소개
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>b
stack에서 최상위 값을 팝하고 stack a
에 밀어 넣습니다 b
. 빈 스택을 터지는 것은 항상 0이 반환 a<b
에 해당합니다 b>a
. a<b>c
최상부로부터 팝 값 b
과 푸쉬 모두 c
와 a
.
더하다: +
통사론: StackIndentifier+Operand
Add 연산자는 스택에서 최상위 항목과 피연산자의 합계를 스택으로 푸시합니다. 피연산자가 스택 인 경우 값이 해당 피연산자에서 팝됩니다. 예를 들어 stack의 최상위 값 a
이 1이면 a+2
3을 밀어 넣습니다. a
비어 있으면 a+2
2를 밀어 넣습니다. 스택의 최상위의 값이있는 경우 a
및 b
1, 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에 따라 라이센스가 부여됩니다.
i
stdin에서 소스 프로그램을 가져 오면 어떻게 입력을 요청할 수 있습니까?