La description
Le code original de Mauris fait ce qui suit:
"f~" e# Push that string on the stack.
:i e# Cast each to integer. Pushes [102 126].
:# e# Reduce by exponentiation. Pushes 102^126.
Aucun autre opérateur mathématique de CJam ne donnerait un nombre aussi élevé pour de petites entrées, il :#ne peut donc pas être modifié. Puisque #, lorsqu'il est utilisé pour l'exponentiation, ne prend que des entiers en entrée, :iil ne peut pas être supprimé également. Cela ne laisse qu'un seul endroit pour modifier l'entrée: la chaîne "f~".
Quel que soit le nombre de caractères de la chaîne, le résultat sera une tour de puissance associative de gauche. CJam prend en charge les caractères compris entre 0 et 65535 (à l'exception des substituts), nous devons donc exprimer la sortie sous la forme b n × k × j , où b , n , k et j sont des entiers dans cette plage.
Le logarithme décimal de l'entier résultant du code modifié est légèrement plus petit que log 10 (2,44 × 10 242545 ) = log 10 (2,44) + 242545 , nous pouvons donc diviser cette valeur par les logarithmes de toutes les bases possibles pour trouver les valeurs appropriées pour n × k × j .
En réalité:
$ cjam <(echo '65536,2>{2.44AmL242545+1$AmL/i:I#s8<"24399707"=}=SIN')
5 347004
La comparaison des 8 premiers chiffres s'est avérée suffisante.
Cela signifie que nous pouvons exprimer la sortie comme 5 347 004 = 15625 57834 = 125 9 × 102 × 126 ,sorte qu'il suffit de remplacer "f~"avec "㴉"ou"} f~" .
Code
"㴉":i:#
ou
"} f~":i:#
Notez que les espaces dans le code ASCII doivent en fait être un tabulateur.
Tenter d'exécuter ce code dans l'interpréteur en ligne est probablement une mauvaise idée, mais voici comment vérifier les résultats à partir de la ligne de commande:
$ wget -q https://bpaste.net/raw/f449928d9870
$ cjam <(echo '[15625 57834]:c`":i:#") > mauris.cjam
$ cat mauris.cjam; echo
"㴉":i:#
$ cjam mauris.cjam | diff -s - f449928d9870
Files - and f449928d9870 are identical
$ echo -en '"}\tf~":i:#' > mauris-ascii.cjam
$ cat mauris.cjam; echo
"} f~":i:#
$ cjam mauris-ascii.cjam | diff -s - f449928d9870
Files - and f449928d9870 are identical