Eu gosto do conceito de 0815 , exceto que o intérprete no site do criador retorna um erro 404. Decidi pedir a todos que ajudassem!
O básico
0815 baseia-se em torno de três (3) registros e uma fila. Os registros são nomeados X, Y e Z, com X sendo somente gravação, Z sendo somente leitura e Y sendo um registro "auxiliar" que não pode ser acessado diretamente. Todos os registros começam com o valor 0. Todos os números estão em hexadecimal.
Instruções
Nota: Algumas instruções aceitam parâmetros formatados como }:hello:
onde :hello:
está o parâmetro. Outra observação: algumas das descrições de instruções não são claras, por isso tomei algumas liberdades com elas. (Instruções originais aqui )
~
significa que o parâmetro é obrigatório
----------|---|--------------------------------------------
~Move | < | <:8: will write 8 to X (parameter required)
----------|---|--------------------------------------------
Swap | x | Swap X and Y
----------|---|--------------------------------------------
~Label | } | }:hello: makes a label called 'hello'
----------|---|--------------------------------------------
Input | | | Set X to an integer from input in
Number | | hexadecimal greedily (regex: [0-9A-F]+)
----------|---|--------------------------------------------
Input | ! | Set X to the ASCII code of one ASCII
ASCII | | character in the input
----------|---|--------------------------------------------
Print | % | Prints an integer stored in Z
number | | (hexadecimal base)
----------|---|--------------------------------------------
Print | $ | Prints an ASCII char stored in Z
ASCII | |
----------|---|--------------------------------------------
Roll | | Rolls all registers to the left
Registers | ~ | X <- Y <- Z <- X
Left | | After roll: X = Y, Y = Z and Z = X
----------|---|--------------------------------------------
Roll | | Rolls all registers to the right
Registers | = | X -> Y -> Z -> X
Right | | After roll: Y = X, Z = Y and X = Z
----------|---|--------------------------------------------
~Jump if | ^ | ^:loop: Jumps to the label 'loop' if Z is
not zero | | not zero
----------|---|--------------------------------------------
~Jump if | # | #:loop: Jumps to the label 'loop' if Z is
zero | | zero
----------|---|--------------------------------------------
Instruções da fila
----------|---|--------------------------------------------
Clear | ? | Clears the queue
----------|---|--------------------------------------------
Enqueue | > | Enqueue the number stored in Z
----------|---|--------------------------------------------
Dequeue | { | Dequeue a number into X
----------|---|--------------------------------------------
| | Rolls the queue to the left, wrapping as
Roll | | necessary. The first number becomes the
Queue | @ | last; second becomes first and so on. Can
Left | | take a parameter to roll a certain number
| | of times. @:b: rolls 11 times.
----------|---|--------------------------------------------
Roll | |
Queue | & | The opposite of @
Right | |
----------|---|--------------------------------------------
Instruções aritméticas
----------|---|--------------------------------------------
Add | + | Z = X + Y
----------|---|--------------------------------------------
Subtract | - | Z = X - Y
----------|---|--------------------------------------------
Multiply | * | Z = X * Y
----------|---|--------------------------------------------
Divide | / | Z = X / Y
| | Y = remainder
----------|---|--------------------------------------------
Programas de exemplo
Olá mundo: (Pouco golfe)
<:48:~$<:65:~$<:6C:~$$><:6F:~$>@<:2C:~$<:20:~$<:57:~${~$<:72:~${~$<:64:~$
Gato:
}:_t:!~$^:_t:
Máquina da verdade:
|~}:i:%^:i:
Isso é código-golfe , então a submissão com menos bytes vence!
fonte
~
e~
nos seus comandos "roll registers"? Você tem um programa de exemplo que as pessoas podem usar para testar?Respostas:
Pip ,
321262248 bytesMuito reduzido usando eval e alguns truques de complexidade Kolmogorov.
Experimente online! (O exemplo é o programa de números Collatz / hailstone no site do autor do idioma.)
Notas:
[0-9A-F]+
). Se, em uma|
instrução, o próximo caractere de entrada não for0-9A-F
, a leitura falhará e causará um comportamento potencialmente estranho. Isso significa que o programa ímpar do autor não funciona como está escrito ... Não sei como ele esperava que várias leituras de números funcionassem, mas eu apenas implementei de acordo com o que as especificações diziam.Minha versão ungolfed com comentários:
fonte
haxe, 987 bytes
ou com algum espaço em branco:
Golfe com sucesso com haxe? Uau.
fonte
Python 3, 1320 bytes
A versão não gasta, bem como a análise (e sempre que necessário, versões corrigidas) dos programas de teste, podem ser encontradas nesta lista .
Decisões de projeto:
Existem problemas com os exemplos de programas que usam CR sozinho como sua nova linha (às vezes), o que faz com que meu shell substitua a linha atual em vez de iniciar uma nova. Isso afeta os programas Sequência de Fibonacci e 99 garrafas de cerveja. O último verso de 99 garrafas de cerveja também não está sendo impresso corretamente, e ainda estou investigando o porquê.
fonte
Scala,
3.1232.8442.6262.540 bytesAlém das restrições descritas na pergunta, esse intérprete foi escrito para se apoiar o máximo possível em relação aos princípios de PF. Especificamente:
Isso foi realizado, com exceção das quatro linhas de código que conduzem o loop principal do intérprete. As estruturas imutáveis eram muito difíceis de utilizar aqui, porque o estado dos registradores impulsiona o fluxo de controle do loop (especificamente as duas instruções GOTO). Ainda estou pensando em como convertê-lo para usar estruturas puras e imutáveis, mas isso é irrelevante para o desafio do código de golfe.
Vou postar a versão não-gasta no Github e fornecerei um link quando o fizer. Por enquanto, vou postar a versão original aqui:
fonte
Flex / C ++,
848838 bytesCompilado com:
Também pode compilar com outras
lex
es, mas não verifiquei. Funciona em duas passagens, portanto os saltos para frente são manipulados corretamente. Os nomes de rótulo podem começar com um dígito, como acontece mais de uma vez nos casos de teste. Literais hexadecimais só podem estar em maiúsculas, de acordo com as especificações.Passa em todos os casos de teste, incluindo os encontrados no Wiki da Esolangs e na página 0815. A manipulação de erros é inexistente e a saída em um rótulo desconhecido não é graciosa, depois de tudo isso é código-golfe.
Estou preparando o intérprete não-agredido (e muito melhor) para um lançamento, para que o OP possa continuar mexendo no 0815. Fique ligado :)
fonte
\r
vez de\n
como nova linha (Mac OS da velha escola?); Portanto, se você quiser ver algo impresso na tela, use./0815 99bb.0815 | tr "\r" "\n"
. Mesmo para Fibonacci.Lisp comum, 1088 bytes
Ungolfed
Com rastreamento opcional em tempo de execução.
Fibonnaci
Expansão de macro
Saída
Talvez mais explicações depois
fonte
Python 3,
1573, 1499 bytesExecuta os programas de exemplo em http://paulo-jorente.de/poncho/esolang/0815/ e implementa todas as instruções (até mesmo as escritas, de acordo com a especificação original).
Executa o arquivo de origem passado na linha de comando.
fonte
j=raw_input
paraj=input
), mas não funciona para mim no programa "99 garrafas de cerveja". Uma amostra ("//" para a nova linha): "0x63 // 0x63folha de cerveja na parede // 0x62 uma abaixo e passe-a em volta // 0x62folha de cerveja na parede // 0x62folha de cerveja na parede // 0x61fina para baixo e passá-lo ")