Rebmu : 79 자 OR (37 + 길이 (p1) + 2 * 최대 (길이 (p2), 길이 (p3)))
먼저 어떤 언어를 배워야하는지 묻는 79 자 솔루션을 제공합니다. (엔트로피 4.0, 30 글자 제외 ?
) 및 Rebol 및 [Red] 의 제안을 제공합니다 .
DD 11 DD :do dd {dd {p{Which languages must you learn?}qt}} pp{{[RReebdo]l}}
다른 언어가 아닌 여기에서 사용할 수있는 독특한 전술은 중괄호가 비대칭 문자열 구분 기호이며 법적으로 중첩 될 수 있다는 사실을 활용하는 것입니다.
my-string: {"It's cool," said {Dr. Rebmu}, "for MANY reasons--like less escaping."}
이스케이프 시퀀스를 사용하지 않는 모든 프로그램에서 쉽게 작동 할 수있는 일반화 된 솔루션을 만들 수 있습니다. 79 자 버전은 바로 가기에 충분하지만 프로그램 p2 및 p3에 대한 임의의 프로그램 소스를 올바르게 포함하려면 전체 템플릿이 필요합니다. 우리가 그것을 사용했다면 87 자였습니다.
DD 11 DD :do dd {dd {p{Which languages must you learn?}qt}} ddoo{{pp{{[RReebdo]l}}}}
이 일반적인 형태를 사용하는 패턴은 가변 길이의 연속 문자의 세 가지 소스 텍스트가있는 경우 (의이 같은 예를 사용할 수 있도록한다는 것입니다 AAA
, BBBBB
, CCCCCCC
당신의 라인을 따라 뭔가로 인코딩 할 수 있습니다)
DD 11 DD :do dd {dd {AAAqt}} ddoo{{BCBCBCBCBC C C}}
(참고 : 이스케이프 문자를 사용하는 프로그램 에서이 패턴을 조정하지 않으면 작동하지 않지만 치명적인 결함은 아닙니다. 중괄호로 구분 된 문자열에서 비교할 수없는 왼쪽 괄호를 얻으려면 다음과 같은 것이 필요 {Foo ^{ Bar}
하지만 ... 대체 문자열 표기법 "Foo { Bar"
및 결합 된 사례는 이스케이프되지 않은 문자열의 혼합을 함께 붙여서 관리 할 수 있습니다.)
그래서 ... 어떻게 예를 들어? 일반적인 형식을 사용할 수있게되면이 573 개의 문자 프로그램은 3 개의 이전 코드 골프 솔루션에서 몇 분만에 조립되었습니다.
DD 11 DD : do dd {dd {rJ N 0 % rN Wa1m2j S {\ x /} D00 Hc & [u [Ze? Wa Qs ~ rpKw [isEL00c [skQd2k] [eEV? kQ [tlQ]] pcSeg--b00 [ eZ 1 5] 3] prRJ [si ~ dSPscSqFHs] eZ 1 [s + dCa + wM2cNO]]] Va | [mpAp2j] prSI ~ w { } Ls2w Wl h01tiVsb01n -1 chRVs { } hLceVn01qt}} ddoo { CrdSz [sn [{N sbeo [tIt0l1eV} 0e5gXN1 01L {5s0} C {1} 0 {0 Do5f0 0bMe1e0r0} 0]] tMw9C9 Numz Jl [paN + [KperlCJBn [[ba sWS {B noJn ln]] {K, j} b P {. } lf EZ--n [N m {G를 더 많이 구입하고 더 구입}] {T akeonedownandpassitar ound} c B w P lf]]}}
누구든지 자신이 선택한 언어로 해당 프로그램을 작성하고 573을 이길 수 있다고 생각되면 알려주십시오. 선택하신 언어가 Rebmu가 아니라고 가정하면 해당 프로그램이 최소가 아니라는 것을 알고 있기 때문에 나는 당신에게 많은 명성을 얻게 될 것입니다. :-)
p2와 p3의 길이가 불균형 할 때 마지막에 나오는 "폐기스러운"간격이 발생합니다. 그러나이 경우 3 개의 프로그램 모두 크기가 다르므로 p2 / p3에 대해 특히 적합한 페어링이 없습니다. (미로 등의 입력으로 외부 데이터가 없었기 때문에 비슷한 길이의 것이 아니기 때문에 이것을 선택했습니다. 더 최적의 새로운 프로그램을 작성할 수는 있었지만 충분한 시간을 보냈습니다. 당신이 하지 않는 새로운 프로그램을 작성해야 ...)
작동 원리
(참고 : 간소화되지는 않았지만보다 흥미로워 보이는보다 "창의적인"접근 방식으로 시작했습니다. 이 접근 방식을 설명하는 것은 이미 길기 때문에 블로그 항목으로 옮겼습니다 .)
여기서 중요한 것은 다른 항목들과 마찬가지로 "문자열로 eval code"속임수입니다. 비대칭 문자열 구분 기호의 트럼프 카드 만 있습니다. 먼저 80 자의 대소 문자가 어떻게 작동하는지 설명하겠습니다.
이 경우의 가독성을 위해 공백을 조정하는 "전체"프로그램은 다음과 같습니다.
DD 11 ; assign 11 to dd (about to overwrite again)
DD :do ; make dd a synonym for DO (a.k.a. "eval")
; eval a string as source code that ends with QUIT (QT)
dd {dd {p{Which languages must you learn?}qt}}
; we'll never get here, but whatever's here must be legally parseable
pp{{[RReebdo]l}}
여기서는 DD를 DO (일명 "eval")의 동의어로 설정합니다. 그러나 속임수는 절반이 줄어든 프로그램이 실행될 때 D를 무해한 리터럴 1로 정의하는 유일한 효과를 갖는 실행 코드를 감추는 것입니다.
홀수 문자 코드로 공백을 다시 조정 한 내용은 다음과 같습니다.
D 1 ; assign 1 to d
D d ; assign d to itself, so it's still 1
d ; evaluates to integer, no side effect
{d pWihlnugsms o er?q} ; string literal, no side effect
p {Rebol} ; print "Rebol"
그리고 짝수 문자 코드는 다음과 같습니다.
D 1 ; assign 1 to d
D:od ; URL-literal (foo:...), no side effect
d ; evaluates to integer, no side effect
{{hc agae utyulan}t} ; string literal (well-formed!), no side effect
p {[Red]} ; print "[Red]"
실제로 절반이 아닌 프로그램의 경우 dd {dd {(arbitrary code)qt}}
원하는 코드를 실행합니다. 그러나 하나의 평가 대신 두 개의 평가 호출이 있습니다. 중첩 된 괄호는 인터리브 된 코드에서 훌륭하게 작동하지만 DO의 평가 동작을 망가 뜨리기 때문입니다. 때문에:
do {{print "Hello"}}
문자열을 프로그램으로로드하지만 해당 프로그램은 문자열 상수 인 것 {print "Hello"}
입니다. 따라서 여기에서 사용하는 트릭은 DD (DO와 동일한 기능 값을 유지)를 가져 와서 두 번 실행하는 것입니다. 절반은 줄의 다른 부분을 씹지 만 내용에 대해 짝수 / 홀수가 올바른 경우 둘 다 씹지 않으며, 절반을 벗어난 후에 줄 바깥에 남은 것은 단지 정수 d
이기 때문에 무해합니다.
이 패턴을 사용하면 프로그램 동작을 반으로 자르지 않아도 프로그램 동작을 작성하는 데 어려움이 없습니다. 코드의 문자 길이가 짝수 인 한 아무 것도 넣을 수 있습니다 (QT를 세는 경우 홀수). 홀수에서 짝수를 가져와야하는 경우 공백 을 넣으십시오 (p1의 홀수 프로그램 길이에 대해서는 실제로 p1에 위의 수식에 +1이 있음) . 트릭은 나중에 인터리빙 된 코드를 작성하는 것처럼 보이며 파서 가 반으로 떨어지지 않으면 파서를 통과해야합니다 . (QT로 인해 실행되지는 않지만 실행되기 전에 LOADable이어야합니다.)
이 경우는 사소합니다. pp
정의되지 않은 경우에도 기호로 잘로드 p
되고 각 반 프로그램에서 인쇄 를 위해 분할됩니다 . 그러나 문자열 리터럴을 다시 사용하여 다른 트릭을 수행 할 수 있습니다. 절반의 프로그램은 여전히 DO가 정상적으로 정의되어 있으므로 다음과 같이 말할 수도 있습니다.
ddoo{{pp{{[RReebdo]l}}}}
파서가 선택하는 유일한 부분을 전체적으로 상징적 단어 ddoo
와 문자열 리터럴로 만들면 해당 문자열 리터럴 내에 원하는 두 개의 프로그램을 인터리브하고 파서를 화 내지 않아도됩니다. 절반 버전은 다음과 같이 말합니다.
do{p{Rebol}}
..과...
do{p{[Red]}}
내가 말했듯이,이 부분은 프로그램을 문자열로 취급하고 평가하는 다른 솔루션에 익숙해 보입니다. 그러나 경쟁의 경우 포장하는 프로그램에 중첩 된 줄이 포함되어 있으면 렌치가 생깁니다. 여기서 문제가되는 유일한 것은 캐럿 ( ^
)을 통해 탈출하는 것입니다 ... 이는 쉽게 해결할 수 있습니다.
(작은 '속임수'참고 :이 문제에 대한 답변으로 'QUIT'에 QT를 추가했습니다. 실제로, 종료하기 전에 약어를 의도적으로 제거했습니다 ... 어쨌든 콘솔 사용에만 적합하다고 생각했기 때문입니다. REPL에없는 경우 2 글자 공백으로, 특히이 경우에 대해 추가하지 않고 잘못되었다고 생각하기 때문에 추가하고 있습니다. 그럼에도 불구하고, 변경 전에는 2 자 이상이되었습니다. 내가 솔루션을 처음 게시했을 때 Rebmu에는 버그가 있었지만 실제로 작동하지는 않았지만 현재는 작동하지 않습니다.)
x0=00;;
입니다. 큰 도전!