거대한 Boggle 보드에서 프로그램을 찾고


25

이 64 x 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 x 64 그리드 텍스트를 추가 문자가있는 64 x 64 Boggle 그리드와 동일하게 취급하십시오. 그리드에서 시작 위치를 선택하고 원하는만큼 여러 단계를 수직, 수평 또는 대각선 (총 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". 이것은 Ruby 프로그램으로 p " zK#3x"실행될 때 출력하는 문자열 을 추적합니다 ." zK#3x"

목표는 가장 긴 유한 출력 을 생성하는 프로그램을 찾는 것입니다 . 출력 길이를 계산할 때 인쇄 가능한 ASCII 문자 만 고려됩니다 (탭과 줄 바꿈은 계산되지 않음). 다른 문자가있을 수 있습니다. Ruby 예제는 8 자만 생성합니다.

또한...

  • 프로그램 길이는 1-4096 자입니다.
  • 이 프로그램에는 탭, 줄 바꿈 또는 인쇄 할 수없는 ASCII가 포함되어 있지 않을 수 있습니다 (그리드에 없기 때문에).
  • 프로그램은 오류없이 실행되고 종료되어야합니다.
  • 프로그램이 유한 출력 으로 종료되는 한 시간이나 복잡성 제약이 없습니다 .
  • 그리드는 왼쪽에서 오른쪽으로 또는 위에서 아래로 반복되지 않습니다.

프로그램이 그리드에 나타나는 위치를 언급하여 실제로 있는지 확인하십시오.


8
4096 자 휴식이 왜 ... 오.
John Dvorak

2
프로그램이 실제 코드 골프 문제를 해결해야한다면 더 흥미 로웠을 것입니다.
feersum

2
@DavidCarraher-또는 골프가 아닌 언어의 경우 실제로. yes예를 들어 하나의 인스턴스를 찾았습니다 .

1
TECO는 골프 언어가 아닙니다 ... 1960 년대부터 시작된 테이프 / 텍스트 편집기입니다.
feersum

1
언뜻보기에 완벽하게 실행 가능한 펄 프로그램처럼 보입니다 ...
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]있고 do-while을 수행 한다고 가정하십시오 {(\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]에서 스택 상단에서 끝납니다 . 그런 다음을 사용 ;하여 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]

상단은 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을 사용하면 6^6^636k 자리 만 있어도 출력이 200 만자를 넘습니다 .

이 정식 버전을 직접 사용하려면 다음을 사용하여 테스트하십시오.

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에 대한 몇 가지 메모

궁금한 점이있을 수 있습니다 #. 내부 do-while 루프 대신 CJam의 내장 지수 ( )를 사용하지 않겠습니까? 불행히도 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를 곱하는 것과는 다릅니다. 따라서 대신이를 활용하기로 결정했습니다.


4
분 규칙이 제거되었습니다. 미치다!
Calvin 's Hobbies

7

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

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

여기에 이미지 설명을 입력하십시오

편집 : 실수로 하나를 재사용했기 때문에 몇 개의 문자가 변경되었지만 그 부분은 주석 안에 있었으므로 별 차이가 없습니다.

?I 출력의 대부분을 만드는 데 사용하는 명령 반향에 회전. 그런 다음 문자 \RZK%B"s'1UC>가 루프로 인쇄됩니다. %B"sB에 1을 더한 다음 0보다 작은 지 테스트합니다. 따라서이 조건은 음수가 넘칠 때 2 ^ 31 사이클 후에 입력해야합니다. 조건부 안에는 EX프로그램을 종료 하는 명령이 있습니다.

현재 파일에 대한 출력으로 완료를 위해 실행하려고합니다.


"현재 출력이 파일로 향하도록 완료하기 위해 실행하려고합니다." 27.9GB (26GiB)의 여유 공간이 있으면 다음과 같이하십시오.
John Dvorak

1
@ JanDvorak 600GB 이상의 여유 공간이 있습니다 ... 그러나 천천히 진행되고 있습니다.
feersum

-4

HQ9 + (17195 자)

출처:

9Q9

(5 : 4에서 시작한 다음 작동 중지)

산출:

노래 "99 병 맥주"(8596 자), 문자열 9Q9(3 자) 및 "99 병 맥주"(8596 자)의 다른 텍스트 .

이것은 매우 절름발이되는 답변이므로 공표해서는 안되지만 누군가가 게시해야했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.