Introdução
Kipple é uma linguagem de programação esotérica baseada em pilha inventada por Rune Berg em março de 2003.
O Kipple possui 27 pilhas, 4 operadores e uma estrutura de controle.
Pilhas
As pilhas são nomeadas a
- z
e contêm números inteiros assinados de 32 bits. Há também uma pilha especial @
, para tornar os números de saída mais convenientes. Quando um número é pressionado @
, os valores ASCII dos dígitos desse número são pressionados. (Por exemplo, se você pressionar 12 para @
, ele pressionará 49 e depois 50 para @
).
A entrada é pressionada na pilha de entrada i
antes da execução do programa. O intérprete solicitará valores para armazenar i
antes da execução. Após a conclusão da execução, qualquer coisa na pilha de saída o
é exibida como caracteres ASCII. Como esse é o único mecanismo de E / S do Kipple, é impossível interagir com um programa Kipple.
Operadores
Um operando é um identificador de pilha ou um inteiro assinado de 32 bits.
Push: >
ou<
Sintaxe: Operand>StackIndentifier
ouStackIndentifier<Operand
O operador Push leva o operando para a esquerda e o empurra para a pilha especificada. Por exemplo, 12>a
colocará o valor 12 na pilha a
. a>b
irá exibir o valor mais alto da pilha a
e empurrá-lo para a pilha b
. O surgimento de uma pilha vazia sempre retorna 0. a<b
é equivalente a b>a
. a<b>c
aparece o valor mais alto de b
e empurra para ambos c
e a
.
Adicionar: +
Sintaxe: StackIndentifier+Operand
O operador Adicionar coloca a soma do item mais alto na pilha e o operando na pilha. Se o operando for uma pilha, o valor será exibido nela. Por exemplo, se o valor mais alto da pilha a
for 1, ele a+2
empurrará 3 para ela. Se a
estiver vazio, a+2
pressione 2 nele. Se os valores mais altos da pilha a
e b
são 1 e 2, em seguida, a+b
irá aparecer o valor 2 de pilha b
e empurrar 3 na pilha a
.
Subtrair: -
Sintaxe: StackIndentifier-Operand
O operador Subtrair funciona exatamente como o operador Adicionar, exceto que subtrai em vez de adicionar.
Claro: ?
Sintaxe: StackIndentifier?
O operador Clear esvazia a pilha se o item mais alto for 0.
O intérprete irá ignorar qualquer coisa que não está ao lado de um operador, então o seguinte programa funcionaria: a+2 this will be ignored c<i
. No entanto, a maneira correta de adicionar comentários é usando o #
caractere. Qualquer coisa entre um #
e um caractere de fim de linha é removida antes da execução. O caractere ASCII # 10 é definido como final de linha no Kipple.
Operandos podem ser compartilhados por dois operadores, por exemplo, a>b c>b c?
podem ser escritos como a>b<c?
.
O programa 1>a<2 a+a
resultará em a
conter os valores [1 4]
(de baixo para cima) e não [1 3]
. Da mesma forma para o -
operador.
A estrutura de controle
Existe apenas uma estrutura de controle no Kipple: o loop.
Sintaxe: (StackIndentifier code )
Enquanto a pilha especificada não estiver vazia, o código entre parênteses será repetido. Loops podem conter outros loops. Por exemplo, (a a>b)
moverá todos os valores da pilha a
para a pilha b
, embora a ordem seja revertida . Uma maneira funcionalmente idêntica, mas mais elegante de fazer isso é (a>b)
.
Exemplos
100>@ (@>o)
Isso produzirá 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
Isso será impresso "Hello World!"
. Quando a o
pilha está sendo impressa, ela começa a exibir caracteres de cima para baixo.
#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)
)
Este é um gerador de números primos, mas não tenho certeza de como funciona.
Regras
Você deve escrever um programa / função que interprete o Kipple. Este programa / função pode obter um programa Kipple através de um arquivo de origem ou via STDIN diretamente do usuário. Se STDIN não estiver disponível, ele deve ser obtido da entrada do teclado e continuar recebendo até que um caractere não imprimível específico seja inserido. Por exemplo, se o seu intérprete for escrito em código de máquina x86, ele obterá o caractere do programa Kipple por caractere do teclado e continuará a fazê-lo até que esc(ou qualquer outra tecla que não emita um caractere imprimível) seja pressionada.
Se houver um erro, por exemplo, um erro de sintaxe ou estouro de pilha, ele deverá reconhecê-lo de alguma forma, por exemplo, retornando 10 em vez de 0 ou mensagens de erro produzidas pelo intérprete / compilador, MAS NÃO IMPRIME MENSAGENS DE ERRO .
Quaisquer outras regras regulares para o código de golfe se aplicam a esse desafio.
Seu código será testado com alguns dos exemplos no arquivo de amostras do Kipple
Este é um código de golfe . O código mais curto em bytes vencerá. Boa sorte!
Observe que existe um operador opcional no Kipple, "
mas ele não faz parte da especificação e é apenas um recurso extra no intérprete oficial. Eu não o mencionei aqui, portanto, ele não precisa ser suportado em seu envio.
Se você tiver alguma dúvida sobre qualquer parte da especificação, poderá examiná-la com intérprete oficial escrito em Java . Isso fará o download de um arquivo zip contendo o programa compilado e o código fonte. É licenciado sob a GPL.
i
se eu pegar o programa de origem do stdin?