Description du défi
Nous avons eu quelques défis concernant la séquence de recherche et de présentation . Rappel rapide:
- La séquence commence par
1
, - Les termes suivants de cette séquence sont générés en énumérant chaque groupe de chiffres répétitifs dans le terme précédent,
Les premiers termes sont donc:
1 "one"
11 "one one" (we look at the previous term)
21 "two ones"
1211 "one two, one one"
111221 "one one, one two, two ones"
312211 "three ones, two twos, one one"
Faisons maintenant la même chose, mais utilisons des chiffres romains à la place. Nous commençons par I
et suivons les mêmes règles (nous appliquons la règle de comptage des chiffres aux caractères à la place, nous lisons donc IVX
au one one, one five, one ten
lieu de one four, one ten
ou d'une autre manière):
I "one"
II "one one"
III "two ones" = "II" + "I"
IIII "three ones" = "III" + "I"
IVI "four ones" = "IV" + "I"
IIIVII "one one, one five, one one"
IIIIIVIII "three ones, one five, two ones" = ("III" + "I") + ("I" + "V") + ("II" + "I")
Étant donné un entier positif N
, soit:
- Sortez les premiers
N
chiffres de cette séquence (tout séparateur raisonnable est bien, ainsi que["I", "II", "III", ...]
- Afficher
N
le terme de cette séquence (il peut être indexé 0).
N'oubliez pas de rendre votre code aussi court que possible, car il s'agit d'un défi de code-golf !
EDIT: Je crois qu'il y a toujours une façon standard / préférée d'exprimer des entiers en chiffres romains (comme 95
-> XCV
au lieu de VC
). Quelques convertisseurs de chiffres romains que j'ai trouvés en ligne corroborent mon opinion. En cas de doute, utilisez un convertisseur en ligne , car répertorier tous les cas de bord possibles et les règles spécifiques d'écriture des chiffres romains n'est pas le but de ce défi.
EDIT2: @PeterTaylor et @GregMartin ont fait remarquer que des chiffres inférieurs ou égaux à 5
apparaître dans la séquence, de sorte que vous n'avez pas à vous soucier de l'ambiguïté des chiffres romains (numéros 1
- 8
sont I
, II
, III
, IV
, V
, VI
, VII
, et VIII
)
la source
4
/IV
/IIII
? Ou95
/XCV
/VC
? Il n'y a peut-être pas toujours une façon unique d'exprimer un entier, mais je suis presque sûr qu'il y en a toujours une préférée (standard) - corrigez-moi si je me trompe.Réponses:
Perl, 49 octets
Comprend +1 pour
-p
Exécuter avec l'index basé sur 0 sur STDIN, par exemple
ecce.pl
:Les formules magiques sont tellement magiques.
Normalement, j'utiliserais
($_=//)x$'
pour raccourcir le contrôle de boucle d'un octet, mais le score sur ce site donne un handicap de 2 donc il finit par 1 octet de plus. Sur les anciennes perles, vous pouvez supprimer l'espace avantfor
. Certaines versions de perl vous obligent à ajouter une finale;
pour fermer la translittération. Mais ce qui est donné ci-dessus est le code qui fonctionne sur mon système.Explication
Reculer de la solution au code:
Les transformations de chaîne dont nous avons besoin:
Chaque remplacement se termine par le caractère répété. J'obtiendrai une séquence des mêmes caractères en utilisant l'expression régulière
/(.)\1*/
, donc cela peut être fait en ajoutant$1
. La partie avant l'->
est$&
. Avec ça j'ai encore besoin:Écrivez
I
comme1
etV
comme 9:En divisant la partie précédente
->
par le chiffre répété, cela devient:Alors maintenant, l'original répété
V
n'est plus une exception. Je veux donc une expression qui rend cela possible:Et cela peut être fait par un simple modulo 182:
(cela arrive même
IIIIII
àVI
droite même si ce n'est pas nécessaire ici)Il ne reste plus qu'à initialiser la variable de travail à
1
pour l'index 0, répéter cette transformation en boucle et à la fin remplacer1
parI
et9
parV
1
,9
Et182
est la combinaison seul paramètre pour lequel cette simple formule fonctionne de.la source
Mathematica,
1139083 octetsMerci à Martin Ender pour ses suggestions qui ont réduit la longueur de plus de 25%!
Affichage des commandes de haut niveau dans Mathematica.
Une fonction pure, prenant un argument N et sortant le Nième élément de cette séquence (indexée 0), comme une liste de caractères. Étalez un peu:
L'extérieur
Nest
itère la fonction à quatre lignes du milieu, en commençant{"I"}
, N fois. La ligne 4 divise la liste des caractères du chiffre romain entré en séries de caractères similaires, compte chaque série avecTally
et place les décomptes avant les caractères qu'ils comptent. La ligne 3 rend les comptes en chiffres romains, puis divise ces chiffres romains en listes de caractères. LaFlatten
commande réduit la liste de listes entière à une liste unidimensionnelle.Voici la version initiale:
la source
@@@
au lieu de/@
vous pouvez utiliser#
et#2
au lieu de#[[1]]
et#[[2]]
. De plus, les listes de caractères sont des types de chaîne acceptables, vous pouvez donc travailler avec ceux-ci et éviter de les utiliserCharacters@
.@@@
raccourci de type! En ce qui concerne les listes de caractères qui sont des types de chaînes acceptables (ce qui, je pense, raccourcirait le code): y a-t-il un article sur ce site auquel vous pouvez me diriger qui décrit les normes de la communauté?Characters
fils automatiquement , vous pouvez utiliser@
,Reverse@#&
est bien sûr la même chose que simpleReverse
, dans ce cas , vous pouvez aussi ne pas besoin de ces parenthèses. Et la notation de préfixe (dans le cas deFlatten
) n'enregistre rien si vous devez ajouter des parenthèses pour le faire fonctionner. Combinant tous ces éléments:Nest[Flatten[Characters@{RomanNumeral@#,#2}&@@@Reverse@@@Tally/@Split@#]&,{"I"},#]&
CJam (
3330 octets)Démo en ligne
La clé de l'exactitude de l'implémentation est le théorème suivant:
Si la première génération est
I
, aucune longueur de course n'est jamais supérieure à cinqLemme: si la première génération est
I
, aucune chaîne ne contient jamaisVVV
. La preuve est par contradiction. Supposons qu'il existe un premier indexn
pour lequel lan
e génération contientVVV
. Si celaVVV
tombe en panne(a)V VV
alors la conversion de la génération précédente est mauvaise: elle aurait dû l'être(a+5)V
. Il faut doncVV V(d)
, et la génération précédente contenueVVVVV
, contredire le choix den
.Supposons maintenant qu'il existe un premier index
m
pour lequel lam
e génération contient...IIIIII...
. Notez qu'il ne peut y avoir aucun chiffre autre queI
etV
dans la chaîne, car aucune génération précédente n'a eu un cycle de neufI
s ou neufV
s. Au plus quatre desI
s proviennent d'une série deI
s dans la chaîne précédente, donc la section correspondante de la chaîne précédente doit être...IIIVV...
donnée... IIII IIV ...
. Puisque laVV
génération inm-1
ne vient pas deVVVVV
(voir lemme), la secondeV
doit être une longueur de chiffreI
, donc dans la générationm-1
nous avons...IIIVVI...
. Et puisque nous voulons que lesI
s initiaux donnentIIII
et nonIVI
ouVI
, il est précédé soit du début de la chaîne, soit d'unV
.Si nous avons
(...V)?IIIVVI...
en générationm-1
, qu'avons-nous en générationm-2
? Nous avons déjà observé que leVV
gén.m-1
doit être analysé comme(a)V V(I)
.Supposons que nous prenions
a=2
:(...V)?I IIV VI...
En fait, cela doit être...VI IIV VI...
, bien que cette directionV
puisse faire partie deIV
; donc dans la génération précédente, nous avons soit(...V)? IIII VV IIIII...
ou(...V)? IIIII VV IIIII
. Dans les deux cas, nous rencontrons des problèmes avecVVIIIII
: la secondeV
doit être une longueur de course, mais...VI IIII...
nécessite ensuite une paire suivante (longueur de course, chiffre) avec le même chiffre.Il faut donc
a=1
:(...V)?II IV VI...
. Puisque la générationm
est la première avec une série de sixI
s, cela doit être le cas(...V)? II IV VI...
, de sorte que la génération l'm-2
est(...V)? I V IIIII...
....VIVIIIII...
est impossible: cependant on choisit d'interpréter la secondeV
on se retrouve avec deux paires consécutives (run-length, digit) avec le même digit.Par conséquent, la génération
m-2
doit être^IVIIIII...
analysée comme^IV IIII I(V)...
ou^IV III II(V)...
. Ceux-ci donnent respectivement la générationm-3
comme^V III V ...
ou^V II VV...
.Mais si nous regardons le début des chaînes commençant par la première commençant par
V
, nous obtenons un cycle:et donc aucune génération ne commence jamais avec
VIIIV
ouVIIVV
. Nous devons conclure qu'il n'y en a pasm
.Dissection
la source
Python 3, 195 octets
Il y a beaucoup d'octets perdus sur les chiffres romains, donc il y a probablement du golf à faire là-bas.
Merci à @ El'endiaStarman, @ Sherlock9 et @Shooqie
Ideone it!
la source
for v,i in(5,"V"),(4,"IV"),(1,"I")
for v,i in(5,"V"),(4,"IV"),(1,"I"):a,x=divmod(x,v);r+=i*a
enregistre un octet.i
(comme dansfor i in range(...)
). J'ai essayé de barboter,exec
mais cela s'est échappé1
dans la méthode «sub» semble perturber le code, je n'ai pas pu trouver de solution.range
R,
110107 Octetsas.roman
combiné avecrle
rend cela facile. Abus de portée et comportement de chat intégré de<<-
sauvegarde quelques octets.Prend N depuis la console. Produit les 2 à N premiers termes de séquence (ce qui, je crois, est conforme aux spécifications ...)
la source
JavaScript (ES6), 107
Fonction récursive renvoyant le Nème terme basé sur 0
Tester
la source
Perl 6 , 62 octets
Fonction anonyme qui accepte un index de base zéro.
Utilise le fait que les nombres romains supérieurs à 5 ne sont pas nécessaires, car les seuls groupes de chiffres répétitifs qui peuvent se produire sont:
( essayez-le en ligne )
la source