Klein é uma linguagem 2D que eu projetei que pode ser incorporada em 12 superfícies topológicas diferentes. Um programa Klein pode ser executado em superfícies diferentes alterando os argumentos da linha de comandos.
A topologia determina para onde o ponteiro de instrução vai quando sai da borda do programa. Ao sair da borda, o ip pulará para uma borda com a cor correspondente e manterá sua posição em relação à seta, ou seja, o ponteiro conservará sua distância da ponta da seta.
Por exemplo 000
, topologia , a topologia usada pela maioria das linguagens 2D, faz com que o ponteiro de instruções seja contornado para o outro lado quando se move para fora de uma aresta.
Tarefa
A tarefa é bem simples, escreva um programa Klein que, quando executado, produzirá a topologia em que é executado. Os números individuais podem ser separados por espaços. (por exemplo, 000
e 0 0 0
são ambos saída permitida). Você pode optar por usar ou ignorar o -A
sinalizador da linha de comando, que não custará bytes se você o usar.
Isso é código-golfe, então a resposta mais curta será a vencedora.
Aqui está um driver de teste online que pode ser usado para testar todas as topologias de uma só vez. Para executar no modo inteiro, remova o -A
.
Respostas:
5248 bytesExperimente online!
Test Driver
Explicação
Em Klein, o IP começa no canto superior esquerdo, indo para a direita. O primeiro passo que eu queria que meu programa fizesse foi enviar o IP da parte superior do programa para determinar o primeiro e o terceiro bits. O IP entraria novamente no programa da seguinte forma, dependendo da topologia:
Decidi que o meu programa gravaria o terceiro bit da topologia antes do segundo, mas os trocaria (usando
$
) antes do final. Para esse fim, adicionei código para enviar o primeiro e o terceiro bits de cada topologia nos pontos de entrada do IP descritos acima.Em seguida, concentrei-me nas topologias com
1
ou2
como seu primeiro bit. Decidi recombiná-los e enviá-los para o lado não conectado ao lado norte, para que eu pudesse determinar o segundo bit.Convenientemente, isso reagrupou as topologias pelo segundo bit para que eu pudesse colocar isso na pilha.
Depois disso, eu só precisava trocar o segundo e o terceiro bits e terminar o programa.
Agora que as topologias com
1
ou2
como o primeiro bit funcionaram, eu poderia me concentrar em fazer as topologias com0
a saída correta. O primeiro passo foi recombiná-los para que pudessem ser separados em dois grupos com base no segundo bit.Primeiro, foquei nessas topologias com
1
o segundo bit. Isso representou um desafio, porque para eles o IP estava em uma linha já usada pelas topologias com2
o seu primeiro bit. Como seria complicado ajustar mais de uma instrução nessa linha (uma única instrução pode ser pulada usando a!
instrução) e eu estava com pouco espaço como um todo, decidi redirecionar o IP dessa linha e reutilizar uma1
instrução existente para empurrar o segundo bit.Agora, tudo o que restava a ser feito para as topologias com
1
o segundo bit era fixar a ordem do segundo e terceiro bits e terminar.Por fim, permaneceram as topologias com
0
o segundo bit. Não havia muito espaço no programa, com o maior espaço não utilizado na linha superior; portanto, foi lá que eu redirecionei o IP para as topologias com0
o segundo bit.Eu ainda precisava pressionar
0
o segundo bit e corrigir a ordem do segundo e terceiro bits, além de encerrar o programa. Felizmente, pude reutilizar uma$
instrução existente para que as instruções0
e@
pudessem se encaixar nos espaços restantes.Finalmente, os nops podem ser retirados do final das linhas para obter o programa final.
fonte
1168886776961605958545350 bytesExperimente online!
fonte
-d
bandeira, ele fará exatamente isso. Infelizmente, ele não funciona no TIO.44 41 40 3837 bytesExperimente online!
Driver de teste.
Usa um quadrado de 6 por 6. O menor que eu consegui com um quadrado de 8 por 8 é de 38 bytes, se alguém quiser tentar melhorá-lo.
Explicação:
Uma na primeira passagem do código codifica os dois primeiros números para os prefixos
0
e1
. Pois2
, ele codifica o terceiro número e depois o primeiro.Em seguida, passamos os IPs pela terceira extremidade para decidir o número final. Combinamos os IPs com o mesmo prefixo.
Para os prefixos
0
e1
, ambos saem pela borda superior para decidir o terceiro número.Para o
2
prefixo, os IPs saem pelos cantos da borda inferior.Ambas as arestas trocam o primeiro e o terceiro número, empurram o segundo número e o trocam com o terceiro para obter a ordem correta.
fonte