Starry est un langage de programmation ésotérique amusant dans lequel le code consiste uniquement à déterminer +*.,`'
où la commande réelle représentée par chacun de ces caractères est déterminée par le nombre d'espaces devant lui. Cela rend difficile même de relever des défis de sortie fixe, car différentes commandes peuvent représenter un nombre d'octets très différent. En particulier, les littéraux numériques ont une représentation unaire, ce qui oblige à construire de plus grands nombres en opérant sur des plus petits.
Par conséquent, ce défi consiste à écrire un programme qui peut jouer à de tels programmes Starry.
Comment fonctionne Starry?
(Quelques détails ne sont pas spécifiés sur les esolangs, donc je vais avec le comportement de l' interpréteur Ruby .)
Starry est un langage basé sur la pile, avec une seule pile de valeurs entières de précision arbitraire (qui est initialement vide).
Les seuls personnages significatifs sont:
+*.,`'
et les espaces. Tous les autres personnages sont ignorés. Chaque séquence d'espaces suivie d'un de ces caractères non-espace représente une instruction unique. Le type d'instruction dépend du caractère non-espace et du nombre d'espaces.
Les instructions sont les suivantes:
Spaces Symbol Meaning
0 + Invalid opcode.
1 + Duplicate top of stack.
2 + Swap top 2 stack elements.
3 + Rotate top 3 stack elements. That is, send the top stack element
two positions down. [... 1 2 3] becomes [... 3 1 2].
4 + Pop and discard top of stack.
n ≥ 5 + Push n − 5 to stack.
0 mod 5 * Pop y, pop x, push x + y.
1 mod 5 * Pop y, pop x, push x − y.
2 mod 5 * Pop y, pop x, push x * y.
3 mod 5 * Pop y, pop x, push x / y, rounded towards -∞.
4 mod 5 * Pop y, pop x, push x % y. The sign of the result matches the sign of y.
0 mod 2 . Pop a value and print it as a decimal number.
1 mod 2 . Pop a value and print it as an ASCII character. This throws an error
if the value is not in the range [0, 255].
n ` Mark label n.
n ' Pop a value; if non-zero, jump to label n.
Notez que l'interpréteur analyse le code source pour les étiquettes avant le début de l'exécution, il est donc possible de sauter en avant comme en arrière.
Bien sûr, Starry a également des commandes d'entrée (à utiliser de ,
manière analogue à .
), mais celles-ci ne sont pas pertinentes pour ce défi.
Le défi
Étant donné une chaîne, générez un programme Starry qui ne prend aucune entrée et imprime cette chaîne exactement dans STDOUT.
Vous pouvez écrire un programme ou une fonction, en prenant une entrée via STDIN (ou l'alternative la plus proche), un argument de ligne de commande ou un argument de fonction et en sortant le résultat via STDOUT (ou l'alternative la plus proche), la valeur de retour de la fonction ou le paramètre de la fonction (out).
Vous pouvez supposer que la chaîne ne dépasse pas 128 caractères et qu'elle ne sera composée que de caractères ASCII imprimables (points de code 0x20 à 0x7E).
Votre solution devrait traiter une telle entrée en moins de 5 minutes sur une machine de bureau raisonnable (il y a une certaine marge de manœuvre; si cela prend quelques minutes de plus sur mon ordinateur portable, cela ne me dérange pas, mais si cela prend 15, je disqualifierai il).
Votre solution sera testée sur un certain nombre de chaînes différentes répertoriées ci-dessous. Votre score est le nombre total d'octets des programmes Starry correspondants. En cas d'égalité, le métagolfer le plus court l'emporte. Autrement dit, ne vous embêtez pas à jouer à votre propre code à moins qu'il y ait une égalité (ce qui, je pense, ne se produira que dans le cas où une solution optimale est possible).
Vous ne devez pas optimiser votre code vers les cas de test spécifiques répertoriés ci-dessous. Plus précisément, vous ne devez pas coder en dur des solutions artisanales pour eux. L'optimisation vers des classes de chaînes dont la structure est similaire à celle des chaînes données est très bien. Si je soupçonne quelqu'un d'avoir des solutions de codage en dur, je me réserve le droit de remplacer tout ou partie des cas de test (avec des chaînes de structures comparables).
Cas de test
Chaque ligne est un cas de test distinct:
Hello, World!
pneumonoultramicroscopicsilicovolcanoconiosis
.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.
Hickory, dickory, dock. The mouse ran up the clock. The clock struck 1. The mouse ran down. Hickory, dickory, dock.
36912059868043514648560046917066768694455682545071266675083273015450033938555319356951628735735013250100789433961153496780296165
bVZ48121347GLtpYnt76CZSxTpMDs6791EJE808077eySXldY162424ddTB90707UupwlWGb63618542VhA252989453TXrWgqGm85899uHOAY2oAKE198GOVUttvW63
7MYxoWBNt180CDHS5xBGvU70HHVB17bh8jYzIIiU6n6g98Rose1nOe8Svcg56nax20q30kT3Ttb2jHl5q2Iuf1vPbjPxm9cyKXwxc0OUK8pr13b2n7U9Y7RwQTc26A1I
n9}unwxVa}[rj+5em6K#-H@= p^X/:DS]b*Jv/_x4.a5vT/So2R`yKy=in7-15B=g _BD`Bw=Z`Br;UwwF[{q]cS|&i;Gn4)q=`!G]8"eFP`Mn:zt-#mfCV2AL2^fL"A
Les crédits pour le deuxième cas de test vont à Dennis . Les crédits pour le quatrième cas de test vont au Sp3000.
Solution de référence
Voici une solution de référence vraiment basique dans CJam:
q{S5*\iS*'+S'.}%
Vous pouvez l'exécuter sur l'ensemble de la suite de tests ici. Les scores sont:
1233
5240
4223
11110
7735
10497
11524
11392
Total: 62954
C'est l'approche la plus simple possible: poussez le point de code de chaque caractère comme un littéral, puis imprimez-le. Il n'utilise pas de petites différences entre les caractères consécutifs, l'impression entière, les parties répétitives de la chaîne, etc. Je vous laisse ces choses.
Je pense qu'il y a encore beaucoup à faire. Pour référence, le plus court "Hello, World!" ne fait que 169 octets.