esmpmpmeimtmemqmememqicelic
esmpmpmeimememqmlmtmemoc
esmpmpmeimememqmtmtmtmtmeic
esmpmpmeimememqmtmtmtmtmeic
esmpmpmeimeiscic
esmpmpmeimemeimfsic
esmpmpmeisciscimqmtmemeic
esmpmpmeiscimlmqmqmemeic
esmpmpmeimemomqmqmemeic
esmpmpmeisciscimfsimqic
esmpmpmeimeiscic
esmpmpmeisciscimfsimqic
esmpmpmeimemomqmemqmemtmemoc
esmpmpmeiscic
esmpmpmeimemomeimqmeic
esmpmpmeimemeimqmlmtmeic
esmpmpmeimtmtmqmemtmtmeic
esmpmpmeimemomqmqmtmeic
esmpmpmeimemqmqmemeic
esmpmpmeiscimlmqmqmemeic
esmpmpmeiscimqmtmtmtmqmemeic
esmpmpmeimeimemtmqmemeic
esmpmpmeimeiscimlmlmtmlmtic
esmpmpmeimemeimqmlmtmeic
~~
Tous les sauts de ligne sont à des fins esthétiques et peuvent être supprimés sans affecter le programme.
Essayez-le en ligne!
Explication
Après que Lynn ait été supprimée {|}
de la liste des personnages autorisés, j'ai dû essayer quelque chose de nouveau. Il s'avère que nous pouvons encore construire des chaînes arbitraires et les évaluer comme du code.
Tout d'abord, nous devons mettre de la valeur dans la pile. Les seuls éléments intégrés disponibles qui poussent quelque chose sans faire sauter autre chose en premier (et sans lire l'entrée) sont es
, ea
et et
. Je suis sûr que vous pourriez commencer à partir de tout cela d'une manière ou d'une autre, mais je suis allé avec es
ce qui pousse l'horodatage actuel. Comme je ne voulais pas faire d'hypothèses sur sa valeur réelle, je teste sa primalité avec mp
(qui donne 0
et 1
) et teste à nouveau la primalité de cette valeur pour m'assurer que j'ai un 0
sur la pile. Un 1
sera plus utile, donc nous calculons exp(0)
avec me
et le transformons en un entier avec i
. Donc, tous les chiffres commencent par:
esmpmpmei
Maintenant, nous avons un tas d'opérateurs mathématiques unaires avec lesquels travailler:
i int(x) (floor for positive numbers, ceiling for negative)
me exp(x)
ml ln(x)
mq sqrt(x)
mo round(x)
mt tan(x)
Nous pouvons également combiner quelques éléments intégrés pour des fonctions plus élaborées de x
:
sci Extract first digit of x and add 48 (convert to string, convert
to character, convert to integer).
ceui Convert to character, convert to upper case, convert to integer.
celi Convert to character, convert to lower case, convert to integer.
mfsi Get a sorted list of prime factors of x and concatenate them into
a new number.
mfseei Get a sorted list of prime factors, interleave it with 1,2,3,..., and
concatenate the result into a new number.
En utilisant ces derniers, nous pouvons obtenir n'importe quel nombre dans 0 <= x < 128
(et beaucoup d'autres) en moins de 10 étapes 1
. Je suis sûr qu'un sous-ensemble beaucoup plus petit de ces commandes suffirait également. J'ai écrit un petit programme Mathematica pour déterminer tous ces extraits (ce n'est pas très lisible, désolé):
codes = SortBy[
Select[Nest[Select[DeleteDuplicatesBy[SortBy[Join @@ (Through[{
List,
If[1 <= # < 50, {Exp@#, #2 <> "me"}, Nothing] &,
If[# >= 1, {Log@#, #2 <> "ml"}, Nothing] &,
If[# > 1, {Sqrt@#, #2 <> "mq"}, Nothing] &,
{If[# > 0, Floor@#, Ceiling@#], #2 <> "i"} &,
{Floor[# + 1/2], #2 <> "mo"} &,
{Tan@#, #2 <> "mt"} &,
If[NumberQ@# && # >= 0, {First@
ToCharacterCode@ToString@#, #2 <> "sci"},
Nothing] &,
If[IntegerQ@# &&
32 < # < 65536, {First@
ToCharacterCode@
ToUpperCase@FromCharacterCode@#, #2 <> "ceui"},
Nothing] &,
If[IntegerQ@# &&
32 < # < 65536, {First@
ToCharacterCode@
ToLowerCase@FromCharacterCode@#, #2 <> "celi"},
Nothing] &,
If[IntegerQ@# && # > 0, ## & @@ {
{FromDigits[
"" <> (ToString /@ (f =
Join @@ Table @@@ FactorInteger@#))], #2 <>
"mfsi"},
{FromDigits[
"" <> (ToString /@
MapIndexed[## & @@ {#2[[1]] - 1, #} &, f])], #2 <>
"mfeesi"}
}, Nothing] &
}@##] &) @@@ #, StringLength@*Last],
First], #[[1]] < 1000000 &] &, {{1, "esmpmpmei"}}, 9],
IntegerQ@# && 0 <= # < 128 &@*First], First]
Avec cela, nous pouvons simplement pousser une liste arbitraire de codes de caractères, en convertissant chacun d'eux en un caractère avec c
ensuite. Une fois que nous avons poussé tout le code que nous voulons exécuter, nous poussons 95
( ]
). Nous évaluons celui-ci avec ~
pour envelopper tous les autres dans une chaîne, puis nous évaluons cette chaîne avec ~
.
Le code réel exécuté à la fin du programme est à nouveau:
ri__2#,:)/2/[1W]f.%:~<p
Voir ma solution précédente pour une explication.
¦
ça marche me tue à chaque fois, j'ai essayé hier mais avecṚ
plutôt queU
et j'ai décidé que çaḤ
ne marchait pas.