Nach und nach wird das ausgegeben, was ich durch den kürzlich gestarteten Codewar gelernt habe
Bob is preparing to pass IQ test. The most frequent task in this test is to find out which one of the given numbers differs from the others. Bob observed that one number usually differs from the others in evenness. Help Bob — to check his answers, he needs a program that among the given numbers finds one that is different in evenness, and return a position of this number. ! Keep in mind that your task is to help Bob solve a real IQ test, which means indexes of the elements start from 1 (not 0)
Ich werde eine Methode erstellen, die einen numerischen Wert findet, der außerhalb der Gruppe liegt, und diesen Wert zurückgibt.
Im folgenden Fall, wenn es sich um "iq_test (" 2 4 7 8 10 ")" handelt, ist nur 7 ungerade. Es scheint also, als würde 3 zurückgegeben, was die Zahl ist, die durch Hinzufügen von +1 zur Indexnummer erhalten wird.
iq_test ("1 2 1 1") bewirkt, dass 2 2 von der Minderheit zurückgibt.
iq_test("2 4 7 8 10") => 3 // Third number is odd, while the rest of the numbers are even
iq_test("1 2 1 1") => 2 // Second number is even, while the rest of the numbers are odd
def iq_test(numbers)
numbers = numbers.split().map{|num| num.to_i}
even_count = numbers.select {|num| num.even?}.count
odd_count = numbers.select {|num| num.odd?}.count
numbers.each_with_index do |num, i|
if even_count > odd_count
return i + 1 if num.odd?
else
return i + 1 if num.even?
end
end
end
(1) Konvertieren Sie die als Argument übergebenen Daten in ein Array mit "split" und konvertieren Sie die Elemente des Arrays mit "to_i" in Zahlen mit "map".
(2) Verwenden Sie select
, um nur gerade Daten zu extrahieren und zu zählen, wie viele es mit der count
-Methode gibt.
③ Zählen Sie ungerade Zahlen wie ②
④ Übergeben Sie das Array mit den Zahlen mit "each_with_index" nicht nur den Elementen, sondern auch den Indexnummern. ⑤ Vergleichen Sie bei der bedingten Verzweigung, ob gerade oder ungerade die Minderheit ist, und geben Sie die Minderheit mit "return" zurück
Es ist immer noch ein kurzer Code. .. ..
def iq_test(numbers)
nums = numbers.split.map(&:to_i).map(&:even?)
nums.count(true) > 1 ? nums.index(false) + 1 : nums.index(true) + 1
end
nums = numbers.split.map(&:to_i).map(&:even?)
Ordnen Sie die Zahlen mit "split" an, konvertieren Sie die Zahlen mit "map" so wie sie sind, bewerten Sie dann, ob sie mit der zweiten "map" gerade sind, und setzen Sie das True / False-Ergebnis in "nums" ing.
In "jeder" und "Karte" werden die folgenden Muster häufig unter Verwendung von Blöcken verwendet.
["1", "2", "3"].map{|v| v.to_i}
=> [1, 2, 3]
Hier erkannten die Programmierer die Idee, dass "ich kürzer schreiben möchte", und ich konnte kürzer schreiben, indem ich den Operator & kombinierte.
#normal
["1", "2", "3"].map{|v| v.to_i}
=> [1, 2, 3]
nums = numbers.split.map(&:to_i).map{|num| num.even?}
#&verwenden
["1", "2", "3"].map(&:to_i)
=> [1, 2, 3]
nums = numbers.split.map(&:to_i).map(&:even?)
https://www.xmisao.com/2014/02/09/ruby-array-map-idiom-symbol-to-proc.html Die Map-Methode ist eine Methode mit einem Block, und natürlich müssen Sie einen Block als Argument der Methode mit einem Block übergeben. ** Wenn Sie jedoch & vor ein Objekt stellen, das eine to_proc-Methode hat, wird es als Block interpretiert **
Das Objekt des Blocks ist "proc". Blöcke können nur beim Aufrufen von Methoden wie "each" oder "map" verwendet werden und können nicht als Objekte behandelt werden. Daher ist das Objekt des Blocks, der "&" verwendet, "proc".
nums.count(true) > 1 ? nums.index(false) + 1 : nums.index(true) + 1
Bewerten Sie jede Zahl mit nums = numbers.split.map (&: to_i) .map (&: gerade?)
, Setzen Sie true / false in nums
und die Anzahl von true ist 1 oder mehr. Wenn ja, gibt es mehr gerade Zahlen und weniger ungerade Zahlen.
Wenn es viele gerade Zahlen gibt, wird eine ungerade Indexnummer +1 zurückgegeben, und wenn es nicht mehr als 1 gibt, wird eine gerade Indexnummer +1 zurückgegeben.
Ich bin mir nicht sicher, ob die Codes korrekt erkannt werden. Bitte weisen Sie auf Unterschiede hin.
Recommended Posts