Starry 는 재미있는 문자 프로그래밍 언어로, +*.,`'
각 문자로 표시되는 실제 명령이 앞의 공백 수에 의해 결정되는 위치 로만 구성됩니다 . 다른 명령은 매우 다른 바이트 수를 설명 할 수 있기 때문에 고정 출력 문제를 해결하기가 까다로워집니다. 특히, 숫자 리터럴에는 단항 표현이있어 더 작은 숫자를 조작하여 더 큰 숫자를 만들어야합니다.
따라서이 과제는 그러한 Starry 프로그램을 골프로 칠 수있는 프로그램을 작성하는 것입니다.
별이 어떻게 작동합니까?
(몇 가지 세부 사항은 esolangs에 지정되어 있지 않으므로 Ruby 인터프리터 의 동작으로갑니다 .)
Starry는 스택 기반 언어이며 임의의 정밀 정수 값의 단일 스택 (처음 비어 있음)입니다.
의미있는 문자는 다음과 같습니다.
+*.,`'
그리고 공백. 다른 모든 문자는 무시됩니다. 공백이 아닌 문자 중 하나가 뒤에 오는 각 공백 시퀀스는 단일 명령어를 나타냅니다. 명령어 유형은 공백이 아닌 문자와 공백 수 에 따라 다릅니다 .
지시 사항은 다음과 같습니다.
Spaces Symbol Meaning
0 + Invalid opcode.
1 + Duplicate top of stack.
2 + Swap top 2 stack elements.
3 + Rotate top 3 stack elements. That is, send the top stack element
two positions down. [... 1 2 3] becomes [... 3 1 2].
4 + Pop and discard top of stack.
n ≥ 5 + Push n − 5 to stack.
0 mod 5 * Pop y, pop x, push x + y.
1 mod 5 * Pop y, pop x, push x − y.
2 mod 5 * Pop y, pop x, push x * y.
3 mod 5 * Pop y, pop x, push x / y, rounded towards -∞.
4 mod 5 * Pop y, pop x, push x % y. The sign of the result matches the sign of y.
0 mod 2 . Pop a value and print it as a decimal number.
1 mod 2 . Pop a value and print it as an ASCII character. This throws an error
if the value is not in the range [0, 255].
n ` Mark label n.
n ' Pop a value; if non-zero, jump to label n.
인터프리터는 실행이 시작되기 전에 소스 코드에서 레이블을 스캔하므로 앞뒤로 이동할 수 있습니다.
물론 Starry에는 입력 명령 (와 ,
유사하게 사용 .
)이 있지만이 과제와 관련이 없습니다.
도전
문자열이 주어지면 입력을받지 않고 그 문자열을 STDOUT에 정확하게 인쇄하는 Starry 프로그램을 생성하십시오.
STDIN (또는 가장 가까운 대안), 명령 행 인수 또는 함수 인수를 통해 입력을 받고 STDOUT (또는 가장 가까운 대안), 함수 리턴 값 또는 함수 (out) 매개 변수를 통해 결과를 출력하는 프로그램 또는 함수를 작성할 수 있습니다.
문자열이 128자를 넘지 않고 인쇄 가능한 ASCII 문자 (코드 포인트 0x20 ~ 0x7E)로만 구성되어 있다고 가정 할 수 있습니다.
귀하의 솔루션은 합리적인 데스크탑 컴퓨터에서 5 분 이내에 이러한 입력을 처리해야합니다 (여기에 약간의 여지가 있습니다. 노트북에서 몇 분 더 걸리면 걱정하지 않지만 15 일이 걸리면 실격됩니다. 그것).
솔루션은 아래에 나열된 여러 가지 다른 문자열에서 테스트됩니다. 당신의 점수는 해당 Starry 프로그램의 총 바이트 수입니다. 동점 인 경우 가장 짧은 metagolfer가 이깁니다. 즉, 넥타이가 없다면 자신의 코드를 골퍼 링하지 마십시오 (최상의 솔루션이 가능한 경우에만 발생한다고 생각합니다).
아래 나열된 특정 테스트 사례에 맞게 코드를 최적화해서는 안됩니다. 특히 손으로 만든 솔루션을 하드 코딩해서는 안됩니다. 주어진 문자열과 구조가 유사한 문자열 클래스를 최적화하는 것이 좋습니다. 하드 코딩 솔루션을 사용하는 사람이 의심되는 경우 테스트 사례의 일부 또는 전부를 비슷한 구조의 문자열로 교체 할 권리가 있습니다.
테스트 사례
각 줄은 별도의 테스트 사례입니다.
Hello, World!
pneumonoultramicroscopicsilicovolcanoconiosis
.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.
Hickory, dickory, dock. The mouse ran up the clock. The clock struck 1. The mouse ran down. Hickory, dickory, dock.
36912059868043514648560046917066768694455682545071266675083273015450033938555319356951628735735013250100789433961153496780296165
bVZ48121347GLtpYnt76CZSxTpMDs6791EJE808077eySXldY162424ddTB90707UupwlWGb63618542VhA252989453TXrWgqGm85899uHOAY2oAKE198GOVUttvW63
7MYxoWBNt180CDHS5xBGvU70HHVB17bh8jYzIIiU6n6g98Rose1nOe8Svcg56nax20q30kT3Ttb2jHl5q2Iuf1vPbjPxm9cyKXwxc0OUK8pr13b2n7U9Y7RwQTc26A1I
n9}unwxVa}[rj+5em6K#-H@= p^X/:DS]b*Jv/_x4.a5vT/So2R`yKy=in7-15B=g _BD`Bw=Z`Br;UwwF[{q]cS|&i;Gn4)q=`!G]8"eFP`Mn:zt-#mfCV2AL2^fL"A
두 번째 테스트 사례에 대한 크레딧은 Dennis 에게갑니다 . 네 번째 테스트 사례의 크레딧은 Sp3000으로 이동합니다.
참조 솔루션
CJam의 기본 참조 솔루션은 다음과 같습니다.
q{S5*\iS*'+S'.}%
여기에서 전체 테스트 스위트에 대해 실행할 수 있습니다. 점수는 다음과 같습니다.
1233
5240
4223
11110
7735
10497
11524
11392
Total: 62954
가능한 가장 간단한 방법입니다. 각 문자의 코드 포인트를 리터럴로 푸시 한 다음 인쇄하십시오. 연속 문자, 정수 인쇄, 문자열의 반복 부분 등의 작은 차이는 사용하지 않습니다.
개선의 여지가 많다고 생각합니다. 참고로, 가장 짧은 수 제작 "Hello, World!" 길이는 169 바이트입니다.