[RUBY] Studieren bei CodeWar (Rubin) ⑤ proc

Über diesen Artikel

Nach und nach wird das ausgegeben, was ich durch den kürzlich gestarteten Codewar gelernt habe

Problem

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.

Beispiel

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

Meine Antwort

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

beste Übung

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

Erklärung ①

 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.

Wer ist map (&: to_i)?

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 **

Was ist proc?

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".

Erklärung ②

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.

Schließlich

Ich bin mir nicht sicher, ob die Codes korrekt erkannt werden. Bitte weisen Sie auf Unterschiede hin.

Recommended Posts

Studieren bei CodeWar (Rubin) ⑤ proc
Studieren bei CodeWar (Ruby) ④ case ~ when
Studieren bei CodeWar (Rubin) ②
Studieren bei CodeWar (Rubin) ⑥ injizieren
Studieren bei CodeWar (Rubin) ③ Squeeze, gsub
Studieren bei CodeWar
Erste Schritte mit Ruby
Evolve Eve mit Ruby
Wechseln Sie die Ruby-Version mit rbenv
Ich habe DI mit Ruby versucht
GraphQL Client beginnend mit Ruby
Ruby: Mail mit Starttls senden
Formatieren Sie Ruby mit VS-Code
Wie man ganze Zahlen mit Rubin überprüft
[Ruby] Problem mit der if-Anweisung
Verwenden Sie Ruby mit Google Colab
Erste Schritte mit Ruby-Modulen
[ruby] Eine Methode mit einem Argument aufrufen
Installieren Sie Ruby mit pacman auf MSYS2
Ruby Scraping-Move Selen Headless mit VPS.
Ruby mit AtCoder 6 lernen [Contest 168 Daher]
[Ruby] Behandeln Sie Instanzvariablen mit Instanzmethoden
Behandle DatePicker mit Ruby / gtk3 + glade3
Eindrücke von Black Jack-Cli mit Ruby
Installieren Sie Ruby unter Ubuntu 20.04 mit rbenv
Machen Sie ein Tippspiel mit Ruby