Étudier à CodeWar (ruby) ⑤ Proc

À propos de cet article

Petit à petit, sortie de ce que j'ai appris grâce au Codewar récemment lancé

problème

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)

Je vais créer une méthode qui trouve une valeur numérique qui est hors du groupe et renvoie cette valeur.

Exemple

S'il est inférieur, ʻiq_test ("2 4 7 8 10") `retournera 3 qui est le nombre obtenu en ajoutant +1 au numéro d'index car seulement 7 est impair.

iq_test ("1 2 1 1") fait que 2 renvoie 2 de la minorité.

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

Ma réponse

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) Convertissez les données passées en argument en un tableau avec split, et convertissez les éléments du tableau avec to_i en nombres avec map. (2) Utilisez select pour extraire uniquement les données paires et compter le nombre avec la méthode count. ③ Comptez les nombres impairs de la même manière que ②

④ Passez le tableau contenant les nombres avec ʻeach_with_index` non seulement les éléments mais aussi les numéros d'index. ⑤ Dans le branchement conditionnel, comparez si pair ou impair est la minorité et renvoyez la minorité avec «retour».

meilleur entrainement

C'est toujours un code court. .. ..

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

Explication ①

 nums = numbers.split.map(&:to_i).map(&:even?)

Faites des nombres dans un tableau avec split, convertissez les nombres avec map tels quels, puis évaluez s'il est égal avec la deuxième map et mettez le résultat vrai / faux dans nums ing.

Qui est map (&: to_i)?

Dans ʻeachetmap`, les modèles suivants sont souvent utilisés en utilisant des blocs.

["1", "2", "3"].map{|v| v.to_i}
=> [1, 2, 3]

Ici, les programmeurs ont réalisé l'idée de "Je veux pouvoir écrire plus court", et j'ai pu écrire plus court en combinant & opérateurs.

#Ordinaire
["1", "2", "3"].map{|v| v.to_i}
=> [1, 2, 3]

nums = numbers.split.map(&:to_i).map{|num| num.even?}

#&utilisation
["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 La méthode map est une méthode avec un bloc, et bien sûr vous devez passer un bloc comme argument de la méthode avec un bloc. ** Mais si vous placez & devant un objet qui a une méthode to_proc, il sera interprété comme un bloc **

Qu'est-ce que proc?

L'objet du bloc est «proc». Les blocs ne peuvent être utilisés que lors de l'appel de méthodes telles que ʻeach ou map`, et ne peuvent pas être traités comme des objets. Par conséquent, l'objet du bloc utilisant «&» est «proc».

Explication ②

nums.count(true) > 1 ? nums.index(false) + 1 : nums.index(true) + 1

Évaluez chaque nombre avec nums = numbers.split.map (&: to_i) .map (&: even?), Mettez vrai / faux dans nums, et le nombre de vrai est 1 ou plus. Si c'est le cas, cela signifie qu'il y a plus de nombres pairs et moins de nombres impairs. S'il y a beaucoup de nombres pairs, un numéro d'index impair +1 est renvoyé, et s'il n'y en a pas plus de 1, un numéro d'index pair +1 est renvoyé.

finalement

Je ne sais pas si les codes sont correctement reconnus, veuillez donc signaler les différences.

Recommended Posts

Étudier à CodeWar (ruby) ⑤ Proc
Étudier à CodeWar (ruby) ④ cas ~ quand
Étudier à CodeWar (ruby) ②
Étudier à CodeWar (ruby) ⑥ inject
Étudier à CodeWar (ruby) ③ squeeze, gsub
Étudier chez CodeWar
Premiers pas avec Ruby
Evolve Eve avec Ruby
Changer de version Ruby avec rbenv
J'ai essayé DI avec Ruby
Client GraphQL commençant par Ruby
Ruby: envoyer des e-mails avec Starttls
Formater Ruby avec VS Code
Comment vérifier les nombres entiers avec ruby
[Ruby] problème avec l'instruction if
Utilisez Ruby avec Google Colab
Premiers pas avec les modules Ruby
[ruby] Appel d'une méthode avec un argument
Installez Ruby sur MSYS2 avec pacman
Ruby Scraping-Move Selenium Headless avec VPS.
Apprendre Ruby avec AtCoder 6 [Concours 168 Donc]
[Ruby] Gérez les variables d'instance avec des méthodes d'instance
Gérer DatePicker avec Ruby / gtk3 + glade3
Impressions de faire Black Jack-cli avec Ruby
Installez ruby sur Ubuntu 20.04 avec rbenv
Faites un jeu de frappe avec ruby