Ищете программы на огромной доске Boggle

25

Каждый символ в этом 64 на 64 текстовом блоке был выбран случайным образом и равномерно из 95 печатных символов ASCII .

/rq$:Zy5*g'$DeGXX2o8y "{@Cg:FR9qih}xh >5$DsF1Fs5Ao~smFp;.RJbV )U
c4\(|Sx*V$10G9xO:NjHKasem%,\9[pPm@&kTaN~HC[;9`lgqlAH(7dt0a-5}LJ[
&sifw9V-.PLRoD~F'dJYA^Q)L#h>$9h!B4b&ceKp8~HndzDm#1/ySydrf5T8[Y%4
U9>HLQ74Qf[^V9tpWrKFcFxZJ::4?z/o]3u,V[B&hB9lFYA0:rW#yql5z9.d*D}U
:M2*O9'7_HMGw_=%@hR>O+(@Dr6MIt(=/{-{4lia0Vmws32wr(fnTmT%HSo&7!uz
\KZWG&KnXh+6E+Q>%pV(<Bnm-d+p~y~]Ta"aw9)]0A_AHz\tP3&}1R^/yPPSgN?8
".7|Uj)S7-k[`yeLO~P2a?z3wiS(R-\k'?z(pVm;;D^k/q84?&7:,E*9$UQ"UbBJ
ME]&*R ,*7PDF4Tw*-;De{YeP_al.CJcJX`@V_y+>^<h{L[^Y"!RxjN^lyA_/Y=(
#C>Zo#Sl;UUD5ChIj'L@rkELk%S*]a$87j\\n;}796m/\NPL>8d-T-hR!7ftw ?A
tV5"E309bAv$jhE6\'8f?VGlBb?z#V;F((3'|}$tfpiNB>"*mxc,X1s:/%x*JQAL
rxYXUJsd?X}^yc|'16539vd=psU'>|y/!$-TRamKcJk^2-aD35h7CcaRNue"8#{;
@yUq?*(72I8@I)So+]RwtKy:mLhjG/f#:U<TXml<PtX*+,ngfZt75-q*gSsyI2tS
|*M*;yz6u2(LZ>W`bth-7G~>|dh'pm}]@"#Oq9%o\W)b,gh%b1O]4F:EGb7ERI=@
ehMo69slKw=S@<j*Q4sfd\1')#)V&yaPF%%ZG6VK\_-$Cab,nrlW"O(<tu&xU=I&
|[g4k2L;FD)=yX0SsE-|vI(mDOccuU(+m\wxgrJxi8ZP[uD)L.!K@]%@q`!pk8Yx
?PZaS3;x,7nK~IHlrCGy~xq:@K/CJ1J^oeac&Tv?6[H>>0lu?(/bh@6J^@S?IY-|
@tdN$K=Ci2;_0Du;L2OO'en|]<_`nX5p3Bes9`8{}fRCV$X&aoQGYS'$j%r<2709
UwETsAo^d!aUZ0vN5,Yq\n%JAIm}%O88FAJK^Jt&=jM\Q1^+^|X8\._"l%hlF+yH
+c^FBFxTGz|f|#kElQs)mS64-3Z\An]|[rQo"OQ+ IP"ARdJ}/OYFQF_/{B 73mU
UPvxNByN[2TT,XgRZ_LwolUVWuR)DjYI7j#mmA8m?&Y}}[_h8@Y-R*,#=1\D*&@*
ePW.w{@z3moe3Vztd,>?*~ZQUvn8$+xw$$f92D*kPZ":;lcTr3m&{*?j$FgZK|cU
IAd'0C{<4b}NuhX1B#gmk'oF4+(@fzP^T?hF/#]g^y rb5][)X-d4Q't~1]HE"tZ
p2Z,%H0$EWF/%|UQm?&]E~=v;9YwxrSs%}df`[ `SfXMJWt86UY1duGAAKkFSrH!
oUyB[soS!N%XYwX]%n K^}CcTE?~.,8`C&l)Jjjp5|z))!o/ "G)sj,{OETsi:KE
4E,':a=,T~YlxdF^<\$fE|f:_-RG}7=m%g\-9a*X]`n<P$D+q7O`+$P&!\"NUs7n
hL@0s 7i^Xp\._4$lZIB9Ql AXX_00K=<hp%55KSO6yWH~cGe%|(p_WzlhPUbH{?
o5b4pi(,]&&jB\hGa:\DQbrYc,n|,b)_E{n~i~+JSxn?%/qJVm|B 8"Jf||L.|M-
 KRxH;T^Z7%ZufyO=nI;[v1\8ZTg\_)ect4DvMTvqtoo(;b~J&'~E2TTD!w1BvGv
Q+1sv>q%1$BaCm%(\%uGH*]emoFwejkhb$gKm=DVG#&:p'";s)&MY30q_cG=.CKJ
q,aWTi|^w2wg3<G_y<n+^Xq2ymHFs#7z[x0l'Lz6N>Mpo?=hAd&58HVMhsh(kQH5
&kSivkn`,KON9xb:$M[L15!D6W?\ASWc#}V#2U;qxKhtil73,!iuG~(lr[tPJQ6w
IZ)0Vp{kEUID:vgwmTMQ#Y]NdX6{'/3bI2x9k 4[>j)&Q0U,t,iA#A%4929o6+n_
SQe/!KubbuXthMe&2\%:'Z`,aaA)V&(v+]0^v-_@*Qg!^K!pCo"@e/|3}.3q^R||
6hF>/jd>(=il~2$KY.^x~K_H)J8Fi)'LOcUr4xJir^v0,c fIsoT<|7K}Bls|36z
MQ|-w=bp)_EY>YtGcW)!@/|Lc:I_<]x.~[|QSgJY1ZX9^e`ojAR6U#zt9!,44}>#
EJzH \gwosC>Z*)H!]1BPaIEYGyk{c0zv{d\#px2@#'-T{{.Qxknxv}"x3#K]w>;
<X(\bNnY_6*7Yu7_3a+wInwt vh=1eBgz>7Bnhs!<t.T#&V{+?p+{.RTN:xz>|,E
$upN*[F4A`~ZDMDt{.&2z+LZ7bcfeJfF9Uy3xX]ZzQ1FvB.U4S!hm$LYCp: wF7h
 47-+lY$"}AExXQ@?!/6}biptH=6N-6&8-T\C8{`i56e'%cimv,0QKYTx) "nkFJ
C:Enw=Q%6J;t6wS+2O,b0v'"OK6GMbr);y#-H86>pCE6wjdk*rR*=reWo57^2TFH
::Nq,t9_S">\o^NZzh|U\^qyh-yt0nvMs%'6\;$%(91gTC=&1q]q-*u*so KrXsE
-Sz>q]l86[OO@\5W<'\XDc,%/=0sV0&1'Etty%f ~,c45IIqy=no.DY{8\?fa<9{
6%3TP:i^q.JzU217CADu}iAzWT""E\{IEMbGDKZB6s*LmlM0|<WA8CP7sR}f?WSL
S`T} 7Tn9!h8P\W 8J\#Mg\o;Qwt&4\UYKf{)O3G&B]sK.bw1!?7=:h$IIOIakD<
H/O5v`ld*35MSsydSQoiAnJ*\!^?'_=6E?c> PtM!rw5y{ZT2xSco){3_?j|wtJp
CT1!e~k8aNgw)LE:}oX4R*<u]TB%\IN8YoMK'bV%L2H{L3'c/|xoTY^&&WPKSyo<
cXma$Rfjj^':^a\?$UOo48]791Wywj7aH1\iP|\l=sjjbjqZB2)-apvjV@q47Spw
OP[kT<l@cKB="n;VC#6a*InmS~$TN{= j)r>S] uH9:E-}y>.Ygc'll$5Y$j]AYt
jB="iGo7[qY~A*nv.\51[<]):^[iZs4s-D_bC'OfM%lHlz;MoxY$Ku]NCt72PYMB
_(myN5'%] C!7FPoGX7+*,Yptuaz;Q6W,;R|U1XEhgq21R7<ncnDB<D_);j.:r0r
Q6!k|Dq`!Jz7l="*n?w@f|h=PA_A)n._ii:s~'n~XsD}?JRIkC9AW^piUfBTU,ui
nf+yZ`7P-(@{>s:{Vz'N 7qB&+UZbm4'0]D~HZNJq.w</3 \cL)WRDP(y]w~L4N/
!!lA+NK[+9#-iwx`PE53D.K2]]#M.Rm$^Cc'|!@cX6{yCg8K0|>E_jyup|+'=#c%
Ao5$B);DoQ#jg[7GbdE+o:R,T#@`;UnX}.?2z\RJ98Se*_.*e8mCUF}Vw1u13cy1
2s}1@?{0);Jo6(J@l>[M 0CkeO6{ExN7,%Kv1#[!** czaX)=;Q~D;z',fkq!1W<
% f(i#i`PQY!m7v#D:j5pyU]8:at2,k("BWZRI<WR??GQ$^1d[m,F(<e5CLv-m*B
CD)zVpa95WpJ K@&}yN\Q8I<%z/*_/bPsR5=0\Z=#mWZDAfA5[k|$Yks@Q;@h,s/
Np.$gTvz>T+"0|$Nw::%m$GFYxG{2akv$Eh8\4|eW'oJEffNzJ>UxU4>oITZMe/'
EMg$>kD|\ ^.W)Stzv/7z\^bdi]E@] U&-r8(B^?}$P56[?e~jE#_j)5=#~.yNP$
'mgF3EAhXB 55)\WXp*e+fD#^&SHGx++7VO[R7*b(Q+:jESt'K%m~d$Bv^/{7=zr
5oCZDp& ;*Y*G`L$C]Nm`|^:y2NKaO!)u/{hwm(VjS`<qKgNw7[+~0 <be'sWjTo
.3!sPGuFFZ@9.4u*ml)pLeEVJ~8A$mgz*d>ajbg1FIYrg6J`D0xJMXi`ghA1V$ju
*rJg/ o;6M7`(qTF.nO'4da,{ieM&NC9rg;nX*))*DK"DycYD66&6z/I@}y4@$<f
3S]~9g An{=Rj|y&A2Vh^F\3lb#N~8w0EMx<K$]z(eZS~zbmgeeV\i7,MY~zrc+;

Ваша задача в этой проблеме не писать свой собственный код, а для извлечения кода из этого блока текста , как будто это огромная Boggle сетка и вы ищете работающую программу , а не слово.

Представление с программой, которая производит самый длинный конечный результат, выигрывает.

Детали

Относитесь к сетке текста размером 64 на 64 точно так же, как к сетке размером 64 на 64 с дополнительными символами. Создайте строку, которая является исполняемой программой на каком-либо языке, выбрав начальное местоположение в сетке и многократно перемещая один шаг по вертикали, горизонтали или диагонали (всего 8 направлений) столько раз, сколько вы хотите. Вы не можете использовать одно и то же пространство сетки более одного раза!

Например, эти 4 строки были взяты из середины текстового блока:

EJzH \gwosC>Z*)H!]1BPaIEYGyk{c0zv{d\#px2@#'-T{{.Qxknxv}"x3#K]w>;
<X(\bNnY_6*7Yu7_3a+wInwt vh=1eBgz>7Bnhs!<t.T#&V{+?p+{.RTN:xz>|,E
$upN*[F4A`~ZDMDt{.&2z+LZ7bcfeJfF9Uy3xX]ZzQ1FvB.U4S!hm$LYCp: wF7h
 47-+lY$"}AExXQ@?!/6}biptH=6N-6&8-T\C8{`i56e'%cimv,0QKYTx) "nkFJ

Начиная с pправого конца третьей линии, я могу перейти к диагонали вниз и вправо, затем "вправо, затем вверх 3 раза  zKи влево 4 раза #3x". Это отслеживает строку, p " zK#3x"которая при запуске как программа Ruby выводит " zK#3x".

Цель состоит в том, чтобы найти программу, которая дает самый длинный конечный результат. При подсчете длины вывода учитываются только печатные символы ASCII (это означает, что вкладки и переводы строк не учитываются), хотя могут присутствовать и другие символы. Пример Ruby выдает только 8 символов.

Также...

  • Программа может быть длиной от 1 до 4096 символов.
  • Программа может не содержать вкладок, новых строк или непечатаемых ASCII (поскольку их нет в сетке).
  • Программа должна работать и выходить без ошибок.
  • Нет ограничений по времени или сложности, если программа в конечном итоге завершится с конечным выводом.
  • Сетка не зацикливается слева направо или сверху вниз.

Пожалуйста, укажите, где ваша программа появляется в сетке, чтобы мы могли быстро убедиться, что она действительно там.

Кальвин Хобби
источник
8
Почему 4096 символов отдыхают ... о
Джон Дворак
2
Возможно, было бы более интересно, если бы программа должна была решить реальную проблему с гольф-кодом, но была бы взята из сетки.
feersum
2
@DavidCarraher - Или для любого языка, не являющегося игрой в гольф на самом деле. Я нашел один экземпляр yes, например.
1
TECO - это не язык игры в гольф ... это текстовый редактор 1960-х годов.
feersum
1
На первый взгляд выглядит вполне жизнеспособной Perl-программой ...
DGM

Ответы:

15

CJam, свыше (81182737 ^ 2813292) ↑↑ (10604499373-1) символов

Ладно, думаю, я наконец все разобрался. Это было весело - придумывать код было все равно, что ходить по минному полю.


Прежде чем мы углубимся, давайте начнем с более простого примера ( попробуйте онлайн ):

1 3{(\1\{(\5*\}h;\}h;

hэто цикл do-while, который оставляет условие в стеке и {}представляет собой кодовые блоки. Внутренний блок это:

(        Decrement
\        Swap top two of stack
5*       Push 5 and multiply
\        Swap back

Предположим, что вершина стека есть, [1 10]и мы выполним задание {(\5*\}h;. Вот что происходит:

[1 10] --decrement--> [1 9]    --swap--> [9 1]    --multiply--> [9 5^1]  --swap--> [5^1 9]
       --decrement--> [5^1 8]  --swap--> [8 5^1]  --multiply--> [8 5^2]  --swap--> [5^2 8]
       --decrement--> [5^2 7]  --swap--> [7 5^2]  --multiply--> [7 5^3]  --swap--> [5^3 7]
       ...

Это происходит до тех пор, пока 10 не уменьшится полностью до 0, и цикл не завершится, после чего мы окажемся [5^10 0]на вершине стека. Затем мы можем использовать, ;чтобы вытолкнуть ноль, оставив [5^10].

Другими словами, мы только что выполнили возведение в степень, что [1 x]{(\5*\}h;привело к [5^x].

Внешний блок {(\1\{(\5*\}h;\}h;аналогичен, но вместо 5*середины у нас есть петля «экспоненциальной базы 5». Итак, для нашего простого примера, начиная с [1 3]:

[1 3] -dec/swap-> [2 1]   -push 1-> [2 1 1]   -swap-> [2 1 1]   -5^-> [2 5]     -swap-> [5 2]
      -dec/swap-> [1 5]   -push 1-> [1 5 1]   -swap-> [1 1 5]   -5^-> [1 5^5]   -swap-> [5^5 1]
      -dec/swap-> [0 5^5] -push 1-> [0 5^5 1] -swap-> [0 1 5^5] -5^-> [0 5^5^5] -swap-> [5^5^5 0]

Вершина равна нулю, поэтому мы останавливаем цикл и выходим, уходя [5^5^5]. Другими словами, мы только что создали 5^5^5, или 5↑↑3в обозначении стрелки Кнута . Вы можете переключать 5 и 3 для других чисел, но гиперэкспонентация быстро увеличивается , поэтому я бы не советовал выбирать что-то слишком большое.


Теперь по-настоящему:

1B);0D+9#{z(J Y=A*;\VC#UooJ87<W5^o\OO>;J6%_9=+NpXzH|>!p{Kdp(_E=XIK21^%^Z&&p\Y~!E<432|T|Z#00I0*boW)I^8227(*JEo*#09;*7XH+G^o9=pWdK>(2P-*I\6539K~>)#D@</CJ1(+^po\F"U$(jX?a"apV\|;}_V);;D00&phVA^^6pJP\<%o\8H>V1^+aoXY-Y&41-X)8/o!Jb;}"}:rM)<W?o:p'";h

(Трассировка пути)

Аннотированный (что-либо без примечаний является наполнителем):

1                                           Push 1
B);
0D+9#                                       Push 13^9 = 10604499373
{                                           Start outer block
z
(                                           Decrement
J Y=A*;
\                                           Swap
VC#Uoo
J87<                                        Push 1
W5^o
\                                           Swap back
OO>;
J6%_9=+NpXzH|>!p
{                                           Start inner block
Kdp
(                                           Decrement
_E=XIK21^%^Z&&p
\                                           Swap
Y~!E<432|T|Z#00I0*boW)I^8227(*JEo*#         Push 81182737^2813292, <output 3 chars>
09;
*                                           Multiply by previous large number
7XH+G^o9=pWdK>(2P-*I\6539K~>)#D@</CJ1(+^po
\                                           Swap back
F"U$(jX?a"apV\|;
}                                           End inner block
_V);;
D00&p
h                                           Perform inner do-while loop
VA^^6pJP\<%o                                Pop top of stack by outputting
\                                           Swap back
8H>V1^+aoXY-Y&41-X)8/o!Jb;
}                                           End outer block
"}:rM)<W?o:p'";
h                                           Perform outer do-while loop

Это в основном то же самое, что и простой пример, просто с большим количеством наполнителя при переходе от одной инструкции к другой в сетке.

Вместо 5 и 3 мы имеем 81182737^2813292и 10604499373, что означает, что (81182737^2813292)↑↑10604499373выводится в конце (конечно, при наличии достаточного количества времени и памяти!). Обратите внимание, что это всего лишь нижняя граница - существует много других видов печати, например, при 6 и 3 выходной файл имеет длину более 2 миллионов символов, хотя 6^6^6имеет только 36 тыс. Цифр.

Если вы хотите попробовать эту полную версию для себя, протестируйте с помощью:

1B);
3
{z(J Y=A*;\VC#UooJ87<W5^o\OO>;J6%_9=+NpXzH|>!p{Kdp(_E=XIK21^%^Z&&p\
5
09;*7XH+G^o9=pWdK>(2P-*I\6539K~>)#D@</CJ1(+^po\F"U$(jX?a"apV\|;}_V);;D00&phVA^^6pJP\<%o\8H>V1^+aoXY-Y&41-X)8/o!Jb;}"}:rM)<W?o:p'";h

заменив 5 и 3 во второй и четвертой строках номерами по вашему выбору. Обратите внимание, что выходные данные будут иметь несколько дополнительных цифр вокруг важного гиперэкспонированного числа (а именно, предшествующего 010и конечного 0).


Несколько заметок о CJam

Возможно, вы задаетесь вопросом: почему бы не использовать встроенное возведение в степень CJam #вместо внутреннего цикла do-while? К сожалению, после изучения источника CJam я узнал, что для возведения в степень база может быть BigInt (произвольная точность), но показатель степени конвертируется в обычный 32-битный тип int . Это имеет некоторые забавные, но раздражающие побочные эффекты:

2 2 31# #     -->    java.lang.ArithmeticException: Negative exponent  (should be 2^2^31)
2 2 32# #     -->    1                                                 (should be 2^2^32)

Это означало, что я не мог использовать встроенную экспоненту CJam, когда показатель слишком велик по причинам переполнения. Тем не менее, умножение отличается тем, что умножение двух BigInts приводит к новому BigInt, поэтому я решил использовать его вместо этого.

Sp3000
источник
4
Минутное правило удалено. Сходить с ума!
Увлечения Кэлвина
7

TECO, ~ 2 ^ 31 * 13 ~ = 27,9 * 10 ^ 9

?^e=<\RZK%B"svbk7,.c2z\R!Z~|bS|VM!2=9%MEX'1UC>

введите описание изображения здесь

Изменить: изменил пару символов, потому что я случайно использовал один, но эта часть была внутри комментария, так что это не имеет большого значения.

В ?очереди на команды эхо, которые я использую , чтобы создать большую часть продукции. Затем символы \RZK%B"s'1UC>печатаются в цикле. %B"sдобавляет один к B и затем проверяет, является ли это меньше чем ноль. Таким образом, это условие должно быть введено после 2 ^ 31 циклов, когда оно переполняется до отрицательного числа. Внутри условного есть EXкоманда, которая выходит из программы.

В настоящее время я пытаюсь запустить его до конца с выводом в файл.

feersum
источник
«В настоящее время я пытаюсь запустить его до конца с выводом, направленным в файл». Я надеюсь, что у вас есть 27,9 ГБ (26 ГиБ) свободного места, затем ...
Джон Дворжак
1
@JanDvorak У меня более 600 ГБ свободного места ... однако это происходит так медленно, что кажется маловероятным, чтобы сделать это полностью.
feersum
-4

HQ9 + (17195 символов)

Источник:

9Q9

(начинается в 5: 4 и затем вниз)

Выход:

Текст к песне «99 бутылок пива» (8596 знаков), строка 9Q9(3 знака) и еще один экземпляр «99 бутылок пива» (8596 знаков).

Это очень неубедительный ответ, и вы не должны его голосовать, но кто-то должен был опубликовать его.

Philipp
источник