Hora de você implementar minha nova linguagem baseada em pilha! Chama-se StackyMath. Este será um idioma baseado na pilha com 8 operações na pilha e maneiras de adicionar números à pilha.
Lista de operações:
/
: Divisão. Apresentado nos 2 principais números da pilha. Empurra o resultado de volta para a pilha.*
: Multiplicação. Apresentado nos 2 principais números da pilha. Empurra o resultado de volta para a pilha-
: Subtração. Apresentado nos 2 principais números da pilha. Empurra o resultado de volta para a pilha+
: Adição. Apresentado nos 2 principais números da pilha. Empurra o resultado de volta para a pilha^
: Exponenciação. Apresentado nos 2 principais números da pilha. Empurra o resultado de volta para a pilha%
: Módulo. Apresentado nos 2 principais números da pilha. Empurra o resultado de volta para a pilha!
: Fatorial. Executado no número superior da pilha. Empurra o resultado de volta para a pilhaD
: Duplicar o número superior na pilha
Operações definidas no pseudo-código:
/
:push(pop divided by pop)
*
:push(pop times pop)
-
:push(pop minus pop)
+
:push(pop plus pop)
^
:push(pop to the pop)
%
:push(pop mod pop)
!
:push(factorial pop)
D
:t = pop; push(t); push(t)
Como enviar números para a pilha:
Adicionar números à pilha é fácil, basta colocar o número bruto no seu programa onde você precisar. Se você precisar colocar vários números na pilha, poderá separá-los com uma vírgula ( ,
). Seu programa não precisará processar -
números na entrada. Se o usuário quiser um, ele deve pressionar o número que deseja negado, zero e -
. Os números na entrada do programa também são restritos a números inteiros positivos.
Entrada:
Seu programa deve receber a entrada na linha de comando ou a partir de std in. A entrada consistirá apenas de números (sem notação científica ou decimais) delimitados ,
conforme necessário e das operações definidas acima.
Resultado:
Seu programa deve imprimir o número na parte superior da pilha.
Casos de erro:
- Se o programa tentar sobrecarregar a pilha, você deverá imprimir
StackUnderflowException!!!
. - Se você tiver uma divisão por zero, imprima
DivisionByZeroException!!!
- Se um número que exceder 64 bits, durante a execução do programa ou o processamento de um número na entrada, imprima
NumberOverflowException!!!
- Se, de alguma forma, você obtiver um número negativo no topo da pilha e precisar fazer um fatorial, imprima
NegativeFactorialException!!!
- Se você tiver um número de ponto flutuante no topo da pilha e a próxima operação for fatorial, imprima
FloatingFactorialException!!!
- Se nenhum número estiver na pilha quando o programa sair (ou seja, o programa estava vazio), imprima
EmptyProgram!!!
Notas:
- Toda saída de erro deve ter seu erro padrão ou equivalente mais próximo.
- Todos os números são restritos ao ponto flutuante de 64 bits.
Programas de exemplo:
50,47* -> 2350
50,47/ -> 0.94
100,8! -> 40320
100D* -> 10000
! -> StackUnderflowException!!!
5,2/! -> FloatingFactorialException!!!
4,3!2*/ -> 3
654,489,48,43/5*7D+-*% -> 77.68749999999909
-> EmptyProgram!!!
(Posso adicionar mais, se necessário)
fonte
!
paraF
).654,489,48,43/5*7D+-*%
deve retornar77.6875
. (43/48*5-(7+7)
should be(7+7)-43/48*5
)Respostas:
Ruby,
412410404392380377 caracteresEsta é a versão de precisão regular usando
Float
. A precisão do resultado é como no código de amostra, mas a detecção numérica de estouro não é exata.Exemplo de execução:
Ruby,
378377 caracteresEsta é uma versão de alta precisão usando
Rational
. A precisão do resultado nem sempre é a mesma do código de amostra, mas a detecção numérica de estouro é exata.Exemplo de execução:
fonte
JavaScript (ES6), 430 bytes
422 bytes com o ES7, alterando
Math.pow(2,2)
para2**2
Explicação
Usa
eval
para substituir certas frases comuns. Ungolfed e sem oeval
que se parece com isto:fonte
Math.pow(p(),p())
comp()**p()
.Groovy, 718 bytes. Fore!
Pode também postar meu impl golfed. Conheça meu grande mural de códigos:
Ungolfed:
Edição 1: economize ~ 15 bytes graças ao @Doorknob
Edição 2: solte ~ 130 bytes com mais alguns truques
fonte
for
/if
, etcSystem.in.text
vez deSystem.in.newReader().readLine()
..text
é ganancioso e enquanto os dados estiverem no leitor, eles não retornarão.Doces ,
298348392 bytesEmbora Candy seja baseado em pilha, não tenho certeza se isso realmente ajudou ...
Um pouco formatado revela um pouco de estrutura:
A matemática real ocorre nas duas últimas linhas. É conduzido por uma mesa de salto na terceira linha.
fonte