Quand j'étais enfant et que je voulais compter les billets d'un dollar dans mes économies, j'ai compté à voix haute:
un deux trois quatre cinq six sept huit neuf dix;
onze, douze, treize, quatorze, quinze, seize, dix-sept, dix-huit, dix-neuf, vingt;
vingt et un, vingt-deux, vingt-trois, vingt-quatre, vingt-cinq ...
Finalement, j'en ai eu marre de prononcer chacun de ces nombres à plusieurs syllabes. Étant d'esprit mathématique, j'ai créé une méthode de comptage beaucoup plus efficace:
un deux trois quatre cinq six sept huit neuf dix;
un, deux, trois, quatre, cinq, six, sept, huit, neuf, vingt;
un, deux, trois, quatre, cinq, six, sept, huit, neuf, trente ...
Comme vous pouvez le constater, je ne prononcerais que le ou les chiffres qui ont changé par rapport au numéro précédent. Cela présente l’avantage supplémentaire qu’il est considérablement plus répétitif que les noms anglais des nombres, et qu’il nécessite donc moins de réflexion pour le calcul.
Défi
Ecrivez un programme / fonction qui prend un entier positif et affiche / retourne comment je le compterais: c’est-à-dire le chiffre non nul le plus à droite et tous les zéros à la fin.
Exemples
1 1
2 2
10 10
11 1
29 9
30 30
99 9
100 100
119 9
120 20
200 200
409 9
1020 20
Une liste complète des cas de test ne devrait pas être nécessaire. C'est A274206 sur OEIS.
Règles
- Votre entrée doit théoriquement fonctionner pour tous les entiers positifs, en ignorant les problèmes de précision et de mémoire.
- L'entrée et la sortie doivent être en décimal.
- Vous pouvez choisir de prendre en entrée et / ou en sortie un nombre, une chaîne ou un tableau de chiffres.
- L'entrée est garantie d'être un entier positif. Votre entrée peut faire n'importe quoi pour une entrée invalide.
C'est le code-golf , donc le code le plus court en octets gagne.
[1,0,2,0]
->[2,0]
pour le dernier cas de test? (Je ne suis pas clair sur la phrase "tableau à élément unique").Réponses:
Python 2 , 28 octets
Essayez-le en ligne!
Une formule récursive fonctionne très proprement. Si le dernier chiffre est différent de zéro, indiquez-le. Sinon, supprimez le zéro final, calculez le résultat et multipliez-le par 10.
la source
Gelée ,
63 octets-3 octets en ayant les E / S sous forme de liste décimale de chiffres .
Suite de test sur Essayez-le en ligne!
Comment?
Si nous ne pouvons pas prendre de listes décimales, un 6 octets est:
Que vous pouvez voir ici .
Cela fait la même chose, mais convertit un entier en une liste décimale au préalable et reconvertit en un entier par la suite.
la source
C,
302927 octetsFier de cela alors que j'abuse de deux exploits de C pour jouer au golf (décrit à la fin du post); Ceci est spécifiquement pour C (GCC)
3)
b=10;f(a){a=a%b?:b*f(a/b);}
// 27 octets2)
// 29 octetsb;f(a){b=a=a%10?:10*f(a/10);}
1)
// 30 octetsf(i){return i%10?:10*f(i/10);}
Essayez-le en ligne (version 27 octets)
Première tentative (30 octets): abuse du fait que, dans GCC, si aucune valeur n'est déclarée en ternaire, la valeur conditionnelle sera renvoyée. D'où la raison pour laquelle mon opérateur ternaire est vide pour la valeur de retour de vérité.
Deuxième tentative (29 octets): Abuse un bogue de mémoire dans GCC où, pour autant que je sache, si une fonction n'a pas de valeur de retour, lorsque plus de deux variables ont été utilisées de manière significative dans la fonction, la dernière valeur définie du premier argument sera retourné.
(Édition: mais cette "valeur définie" doit être définie de certaines manières, par exemple définir une variable avec
=
ou+=
fonctionne, mais la définir avec%=
ne fonctionne pas; bizarre)Troisième tentative (27 octets): Étant donné que je dois utiliser de manière significative la deuxième variable (b) pour abuser correctement du bogue de mémoire mentionné ci-dessus, je peux aussi bien l’utiliser comme variable réelle pour "10" à des fins de substitution.
(Remarque: je devrais pouvoir permuter
a=a%b
aveca%=b
pour enregistrer un autre octet, mais malheureusement, l'exploit de mémoire ci-dessus cesse de "fonctionner", je ne peux donc pas)la source
Retina ,
7 à6 octetsEssayez-le en ligne (tous les cas de test)
Les correspondances de sortie d'un chiffre suivi de zéros à la fin de la chaîne d'entrée. Bien que non requis, cela se passe aussi pour
0
.la source
[1-9]
(ou[^0]
) serait nécessaire à la place de\d
. Je suppose que la gourmandise de*
assure le bon résultat à chaque fois.*
mais avec le fait que les allumettes sont recherchées de gauche à droite.\d0*?$
fonctionnerait aussi..0*$
devrait marcher.0*
Cubix , 18
32octetsJe pense que je devrai y revenir un peu plus tard et voir si je peux le compresser un peu. Mais pour le moment le voici.Il se trouve que je pensais à cela totalement dans le mauvais sens. Maintenant, le processus applique de manière incrémentielle un mod (1,10,100,1000, ...) à l'entier en entrée et affiche le premier qui n'est pas zéro. Un peu plus ennuyeux, mais plus court.
Essayez-le ici
la source
JavaScript, 21 octets
Cas de test
Afficher l'extrait de code
la source
Javascript
1918 octetsMerci à ETHproductions pour le golf d'un octet et à Patrick Roberts pour le golf de deux octets
Retourne un tableau de chaînes qui correspond à l'expression régulière à la fin de la chaîne d'entrée avec n'importe quel caractère suivi du plus grand nombre de zéros possible.
Essayez-le en ligne
la source
g
, car il n'y a jamais qu'un seul match à trouver.x=>x.match`.0*$`
Bash + coreutils, 12
Essayez-le en ligne .
la source
Grime , 5 octets
Essayez-le en ligne!
Explication
la source
Brachylog , 2 octets
Essayez-le en ligne!
Le suffixe intégré
a₁
, pour les entiers, est implémenté comme suit :Brachylog aime pouvoir traiter les nombres entiers comme des listes de chiffres et utilise pour cela le prédicat de l'utilitaire personnalisé
integer_value/2
. La chose intéressante à proposinteger_value/2
ici est que, comme il doit être capable de traduire correctement une liste de chiffres avec des zéros non significatifs, il est également possible de traduire un entier en une liste de chiffres avec des zéros non significatifs, donc les prédicats qui ne le souhaitent pas. arrive (la plupart d’entre eux, en particulier ceux qui ne sont pas ressemblantsa
) interdisent aux têtes de leurs listes de chiffres d’être égaux à 0. Ainsi, tout ena₁
générant les suffixes les plus courts en premier pour les listes et les chaînes, il saute tout suffixe d’un entier avec un 0 en tête, Outre l’élimination des doublons, cela signifie également que le premier suffixe généré est le dernier chiffre différent de zéro, avec tous les zéros à la fin.la source
Flaque de cerveau , 74 octets
Essayez-le en ligne!
Imprime uniquement les derniers non-0 et tous les derniers 0.
Explication:
la source
Vim, 19 octets
Deux versions, les deux 19 octets:
Plus un retour de chariot de fuite sur chacun.
Vérifiez tous les cas de test en ligne! (Un octet ajouté pour tester sur plusieurs lignes)
la source
TI-Basic, 18 octets
la source
R, 33 octets
Implémenté comme une fonction non nommée
Ceci s'applique à un mod de 10 ^ 0 à 10 ^ 99.
rle
est utilisé pour réduire les résultats afin que le deuxième élément soit toujours le résultat souhaité.Essayez-le en ligne!
la source
Zsh ,
1816 octetsEssayez-le en ligne!Essayez-le en ligne!Bash , 25 octets
Essayez-le en ligne!
Les shells ont besoin d'appeler des programmes externes pour utiliser regex, nous devons donc nous débrouiller avec globbing.
L'
${1%[^0]*}
extension correspond au suffixe le plus court commençant par un caractère différent de zéro et le supprime.(M)
indicateur permet de conserver le suffixe correspondant au lieu de le supprimer.${1% }
extension supprime comme préfixe tout ce qui reste.la source
GNU sed ,
1714 + 1 (drapeau r) = 15 octetsEdit: 2 octets de moins grâce à Riley
Cela fonctionne en supprimant tout jusqu'au chiffre non nul le plus à droite, qui est ensuite imprimé avec tous les zéros de fin existants. Le script peut gérer plusieurs tests en une fois, chacun sur une ligne distincte.
Essayez-le en ligne! (tous les exemples de tests)
la source
Mathematica, 26 octets
Fonction pure qui prend une liste de chiffres et génère une liste de chiffres:
Explication
Cela fonctionne car il trouve la correspondance la plus à gauche pour
x
, qui doit être l'élément non nul le plus à droite de la liste car il est suivi d'une séquence de zéro de plus0
s, puis de la fin de la liste.la source
Java 8, 47 octets
c'est une expression lambda assignable à un
IntUnaryOperator
:explication: multiplier m par 10 jusqu'à ce que
x%m
N'est pas égal à 0.return x%m*m/10
Nécessite la division, car m est un ordre de grandeur supérieur au résultat souhaité.la source
Perl 6 , 10 octets
Solution de regex triviale. Entrer et sortir un nombre.
la source
MATL ,
107 octets3 octets sauvegardés grâce à @B. Mehta!
L'entrée et la sortie sont un tableau de chiffres.
Essayez-le en ligne!
Ou vérifier tous les cas de test .
Explication
la source
48-
entièrement l’économie de 3 octets: essayez-le en ligne!C #,
3028 octetsBasé sur cette réponse JavaScript , je suppose donc que tous les crédits lui vont un peu.
Golfé
()
environa
grâce à Emignala source
i
pour que cela fonctionne lorsque vous utilisez la récursivité.i
il sera non déclaré pour l'appel récursif).a
n'est pas nécessaire dans les deux cas.J, 27 octets
Il est basé sur la formule de xnor, donc créditez-le.
la source
Kotlin, 49 octets
lambda, assignable à
(List<Int>) -> List<Int>
it
dansindexOfLast
..
pour construire des gammesla source
Perl 5, 12 octets
11, plus 1 pour
-nE
au lieu de-e
la source
05AB1E , 9 octets
Essayez-le en ligne! ou en tant que suite de tests
Explication
la source
Japt , 6 octets
Essayez-le en ligne!
la source
Stax , 5 octets
Exécuter et déboguer
Procédure:
la source
05AB1E , 4 octets
I / O sous forme de liste de chiffres.
Essayez-le en ligne ou vérifiez tous les cas de test (la suite de tests contient une jointure pour une meilleure lisibilité).
Explication:
la source
Pyke,
131110 octetsEssayez-le ici!
11 octets:
Essayez-le ici!
13 octets:
Essayez-le ici!
la source
Haskell 57 octets
la source