Sur 4chan, un jeu populaire est obtenu. Chaque publication sur le site reçoit un identifiant de publication séquentiel. Comme vous ne pouvez pas les influencer ou les déterminer, les gens essaient de deviner (au moins une partie de) leur propre numéro de poste, généralement les premiers chiffres. Une autre version du jeu s'appelle les doublons, et son objectif est d'obtenir des chiffres répétitifs à la fin du numéro (par exemple 1234555).
Votre tâche, si vous souhaitez l'accepter, est d'écrire un programme qui prend un post id en entrée (entier standard, vous pouvez supposer en dessous de 2 ^ 32), et retourne combien de chiffres se répètent à la fin.
Règles
- Les failles standard ne sont pas autorisées .
- Le programme peut être une fonction, un programme complet, une commande REPL, tout ce qui fonctionne vraiment, tant qu'aucun code / argument non compté externe n'est nécessaire pour l'exécuter.
- L'entrée peut provenir de STDIN, des arguments de fonction, de l'argument de ligne de commande, du fichier, selon ce qui vous convient.
Cas de test
Input: 14892093
Output: 1
Input: 12344444
Output: 5
Input: 112311
Output: 2
Input: 888888
Output: 6
Input: 135866667 //Post number I got on /pol/ few days ago, rip
Output: 1
code-golf
number
number-theory
counting
sagiksp
la source
la source
Réponses:
Mathematica, 29 octets
Que diriez-vous d'une solution arithmétique?
Je suis très heureux de voir que cela dépasse l'approche directe de Mathematica.
Explication
Le code lui-même calcule 9 * n + n% 10 et trouve ensuite la plus grande puissance de 10 qui divise l'entrée, ou en d'autres termes, compte les zéros de fin. Nous devons montrer si n se termine par k chiffres répétés, que 9 * n + n% 10 a k zéros de fin.
Les chiffres de répétition s'expriment le plus facilement mathématiquement en divisant un nombre comme 99999 (qui est 10 5 -1 ) par 9 , puis en multipliant par le chiffre répété. Nous pouvons donc écrire n = m * 10 k + d * (10 k -1) / 9 , où m ≢ d (mod 10) , pour nous assurer que n ne se termine pas par plus de k chiffres répétés. Notez que d = n% 10 .
Insérons cela dans notre formule 9 * n + n% 10 . On obtient 9 * m * 10 k + d * (10 k -1) + d . Le d à la fin est annulé, nous nous retrouvons donc avec: 9 * m * 10 k + d * 10 k = (9 * m + d) * 10 k . Mais 9 ≡ -1 (mod 10) , donc 9 * m + d ≡ d - m (mod 10) . Mais nous avons affirmé que m ≢ d (mod 10) et donc d - m ≢ 0 (mod 10) .
En d'autres termes, nous avons montré que 9 * m + d n'est pas divisible par 10 et donc, la plus grande puissance de 10 qui divise 9 * n + n% 10 = (9 * m + d) * 10 k est k , le nombre de chiffres répétés à la fin.
En prime, cette solution imprime le résultat correct,,
∞
pour la saisie0
.la source
Rétine , 9 octets
Essayez-le en ligne!
Compte le nombre de correspondances
(.)\1*$
qui se chevauchent, dont une expression régulière qui correspond à un suffixe de caractères identiques.la source
(.)(?=\1*$)
.(?=(.)\1*$)
(donc fondamentalement la même que la vôtre).Brachylog , 4 octets
Essayez-le en ligne!
Explication
Si
ḅ
je travaillais directement sur des entiers (et je ne sais pas pourquoi je ne l'ai pas implémenté pour qu'il le fasse), ce ne serait que de 3 octets carẹ
cela ne serait pas nécessaire.la source
Python 2 ,
4741 octetsEssayez-le en ligne!
36 octets - Pour une entrée plus flexible
Essayez-le en ligne!
la source
dir(object)
est notre ami c:Javascript (ES6),
55523230 octetsUtilisation d'une expression régulière pour faire correspondre le dernier groupe du dernier chiffre
Remarque: première publication. N'hésitez pas à faire des remarques.
la source
/(.)\1*$/
f=
.C,
62564847 octetsUn octet enregistré grâce à @Steadybox!
Essayez-le en ligne!
la source
PHP,
474540 octetsCourir avec
echo <n> | php -nR '<code>
semble une boucle est encore plus petite que ma première réponse. comptez simplement les caractères égaux au dernier. Cela utilise des décalages de chaîne négatifs de PHP 7.1 .
-5 octets par Titus. Merci !
Ancienne réponse:
supprime de droite chaque caractère correspondant au caractère le plus à droite et calcule la différence de longueur.
la source
-R
et$argn
pourrait économiser 5 octets.05AB1E , 4 octets
Essayez-le en ligne! ou comme suite de tests
Explication
la source
CJam , 7 octets
Essayez-le en ligne!
Explication
la source
Gelée , 5 octets
Essayez-le en ligne!
Explication
la source
Perl 5 , 22 octets
21 octets de code +
-p
indicateur.Essayez-le en ligne!
/(.)\1*$/
obtient les derniers nombres identiques, puis$_=length$&
attribue sa longueur à$_
, qui est implicitement imprimée grâce à-p
flag.la source
C (gcc) ,
3229 octetsCeci est un port de ma réponse Python .
Ce travail avec gcc, mais le manque d'un
return
instruction est un comportement indéfini.Essayez-le en ligne!
la source
return
instruction ne fait que stocker la valeur de retour dans EAX. Avec gcc, l'affecter à une variable fait la même chose. Quant à l'arithmétique du pointeur, lorsque vous ajoutez 1 à un pointeur int, il passe au prochain int, pas au prochain octet.Python 2, 51 octets
Prend un entier comme entrée. Essayez-le en ligne
48 octets pour la chaîne en entrée. Essayez-le en ligne
la source
C # ,
6362 octetsGolfé
Non golfé
Non lisible non lisible
Code complet
Communiqués
- 1 byte
- Merci au commentaire de Kevin .63 bytes
- Solution initiale.Remarques
Rien à ajouter
la source
i=>{int a=i.Length-1,b=a;while(a-->0&&i[a]==i[b]);return b-a;}
Python 2 ,
3832 octetsMerci à @xnor pour avoir économisé 6 octets!
Essayez-le en ligne!
la source
MATL ,
65 octets1 octet enregistré grâce à @Luis
Essayez-le sur MATL Online
Explication
la source
&
faisait ça pourY'
:-D Pourquoi ne pas prendre l'entrée comme une chaîne entre guillemets et s'en débarrasserj
?Cubix,
2419 octetsRemarque
Essayez-le ici
Explication
Tout d'abord, développons le cube
Les étapes de l'exécution peuvent être divisées en trois phases:
Phase 1: entrée
Les deux premiers caractères exécutés sont
A
etB
.A
lit toutes les entrées et les envoie sous forme de codes de caractères à la pile. Notez que cela se fait à l'envers, le premier caractère se retrouve en haut de la pile, le dernier caractère presque en bas. Tout en bas,-1
(EOF
) est placé, qui sera utilisé comme compteur pour le nombre de caractères consécutifs à la fin de la chaîne. Puisque nous avons besoin que le haut de la pile contienne les deux derniers caractères, nous inversons la pile, avant d'entrer dans la boucle. Notez que la partie supérieure de la pile ressemble maintenant à:..., C[n-1], C[n], -1
.La place de l'IP sur le cube est l'endroit où se
E
trouve, et il pointe vers la droite. Toutes les instructions qui n'ont pas encore été exécutées ont été remplacées par des no-ops (arrêts complets).Phase 2: Comparaison des personnages
La pile est
..., C[a-1], C[a], counter
, oùcounter
est le compteur à incrémenter lorsque les deux caractères à vérifier (C[a]
etC[a-1]
) sont égaux. L'IP entre d'abord dans cette boucle au niveau duS
personnage, se déplaçant vers la droite. LeE
caractère est la position où l'IP finira (pointant vers la droite) quandC[a]
et n'auraC[a-1]
pas la même valeur, ce qui signifie que la soustractionC[a]
deC[a-1]
ne donnera pas0
, auquel cas l'instruction suivant le!
sera sautée (qui est aw
).Voici les instructions qui sont exécutées pendant une boucle complète:
Et puis il tourne en boucle.
Phase 3: impression du résultat
Depuis que nous avons quitté la boucle au début, la pile ressemble à ceci:
counter, ..., C[a-1]-C[a]
. Il est facile d'imprimer le compteur, mais nous devons l'incrémenter une fois parce que nous ne l'avons pas fait lors de la dernière itération de la boucle, et encore une fois parce que nous avons commencé à compter à la-1
place de0
. Le chemin sur le cube ressemble à ceci, en commençant parS
, pointant vers la droite. Les deux no-op qui sont exécutés par l'IP sont remplacés par des flèches qui pointent dans la direction de l'IP.Les instructions sont exécutées dans l'ordre suivant. Notez que les
B)
instructions à la fin changent la pile, mais n'affectent pas le programme, car nous sommes sur le point de le terminer, et nous n'utilisons plus la pile.Le sort en est jeté.
la source
Lot, 91 octets
Le
-
empêche le test de s'exécuter au début de la chaîne.la source
JavaScript (ES6), 34 octets
Pas plus court que la solution regex.
Fonction récursive qui évalue les chiffres de droite à gauche, s'arrêtant lorsqu'un autre chiffre est rencontré. Le résultat est le nombre d'itérations.
p
estundefined
sur la première itération, ce qui signifie desn%10-p
retoursNaN
(fausse). Après cela,p
est égal au chiffre précédent avecn%10
. Lorsque le chiffre actuel (n%10
) et le précédent (p
) sont différents, la boucle se termine.la source
Röda , 12 octets
Essayez-le en ligne!
Il s'agit d'une fonction anonyme qui s'attend à ce que chaque caractère de la chaîne d'entrée soit poussé vers le flux (je pense que cela est valide dans l'esprit d' une méta-question récente ).
Il utilise deux fonctions intégrées:
count
ettail
:count
lit les valeurs du flux et pousse le nombre d'éléments consécutifs dans le flux.tail
renvoie la dernière valeur du flux.la source
T-SQL,
238214 octetsOu:
la source
Java 7, 78 octets
Essayez-le ici.
J'ai essayé certaines choses en utilisant la récursivité ou une boucle, mais les deux ont fini au-dessus de 100 octets ..
la source
Powershell, 41 octets
boucle directe vers l'arrière jusqu'à ce qu'un caractère ne corresponde pas au dernier caractère de la chaîne, retourne l'index de ce caractère -1.
-3 grâce à @AdmBorkBork - en utilisant une boucle for au lieu d'un certain temps.
la source
Mathematica,
3330 octetsMerci à Greg Martin d'avoir économisé 3 octets.
Prend l'entrée sous forme de chaîne.
Obtient les chiffres décimaux (sous forme de caractères), les divise en séries d'éléments identiques, obtient la dernière série et calcule la longueur avec l'astuce standard de prendre la somme du vecteur
1^list
.la source
Characters
au lieu deIntegerDigits
?Utilitaires Bash + Unix, 34 octets
Essayez-le en ligne!
la source
JavaScript (ES6),
39383727 octetsPeut-être pas plus court que la solution basée sur l'expression rationnelle, mais je n'ai pas pu résister à l'écriture d'une solution entièrement basée sur l'arithmétique. La technique consiste à prendre
n % 100 % 11
et à diviser par 10 à plusieurs reprises jusqu'à ce que le résultat ne soit pas nul, puis à compter les itérations. Cela fonctionne parce que si les deux derniers chiffres sont identiques, len % 100 % 11
sera0
.la source
f=(n,p)=>n%10-p?0:1+f(n/10|0,n%10)
Haskell , 33 octets
Essayez-le en ligne!
Prend l'entrée de chaîne. Coupe à plusieurs reprises le premier caractère et ajoute 1 si tous les caractères du suffixe sont égaux au premier.
la source
R, 35 octets
Brève explication
la source
Befunge-98 , 19 octets
Essayez-le en ligne!
Cela pourrait être raccourci si je réussissais à n'utiliser que la pile.
Comment ça marche:
la source
Python 3 -
5044 octetsProgramme complet (en Python 3,
input()
retourne une chaîne, peu importe l'entrée):la source