Um desafio que achei muito legal é criar um intérprete para um idioma completo de Turing de sua escolha.
As regras são simples:
- Você pode usar qualquer idioma para criar esse intérprete, mesmo que seja mais novo que esse desafio.
- Você pode usar qualquer idioma completo do Turing, desde que não seja o mesmo que você está escrevendo.
- Você não pode simplesmente avaliar o código, por exemplo, usar funções eval.
- Uma explicação de como você abordou isso será agradável, mas não necessária.
- Isso será pontuado em bytes.
- Cada envio deve estar totalmente funcionando, o que significa que todos os recursos que o seu idioma escolhido deve estar presente.
Para ser simples:
Sua tarefa é criar um intérprete funcional para qualquer idioma completo de Turing com qualquer idioma de sua escolha.
Boa sorte!
code-golf
interpreter
arodebaugh
fonte
fonte
eval
soluções triviais .eval
comandos / funções, pois alguns idiomas têm recursos internos para avaliar o código em outro idioma.Respostas:
Brachylog (2) → Problema de pós-correspondência , 9 bytes
Experimente online!
Entrada é uma lista de listas de strings. (No problema Pós-correspondência, conforme definido na Wikipedia, as listas internas têm dois elementos cada, embora este programa possa realmente lidar com uma generalização para qualquer número de elementos.) Este programa força as soluções para o problema, em ordem de comprimento, até uma solução é encontrada. Sabe-se que o problema de pós-correspondência é capaz de simular uma máquina de Turing e, portanto, soluções de força bruta para ela são completas. Se executado como uma função, e não como um programa, na verdade também produz resultados significativos.
O programa no link TIO acima é o
[["a","baa"],["ab","aa"],["bba","bb"]]
que copiei da Wikipedia. A solução (que o programa encontrar rapidamente) é["bbaabbbaa","bbaabbbaa"]
.Explicação
Isso é basicamente uma tradução direta do problema de correspondência do Post para o Brachylog.
Basicamente, criamos uma lista com cópias repetidas da entrada (o mínimo possível, o que significa que não perdemos nenhuma possibilidade ao forçar brutalmente), pegamos um elemento de cada cópia e concatenamos os elementos correspondentes (como na correspondência de postagem problema).
fonte
~dp
(o que não significa exatamente a mesma coisa, mas está próximo o suficiente para ser Turing-complete), exceto que o intérprete Brachylog ainda não sabe como reverterd
.Geléia → "Adicionar mínimo para transpor",
54 bytesExperimente online! (executa apenas uma iteração, para evitar tempos limite)
Uma construção muito simples de Turing: tomamos uma matriz quadrada como programa e fazemos um loop para sempre, identificando a linha lexicograficamente menor e, em seguida, aumentando cada elemento da primeira linha pelo primeiro elemento da menor lexicograficamente, cada elemento da segunda linha pelo segundo elemento do menor lexicograficamente, e assim por diante. (O programa Jelly é "
+"
adicione elementos correspondentes {da entrada e}Ṃ
o mínimo {do original},ẞ
loop"; este é um byte mais curto que o meu programa anteriorZ+ṂZß
, que fez exatamente a mesma coisa. Claramente eu deveria ter me concentrado em jogar golfe no Jelly, não apenas jogando a linguagem implementada.)O idioma resultante é Turing-completo pelo mesmo motivo que o Kangaroo. O primeiro elemento de cada linha atua como uma contagem de ignorados (embora, em vez de a contagem de ignorados de cada comando seja reduzida quando ignorada, aumentamos a contagem de ignorados de cada comando quando executado, e procuramos o comando com a menor contagem de ignorados do que comandos com contagem de pulos zero; isso acontece da mesma maneira). Garantimos que esse primeiro elemento seja mais alto que os outros elementos (que representam o número de vezes que cada comando aparece no multiset de cada comando), garantindo assim que a primeira linha nunca seja o mínimo; o restante da primeira linha pode ser lixo. O único problema restante é modelar a maneira como os comandos com contagem de pulsos iguais são executados ciclicamente em sequência, mas podemos fazer isso multiplicando todas as contagens de pulados por uma constante grande e adicionando pequenas "iniciais" pular conta para a primeira coluna para servir como desempate. Isso nos dá um desempate das "primeiras execuções de comandos não pulados", não "dos comandos não pulados são executados ciclicamente em sequência", mas a construção de Turing-completeness para o Kangaroo não se importa com essa diferença.
fonte
Mathematica interpretando o jogo da vida de Conway, 64 bytes
O Jogo da Vida de Conway é conhecido por ser Turing completo; e autômatos celulares são a verdadeira obsessão de Stephen Wolfram.
CellularAutomaton@{224,{2,{t={2,2,2},{2,1,2},t}},{1,1}}
é uma regra que transforma uma matriz bidimensional de 0s e 1s de acordo com uma etapa do Jogo da vida de Conway. (Eu acho que o comportamento padrão é que essa matriz envolva suas bordas, então é realmente um toro discreto.)~Nest~##&
Transforma essa regra em uma função que, quando recebe um estado inicial da placa (de qualquer dimensão) e um número inteiron
como argumentos, gera o resultado den
iterações da regra do Jogo da Vida.Para sua diversão, você pode usar a versão embrulhada
e percorra 100 gerações em uma placa de 50x50.
fonte
Turtled interpretação CT , 49 bytes
Talvez eu consiga jogar golfe
Além disso, isso não gera nada útil. apenas pára se, e somente se, o programa CT dado parar.
este é um que eu fiz há um tempo, na verdade (então joguei golfe agora)
Como funciona:
Turtlèd usa células da grade. Quando digo "escreva algo na grade", quero dizer que um grupo contíguo de caracteres é colocado na grade. exemplo
para o programa
os dados são inseridos primeiro:
este é essencialmente um programa para gatos. grava a entrada na grade.
então os comandos são inseridos:
o que faz com estes comandos:
esses comandos são "produções". se o bit de dados mais à esquerda for 1, ele copia a produção no final da cadeia de dados. caso contrário, nada acontece. o bit de dados mais à esquerda é removido e usa a próxima produção com o próximo bit de dados mais à esquerda. o programa pára quando não há bits na cadeia de dados. Uma maneira de fazer essas produções é lidar com os bits e o final das produções separadamente. é isso que nosso programa faz. ele copia separadamente os bits da cadeia de comando até o final da cadeia de dados e exclui os bits da cadeia de dados
sobre como este programa faz isso. depois de inserir os comandos, o ponteiro da tartaruga / grade retorna ao bit mais à esquerda da sequência de dados. depois entra em loop
o que ele faz nesse loop, é movido para cima a partir da sequência de dados mais à esquerda e anota o caractere de comando atual (u.). se for;, no final de uma produção, ele se move para baixo e exclui o bit de dados mais à esquerda abaixo dele e volta para cima (
(;d' u)
). então, de qualquer maneira, ele desce um (d
). se o bit não foi excluído, significa que deve verificar se é necessário copiar um pouco dos comandos no final. portanto, se esse caractere que é ou foi o banco de dados mais à esquerda for 1, ele será movido para o final da extremidade direita da sequência de dados, copiará o bit da sequência de comandos e voltará para o espaço à esquerda dos dados mais à esquerda bit ((1[ r].[ l])
). agora, ele está no banco de dados mais à esquerda, que era zero, ou à esquerda do banco de dados mais à esquerda. então, movemos para a direita se estiver em um espaço (( r)
) então, o ponteiro do comando é incrementado, para que anotemos o próximo comando na próxima iteração do loop. Se não houver mais datatring, isso significa que estaremos em um espaço e o loop terminará. caso contrário, executaremos novamente o loop.fonte
Perl → Variante do programador de três estrelas , 26 + 1 = 27 bytes
Experimente online! (Este link contém um cabeçalho que sai do programa após um número definido de iterações (para que o TIO não atinja o tempo limite) e para imprimir o estado interno a cada iteração (para que ele faça algo observável).)
Execute com
-a
(penalidade de 1 byte, como você pode ajustá-lo antes da-M5.010
produção-aM5.010
).Especificamente, isso implementa o Programador Três Estrelas no qual os comandos são separados por espaços e nenhum comentário é permitido no arquivo, sem extensões de E / S. (Essas alterações não fazem diferença para a conclusão de Turing do idioma, obviamente.) Não há uma prova de conclusão de Turing para programador de três estrelas on-line, mas é de conclusão de Turing (estive compartilhando uma prova de esboço de seu Turing -completude com outros esoprogramas, mas parei de trabalhar na linguagem quando descobri que era realmente fácil programar uma vez que você superava o choque original).
O programa realmente não precisa de muita explicação; Programador de três estrelas tem uma especificação muito simples, e esta é uma tradução direta dele. Os únicos pontos sutis:
@F
é a entrada para o programa em forma de matriz (isso é uma conseqüência de-a
); eredo
repetirá o programa inteiro, pois está em um loop implícito (também uma conseqüência de-a
).fonte
assembly x86 (sintaxe da Intel / MASM) -Brainfuck 2127 bytes.
Ainda capaz de golfe
fonte
Pip interpretando sistemas de tags cíclicos , 16 bytes
Toma as produções do sistema de tags como argumentos da linha de comandos e a sequência de dados inicial de stdin.
O código acima é meio difícil de verificar porque não produz nenhuma saída (então o único comportamento observável é "termina" vs. "não termina"). Portanto, aqui está uma versão desmontada que gera a sequência de dados após cada etapa e também termina após 20 etapas, para que o TIO não precise lidar com toneladas de saída de loops infinitos: Experimente on-line!
Sistemas de etiquetas cíclicas
Os sistemas de tags cíclicos são um modelo computacional extremamente simples, porém completo, de Turing . Eles consistem em uma lista de produções que definem operações em uma sequência de dados . As produções e a sequência de dados consistem em 1 e 0.
A cada etapa, o caractere mais à esquerda da sequência de dados é removido.
Em ambos os casos, a produção atual passa para a próxima produção da lista, ciclicamente: se estivéssemos na última produção, passamos para a primeira. A execução continua até que a sequência de dados esteja vazia.
Explicação
fonte
1
fonte: esolangs links para este arxiv.org/abs/1312.6700 . Vou editar a minha resposta em breve, e se isso ajuda a sua resposta você deve (TBH sua entrada parece suficiente golfy na verdade)Funções de Collatz Generalizadas Iteradas -> Python 2, 46 bytes
Chame essa função com uma lista de m-1 a's eb's, o valor inicial x e o divisor m, que coletivamente constituem um "programa" para IGCF. Em vez de usar uma terceira matriz para indicar em quais módulos parar, isso simplesmente pára sempre que o módulo é m-1. Essa simplificação significa que pode ser necessário um esforço extra para converter um determinado programa Fractran nessa variante, mas economiza alguns bytes no intérprete.
Experimente online! Este TIO demonstra como adicionar 5 + 5 com esse idioma. O programa a = [3], b = [0], m = 2 adiciona e, começando com 7776 = 2 ^ 5 * 3 ^ 5, eventualmente produz 59049 = 3 ^ 10.
fonte
Variante ResPlicate -> Python 2, 47 bytes
Esta função interpreta uma variante do ResPlicate
A última alteração significa que alguns programas ResPlicate (que atendem à primeira condição) não se comportarão da mesma forma nesta variante, mas, felizmente, os intérpretes do BCT não exigem a funcionalidade removida e, portanto, o idioma permanece TC.
Experimente online! Esse TIO possui uma impressão inserida para mostrar que funciona e um cabeçalho que mata o programa após 1 segundo e um exemplo que consegue gerar mais saída do que o TIO pode suportar naquele segundo.
fonte
l=input()
? Seria um byte mais curto.Perl
-a
→ Máquina I / D , 24 bytesExperimente online! (contém um cabeçalho que imprime o estado interno e pára após 10 iterações, para que o comportamento seja observável)
Sobre o idioma
Passei os últimos dias trabalhando na máquina de I / D , uma das minhas idéias mais recentes para linguagens de programação muito simples. Funciona da seguinte forma: o armazenamento de dados consiste em uma RAM ilimitada, inicialmente todos os zeros. Cada elemento pode armazenar um número inteiro ilimitado (embora, na prática, a maioria dos programas de máquina de E / D armazene apenas números inteiros pequenos na maioria deles, e utiliza os números inteiros não limitados apenas como forma de endereçar células com endereços grandes). Há também um ponteiro de dados, que aponta para uma célula (ou seja, mantém o endereço como uma célula); inicialmente também é zero.
Existem apenas dois comandos:
I
: Incremente a célula para a qual o ponteiro de dados aponta. (O ponteiro de dados em si permanece inalterado.)D
: Desreferencia o ponteiro dos dados, isto é, leia o valor da célula para a qual o ponteiro de dados aponta. Em seguida, armazene o valor resultante que você lê novamente no ponteiro de dados.A execução simplesmente executa o programa em um loop repetidamente, para sempre.
É bastante surpreendente que um idioma tão simples seja o Turing completo, por isso tenho trabalhado para provar isso. Aqui está a prova . É bem parecido com (mas mais simples que) a prova para o Programador Três Estrelas, uma linguagem muito semelhante (e, de fato, este envio usa o mesmo "shell" básico do OISC em torno do programa, diferindo apenas nas instruções reais implementadas).
Sobre o programa
Uso
A entrada deve ser fornecida na entrada padrão e é um programa de máquina de E / D sem comentários e usando a sintaxe RLE / OISC. (A máquina de E / D possui duas sintaxes equivalentes e diferentes, mas, para fins de golfe, este programa suporta apenas uma delas.) Nessa sintaxe, um programa é uma sequência de números em decimal, representando o comprimento das execuções de
I
comandos entre osD
comandos. (Você pode especificar dois ou maisD
comandos consecutivos colocando uma "execução de 0I
comandos" entre eles, para que a sintaxe seja totalmente geral.)Explicação
Como pode ser visto no programa, isso não está implementando os comandos
I
eD
individualmente. De fato, é um intérprete de otimização (levemente) (puramente porque é mais curto para escrever dessa maneira). A chave é ver que uma execução de n comandos de incremento incrementa o destino do ponteiro de dados n vezes, ou seja, adiciona n a ele; e uma execução de comandos de incremento 0 também pode ser implementada dessa maneira, pois adicionar 0 à memória não tem efeito. Portanto, a operação que realmente implementamos é alternar entre implementar um run-of-I
s e aD
. Ou, em outras palavras, "adicione nao valor apontado pelo ponteiro de dados (armazenando-o novamente no valor apontado pelo ponteiro de dados), depois leia o valor apontado pelo ponteiro de dados e armazene-o no ponteiro de dados ". Isso é claramente mais detalhado do que precisa para ser, e podemos simplificar ainda mais isso para "adicionar n ao valor apontado pelo ponteiro de dados e armazenar esse valor no destino do ponteiro de dados e no próprio ponteiro de dados".Então isso faz parte do núcleo do nosso programa. Estamos usando uma matriz
$a
para armazenar a RAM e$p
como ponteiro de dados (indexação na matriz):Convenientemente, o Perl interpreta os elementos não inicializados da matriz como 0 quando são tratados como números; portanto, a matriz será inicializada lentamente em zeros para nós, sem nenhum código explícito para isso. (Um problema em potencial é a precisão numérica quando os números aumentam; no entanto, isso só acontecerá se a quantidade da matriz usada exceder o espaço de endereço da máquina (números inteiros Perl são grandes o suficiente para conter ponteiros), algo que não pode acontecer em uma máquina idealizada.)
Finalmente, tudo o que precisamos fazer é colocar esse programa em alguns loops. O
for@F
loop, combinado com a-a
opção de linha de comando, passará pelos campos da entrada padrão (a definição padrão de "campo" aqui será dividida em espaço em branco). Oredo
loop colocará o programa inteiro em um loop implícito (que não seja, convenientemente, a leitura da entrada padrão), o que fará com que o programa execute um loop repetidamente, conforme exigido pela semântica da máquina de I / D.fonte
-a
'. codegolf.meta.stackexchange.com/a/14339/9365Geléia → Sistema com 2 etiquetas , 8 bytes
Experimente online!
Eu tenho uma recompensa em favor de linguagens práticas, mas pensei que eu poderia tentar vencer a tarefa original enquanto estava nela (pois não posso exatamente ganhar minha própria recompensa).
Implementa uma variante de sistemas de tags sem estado de parada, pois não é necessário para a integridade de Turing. Os estados são numerados de 1, consecutivamente, e a sequência inicial vem antes do programa.
Por exemplo, Wikipedia dá um exemplo de um sistema de tag {
a
,b
,c
}, {a
→bc
,b
→a
,c
→aaa
} com corda inicialaaa
; neste formato de entrada, que é[1,1,1]
,[[2,3],[1],[1,1,1]]
. (Os sistemas de tags não possuem uma sintaxe fixa, e isso parece ser uma maneira razoável de fazer isso.)O link do TIO foi adicionado
Ṅ
("escreva o estado interno e uma nova linha para o stdout") para mostrar que o programa está realmente funcionando.Explicação
fonte
BF / P "implementado em uma máquina de Turing, 842 bytes
Tabela de transição (vinculada por causa do comprimento)
Tabela de transição, versão menos golfe
Simulador de máquina de Turing que usei
Isso certamente não vai ganhar nenhum prêmio por tamanho, mas é algo que eu sempre quis fazer, já que o BF é tão semelhante a uma Máquina de Turing. Cada célula armazena um valor de
0x0
-0xF
. No entanto, a largura está longe do site da Turing Machine, sem travar o navegador. As funções,
e.
(entrada e saída) não estão definidas, por isso é um pouco mais parecido com P "do que com BF verdadeiro.Para executá-lo, cole a tabela de transição no simulador da Turing Machine, defina a entrada para algum código BF e pressione executar.
A fita da TM armazena o código BF e os dados BF, com um único espaço no meio. Ele monitora sua posição no código, modificando o caractere que está executando no momento (
[
->(
, etc) e sua posição nos dados com um^
na frente da célula. Depois de ler um caractere de comando, ele se move até atingir o cursor, move uma célula para a direita e executa a função apropriada. Em seguida, ele retorna, procurando um dos caracteres de comando "modificado" no código BF e passa para o próximo, repetindo todo o processo. Depois de ficar sem código, ele pára.A melhor maneira de entender como funciona é executando a versão não-gasta, colocando-a no modo de etapa e observando quais linhas levam a quais outras e o que cada estado / bloco de linhas faz.
As versões de golfe e não de golfe são exatamente iguais em termos de como funcionam, mas a versão não de golfe tem nomes mais amigáveis ao ser humano e é dividida em seções.
fonte
C implementando a (2,3) Turing Machine ,
236205 bytes (4631 a menos se você não se importa com entradas estranhas)Agradecimentos ao Appleshell por -11 bytes, VisualMelon por -12 bytes e Johan du Toit por -7 bytes.
O CeilingCat criou uma versão que usa apenas 144 bytes, veja aqui .
(Adicionei algumas quebras de linha aqui para que você não precise rolar, mas normalmente a maioria delas seria excluída)
Experimente online!
Para usar: Insira uma sequência de até 256 unidades, zeros e dois para inicializar a fita. Quaisquer valores não inicializados serão zero. (Valores diferentes de 0, 1 e 2 podem causar comportamento indefinido.) O programa iterará mais de 256 etapas. O número de etapas que ele repete pode ser aumentado modificando o código, mas obviamente isso requer mais caracteres.
É uma entrada bastante longa, mas esta é a primeira vez que faço uma delas e não usei um idioma dedicado ao golfe. Eu me diverti muito, mesmo que fosse mais do que eu esperava.
Muitos bytes são do processamento de entrada e saída, e eu perdi um total de 42 bytes ao aceitar 0, 1 e 2 em vez de NUL, SOH, STX. (Para mudar isso, exclua
k;
da frente efor(;k<256&&d[k];)d[k++]-=48;
da segunda linha.)A tabela de transição, especialmente a linha
*p=-t*t+(2-s)*t+1+s;
(que define os valores na fita) provavelmente também poderia ser compactada.fonte
k,j;c s,d[256];
(int
está implícito em C, então você também pode moveri
a declaração global para salvar 3 bytes mais)k++
e remover o{}
salva mais alguns bytes:for(;k<256&d[k];)d[k++]-=-48;
comoj
é apenas um cronometrista (o valor nunca é usado), você pode substituí-lo (ei
)k
contando ao contrário: você sabek==256
após o primeiro ciclo, então conte até zero no segundofor(;k>0;)
, que saik==-1
, então o último loop pode se tornarfor(;++k<256;)
. (Aviso: eu costumo jogar golfeC#
, mas isso pareceu compilar).k<256&&d[k]
, não&
, porqued[k]
estava sendo avaliado emk==256
. Além disso, comok
não havia mais garantia de ser256
posterior a esse loop, tive que redefini-lo posteriormente para garantir 256 etapas. (Se você (ou seja, VisualMelon) tem alguma outra sugestão, nós provavelmente deve colocá-los em bate-papo para que não fique muito muitos comentários)Röda implementando o Fractran ,
114112106 bytes1 byte economizado graças a @fergusq, reorganizando os parâmetros
Experimente online!
Chame a função assim:
f reference_to_input program
. A saída será armazenada no local doinput
.fonte
e[1]
é redundante. Além disso, você pode salvar um byte alterando ordem parâmetro:f&n,a
.f&n,a
truque, e eu estava prestes a remover o ponto e vírgula quando você comentou :)Clojure,
8281 bytes (Máquina de Turing)Atualização: removeu um espaço de
t{} s
.Implementa a máquina de Turing como um loop, retorna a fita quando o estado de parada é atingido. Nas regras de transição de estado, isso é indicado omitindo o estado de transição. A settins
N
paranil
e a subsequenteif-let
abortará como a transição de estado correspondente não é encontrada a partir da entrada de hash-mapa%
. Na verdade, qualquer valor para esse estado funcionará, como:abort
0 ou -1.Sem jogar com um exemplo de castor ocupado de 3 estados e 2 símbolos da Wikipedia .
Experimente online .
Em um único núcleo de 6700K, ele executa o castor de dois estados com 5 símbolos (47,1 milhões de etapas) em cerca de 29 segundos ou 1,6 milhão de etapas / segundo.
fonte
M → Dica , 4 bytes
Experimente online!
O link TIO adiciona um rodapé para chamar a função com o exemplo do programa Tip mostrado na página Esolang (o "invólucro automático" de M para chamar funções como se fossem programas que não possam lidar com números racionais ou de ponto fixo, ou pelo menos eu não descobri como contar, então preciso transformar a função em um programa completo manualmente para poder executá-lo.)
Na verdade, isso imprime saída de depuração útil; o programa não pode ser escrito em 3 bytes em M porque um programa que consiste em exatamente três díades aciona um caso especial no analisador, então tive que adicionar um comando extra para evitar o caso especial. Torná-lo
Ṅ
(imprimir com nova linha), pelo menos, proporciona uma finalidade útil.ı
Não implementa E / S (exceto halt / no-halt). AE / S é uma extensão do Tip (não faz parte do próprio idioma) e não é necessária para a conclusão de Turing.
Explicação / Antecedentes
[1,2,3]
[1,2,3,1,2,3,1,2,3,…]
ḅ
Então olhei para trás e reavaliei um pouco. Existem operações que poderíamos usar em vez da avaliação polinomial? Idealmente, aqueles que são comutativos, para que não tenhamos que nos preocupar com a ordem dos argumentos? Logo depois, percebi que as funções Collatz são mais complexas do que precisam.
E, é claro, diferentemente da conversão base (
ḅ
), a multiplicação (×
) é comutativa e, portanto, não importa em que ordem os argumentos são colocados. Portanto, tudo o que precisamos escrever é×ị
e, em seguida, colocar o programa em uma recursão infinita comß
, e temos uma linguagem completa de Turing. Direita?¹×ịß
¹
¹
Ṅ
é uma boa opção porque produz saída de depuração útil.Três bytes são possíveis? A menos que eu esteja perdendo alguma coisa, não com esta escolha específica de linguagem de implementação e implementação, mas neste momento certamente parece que seria possível de alguma forma, pois existem muitas maneiras de fazê-lo em quatro e tantos Turing-complete idiomas que você pode implementar.
fonte
ḋ
e emṙ
vez de×
eị
; o idioma resultante não é exatamente o mesmo que Tip, mas é bastante semelhante e quase certamente completo por Turing pelo mesmo motivo. Infelizmente,ḋ
não está implementado em M, e não consigo encontrar nenhuma maneira de fazer o Jelly fazer cálculos de precisão arbitrária quando uma das entradas é um número real não inteiro. Porém, se alguém conhece algum outro idioma de golfe onde essa construção possa funcionar, fique à vontade para tentar.C interpretando Brainfuck, 187 bytes
Experimente online
fonte
Lua interpretando Brainf ***, 467 bytes
Eu sei que ainda há algum emagrecimento que posso fazer mais tarde, mas é aqui que o meu primeiro passe terminou. Toma o código brainf da entrada padrão.
fonte
brains
, sempre é divertido quando os jogadores atribuem a uma lista de variáveis.CJam → Variante ResPlicate,
151413 bytes-1 byte graças a @ ais523
A variante é igual à desta resposta , exceto que o número de itens retirados da fila é um a menos que o número superior na fila.
A
l~{ ... }h
peça apenas pega uma matriz como entrada e se repete até que ela esteja vazia.Explicação para o loop principal:
fonte
Chip , 20 + 3 = 23 bytes (Regra 110)
+3 para bandeira
-z
Experimente online!
Esse envio não é perfeito, pois o Chip ainda não possui capacidade de loop, portanto a saída deve ser transmitida como entrada para simular várias gerações, com algo assim (é claro, você pode executar esse loop indefinidamente, e Chip pode lidar com entradas arbitrariamente longas, portanto, essa combinação é Turing Complete).
Essa implementação recebe entrada e saída na forma de ASCII
0
s e1
s. A lógica aqui é a seguinte:O restante dos elementos é para limpeza:
e*f
causa a saída numérica ASCII eE~Zt
finaliza a execução dois bytes após o esgotamento da entrada (já que a largura aumenta 2 por geração).fonte
Clojure, 75 bytes (sistema de etiquetas cíclicas)
Atualização 1: substituída
some?
pornil?
.Atualização 2: corrigida uma falta
S
no ramo deif s
.Implementa o sistema de tag cíclico , retorna
nil
se o programa for interrompido e repetir para sempre. Clojure realmente brilha aqui com infinitas sequências preguiçosas (como ciclo ) e desestruturação . Uns e zeros são indicados como valores verdadeiros e falsos. Quando a sequência de dados acabar,s
torna - senil
.Ungolfed:
Resultados de exemplo:
fonte
Regra de interpretação do JavaScript 110 , 131 bytes (99 bytes? 28 bytes?)
Como você pode ver, o código define 3 funções,
a
,b
ec
. Talvez seja possível salvar bytes combinando-os na função 1 (não vejo como), mas é bom que se separem porque cada um deles já cumpre esse desafio em algum sentido.A função
a
recebe 3 números como entrada e calcula um polinômio estranho deles. Quando esses três números são0
ou1
podem ser vistos como células da Regra 110. A paridade da saída dea
pode então ser vista como o valor da célula do meio na próxima geração. Portanto, de certa forma, essa função simples já é um 'intérprete' da Regra 110 (28 bytes):Podemos então criar uma nova função
b
que avaliea
todos os caracteres de uma sequência de uns e zeros. Esteb
é, então, de uma maneira melhor do quea
, um intérprete Regra 110. Tomando o mod 2 após a avaliação de um salvamento entre colchetes (99 bytes):Para realmente calcular uma função com a Regra 110, o usuário deve especificar o estado inicial e o número de gerações após as quais a saída será 'exibida'. Podemos criar uma terceira função
c
que utiliza uma sequência de uns e zeros, e um número inteiro positivon
, que avaliab
a sequência den
tempos. Assim, podemos realmente ver a Regra 110 como uma linguagem de programação, onde um programa é um estado inicial e um númeron
, e a saída é o estado apósn
gerações. A funçãoc
agora é um intérprete real para essa linguagem de programação, portanto o código final para esse desafio é o que apresentei acima.fonte
JS -> Nova linha 854 bytes
Super golfed graças ao google.
fonte
var
instruções:var b=0,n=!0,c=[],h=[],e=0,l=[],m=0,f=2,a=0,g=!1;
var
tyClojure, 87 bytes (Regra 110)
O crédito pelo código de paridade vai para Jens Renders! Eu estava realmente lutando para expressar isso e eu ia converter o
[p q r]
binário em um número inteiro e usar uma tabela de pesquisa.Aqui,
partition
a desestruturação de Clojure torna a aplicação lógica bastante simples. Essa função retorna uma sequência infinita de estados, de modo que o responsável pela chamada é responsáveltake
por quantos forem necessários ou apenasnth
para pular para um estado específico. Se o preenchimento com zero fosse dois elementos em vez de apenas um, a fita aumentaria constantemente, evitando problemas de contorno. Agora permanece a largura original.Exemplo:
fonte
cycle
seria capaz de construir o padrão de preenchimento infinito, mas executar o primeiro passo seria tomar uma quantidade infinita de tempo: /APL (Dyalog) → Variante Fractran , 15 bytes
Experimente online!
A função recebe os racionais como uma lista de números em vez de duas listas contendo o numerador e o denominador e gera o resultado se o programa terminar. Isso implementa uma variante do Fractran que possui o 1/1 racional (= 1) no final do programa. O 1 não tem efeito sobre a completude de Turing (tanto quanto eu entendo) porque a entrada para o programa só atinge a 1 quando nenhuma das outras racionalidades funciona e, quando funciona, a entrada não é alterada. Isso é usado apenas para que a função saiba quando terminar.
O link TIO executa a função por 2 iterações (para que você possa ver a saída porque o programa não termina) na primeira entrada e executa a segunda entrada até a conclusão, após o que retorna a saída.
(⊃0~⍨××0=1|×)⍣≡
toma a lista de argumentos como o argumento da esquerda, a ser referido como ⊣, e a entrada como o argumento da direita, a ser referido como referred(⊃0~⍨××0=1|×)
trem de função1|×
obter a parte após o ponto decimal (módulo 1) do produto×
de ⊣ e ⊢0=
é igual a 0?××
multiplique esse resultado por ⊣ × ⊢, sempre que o racional × ⊢ não for um número inteiro, ele será substituído por 00~⍨
remova todos os 0s⊃
pegue o primeiro elemento⍣
até a≡
entrada não mudar, observe que o resultado de(⊃0~⍨××0=1|×)
é reutilizado como entrada; portanto, se ele parar de mudar (como resultado de 1 no final), o programa parafonte
JavaScript: Cálculo Lambda (
123114)Representado usando indicadores Debruijn em duplos.
O combinador S é
[0, [0, [0, [[3, 1], [2, 1]]]]]
K é
[0, [0, 2]]
Eu sou
[0, 1]
Editar: raspou 9 bytes substituindo
"number"==typeof c
por!isNaN(c)
fonte
APL (Dyalog Unicode) , SBCS de 15 bytes
Programa completo que implementa um executor de autômato celular unidimensional generalizado. Isso inclui a Regra 110, que é Turing completa. Solicita ao stdin o estado inicial, o número de iterações (ou
≡
para continuar até estável ou{⍵≡⎕←⍺}
para exibir todos os valores intermediários até estável) e o conjunto de regras.Experimente online! (4 iterações da Regra 110)
⎕
solicitar o estado inicial e⊢
rendimento que (separa o estado do número de iterações)⍣⎕
solicite o número de iterações e aplique a seguinte função várias vezes:(
…)
Aplique a seguinte função tácita:⌺3
obtenha todos os bairros de comprimento 3 (com informações sobre se estão no limite) e aplique a seguinte função tácita a cada par:⊂
coloque o bairro∘
e⊢
rendimento que (descartando as informações sobre estar na borda)∘
então∊⍨
verifique se são membros de⎕
solicitar a lista de bairros que levam a estar na próxima iteraçãofonte