~(#)
Попробуйте онлайн! (или попробовать здесь чтобы избежать тайм-аута)
Выходы 2.
Объяснение.
Цель состоит в том, чтобы вывести символ ASCII " print(3*10**456570)
" in a 7-byte or less program.
Код и данные Malbolge занимают одно и то же пространство памяти. Когда загружается программа Malbolge, последние две однобайтовые инструкции действуют как «начальные числа», которые определяют, как инициализируется оставшаяся память (детерминированным, но довольно неконтролируемым образом). Итак, если мы попытаемся создать 5 командно-байтовых программ, которые используют содержимое памяти для генерации кодировки ASCII для " 48 136118222288577729572552152791709368605773628347021471008690822115373392141244799774415998107055377981742447271161172093778621602759645881735548840779482802560209189517746243033627985739511100518293138471484155429274889918272710559291982273929396912514475806069037521031407489333870378703173662910402083164029699758795021006600087782123480276870349030965867563726975877728510764214971834340717031826050329624446895168002822671009104546726772407954859794475567312583905626817398451742396403319735329821368897163429801670218889821848435198982270769585133239840182076928600225425386926305906233725574337009104530356853863448383654832344408718772724757372631143287400290703116853900133240035664821661976772888810467002790969870927064001031662898740474966711631710727286951427698675681491111582579107155062882709864229052873760966169264245600186093538370974908907020474070930611562816292100183878427364763405389786799631792649382212389347264227332059441821014321577413408905755610100524739302573178913805937883513832378054230283344383753275902621779919104894612137194747465109053363132937703205299899090062685892622098070989799300096851455096301228710972701865038051936551041342440525433281771038877777161882636844059426594521805350407152290165733138028576146967247522643744694141195004623423857857693427850032738203686267421228588828435013088446245077772203162760491431357812801871298876631302950079959010177847566668826266369346040779302669462790393198104623019338124802383380441313038602352462845958086644089497490467594136351122837597449672487010313897868432189301305885675861325709179122431375903938149903427353406026693988298068066087414204535567217531278847246663063521026232422013930241593518848232749733716027932971967899916260405600669083231342566885341691912368360136490149146410247155251733391927312938665018633466748949229241307444214633067906713336048685943513134140263372359696945716406670478168007378272916725550905826132341140883161990841937113616809856754859509173906225877693272986499970529936397933788880924831441272134709649991804869975215537765013304261103280798035738449283801074367455416975896866833656686794976325679828000354046625307811860168996790355272279436375392093313679100121487235860221918848736347751782535229777178218227648706506003129525970134666691479694925217524902959803338422438060038658440582225592904612537669959087757488373578611752282868269275950214371229748731729215641332246654869362216109284862185496124584262579953474203167872603070470067950478753207808608248943878860011908115468802190546000519840247324568161439611525769820989196058123147718137077000120913662868599382356603269721601449988482683980532792892177658333875496383645485133701798213530386049902190319666619680418627484562095523349838908554879800729189834397636333150687591784783593636695475815080002634570530677847790228554244311329470586241698758265462755938042304017099033993858637076639260904636077951244351657896256391998258900387543477862789459882688297086948688007197707992577339183010173354065933555655553421866069534486864447491231024219783356908661520568506172333653043056654975852125377780460189002009695349728259441892176823884813139372756407875800289098734167129099381792737264454097003678873187452677901588877289663613161551851497712147029113595405001612731177702538079055158748598170770058186080901509151495332123511968083584199679029073876741472874261160159173180904406481520378171876773781817052362670957754076341052151226864982044423001068087857032658832611786035188675526138932008287577260700322890640413383485742814765880396419208969263227721270455088178847430617675460588467868983618120954389404362140231158416321704501412371098629111850576048849097883084678663620297477847964712187292115607313892012356396662805274189107494467684644891521782414262128173708455480707454354968100553678330533006106890027275388315886464487511584246560889155661821779830187538375406868333151665726444207031130208083500148213129337075506341798868095841311106337887887291979827246042278337117981115263174824668396544795084846659779500193321324649508077325582071348037416574693493790019348532848623137704882189995492207319495341511822520469501170794388924439459462165936478786200751196030621197856797511117488998623310034898658778486649937046992404397946797175451641601275425983240032855623615931663152448038884938302103599522781131691794955910668601656339114328483085213740867710698818388423094906297631419655436847220572682142406966844544894284269328182913703189411753835932978396033829515305455631318696053728968876051410783596705077112312728424202529475578776676152981258884551184505959739004252170359641105692336889964755135425463797747654176970663980003607348930037794652574271713970
", we can try different combinations of the remaining 2 commands/bytes to try to find one that gives the correctly-initialized memory to achieve this. There are 8 valid Malbolge commands (and any other byte in the program will generate an error upon loading), so this gives us 8x8 combinations to try per 5 byte program. This is obviously less than the 1/256 chance of 'hitting' the ASCII character " n^ceiling(log(1.7e308,n))
" в любом конкретном байте, поэтому нам, вероятно, придется попробовать более одной программы.
Каждая команда Malbolge самомодифицируется сразу после выполнения, что затрудняет повторное использование. Итак, здесь мы пробуем только однопроходные программы, без каких-либо попыток зацикливания. Нам нужно будет использовать команды log(1.7e308,n)
(set the data pointer), n
(запишите значение ASCII на вывод) и (вероятно) 28^213
(end the program). This gives us room for 2 more data-altering commands in within the 5-byte limit, so we can try combinations of -[>+<-----]>++.
(поворот) и x=>'909'.repeat(1e7/3)
(tritwise OP operation), as well 1e7-1
(никакой операции; но в Malbolge это изменяет указатель данных как побочный эффект, поэтому это также может повлиять на вывод).
К сожалению, после перебора всех 64 комбинаций последних двух байтов в программах Malbolge 9999999
, x=>'9'.repeat(1e7-1)-1
, =1E250
, 16ḟ # Push the factorial of 16: 20922789888000
↔ # Reverse (but remain an integer): 88898722902
↔ # Reverse back: 20922789888
, 16ḟ↔↔
, k× Push 2147483648 onto the stack
=> [2147483648]
: Duplicate the stack
=> [2147483648, 2147483648]
\(+ Concatenate the last element of the stack with `(`
=> [2147483648, '2147483648(']
33* Multiply by 33 the string on top of the stack
=> [2147483648, '2147483648(21 ... 8(2147483648(']
\↵+ Add `↵` to the string on top of the stack
=> [2147483648, '2147483648(21 ... 8(2147483648(↵']
Ė Evaluate as vyxal code the last element of the stack (see the cop thread)
=> [ <lowest bound> ]
› Add 1 to the result
=> [ <lowest bound +1> ]
implicit output
, k×:\(+33*\↵+Ė›
, 2e98
, (&<`q#
and j*p</j
(где 2
represents any of the 8 Malbolge commands), we can only generate the output numbers 0, 1, 3, 5, 6, 7, 8, 9. At this point it seems likely that Камила Шевчик возможно, использовали аналогичный подход и поэтому надеялись, что создание персонажа " /j
" in 7 bytes or less is impossible...
Но: как насчет более коротких программ, в которых отсутствует 2L
(end the program) command? These allow the memory to be initialized differently, and so we can maybe find a combination that enables output of " <j
«...но интерпретатор Malbolge теперь продолжит читать байты из остальной части инициализированной памяти и выполнять их как команды с довольно неконтролируемыми последствиями! Тем не менее, если он достигнет 2
(end of program) before it hits a j*p<..
(записать вывод), это может быть хорошо: давайте попробуем!
После недолгих поисков мы обнаруживаем, что <
is indeed able to initialize the memory to output " v
", используя две разные комбинации суффиксов: при тестовом запуске, 2
unfortunately keeps running and outputs an additional " v
"прежде чем остановиться, но 2
stops after the " .
". Это трещина!
Для загрузки в Мальбольге финальную программу - j*ppp<v
- must finally be encoded using a series of operations (see the spec) to yield the final loadable code of j*pp<v.
.