Um sistema cíclico de tags é um minúsculo modelo computacional completo de Turing que consiste em um alfabeto de dois símbolos (eu usarei {0,1}
), uma lista cíclica finita e não vazia de produções que consistem nesses dois símbolos e uma palavra ilimitada que também consiste em esses dois símbolos.
Em cada etapa:
- o primeiro elemento da palavra é removido
- se fosse
0
a produção atual é ignorada - se foi,
1
a produção atual é anexada ao final da palavra . - a próxima produção se torna ativa. Se essa foi a última produção, volte para a primeira.
O sistema pára quando a palavra fica vazia.
Um exemplo (da Wikipedia):
Productions: (010, 000, 1111)
Initial word: 11001
Generation Production Word (before) Word (after)
0 010 11001 → 1001010
1 000 1001010 → 001010000
2 1111 001010000 → 01010000
3 010 01010000 → 1010000
4 000 1010000 → 010000000
5 1111 010000000 → 10000000
6 010 10000000 → 0000000010
7 000 0000000010 → 000000010
8 1111 000000010 → 00000010
9 010 00000010 → 0000010
Sua tarefa, se você optar por aceitá-la, é escrever um programa ou função que utilize:
- uma lista de produções,
- a palavra inicial e
- uma geração,
e imprime ou retorna a palavra nessa geração.
Por exemplo,
cyclic_tag(
prod=[[0,1,0],[0,0,0],[1,1,1,1]],
word=[1,1,0,0,1],
gen=4) => [1,0,1,0,0,0,0]
Detalhes da implementação:
O alfabeto não importa. Você pode usar
0
e1
,True
eFalse
,T
eNIL
,A
eB
, ou mesmo1
e0
, ou qualquer outra coisa que possa inventar, desde que seja consistente. Todas as entradas e saídas devem usar o mesmo alfabeto e você deve indicar para o que está usando0
e para que1
.O comprimento da palavra deve ser teoricamente ilimitado. Ou seja, você não pode codificar um tamanho máximo de palavra. Se eu executar o seu programa em um computador ideal com uma quantidade infinita de memória, seu programa deve teoricamente ser capaz de fazer uso dele. (Você pode ignorar os limites do seu intérprete / compilador.)
Se o sistema especificado parar antes que a geração seja atingida, você deverá retornar ou imprimir a palavra vazia.
A produção vazia existe e você deve poder lidar com isso. Se você escrever um programa completo, sua E / S também deve poder lidar com isso.
Edit : Eu pretendia originalmente que geração 0
fosse a própria palavra de entrada e geração 1
fosse o resultado do primeiro passo. Ou seja, eu pretendia que você retornasse a coluna anterior . No entanto , como não fui suficientemente claro ao afirmar isso, aceitarei as duas opções ; para cada geração, você pode retornar o valor na coluna antes ou depois . Você deve declarar que está seguindo a coluna depois , se estiver fazendo isso. Você também deve ser consistente em qual coluna você escolher.
Atribuirei o menor código daqui a uma semana (27/10/2014).
fonte
Respostas:
GolfScript (17 a 19 bytes, dependendo do formato de entrada e do formato de saída aceito)
18 bytes:
Recebe entrada no formulário
[1 1 0 0 1] [[0 1 0] [0 0 0] [1 1 1 1]] 4
e fornece saída no formulário[1 0 1 0 0 0 0]
. (Pode ter 17 bytes sem o último`
se a saída1010000
for aceitável).Demonstração online
19 bytes:
Recebe entrada no formulário
"11001" ["010" "000" "1111"] 4
.Demonstração online
Dissecação
Crédito para Martin Büttner 's solução CJam para a idéia de gerar a lista de produções por repetição e truncagem.
fonte
Haskell,
555351isso usa
True
como1
eFalse
como0
. exemplo execute:fonte
CJam,
313028272418 bytesIsso define um bloco (a coisa mais próxima de uma função), que espera que a entrada resida na pilha como esta
Ele também irá deixar um conjunto de
0
s e1
s na pilha.Teste aqui. Cole a entrada na primeira linha, o código na terceira linha e acrescente a
~
para realmente avaliar o bloco. Por exemploSe a saída não precisar ter o mesmo formato da entrada
Explicação:
O estado final da palavra é deixado na pilha.
Agradeço a Peter Taylor por me fazer revisitar isso.
fonte
l~{_,g{('1=@(:Pa+@@P*+}*}*\;
28 e ainda espaço para melhorias (especialmente a(:P
parte), mas o tempo para o almoço:P
também está me irritando: Dl~{_,g{(si@(:Pa+@@P*+}*}*\;
: 27 e depois de olhar para ele,:P
é realmente eficiente: P_,g
também pode ser substituído por_!!
mas mesmos bytes._{...}{}?
isso.Mathematica,
84 8077 caracteresExemplo:
fonte
Pitão 22
Requer todos os 3 argumentos como entradas separadas.
Toma argumentos como:
Explicação:
Python 2-61
67 91 105 124Resposta bastante Joe-Basic. Assume que a produção está vazia
[[]]
.Graças a @xnor, por apontar que jogar golfe às 2 da manhã é uma péssima decisão.
Agradecimentos adicionais a @xnor, a quem pareço dever 50% da minha pontuação.
Amostra:
fonte
g and w
parax
? Além disso, acho queg*w
deveria funcionar para dar um valor verdadeiro quando ambosg
são diferentes de zero ew
não são vazios.if x else w
. Nemx
sempre será verdade porque esse código é executado apenasif x
ou estou faltando alguma coisa?and
/or
e rotação emp
vez de incrementarn
:c=lambda p,w,g:g*w and c(p[1:]+p[:1],w[1:]+w[0]*p[0],g-1)or w
Javascript ES6 - 88 bytes
Parece estranhamente semelhante à resposta de Fry, que apareceu no meu navegador. (Sem cópia, juro solenemente.)
Parece que ele seguiu a rota do array enquanto eu segui a rota string / regex.
Expandido:
Saída de amostra
Agora observe as línguas do golfe entrarem e massacrarem nós dois. : D
fonte
n
,. Grandes mentes, não é? : D