En l'honneur du nombre de représentants que j'avais il y a plusieurs heures, lorsque j'ai pensé à ce défi pour la première fois:
Des nombres comme celui-ci qui sont constitués d'un seul chiffre répétitif sont appelés repdigits . Les chiffres sont amusants! Chaque corps serait plus heureux si la quantité de représentant qu'ils avaient était un nombre uniforme ¹ , mais je suis impatient, alors vous devez me aider à trouver le meilleur moyen d'arriver à un nombre uniforme.
Voici votre défi:
Compte tenu d' un représentant des nombres entiers positifs réputation, sortie le montant minimum de représentant dont ils ont besoin pour gagner pour arriver à un nombre uniforme. Par exemple, au moment d'écrire ce défi, l'utilisateur Martin Ender avait 102 856 représentants. Le chiffre de rep le plus proche est 111,111, il devrait donc gagner: 8255 rep pour être à un chiffre de rep.
Étant donné que les gens n'aiment pas perdre leur représentant, nous ne considérerons que les changements non négatifs. Cela signifie que, par exemple, si quelqu'un est à 12 répétitions, plutôt que de perdre 1 répétition, la solution est de gagner 10 répétitions. Cela permet à «0» d'être une sortie valide, car toute personne ayant 111 rep est déjà à un chiffre rep.
L'entrée et la sortie peuvent être dans n'importe quel format raisonnable , et comme il est impossible d'avoir moins de 1 représentant sur un site Stack Exchange, vous pouvez supposer qu'aucune entrée ne sera inférieure à 1.
Une valise d'angle à noter:
Si un utilisateur a moins de 10 répétitions, il est déjà à un chiffre de répétition et a donc également besoin de «0».
Test IO:
#Input #Ouput
8 0
100 11
113 109
87654321 1234567
42 2
20000 2222
11132 11090
Les failles standard s'appliquent et la solution la plus courte en octets l'emporte!
110
faut donc donner1
, même s'il n'y a pas moyen de gagner un représentant.Réponses:
Gelée , 6 octets
La sortie est un tableau singleton.
Essayez-le en ligne! ou vérifiez la plupart des cas de test . Le cas de test 87654321 est trop lent pour TIO.
Comment ça marche
la source
Haskell, 39 octets
Essayez-le en ligne
la source
Brachylog , 9 octets
Essayez-le en ligne!
C'est assez efficace car il utilise l'arithmétique des contraintes.
Explication
la source
This is the answer you're looking for. Figure it out for me
:)call_reside_vars/2
, récupérez les variables CLP (FD) et étiquetez-les. Par exemple:call_residue_vars(Program, Vs0), include(fd_var, Vs0, Vs), label(Vs)
. Qu'est-ce que tu penses?Python 2,
4140 octetsPas l'approche la plus courte, mais très efficace. Testez-le sur Ideone .
Comment ça marche
Pour les
10**len(`n`)
tours d' entrée n jusqu'à la puissance la plus proche de 10 . Ensuite, nous divisons le résultat par 9 . Cela renvoie le chiffre 1 à 1 qui contient autant de chiffres que n . Nous enregistrons le résultat dans r . Par exemple, si n = 87654321 , alors r = 11111111 .Le chiffre souhaité sera un multiple ou un r . Pour décider lequel, nous effectuons la division du plafond de n par r . Depuis les
/
étages de l' opérateur de division de Python 2 , cela peut être réalisé avec-n/r
, ce qui donnera la valeur absolue correcte, avec un signe négatif. Par exemple, si n = 87654321 , cela renverra -8 .Enfin, nous multiplions le quotient calculé par -r pour répéter le quotient une fois pour chaque chiffre de n . Par exemple, si n = 87654321 , cela renvoie 88888888 , qui est le chiffre souhaité.
Enfin, pour calculer l'incrément requis, on soustrait n du résultat précédent. Pour notre exemple n = 87654321 , cela renvoie 1234567 , comme souhaité.
la source
lambda n:10**len(`n`)/9*-~int(`n*9`[0])-n
. Cela fonctionne presquelambda n:int(`n*9`[0]*len(`n`))-n
, mais le chiffre est trop petit et je ne vois pas de bon moyen de le corriger.O(1)
.O(1)
, mais je suppose que cela a du sens.Python 2, 37 octets
Testez-le sur Ideone . Notez que cette approche est trop inefficace pour le cas de test 87654321 .
Comment ça marche
Si n est déjà un chiffre,
1-len(set(`n`))
renverra 0 puisque la longueur de l'ensemble des n chiffres de la base 10 sera 1 . Dans ce cas, f renvoie 0 .Si n n'est pas un chiffre,
f(n+1)
appelle récursivement f avec la prochaine valeur possible de n .-~
incrémente la valeur de retour de f ( 0 lorsqu'un chiffre est trouvé) de 1 chaque fois que f est appelé récursivement, de sorte que la valeur de retour finale est égale au nombre de fois que f a été appelé, c'est-à-dire que le nombre de fois où n a dû être incrémenté à obtenir un repdigit.la source
L
longs doivent être traités.-~
permet à la fonction de compter le nombre d'appels qu'elle a effectués.Perl 6 , 23 octets
Un lambda qui prend le numéro d'entrée comme argument et renvoie le résultat.
Explication:
...
opérateur de séquence pour incrémenter le numéro d'entrée jusqu'à ce qu'il atteigne un chiffre (testé en divisant sa représentation sous forme de chaîne en caractères et en voyant s'ils sont tous égaux) .la source
/(.)$0*/
Java 7,
11676 octetsUtilisé l'approche étonnante de @Dennis pour réduire le nombre d'octets de 40 octets.
Cas non testés et testés:
Essayez ici.
Sortie:
la source
2222
la quatrième sortie12345678
?2222
au lieu de222
. J'ai corrigé une erreur dans le code, mais j'avais accidentellement utilisé l'ancienne sortie ici. C'est corrigé maintenant. Quant au quatrième, non, il devrait l'être123467
(comme vous pouvez également le voir à la question d'OP).Pyth,
987 octets1 octet grâce à @FryAmTheEggman.
Essayez-le en ligne.
Très inefficace, boucle tous les nombres de l'entrée au chiffre suivant.
la source
Brain-Flak
690358octetsVoici mon coup
Essayez-le en ligne
Explication
Commencez par faire une deuxième copie de l'entrée qui est une de moins que l'original. Nous utiliserons la copie pour rechercher le prochain chiffre. Nous soustrayons un au cas où le nombre lui-même était un chiffre
Appuyez sur l'un pour satisfaire la boucle à venir. (ne doit pas nécessairement être un, mais pas zéro)
Cette boucle s'exécutera jusqu'à ce qu'il y ait un chiffre de répétition au-dessus de la pile
Pop the merde. C'est un "booléen" sur le dessus qui pilote la boucle, car il n'est plus nécessaire de le faire éclater.
Ajoutez-en un et dupliquez le haut. La copie sera décomposée en ses chiffres.
Alors que la copie n'est pas nulle ...
Copiez à nouveau
Mod 10 et passez à l'autre pile
Diviser par 10 (division entière)
Pop the zero that was our copy
Nous avons maintenant décomposé le nombre en ses 10 chiffres de base, nous allons donc basculer sur la pile avec tous les chiffres.
Alors que le premier chiffre n'est pas zéro
On récupère une copie de la hauteur de pile (ie le nombre de chiffres) ...
Soustrayez silencieusement un de chaque nombre sur la pile
Mettez la hauteur de pile que nous avons ramassée. (et permutez sur l'autre pile)
Nous utilisons la hauteur de la pile pour ramener tous les chiffres que nous avons placés sur l'autre pile sur la pile appropriée.
Pop le zéro qui était notre hauteur de pile
Retournez sur la pile avec les chiffres (ou quels étaient les chiffres)
Boucle de fin
Maintenant, nous avons soustrait le chiffre supérieur de tous les autres chiffres. Si tous les chiffres sont nuls, le numéro d'origine (pas l'entrée mais le numéro que nous vérifions) était un chiffre nouveau. [citation nécessaire] . Nous devons donc vérifier les non-zéros.
Alors que la hauteur de pile n'est pas nulle
Si le chiffre n'est pas zéro, déplacez-le vers l'autre pile et remplacez-le par un zéro.
Pop it (maintenant c'est un zéro)
Boucle de fin
Échangez sur l'autre pile (duh ..)
Prenez-nous une copie de la hauteur de pile moins deux
Alors que la hauteur de la pile n'est pas deux (l'original et l'accumulateur)
Pop the top
Fin du temps
Déposez notre copie de la hauteur de pile moins deux. Cela finit par être le nombre de chiffres qui ne sont pas les mêmes que le premier chiffre. En d'autres termes, s'il est nul, c'est un chiffre.
Si cette boucle se termine, nous avons trouvé un repdigit
Pop le "booléen"
Soustrayez l'original du repdigit
la source
Python 2, 52 octets
Python 2 a plusieurs astuces qui raccourcissent cela. Par exemple, l'entrée est numérique, nous n'avons donc pas besoin de transtyper en int. (-5 octets) Nous n'avons pas non plus besoin de mettre de parenthèses autour du
a-b
(-1 octet)Utilisez ce script pour vérifier tous les cas de test:
Vous pouvez également l' essayer en ligne!
la source
GNU sed, 223 + 1 (drapeau r) = 224 octets
Courir:
Sortie:
Il s'agit d'une solution pure sed , l'arithmétique est simulée à l'aide d'expressions régulières uniquement. L'algorithme fonctionne comme suit:
^current_reputation:needed_reputation%$
a)
%:
applique l'incrément à required_reputationb)
:%
applique l'incrément à current_reputationla source
Java,
7472 octets(Si l'autre entrée Java fait 76 octets, celle-ci est
7472, puisqu'il estdeuxquatre octets de moins).Quoi qu'il en soit, il suffit d'incrémenter l'entrée jusqu'à ce qu'il s'agisse d'un nouveau chiffre tout en incrémentant un compteur. Retournez le comptoir.
Oui, ce sont trois avantages consécutifs, deux pour incrémenter l'entrée, un pour concaténer une chaîne vide pour en faire une chaîne.
Non, je ne pensais pas que ce serait légal sans un espace entre les deux, mais voilà. C'est ce qu'une faute de frappe fera pour vous: un octet plus court.
L'utilisation d'une boucle for au lieu d'un certain temps prend exactement autant d'octets:
Modifier:
Une version antérieure devait
matches("^(\\d)\\1*$")
vérifier un repdigit, mais comme nous venons de convertir un int en chaîne, utiliser un.
pour correspondre suffit.Cas non testés et testés:
Essayez ici.
}
Sortie:
la source
R,
1029891 octetsUngolfed:
Jouer avec le format (
) ajoute quelques octets, mais R n'est pas vraiment flexible!as.numeric
etas.character
la source
Perl, 40 + 1 (
-n
) = 41 octetsSi l'impression de rien au lieu de
0
lorsque le nombre est déjà un chiffre est acceptable, alors 37 octets suffisent:Exécuter avec
-n
(1 octet) et-E
ou-M5.010
(gratuit):Explications : le code comporte deux parties principales:
/^(.)\1*$/&&say$v
et$_++&&++$v&&redo
. Le premier teste if$_
est un repdigit; si oui, il imprime le numéro que nous avons ajouté au numéro d'origine pour en faire un repdigit ($v
), et si non, nous avons eu 1 pour les deux$_
et$v
, et recommencer.la source
perl -pe '@x=sort/./g;//;$_=(($x[-1]>$&)+$&)x+@x-$_'
JavaScript (ES6), 42 octets
Explication: Calcule récursivement
p
la puissance suivante de l'10
aftern
. Le chiffre à répéter est ensuite calculé comme1+floor(9n/p)
, et la répétition est simplement(p-1)/9
, dont le résultat suit.la source
05AB1E ,
106 octetsEssayez-le en ligne!
Explication
la source
§
et changez¹-
enα
. Et voici une alternative 8 octets assez similaire:∞+.ΔÙg}α
Pyke,
1311 octetsEssayez-le ici!
la source
En fait, 15 octets
Essayez-le en ligne!
Explication:
la source
Méduse , 20 octets
Essayez-le en ligne! TIO ne peut pas gérer les cas de test plus longs, mais avec suffisamment de temps et de mémoire, ils devraient également fonctionner.
Explication
i
est entrée et la<
décrémente. Cette valeur est envoyée à la fonction de gauche.\>
incrémente la valeur (au moins une fois) jusqu'à ce que la fonction de droite donne une valeur véridique.&
s) de quatre fonctions.0~j
convertit en chaîne.u
supprime les chiffres en double.>
supprime la tête de la chaîne résultante.N
est une négation logique: elle donne1
pour une chaîne vide, et0
pour non-vide. Ainsi, la fonction teste un chiffre de répétition, et le résultat de\
est le chiffre de répétition suivant à partir de<i
.)-
soustrait le résultat de l'entrée de fonction, c'est-à-dire<i
.<
diminue. Enfin,p
imprime le résultat.la source
PowerShell v2 +, 66 octets
Le casting très lâche habituellement bon pour le golf de PowerShell est une chute majeure ici.
Prend l'entrée
$n
sous forme de chaîne et entre dans unefor
boucle. Pour l'étape de configuration, nous extrayons le premier caractère$n[0]
, mais devons le reconvertir en chaîne"$(...)"
avant de le convertir en entier+
et de l'enregistrer$x
. Sinon, l'arithmétique ultérieure utilisera la valeur ASCII du code de caractère.Le conditionnel vérifie si une chaîne construite à partir de
$n.length
"$x"
s, stockée temporairement dans$y
, est inférieure à$n
. Tant que ce n'est pas le cas, nous incrémentons$x++
, en configurant le conditionnel pour la prochaine boucle.Par exemple, pour l'entrée
123
, la valeur de$y
la première vérification du conditionnel sera111
inférieure à$n
, de sorte que la boucle continue. Il n'y a rien dans le corps de la boucle, donc l'incrément de pas se produit$x++
, puis le conditionnel est vérifié à nouveau. Ce temps$y
est égal à222
, ce qui est supérieur à$n
, donc la boucle se termine. Si l'entrée est déjà un repdigit, le conditionnel n'est pas satisfait, car à ce point$y
est égal à$n
.Une fois hors de la boucle, nous transtypons
$y
en un entier+
, puis soustrayons$n
. Ce résultat est laissé sur le pipeline et la sortie est implicite.la source
PHP 5.6,
59535150 octetsEnregistré
68 octets grâce à @manatwork.Testez avec:
La
count_chars()
fonction avec 3 comme deuxième paramètre renvoie une chaîne avec les caractères distincts dans une chaîne. Lorsque cette chaîne contient 1 caractère ([1]
renvoie false lorsqu'elle est de longueur 1), alors écho$b
, sinon incrémentez$b
et bouclez à nouveau.la source
count_chars()
. Qu'en est-il de 3 comme paramètre du mode $? Donc , ce serait l'while
état:count_chars($argv[1]+$b,3)[1]
.count
oustrlen
alors il s'est avéré être de la même longueur.echo$b?:0;
MATL , 10 octets
Essayez-le en ligne!
Cela continue à incrémenter l'entrée jusqu'à ce que tous les chiffres soient égaux, donc c'est lent. Le cas de test pour les
87654321
délais d'expiration dans le compilateur en ligne.la source
Ruby, 42 caractères
Attend une entrée de chaîne.
Échantillon échantillon:
Ruby, 39 caractères
Appel récursif, s'exécute dans «SystemStackError: niveau de pile trop profond» sur des résultats plus importants.
Échantillon échantillon:
la source
Matlab,
6564 octetsÀ cause de la boucle while, c'est plutôt lent ...
Explication
Enregistrement d'un octet grâce à @Luis Mendo .
la source
+0
?diff
convertit automatiquement les caractères en nombresdiff
traite la chaîne comme sym et essaie de se différencier.Excel,
8579 octetsMettez la formule suivante dans n'importe quelle cellule, sauf la cellule,
N
car il s'agit d'un nom pour la cellule de référence d'entrée:Explication:
N
est l'entrée et également le nom de la cellule de référence .LEFT(N)
prendre le premier chiffre de la valeur d'entrée.LEN(N)
renvoie la longueur de la valeur d'entrée.REPT(LEFT(N),LEN(N))
répétez le premier chiffre desLEN(N)
temps de valeur d'entrée et multipliez-le par 1 pour convertir le format de texte en format numérique afin que nous puissions l'utiliser pour la comparaison des nombres.la source
Num_chars
dansLEFT
et enregistrer 4 octets:LEFT(N)
IF
condition dans un1
ou en l'0
utilisant--
ainsi vous n'avez pas besoin de vous répéter juste pour+1
:=REPT(LEFT(N)+(--1*(REPT(LEFT(N),LEN(N)))<N),LEN(N))-N
=REPT(LEFT(N)+(1*(REPT(LEFT(N),LEN(N)))<N),LEN(N))-N
Brachylog v2, 6 octets
Essayez-le en ligne!
Le 5 octets
+↙.=∧
s'en sort en omettantℕ
car il n'essaie pas du tout de sorties non positives, mais il échoue également lorsqu'il reçoit un nombre qui est déjà un chiffre car il n'essaie pas du tout de sorties non positives.la source
Java, 59 octets
(Je ne sais toujours pas comment compter les entrées Java, mais selon la norme définie par la première entrée Java , cette entrée est de 59 octets, car elle est de 17 octets plus courte).
Quoi qu'il en soit, si nous avons un chiffre rep, renvoyez 0, sinon ajoutez 1 à l'entrée, appelez-vous et ajoutez 1 au résultat.
Cas non testés et testés:
Essayez ici.
Sortie:
Comme vous pouvez le voir, la dernière entrée manque de mémoire avant de pouvoir se terminer. Le (très approprié)
StackOverflowError
est jetéjava.util.regex.Pattern.sequence(Pattern.java:2134)
, mais je suis assez confiant qu'il n'y a rien de mal avec le regex lui-même, car c'est le même que j'ai utilisé dans mon entrée précédente .la source
C #, 82 octets
la source
C, 84 octets
Test principal:
la source
Prolog, 120 octets
Essayez-le en ligne!
la source