2017-07-20 1 views
1

Hallo ich habe eine Methode XO dieMethode true statt falsche Rückkehr für bestimmte Argumente

  • kehrt wahr wenn eine Zeichenfolge hat die gleiche Menge von ‚x und‘ O

  • kehrt false wenn es mehr x gibt als o's und umgekehrt

  • liefert true wenn NO x und o vorhanden sind.

Diese sollten die richtigen Tests sein:

XO("ooxx") => true 
XO("xooxx") => false 
XO("ooxXm") => true 
XO("zpzpzpp") => true // when no 'x' and 'o' is present should return true 
XO("zzoo") => false 

Aus irgendeinem Grund ist meine Methode immer Rückkehr wahr, und ich verstehe nicht, warum.

Ich bin ein Anfänger zu Ruby so Entschuldigungen für meine shabby code.

+1

Können Sie mir den Grund für die Markierung meiner Post nennen? Ich habe das Problem richtig versucht und hier richtig gepostet. – Benjamints

+1

Ich denke, deine Frage ist in Ordnung (ich arbeite gerade daran).Jemand muss mit dem Downvote Trigger-glücklich gewesen sein. – eiko

Antwort

3

Das Problem mit Ihrem Code ist, dass diese Zeile:

str.split.select { |x| !x.include?("o" "O") && !x.include?("x" "X") } 

wird ein leeres Array [] in einer Situation zurückkehren, wo die Zeichenfolge kein 'X' oder 'haben o ist. In Ruby gilt jedes Array als truthy, sogar als leer. Dein Code gibt also immer true hier zurück. Sie können es beheben, indem Sie überprüfen, dass das Array leer ist:

Dieser Code wird gut ausgeführt und tun, was Sie möchten. Es ist jedoch zu kompliziert! Wenn Sie an Ihren Anforderungen aussehen:

  • gibt true zurück, wenn ein String hat die gleiche Menge von ‚x und‘ s o
  • gibt false zurück, wenn es mehr xs als O ist und umgekehrt
  • gibt true zurück, wenn NEIN x's und o's sind vorhanden.

Wenn es keine x und kein O, könnte man sagen, dass es in der Tat 0 x und 0 OS ist, was bedeutet, es ist die gleiche Menge von ‚x und‘ O. Was bedeutet, können Sie dies nur tun:

def XO(str) 
    x = str.count("o" "O") 
    y = str.count ("x" "X") 
    x == y 
end 

In Situationen, in denen es keine ‚X‘ oder 'sind O, du wirst 0 == 0 haben, die true zurückgibt, wie Sie wollen.

2

Ein Straight-Up-Äquivalenztest erfüllt alle Ihre Bedingungen.

def xo str 
    str.count("oO") == str.count("xX") 
end 

xo "ooxx" #=> true 
xo "xooxx" #=> false 
xo "ooxXm" #=> true 
xo "zpzpzpp" #=> true 
xo "zzoo" #=> false 

Verwenden Sie zwei Leerzeichen für Einzug und Kleinbuchstaben für Methodennamen. Beachten Sie das kompaktere count Argument.

+0

Schätzen Sie eine Lösung. Warum hat meine Methode nicht bestanden? – Benjamints

Verwandte Themen