CJam, 1051 827 643 569 545 407 327 279 235 233 229
''"','#'C'J'a'm',' qYew::-Yf#:+e#'''''''''"
f{-ci'(*''2*\}'^,40>"*/:N"-"][ZZ[\^__`bcdgimpstsz{}~~~"
위의 프로그램은 실제 소스 코드를 생성하는데, 길이는 1,179,112 바이트입니다.
테스팅
Java 인터프리터를 사용하면 다음 과 같이 소스 코드를 생성하고 테스트 할 수 있습니다.
$ alias cjam='java -jar cjam-0.6.5.jar'
$ cjam gen.cjam > diff.cjam
$ cksum diff.cjam
896860245 1179112 diff.cjam
$ cjam diff.cjam < diff.cjam
#CJam, 229
대체 버전
36 점 – 최종 점수 265 점 – – 소스 코드를 99.92 % 더 짧게 만들 수 있습니다 :
'''()))))(''''(((('''())))))))))))))))))))))))))))('''()))))))))))))))))))))))))))))))))))('''())))))))))))))))))))))))))))))))))))))))))))))))))))))))))('''())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))('''()))))(''''((((((('())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))('())))))))))))))))))))))))))))))))))))))))))))))))))('())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))('())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))('()))))))))))))))))))('()))))))))))))))))))('())))))('())))))))))))))))))))))))))))))))))))))))))))))))))('()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(''(((('()))))))))))))))))))('())))('())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(''((((''''''''''''''''''()+,-.0123456789;<=>?@ABCDEFGHIJKLMOPQRSTUVWXYZ[\]][ZZ[\^__`bcdgimpstsz{}~~~
CJam 인터프리터 에서이 버전을 온라인으로 사용해 볼 수 있습니다 .
생각
우리는 코드를 실행하고 싶습니다
'#'C'J'a'm',' qYew::-Yf#:+
점수를 가능한 한 낮게 유지하십시오. 이를 위해 캐릭터별로 문자열을 작성하고 (전후에 몇 번의 노프없이) 결과를 평가합니다.
다행히도 '
(푸시 문자 리터럴), (
(감소) 및 )
(증가)는 연속적인 ASCII 문자이므로 임의의 문자를 입력하는 것이 상대적으로 저렴합니다.
ASCII 문자 '
이후는로 푸시 할 수 있으며 '()…)(
여기서 )
코드 수 는 코드 포인트 에 따라 다릅니다.
예를 들어 +
로 푸시 할 수 있습니다 '())))(
. 사이의 거리 '
와 (
, 그리고 (
및 )
트레일은 1이다 )(
서로 상쇄; 그들의 유일한 기능은 '
다음 문자 (다음 문자에 해당)를 연속 문자 로 포장하는 것입니다 .
이 방식으로 밀린 캐릭터는 점수를 4 점 올립니다.
이전의 ASCII 문자 '
는로 푸시 할 수 있으며 ''(…(
여기서 (
코드 수 는 코드 포인트 에 따라 다릅니다.
예를 들어 #
로 푸시 할 수 있습니다 ''((((
. 사이의 거리 '
와 (
1이다.
이 방식으로 밀린 캐릭터는 점수를 2 점 올립니다.
''(…(
실제로 문자 는 16 비트이고 줄 바꿈 되므로 모든 ASCII 문자에서 작동합니다 . 예를 들어, 을 누른 다음 65,532를 누를 수 있습니다 .+
''
(
이 기술은 1.2MB 버전의 코드에서 사용됩니다.
캐릭터 '
를로 밀면 ''
점수에 영향을주지 않습니다.
암호
e# Push these characters on the stack: ','#'C'J'a'm',' qYew::-Yf#:+e#'''''''''
''
'()))))(
''
''((((
''
'())))))))))))))))))))))))))))(
''
'()))))))))))))))))))))))))))))))))))(
''
'())))))))))))))))))))))))))))))))))))))))))))))))))))))))))(
''
'())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(
''
'()))))(
''
''(((((((
'())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(
'())))))))))))))))))))))))))))))))))))))))))))))))))(
'())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(
'())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(
'()))))))))))))))))))(
'()))))))))))))))))))(
'())))))(
'())))))))))))))))))))))))))))))))))))))))))))))))))(
'()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(
''((((
'()))))))))))))))))))(
'())))(
'())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(
''((((
''
''
''
''
''
''
''
''
''()
+ e# Concatenate the two topmost single quotes.
, e# Push the length of the resulting string (2).
-.0123456789 e# Push that number.
; e# Discard it from the stack.
< e# Compare a single quote with 2. Pushes 0.
= e# Compare a single quote with 0. Pushes 0.
> e# Compare a single quote with 0. Pushes 1.
? e# Ternary if. Discards a single quote and 1.
@ e# Rotate the remaining three single quotes.
ABCDEFGHIJKLMOPQRSTUVWXYZ e# Push 25 items on the stack.
[\] e# Swap the last two and wrap them in an array.
e# So far, we've pushed the elements of "','#'C'J'a'm',' qYew::-Yf#:+e#'''"
e# followed by the elements of [10 11 12 13 14 15 16 17 18 19 20]
e# and ["" "" "" 3.141592653589793 "" "" " " 0 0 0 -1 1 [3 2]].
] e# Wrap the entire stack in an array.
[ e# Begin an array. Does nothing.
ZZ e# Push 3 twice.
[ e# Begin an array. Does nothing.
\^ e# Swap both 3s and push the bitwise XOR. Pushes 0.
__ e# Push two copies.
` e# Inspect the last copy. Pushes the string "0".
b e# Convert "0" from base 0 to integer. Pushes 48.
cd e# Cast 48 to Character, then Double. Pushes 48.0.
gi e# Apply the sign function, then cast to integer. Pushes 1.
mp e# Check 1 for primality. Pushes 0.
s e# Cast the result to string. Pushes the string "0".
e# We now have three elements on the stack: an array, 0, and "0"
t e# Set the element at index 0 of the array to the string "0".
s e# Cast the array to string.
e# This pushes the string consisting of the characters
e# 0,'#'C'J'a'm',' qYew::-Yf#:+
e# and
e# e#'''10111213141516171819203.141592653589793 000-1132
e#
e# When evaluated this does the following:
e# 0, Push an empty array. Does not affect output.
e# '#'C'J'a'm',' Push the characters of "#CJam, ".
e# q Read all input from STDIN.
e# Yew Push the overlapping slices of length 2.
e# ::- Reduce each pair of characters to their difference.
e# Yf# Square each difference.
e# :+ Add the results.
e# e#… Comment. Does nothing.
z e# Zip. This wraps the string on the stack in an array.
{}~ e# Execute an empty block.
~ e# Unwrap the array.
~ e# Evaluate the string.