소개
Kipple 은 2003 년 3 월 Rune Berg가 발명 한 스택 기반의 난해한 프로그래밍 언어입니다.
Kipple에는 27 개의 스택, 4 개의 연산자 및 제어 구조가 있습니다.
스택
스택은 이름이 지정됩니다 a- z및 32 비트 부호있는 정수가 포함되어 있습니다. @숫자를보다 편리하게 출력 할 수 있도록 특수 스택이 있습니다 . 숫자를로 푸시하면 @실제로 해당 숫자의 ASCII 값이 대신 푸시됩니다. 예를 들어 12를 @로 설정하면 49를 누른 다음 50을 @대신 누릅니다 .
i프로그램이 실행되기 전에 입력이 입력 스택으로 푸시 됩니다. 인터프리터는 i실행 전에 저장할 값을 묻습니다 . 실행이 완료되면 출력 스택의 모든 항목 o이 팝업되어 ASCII 문자로 출력됩니다. 이것이 Kipple의 유일한 IO 메커니즘이므로 Kipple 프로그램과 상호 작용할 수 없습니다.
연산자
피연산자는 스택 식별자 또는 부호있는 32 비트 정수입니다.
푸시 : >또는<
구문 : Operand>StackIndentifier또는StackIndentifier<Operand
Push 연산자는 피연산자를 왼쪽으로 가져 와서 지정된 스택으로 푸시합니다. 예를 들어, 12>a값 12를 stack에 푸시합니다 a. a>bstack에서 최상위 값을 팝하고 stack a에 밀어 넣습니다 b. 빈 스택을 터지는 것은 항상 0이 반환 a<b에 해당합니다 b>a. a<b>c최상부로부터 팝 값 b과 푸쉬 모두 c와 a.
더하다: +
통사론: StackIndentifier+Operand
Add 연산자는 스택에서 최상위 항목과 피연산자의 합계를 스택으로 푸시합니다. 피연산자가 스택 인 경우 값이 해당 피연산자에서 팝됩니다. 예를 들어 stack의 최상위 값 a이 1이면 a+23을 밀어 넣습니다. a비어 있으면 a+22를 밀어 넣습니다. 스택의 최상위의 값이있는 경우 a및 b1, 2이고, 다음 a+b스택으로부터 값 2 나옵니다 b및 스택으로 푸시 3 a.
덜다: -
통사론: StackIndentifier-Operand
빼기 연산자는 더하기 대신 빼는 것을 제외하고는 추가 연산자와 똑같이 작동합니다.
명확한: ?
통사론: StackIndentifier?
최상위 항목이 0이면 Clear 연산자가 스택을 비 웁니다.
통역사는 운영자 옆에없는 것을 무시하므로 다음 프로그램이 작동 a+2 this will be ignored c<i합니다. 그러나 주석을 추가하는 올바른 방법은 #문자 를 사용하는 것입니다. a #와 줄 끝 문자 사이의 모든 것은 실행 전에 제거됩니다. ASCII 문자 # 10은 Kipple에서 줄 끝으로 정의됩니다.
피연산자는 두 연산자가 공유 할 수 있습니다 (예 : a>b c>b c?로 작성) a>b<c?.
프로그램 1>a<2 a+a은 (아래에서 위로) a값 을 포함 [1 4]하지 않습니다 [1 3]. -운영자도 마찬가지입니다 .
컨트롤 구조
Kipple에는 하나의 제어 구조가 있습니다 : 루프.
통사론: (StackIndentifier code )
지정된 스택이 비어 있지 않으면 일치하는 괄호 안의 코드가 반복됩니다. 루프는 다른 루프를 포함 할 수 있습니다. 예를 들어, 순서가 반대로 되더라도 stack (a a>b)의 모든 값을 stack a위로 옮깁니다 . 기능적으로 동일하지만 더 우아한 방법은 입니다.b(a>b)
예
100>@ (@>o)
출력됩니다 100
33>o 100>o 108>o 114>o 111>o 87>o 32>o 111>o 108>o 108>o 101>o 72>o
인쇄 "Hello World!"됩니다. o스택이 출력 될 때 스택 맨 위에서 맨 아래로 문자가 튀어 나오기 시작합니다.
#prime.k by Jannis Harder
u<200
#change 200
k<2>m
u-2
(u-1 u>t u>z u<t
(k>e e+0 e>r)
(e>k)
m+1
m>t
m>z
m<t
t<0>z? t?
1>g
(r>b
m+0 m>a
b+0 b>w
(a-1
b+0 b>j
j?
1>s
(j<0>s j?)
s?
(s<0 w+0 w>b s?)
a>t
a>z
t>a
b-1
b>t
b>z
t>b
z<0>t? z?
a?)
b?
1>p
(b<0 b? 0>p)
p?
(p 0>r? 0>p? 0>g)
)
g?
(g m+0 m>k 0>g?)
u?)
(k>@
10>o
(@>o)
)
이것은 소수 생성기이지만 작동 방식을 잘 모르겠습니다.
규칙
Kipple을 해석하는 프로그램 / 기능을 작성해야합니다. 이 프로그램 / 기능은 소스 파일을 통해 Kipple 프로그램을 얻거나 사용자로부터 직접 STDIN을 통해 얻을 수 있습니다. STDIN을 사용할 수없는 경우 키보드 입력에서 가져 와서 인쇄 할 수없는 특정 문자를 입력 할 때까지 계속 입력해야합니다. 예를 들어, 인터프리터가 x86 기계 코드로 작성된 경우 키보드에서 문자로 Kipple 프로그램 문자를 가져 와서 esc인쇄 가능한 문자를 생성하지 않는 다른 키를 누를 때까지 계속합니다 .
구문 오류 또는 스택 오버플로와 같은 오류가있는 경우, 예를 들어 0 대신 10을 반환하거나 인터프리터 / 컴파일러가 생성 한 오류 메시지 인 BUT NOT PRINTING ERROR MESSAGES 와 같은 방식으로 오류를 인식해야합니다 .
코드 골프에 대한 다른 규칙은이 도전에 적용됩니다.
Kipple의 샘플 아카이브 에있는 몇 가지 예제를 사용하여 코드를 테스트합니다.
이것은 code-golf 입니다. 바이트 단위의 최단 코드가 이깁니다. 행운을 빕니다!
Kipple에는 선택적 연산자가 "있지만 사양의 일부가 아니며 공식 통역사의 추가 기능입니다. 여기에서는 언급하지 않았으므로 제출시 지원되지 않아도됩니다.
스펙의 어떤 부분에 의문이 있다면, Java로 작성된 공식 인터프리터를 사용 하여 검사 할 수 있습니다 . 컴파일 된 프로그램과 소스 코드가 포함 된 zip 파일을 다운로드합니다. GPL에 따라 라이센스가 부여됩니다.
istdin에서 소스 프로그램을 가져 오면 어떻게 입력을 요청할 수 있습니까?