Je travaille avec Ruby et je tente d'écrire un code qui prendra une entrée numérique et de renvoyer le prochain numéro le plus grand avec les mêmes chiffres.
J'ai vu cette même question posée ici avant, mais le code diffère trop pour m'aider à résoudre mon problème particulier. P>
def next_smaller n
ndigitsarray=n.digits.reverse
bigdigitsarray=ndigitsarray.sort.reverse
bigdigitsjoint=bigdigitsarray.join.to_i
while bigdigitsjoint>n do
bigdigitsarray.insert(1, bigdigitsarray.delete_at(0))
end
return bigdigitsarray.join.to_i
end
3 Réponses :
Si vous n'êtes pas chargé de créer vous-même la gamme de chiffres, il y a un Array # Permutation Méthode disponible pour générer toutes les combinaisons de numéros basées sur votre numéro d'origine.
Ensuite, après un certain nettoyage et de tri, vous pouvez trouver l'index de votre numéro, puis ajouter 1 pour rechercher le numéro le plus élevé suivant. P>
def next_number(i)
puts "Your number is #{i}"
permutations = i.to_s.split('').permutation.to_a.map(&:join).map(&:to_i).uniq.sort
index = (permutations.find_index(i) + 1)
puts "Next highest is #{permutations[index]}"
end
# Usage
next_number(4357)
next_number(81541)
Next_Number (999) CODE>) LI>
- probablement pas le moyen "le plus rapide" de le faire, si cela fait partie d'un défi de code LI>
ul> p>
Vous utilisez une boucle tandis que la variable utilisée pendant que la condition ne change pas à l'intérieur de la boucle.
Une option pour résoudre le problème de la force brute utilise Array # permutation sur le Integer # chiffres tableau: p>
n.digits.permutation.uniq.map { |e| e.join.to_i }.sort.partition { |k| k > n }
#=> [[1312, 1321, 2113, 2131, 2311, 3112, 3121, 3211], [1123, 1132, 1213, 1231]]
Commençons par créer une méthode dont l'argument par exemple, p> (voir p> Cela peut être un peu académique, nous pouvons faire mieux. Donné Nous pouvons écrire ( Parce que le dernier chiffre est supérieur à zéro): p> De même, après avoir effectué une copie profonde de Nous pouvons mettre à jour ce hachage en écrivant: p> plutôt que d'appeler p> D'autres améliorations seront possibles Dans le cas où le dernier chiffre est zéro (pour éviter d'appeler On pourrait faire quelque chose de similaire si chiffres code> est un tableau de chiffres et qui renvoie un hachage ("comptage") dont les touches sont les chiffres 0-9 code> et dont les valeurs sont chiffres.count (d) code> pour chaque clé d code>. h1>
chiffres code> et chiffre_counts code> ci-dessus, pour mettre à jour chiffres code> pour p> digit_counts code>: p> comte_digits code>. (Voir HASH # Transform_values ). Maintenant, révisons la méthode comme suit. P> h1>
comte_digits code>). Si, par exemple, p> chiffres code> et h code> pourrait être mis à jour pour n = 2129 code > comme suit: p> n = 2100 code> ou 2000 code>, mais cela devient rapidement plus rapide Pour appeler comte_digits code>, p> p>
Votre solution est fausse car elle ne couvre que le déplacement linéaire de chiffres et non la permutation (par exemple, lorsque deux ou plusieurs chiffres échangent des places, non seulement remplacent. Il ne trouvera pas le plus petit nombre le plus proche avec les mêmes chiffres, il ne trouvera rien parce que Votre variable jointe ne change pas après la première affectation et que vous le vérifiez dans la condition de While. On dirait que vous ne comprenez pas la programmation que bien, vous devriez donc mieux l'apprendre mieux (comme un concept d'affectation variable) avant de s'attaquer à de tels problèmes. .