esmpmpmeimtmemqmememqicelic
esmpmpmeimememqmlmtmemoc
esmpmpmeimememqmtmtmtmtmeic
esmpmpmeimememqmtmtmtmtmeic
esmpmpmeimeiscic
esmpmpmeimemeimfsic
esmpmpmeisciscimqmtmemeic
esmpmpmeiscimlmqmqmemeic
esmpmpmeimemomqmqmemeic
esmpmpmeisciscimfsimqic
esmpmpmeimeiscic
esmpmpmeisciscimfsimqic
esmpmpmeimemomqmemqmemtmemoc
esmpmpmeiscic
esmpmpmeimemomeimqmeic
esmpmpmeimemeimqmlmtmeic
esmpmpmeimtmtmqmemtmtmeic
esmpmpmeimemomqmqmtmeic
esmpmpmeimemqmqmemeic
esmpmpmeiscimlmqmqmemeic
esmpmpmeiscimqmtmtmtmqmemeic
esmpmpmeimeimemtmqmemeic
esmpmpmeimeiscimlmlmtmlmtic
esmpmpmeimemeimqmlmtmeic
~~
Tutti gli avanzamenti di riga sono a scopo cosmetico e possono essere rimossi senza influire sul programma.
Provalo online!
Spiegazione
Dopo la rimozione di Lynn {|}
dall'elenco dei personaggi consentiti, ho dovuto provare qualcosa di nuovo. Si scopre che possiamo ancora costruire stringhe arbitrarie e valutarle come codice.
Innanzitutto, dobbiamo ottenere un certo valore nello stack. Gli unici built-in disponibili che spingono qualcosa senza far apparire prima qualcos'altro (e senza leggere l'input) sono es
, ea
e et
. Sono sicuro che potresti iniziare da tutto questo in un modo o nell'altro, ma sono andato con ciò es
che spinge l'attuale timestamp. Dal momento che non volevo fare ipotesi sul suo valore reale, collaudo la sua primalità con mp
(che dà 0
e 1
) e testerò nuovamente la primalità di quel valore per assicurarmi di averne uno 0
in pila. Una 1
sarà più utile, quindi si calcola exp(0)
con me
e di trasformarlo in un intero con i
. Quindi tutti i numeri iniziano con:
esmpmpmei
Ora abbiamo un sacco di operatori di matematica unari con cui lavorare:
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)
Possiamo anche combinare alcuni built-in per funzioni più elaborate di 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.
Usando questi, possiamo ottenere qualsiasi numero in 0 <= x < 128
(e molti altri) in meno di 10 passaggi da 1
. Sono sicuro che basterebbe anche un sottoinsieme molto più piccolo di questi comandi. Ho scritto un piccolo programma Mathematica, per determinare tutti questi frammenti (non è molto leggibile, scusa):
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]
Con ciò, possiamo semplicemente spingere un elenco arbitrario di codici di caratteri, convertendoli successivamente in un carattere c
. Una volta che abbiamo inviato l'intero codice che vogliamo eseguire, spingiamo 95
( ]
). Valutiamo quello con cui ~
avvolgere tutti gli altri in una stringa e quindi valutiamo quella stringa ~
.
Il codice effettivo eseguito alla fine del programma è di nuovo:
ri__2#,:)/2/[1W]f.%:~<p
Vedi la mia soluzione precedente per una spiegazione.
¦
funziona mi uccide ogni volta, l'ho provato ieri ma conṚ
piuttosto cheU
deciso cheḤ
non funzionava.