Petit à petit, sortie de ce que j'ai appris grâce au Codewar récemment lancé
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.
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
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».
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
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.
Dans ʻeachet
map`, 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 **
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».
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é.
Je ne sais pas si les codes sont correctement reconnus, veuillez donc signaler les différences.
Recommended Posts