99 ( "90-nine"으로 발음)는 완전히 새로운 밀교 프로그래밍 언어입니다 ( 99 와 혼동하지 말고 기울임 꼴을 참고하십시오). 이 도전에서 당신의 임무는 가능한 한 짧은 99 통역사를 작성하는 것입니다. 가장 적은 바이트를 가진 제출이 이깁니다. Tiebreaker는 먼저 게시 된 제출물로 이동합니다.
이 질문은 평소보다 조금 더 깊이 있고, 좋은 답변을보기를 간절히 원하므로, 내가 가장 좋아하는 답변 (승자 일 필요는 없음)에 250 명의 보상 현상금을 수여 할 것입니다.
99 사양
99 는 필수 언어입니다. 99 프로그램의 각 줄은 단일 명령문 이며 실행 중에 명령 포인터는 맨 위 줄에서 시작하여 이후의 각 줄을 차례로 통과하여 실행합니다. 마지막 행이 실행되면 프로그램이 종료됩니다. Goto 문은 명령어 포인터의 경로를 다시 지정할 수 있습니다.
줄 바꿈, 공백 및 99 프로그램 9
에서 중요한 유일한 세 문자입니다 . 다른 모든 문자는 완전히 무시됩니다. 또한 각 줄의 후행 공백은 무시되고 행의 여러 공백은 하나의 공백으로 읽 힙니다. ( "줄 바꿈"은 일반적인 줄 바꿈 인코딩을 의미 합니다. 통역사가 사용하는 것은 중요하지 않습니다.)
따라서이 프로그램 :
9 BLAH 99 9a9bb9c9
9 this line and the next have 6 trailing spaces 9
이 프로그램과 동일합니다 :
9 99 9999
9 9
변수
의 변수 (99) 모두가 하나 더 있습니다 이름이 9
(함께 중독 's의 9+
정규식을). 예를 들어 9
, 99
및 9999999999
모든 별개의 변수입니다. 당연히 메모리 제한이 거의 없습니다.
각 변수의 값은 부호있는 임의 정밀도 정수입니다. 기본적으로 각 변수는 고유 한 숫자 표현에 할당됩니다. 따라서 다시 지정하지 않으면 변수의 값은 9
숫자 9이고 변수의 값은 99
숫자 99 등입니다. 변수가 명시 적으로 할당 될 때까지 변수를 일반 숫자로 취급하는 것으로 생각할 수 있습니다.
V
아래에서 임의의 변수 이름을 참조하는 데 사용 합니다.
의 각 인스턴스 V
로 대체 할 수있다 9
, 99
, 999
, 9999
, 등
진술
99 에는 다섯 가지 문 유형이 있습니다. 99 프로그램의 각 행 에는 정확히 하나의 명령문이 있습니다.
여기에 설명 된 구문은 모든 관련없는 문자가 제거되고 모든 후행 공백이 제거되었으며 여러 공백의 모든 시퀀스가 단일 공백으로 대체되었다고 가정합니다.
1. 조작 없음
빈 줄은 no-op 입니다. 명령 포인터를 증가시키는 것 외에는 아무 것도 수행하지 않습니다.
2. 출력
V
V
라인 의 단일 변수 는 해당 변수를 stdout에 인쇄합니다.
경우 V
홀수 갖는 9
S '( 9
, 999
다음 등)의 정수 값 V
(십진수)를 인쇄한다 (9)에 의해 분할한다.
경우 V
짝수 갖는 9
S '( 99
, 9999
등) 다음 아스키 코드 문자 V
9로 나눈 값을 개조 (128)가 인쇄된다. (이것은 (V / 9) % 128
0에서 127 사이의 값입니다.)
예 : 프로그램
9
9999
인쇄 1W
합니다. 첫 번째 줄은 1
9/9가 1이므로 인쇄합니다 . 두 번째 줄은 W
9999/9가 1111이고 1111 mod 128이 87이고 87이에 대한 문자 코드이기 때문에 인쇄 합니다 W
.
줄 바꿈은 출력 토큰 사이에 인쇄되지 않습니다. \n
줄 바꿈을 위해 명시 적으로 인쇄해야합니다.
3. 입력
V
선행 공백 이 V
있는 행 의 단일 변수 는 stdin에서 입력을 가져 와서 해당 변수에 저장합니다.
의 V
수가 홀수이면 9
사용자는 부호있는 정수를 입력 V
할 수 있으며 해당 값의 9 배로 설정됩니다.
경우 V
의 짝수 번호가 9
의 다음 사용자는 ASCII 문자를 입력 할 수 있으며, V
9 배 문자 코드로 설정됩니다.
예 : 주어 -57
와 A
입력으로,이 프로그램
9
9
99
99
출력 -57A
합니다. 내부적으로 변수 9
의 값은 -513이고 99
값은 585입니다.
통역사는 입력이 항상 구문 상 유효하다고 가정 할 수 있습니다.
4. 과제
이 진술은 임의로 길 수 있습니다. 공백으로 구분 된 행에 둘 이상의 변수입니다.
V1 V2 V3 V4 V5 ...
이것은 짝수의 인덱스를 가진 모든의 합에 마이너스 인덱스를 가진의 합을 뺀 것 (제외 )을 할당합니다 . 과제는 참조가 아닌 가치에 의한 것입니다.V1
V
V
V1
대부분의 언어로로 번역 될 수 있습니다 .V1 = V2 - V3 + V4 - V5 + ...
따라서 두 개의 변수 만있는 경우 정상적인 할당입니다.
V1 V2
→ V1 = V2
세 개가 있으면 빼기입니다.
V1 V2 V3
→ V1 = V2 - V3
그리고 +
/ -
기호는 각각의 추가 변수 앞뒤로 전환 유지 :
V1 V2 V3 V4
→ V1 = V2 - V3 + V4
예 :이 프로그램은 다음을 출력합니다 1110123
.
999 Prints triple-nine divided by nine (111).
999 9 9 Assigns triple-nine to zero (nine minus nine).
999 Prints triple-nine divided by nine (0)
9 999 9 Assigns single-nine to negative nine (zero minus nine).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (1).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (2).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (3).
5. Goto (모두 0 인 경우 점프)
이 진술은 또한 임의로 길 수 있습니다. 행에 두 개 이상의 변수이며 공백으로 구분되며 선행 공백이 있습니다 .
V1 V2 V3 V4 V5 ...
이외의 값 중 일부가 0이 아닌 경우 이는 no-op처럼 동작합니다. 명령 포인터는 평소와 같이 다음 줄로 이동합니다.V1
경우 모든 값이 또한 있다 제로 다음 명령어 포인터 번호를 일렬로 이동된다 . 선은 0으로 색인화되므로 0이면 포인터가 맨 위 행으로 이동합니다. 음수이거나 가능한 가장 높은 색인 (행 수에서 1을 뺀 값)보다 큰 경우 프로그램은 일반적으로 오류없이 종료됩니다 .V1
V1
V1
V1
참고는 여기에 9로 나눈되지 않았습니다. 변수가 9의 배수가 아닌 값을 갖는 것은 불가능하기 때문에 9의 배수 인 줄 번호 만 건너 뛸 수 있습니다.V1
예 :
이 프로그램은 1
영원히 인쇄 됩니다 :
9 Prints single-nine divided by nine (always 1).
99 9 9 Assigns double-nine to zero.
99 99 Jumps to line zero (top line) if double-nine is zero.
이 프로그램
99999999 Print G.
999 99 Set triple-nine to ninety-nine.
9999999999 9999999999 9999999999 99 99 9 9 999 999 Set 10-nine to zero.
99999999999 9999999999 Set 11-nine to zero.
999 Print triple-nine's value divided by nine. (This is the ninth line.)
99999999 Print G.
999 999 9 Subtract nine from triple-nine.
99999 999 Jump to line 5-nines if triple-nine is zero (ends program).
9 99999999999 9999999999 Jump to line nine if 10-nine and 11-nine are zero (always jumps).
으로 둘러싸인 순서 감소 출력 번호 11-1 윌 G
'들 :
G11G10G9G8G7G6G5G4G3G2G1G
추가 세부 사항
이상적인 인터프리터는 99 개의 프로그램 파일 이름을 인수로 사용하여 명령 행에서 실행됩니다 . 명령 행에서 I / O도 즉시 수행됩니다.
그러나 프로그램을 입력 토큰 목록뿐만 아니라 문자열로 사용하는 인터프리터 함수를 작성할 수도 있습니다 ["-57", "A"]
. 이 함수는 출력 문자열을 인쇄하거나 반환해야합니다.
귀하의 언어로 이러한 옵션을 사용할 수없는 경우 통역사를 실행하고 I / O를 처리하는 약간 다른 방법이 좋습니다.
보너스 : 99로 멋진 것을 쓰면 기쁜 마음 으로이 게시물에 넣을 것입니다.
- 다음 은 Mac의 답변 에서 나온 "99 Bottles of Beer"프로그램 의 Pastebin 입니다 .