Jeu de nombres ajoutés
Écrivez une fonction / programme qui prend 2 paramètres entiers paramètres entiers ou variables entières , un nombre de départ et un nombre d'itérations max. Le code doit exécuter l'exemple de jeu suivant pour construire un nouveau numéro et répéter jusqu'à ce que le numéro ne contienne qu'un seul chiffre. par exemple.
3 7 2 = (3 + 7) & (7 + 2) = 10 9
1 0 9 = (1 + 0) & (0 + 9) = 1 9
1 9 = (1 + 9) = 10
1 0 = (1 + 0) = 1
Fondamentalement, en prenant chaque chiffre individuel et en l'ajoutant à son voisin, puis en ajoutant le résultat de l'ajout suivant également.
Le nombre d'itérations max est de protéger les boucles infinies, et lorsque le max est atteint, le code devrait vider les 5 dernières étapes numériques. La même sortie devrait se produire à la fin en atteignant un seul chiffre. Si moins de 5 étapes se sont produites, ne sortez que les nombres valides.
La sortie doit apparaître comme ( Step: Number
), y compris les 5 dernières étapes des étapes terminées ou terminées:
func(3541, 50)
produirait ce format de sortie exact:
6: 1411
7: 552
8: 107
9: 17
10: 8
func(3541, 5)
produirait:
1: 895
2: 1714
3: 885
4: 1613
5: 774
L'ensemble du calcul étant:
1: 895
2: 1714
3: 885
4: 1613
5: 774
6: 1411
7: 552
8: 107
9: 17
10: 8
S'il y a moins de 5 étapes, imprimez simplement ces étapes.
N'utilisez que des bibliothèques intégrées, les paramètres peuvent provenir de n'importe où (ce qui est le plus simple pour la langue de votre choix). Aucune limite sur la taille entière maximale, et s'il y a des débordements, laissez-le planter.
Étant donné que ce n'est pas trop difficile d'un point de vue de puzzle, je donnerai jusqu'au dimanche 25, 20h (UTC + 8) pour que les soumissions soient prises en compte pour la réponse acceptée, auquel cas la plus courte de toutes les langues sera gagnante.
ÉDITER:
Félicitations à Howard, gagnant avec une réponse 48 GolfScript .
Mention spéciale à la 2e place marinus avec une réponse 66 APL .
Mon préféré (étant biaisé vers JavaScript) était la réponse de core1024 .
func(3541, 5)
censé imprimer 5 étapes ou 10?Réponses:
GolfScript,
4846 caractèresMerci à Peter Taylor pour une amélioration à deux caractères.
Attend les deux nombres sur la pile. Essayez en ligne .
Exemples:
la source
.,,
et en transformant la carte finale en juste{': '*}%
.APL (66)
L'argument de gauche est le nombre d'itérations maximal et l'argument de droite est le numéro de début.
Explication:
∆←⍺{
...}⍕⍵
: passez l'argument gauche sous forme de nombre et l'argument droit sous forme de chaîne à la fonction qui calcule la liste des nombres, et stockez-la dans∆
:(1<⍴⍵)∧⍺>0:
: si le nombre de chiffres est supérieur à 1 et le nombre d'itérations restant est supérieur à0
:⍎¨⍵
: évaluer chaque chiffre2+/
: additionner chaque paire⍕¨
: formate chaque nombre sous forme de chaîne∆←,/
: concaténer les chaînes et stocker dans∆
∆,(⍺-1)∇⊃∆
: return∆
, suivi du résultat de l'application de cette fonction∆
avec une itération de moins autorisée⋄⍬
: sinon, retourne la liste vide∆,⍪⍳⍴∆
: associer chaque élément de∆
avec son index dans∆
{
...}/
: pour chaque paire:(⍕⍵),': ',⍺
: retourne une chaîne avec l'index, suivi de:
, suivi du nombre↑¯5↑
: transformez la liste des chaînes en une matrice afin qu'elles s'affichent sur des lignes distinctes, et prenez les 5 derniers élémentsTester:
la source
3 {...} 3541
.:
premier)Mathematica, 172 caractères
C'est beaucoup trop long, grâce aux noms de fonctions de Mathematica et à la gestion des chaînes laides (le "jeu" réel n'est que de 76 de ces caractères), mais le voici quand même:
Il attend le numéro d'entrée en variable
n
et le nombre maximum d'itérations enm
.Avec moins de golf:
la source
Ruby, 106 caractères
Je ne suis pas sûr à 100% des règles d'entrée, mais si je peux prendre
n
comme chaîne, je peux enregistrer 5 caractères, et si je peux utiliser des variables prédéfinies et écrire un programme au lieu d'une fonction, je peux enregistrer 9 autres.Crée une fonction
f
qui peut être appelée comme suit:f[3541, 6]
f[372, 50]
f[9999, 10]
la source
J -
9692 carJ'avais d'abord résolu cela en supposant que tous les jeux se terminaient, et cela est revenu me mordre dans le cul pendant les tests. L'argument de gauche est le nombre d'étapes, l'argument de droite est la position de départ, qui peut être donnée sous la forme d'un nombre ou d'une chaîne.
C'est un peu trop golfé et alambiqué pour dégouliner de manière satisfaisante, alors je dirai ceci:
(<@>:@[(' '-.~[:,@":2+/\"."0@]^:)":)
Cette partie exécute le jeu pour le nombre d'étapes spécifié.2+/\
est responsable de l'ajout de chaque paire de chiffres, et<@>:@[
en tandem avec des^:
commandes capturant les étapes intermédiaires du jeu.(#\(,': '&,)&":"0,)@}.@({.~,i.0:)@:".
Cette partie formate tous les résultats enstep: result
.({.~,i.0:)
s'assure que nous ne prenons pas trop de pas, ce#\
sont les numéros de pas, et le(,': '&,)&":"0
bit ajoute les deux points et l'espace.(-@(<.5<.#){.])
Cette partie supprime les cinq étapes pertinentes ou moins de la liste complète.<.
signifie «minimum de».Cela fonctionne, mais si vous commencez avec un nombre suffisamment important, les résultats du jeu commencent rapidement à augmenter en taille, ce qui fait que J passe des entiers aux doubles imprécis. Voici quelques exemples:
la source
Javascript 139
144 150Non golfé
la source
Perl,
8684Avec de nouvelles lignes pour la lisibilité:
+ Modifier: aucune excuse pour ne pas utiliser le
-n
commutateur de ligne de commande, puis le score est de 82 = 81 + 1 :Et, le débordement d'entier possible étant OK, c'est 81 = 80 + 1
la source
Javascript, 247
278288307CaractèresFormaté
Edit 1 : Suppression du ternaire
Edit 2 : Logique inversée pour "sauter" 0 index
Edit 3 : Appels récursifs retravaillés.
Violon
la source
Bash + coreutils, 115 octets
Production:
la source
JavaScript (ECMAScript 6 Draft) - 134 caractères
Exemples:
la source
Javascript, 182 octets
la source
Perl,
166147138129 129 octetsNon golfé:
J'espère que ça va bien qu'il imprime des lignes vides supplémentaires si le tout prend moins de 5 étapes.
la source
(('')x5, @o, "$i: $s")
par(@o, "$i: $s")
etjoin"\n", @o[-5..0]
parjoin"\n", @o[-5..-1]
. Ensuite, vous aurez 3 octets d'avance;)Java
524405365 caractères [414 octets]Version golfée:
class A{static int n=0;List<String> s=new ArrayList<>();void c(int b,int r){String d=b+"";if(r==0||b <= 9){int m=s.size();for(int i= m>=5?m-5:0;i<m;i++)System.out.println(s.get(i));return;}String l="";for(int i=0;i<d.length()-1;i++)l+=d.charAt(i)+d.charAt(i+1)-96;s.add(++n+":"+l);c(Integer.valueOf(l),--r);}public static void main(String[] a){new A().c(3541,50);}}
Version lisible:
la source
chatAt
méthodeInteger.valueOf(digits[i] + "") + Integer.valueOf(digits[i + 1] + "");
vous pouvez le faire(digits[i] + digits[i+1] - 96)
JavaScript 133 octets
Non golfé:
la source
Java, 341 caractères
371 caractèresFormaté:
Grâce à user902383, j'ai pu réduire le code de 30 caractères, en ne divisant pas la chaîne en tableau et en utilisant -96 au lieu de "Integer.valueOf ()
la source
class a{public static void main(String[] a) {p(3541, 50);}static void p(int n,int k){Queue<String> q=new LinkedList();int c=0;while(n>9&&c<k){c++;String r="";String p=""+n;for(int i=0;i<p.length()-1;i++)r+=((p.charAt(i)+p.charAt(i+1)-96));n=Integer.parseInt(r);q.add(c+": "+n);if(q.size()>5)q.remove();}for(String s:q){System.out.println(s);}}}
Fléchette,
602588 octetsDart est probablement l'une des pires langues pour ce faire ... Je vais devoir trouver une meilleure façon de le faire.
Quoi qu'il en soit, voici mon entrée:
Entrée via la console
Et la version non golfée, légèrement non minimisée:
la source
PERL
135129/125125/121 octetsIl a le même bug que la réponse de Tal
Modifiez 129 octets en fonction:125 octets en fonction:125 octets comme script de console (sans le hashbang):121 octets comme script de console (sans le hashbang):
Étendu:
Testez avec
c(372,4);
:Testez avec
c(3541,50);
:la source
C # - 269
Lisible:
Usage:
Production:
la source
Cobra - 363
Un résultat plutôt déprimant ... mais bon, j'ai quand même battu Java.
Il devrait être à l'abri des débordements d'entier pour les cas de test pratiques.
la source
Python 2.7,
174173158 caractèresUtiliser beaucoup de chaînes pour effectuer la tâche.
Python 2.7, 155 caractères
Version définissant une fonction
Version légèrement non golfée:
la source
Haskell, 154
exemple d'utilisation:
Pour le rendre plus lisible, utilisez
putStr
:la source
putStr $ 3541#50
comparer avec l'exemple de l'OP. Sinon, je suis content qu'il y ait un gars Haskell ici.Groovy -
191182 caractèresBasé sur la solution de Thomas Rüping , portée sur Groovy 2.2.1:
Exécution et sortie:
Non golfé:
la source
** C
186179174 **Un peu moins de golf (mini-golf?)
Allouez juste assez de mémoire pour stocker cinq résultats de façon cyclique. La boucle externe continue jusqu'à ce que nous atteignions la limite ou atteignions un seul chiffre. La boucle intérieure ajoute le dernier chiffre du nombre au dernier chiffre de 1/10 du nombre et l'ajoute, multiplié par la puissance pertinente de 10 au résultat. Divisez le nombre que vous avez d'abord par 10 et répétez pour obtenir le total. Imprimez ensuite les cinq derniers résultats.
Le prochain défi est de voir si je peux me raser suffisamment pour battre certains langages de script au golf.
Edit: compile maintenant avec avertissement mais cinq caractères rasés en supprimant la déclaration "void"
la source
C # -
309330320306 octetsVersion golfée:
Utilisation: F (3541,50);
Version non golfée pour la lisibilité:
Les suggestions d'amélioration sont toujours les bienvenues! ;)
Éditer: Supprimé String.Empty et l'a remplacé par "" pour économiser 10 octets.
Edit 2: Merci à malik pour l'astuce avec les cordes!
la source
.ToCharArray()
. A string = char array.ToString()
, faire+""