Une contre - chaîne est une sorte de données de test auto-descriptives utilisées dans les tests de logiciels. Je ne suis pas sûr qu'il ait été inventé par James Bach , mais je le sais de là.
L'idée est la suivante: les données de test contiennent de nombreux astérisques ( *
). Le nombre devant l'astérisque vous indique la durée des données de test à ce stade. Si vous avez besoin de connaître une position dans les données de test qui n'est pas un astérisque, recherchez le dernier astérisque, regardez le numéro avant et ajoutez le nombre de chiffres qui suivent.
La séquence commence comme ceci:
2*4*6*8*11*14*17*20*23*
^
Comme vous pouvez le voir, l'astérisque marqué est en position 14.
Si un fichier se trouve tronqué comme suit
[...]2045*20
vous pouvez alors déduire qu'il y a une limite de 2047 caractères quelque part (2045 où l'astérisque est plus 2 pour 2
et 0
).
C'est votre tâche de créer le programme le plus court (c'est le code-golf ) qui génère (std :: out ou fichier ou autre) une longue chaîne de test arbitraire de ce format. La longueur en caractères est donnée en argument. Le programme doit prendre en charge jusqu'à 2 Go de données de test (valeur d'entrée 2147483647 caractères).
Positions "dangereuses" dans le fichier de 2 Go:
8*11*
98*102*
998*1003*
9998*10004*
99998*100005*
999995*1000003*
9999995*10000004*
99999995*100000005*
999999995*1000000006*
Cela devrait répondre à la question de @Leaky Nun s'il y a une décision à prendre entre 995 * 999 * et 995 * 1000 * ou similaire: non.
La fin du fichier de 2 Go avec la valeur d'entrée 2147483647 est:
2147483640*2147483
995*999*
et995*1000*
ou quelque chose comme ça?Réponses:
Haskell,
6058 octetsEn fonction, nous obtenons:
Programme complet,
7270 octetsCela génère une contre-chaîne infinie vers STDOUT:
La saisie de la longueur nécessite 20 octets supplémentaires:
Cela fonctionne jusqu'à votre taille approximative de RAM, car Haskell utilise par défaut les types intégraux numériques
Integer
.la source
Pyth,
25171514 octetsEssayez-le en ligne.
La longueur est prise via STDIN.
la source
Python 2,
7472666461 octetsPrend un entier n et génère une contre-chaîne de longueur n.
version du programme, 69 octets:
Prend un entier n de stdin et imprime une contre-chaîne de longueur n.
Version alternative plus courte, mais presque fonctionnelle:
la source
PowerShell v5, 97 octets
Prend l'entrée comme argument de ligne de commande
$n
, définit l'aide$l
que nous utilisons pour garder une trace de notre longueur entière. Ensuite, nous bouclons0
jusqu'à$n
. Chaque itération, on incrémente$i
par la.length
de la chaîne formée à partir$i
et un astérisque. Ensuite, si le.length
de$i
change (par exemple, nous sommes passés de 2 chiffres à 3 chiffres), nous incrémentons à la fois la$l
variable helth ength et$i
(pour tenir compte du chiffre supplémentaire). Nous utilisons ensuite laadd-content
commande pour ajouter"$i*"
au fichier.\o
dans le répertoire courant, avec-n
oNewLine.NB
-noNewLine
paramètre a finalement été ajouté dans cette version.[int]
à[double]
(non, je ne sais pas pourquoi il ne va pas[long]
), donc cela traitera correctement les entrées jusqu'à et plus que2147483648
, sans problème. Théoriquement, il gérera les entrées quelque part jusqu'à environ1.79769313486232E+308
(valeur maximale de[double]
) avant de se plaindre, mais je m'attends à ce que le disque se remplisse avant que cela ne se produise. ;-)10
cela produira2*4*6*8*11*
, car11
la première$i
valeur est supérieure à l'entrée.PowerShell v2 +, également 97 octets (non concurrents)
Au lieu d’envoyer vers un fichier, cela encapsule les itérations de boucle, puis
-join
les rassemble dans une chaîne. Cela lui permet de fonctionner pour les versions antérieures à la v5. Cependant, puisque .NET définit un[string]
avec un constructeur commeString(char c,Int32 length)
, cette version ne satisfait pas l'exigence d'entrée maximale, car la chaîne de sortie va déborder et barf.En outre, vous ne souhaiterez peut-être pas avoir une chaîne de ~ 2 Go flottant dans votre pipeline. Je dis juste.
la source
[double]
s est 64 bits. Par exemple, lancezfor($i=2147483645;$i-lt2147483655;$i++){"$i - " + $i.GetType()}
affiche une progression constante de$i
mais lesType
changements à2147483648
ladouble
. Je suis sûr qu'à un moment donné, cela cessera de fonctionner, probablement autour de ~ 15 chiffres de précision ou lorsque le.ToString
commence à utilisere
. Le[double]::MaxValue
était plus d'une blague que une limite jetable grave supérieure.Python 3,
12611499 octetsUne fonction qui prend l'entrée via l'argument du nombre de caractères auquel tronquer la chaîne et imprime dans STDOUT.
Comment ça fonctionne
La différence entre les nombres de la chaîne est initialement de 2. Chaque fois qu'un ordre de grandeur est passé, cette différence est augmentée de 1; ceci peut être réalisé en prenant la différence entre le nombre de chiffres du numéro actuel et le nombre de chiffres du numéro actuel ajouté à la différence, qui est 1 uniquement lorsque cela est nécessaire. La fonction boucle simplement pendant que la longueur de la chaîne est inférieure à l'entrée, ajoute à la chaîne et met à jour la différence et le nombre selon les besoins, puis tronque avant l'impression.
Essayez-le sur Ideone
Version de sortie infinie, 69 octets
la source
R, 92 octets
Exemple de sortie:
la source
Gelée ,
221918 octetsEssayez-le en ligne!
Trouvez les premiers
n
nombres de la chaîne, puis rejoignez la liste avec un astérisque. Ce sera toujours plus long quen
ce qui a été autorisé par OP dans les commentaires.Le programme met à jour sélectivement le registre avec le numéro actuel dans la séquence de la
#
boucle avec¹©=¡
. J'espérais que cela pourrait être plus court, en mettant©
après le deuxièmeµ
par exemple, mais malheureusement cela ne fonctionne pas et je n'ai rien compris de plus court.la source