Dado dois trechos de código brainfuck A
e B
, imprima algum código de brainfuck C
que tenha o mesmo comportamento de executar B
com a entrada do A
resultado s. Observe que C
deve funcionar para qualquer entrada que corresponda às seguintes suposições, como se fosse fornecida A
.
Você pode assumir:
- Entrada finita.
- ambos A e B param.
- O EOF é consistentemente 0 ou consistentemente -1.
- Consistentemente permitir ou não permitir que células saiam
- Fita não ligada (caso contrário, o requisito pode ser impossível)
- Quebra consistente de 8 bits ou número inteiro ilimitado
- Nenhum fluxo (entrada ou saída para A ou B) contém o byte representando o EOF
- Os códigos A e B podem conter caracteres que possivelmente aparecem no seu C e
+-[]<>,.
Por exemplo (EOF = 0)
A = ,[..,]
B = ,[...,]
C = ,[......,]
A = >,[>,]<[.<]
B = ,[...,]
C = >>>>,[[-<+<+<+>>>]>>>,]<<<<[.<]
A = >,[>,]<[.<]
B = ,[...,]
C = >,[>,]<[...<]
A = ,.
B = ,.
C = ,>,[,]<.
A = ,.
B = ,.
C = ,.
são testes válidos
O código mais curto em cada idioma vence. O vencedor em Brainfuck será aceito.
Shortest code in each language win
eShortest Brainfuck solution will be accepted
são dois critérios de vitória diferentes.4.Consistently allow or disallow cells to left
. A resposta principal requer que as células à esquerda na resposta funcionem, mas não permite que A, B e C não se movam além do primeiro byte. As linhas de resposta das minhas respostas movem-se para a esquerda nas respostas A, B e C. Se as regras para o meu programa e C puderem ser diferentes de A e B, então certamente posso reduzir muito minha resposta.>
s ao início da minha resposta para torná-la compatível com um sabor mais restritivo (mas, para o golfe, também devemos considerar alternativas). Além disso, parece-me claro que A, B e C devem ter o mesmo sabor que o outro.Respostas:
brainfuck, 526 bytes
Formatado:
Com relação a A, B e C: EOF = 0, as células restantes do início não permitiram as células de quebra de 8 bits.
Espera A
?
seguido por B.Experimente online
(Essa resposta pode ser compatível com um intérprete de cérebro que não permite sair do início com o custo de um byte, transliterando
y/<>/></
e acrescentando a>
.)A idéia básica é usar uma série de substituições de cadeias para simular as fitas de A e B usando nós de duas células, com atenção especial à substituição
.
de A e,
B para que o fluxo de dados intermediário seja mantido em um bloco de células à esquerda da fita simulada. O esquema de substituição de cadeia é:Inserir
>>
antes de AEm A e B, substitua
>
por>[-]+>
e<
por<<
Em A, substitua
.
por>[-]-[>>]+[[>+<-]<[>+<-]<]>+[->>+]<[>>>-<<+[<<]<+>>>[>>]+<<<-]>[+<->]+</
Inserir
>[>>]+>
após A e antes de BEm B, substitua
,
por,[,]>,<<[<<]<[[>]>>[>>]<+<[<<]<[<]>-]>[>]>>[>>]+<*
fonte
,[>,]<[.<]?,[...,]
12345
retorno de entrada111
, mesmo com o suficiente>
antes?,[>,]<[.<]
Não é válido, mas>,[>,]<[.<]
é.)>
s a D, conforme necessário.brainfuck , 1287 bytes
Experimente online!
Aqui está! O código do cérebro que compõe dois códigos do cérebro. Use um "!" para separar os dois trechos de código de entrada. Por exemplo fragmento A:
>,[>,]<[.<]
, fragmento B:,[...,]
. Input para o meu programa:>,[>,]<[.<]!,[...,]
. Não terminará se não houver "!" seja encontrado.Isso faz essencialmente o mesmo que minha versão do VBA. O código gerado é o mesmo da versão do VBA (observe que os exemplos na postagem do VBA foram feitos antes da alteração mais recente nos trechos do cérebro).
Explicação
Este é o meu código fonte:
fonte
>[,>]<[.<]!,[...,]
, então o trecho A não produz nada. Claro que deve ser>,[>,]<[.<]!,[...,]
um exemplo de trabalho.VBA,
512489479 bytesExplicação
O código VBA altera o código do cérebro de uma maneira, para que a saída do trecho A seja armazenada em uma lista e a entrada do trecho B seja lida nessa lista.
Inicializa algumas variáveis
Em seguida, ele lê trecho de A e substitui todos
<
por<<<[+]-<<
, cada>
por>>>>>>>[+]-<<
e cada.
pela rotina de armazenamentodepois disso, ele exclui a memória do trecho A e faz alterações na lista armazenada, para que possa ser lido como entrada para o trecho B:
O trecho B será lido, todos
<
serão substituídos por<<<<<
, todos>
serão substituídos por>>>>>
e todos,
serão substituídos pela rotina de leitura da lista:Código fonte do Brainfuck
Esta é a minha fonte para as partes do código do cérebro. Vou explicar isso em detalhes mais tarde.
Saída para o caso de teste 1:
f ",[..,]",",[...,]"
Experimente online!
Saída para o caso de teste 2:
f ">,[>,]<[.<]",",[...,]"
Experimente online!
Saída para o caso de teste 3:
f ",.",",."
Experimente online!
Caso de teste complexo: Trecho A: Construa um triângulo do alfabeto
>+++++[<+++++>-]<+[>>[>[.>]]>++++++++++.--[<++++++++>-]<[+.<]<-]>>,>[.>]++++++++++.[<[.<]>,>[.>]<]
Experimente on-line!Snippet B: classifique a entrada em ordem crescente
>>,[>>,]<<[[-<+<]>[>[>>]<[.[-]<[[>>+<<-]<]>>]>]<<]
Experimente on-line!Resultado:
Experimente online!
fonte
Brainfuck , 785 bytes
Experimente online!
Para separar A do BI, optou por
/
.Explicação:
O código real que gera esta é apenas uma leitura em malha com uma bandeira de A / B e um interruptor que reduz a entrada para procurar
>
,<
,/
,,
, e.
e de outro modo apenas de saída da entrada. Na verdade, é apenas um transpilador em que o código transpilado vive dentro de uma estrutura de dados para que não interfira nos dados armazenados de A ou entre si. O/
apenas move a célula ativa para a primeira célula não utilizada. Eu o limpei originalmente, mas isso aumenta o programa e a saída.O resultado do programa possui o seguinte modelo de memória:
O
c
é desmoronar.cz
é sempre0
Ele indica onde está o ponteiro nos meus dados BF emulados. O valor ativo é -1, enquanto todas as células visitadas terão1
. Em operações comoaprint
ebread
algumasc
têm um significado especial.A impressão de código A pula todas as células de 1 byte para deixar espaço para mais uma entrada de byte, que é copiada com um backup nos próximos bytes que se desintegram para copiar novamente.
A leitura do código B busca a entrada da entrada. Aqui ser destrutivo é bom e quando você "lê" o último byte, obtém 0 como EOF, independentemente da implementação.
Comecei como código Extended BrainFuck , resultando em EBF. A maior parte da depuração foi realizada nos arquivos de resultado e, em seguida, é atualizada na fonte que o gerou. Então, eu apenas executo as operações de forma independente para obter a saída BF, mas notei a resposta de Dorian, que me durou muito, então continuei jogando a fonte EBF para obter uma saída BF menor. A fonte original é bastante legível e simples em comparação com outras coisas que fiz com ela:
fonte
[->+]
no programa C causa falha para entradas como->->,./,.
, e isso pode ser corrigido usando[->>+]
(certificando-se de que o ponteiro inicie em uma célula com a paridade desejada). Pois[-<+]
, acho que você pode alterar o esquema de navegação para depender de toda a saída de A ser diferente de zero?->->,.
e B é,.
, seu intérprete preferido produz o mesmo C do TIO e C funciona conforme o esperado no seu intérprete? Porque falha no TIO . (Eu escrevi isso em resposta a um comentário que agora é excluído.)-1
dados do usuário, mas na verdade fiz na linha "ir para a célula ativa, zerá-la". Atualizei minha resposta e adicionei um byte: -O, mas pelo menos funciona. Entre. Se eu não estiver usando o scan para-1
quando buscar entrada em B, terei que mover o byte ativo com uma cópia>[-<+]<
e, portanto, adicionarei mais caracteres do que pouparei, substituindo+[-<+]-
por[<]
. Se você não copiar, não poderá saber se o byte que você compôs foi finalizado e copiar todos os bytes.[-<+]
foi na verdade também em relação à eliminação de bugs (em vez de salvar bytes), para entradas como-./,>++++++[<++++++>-]<.
, que devem ser impressas em#
vez de%
. :) Mas vejo algumas oportunidades para salvar bytes também. Boa sorte! Tentarei otimizar minha solução de fita duplamente infinita, embora ver o que você fez me faça pensar que talvez a fita infinita à direita seja mais golfista no final.sed, 165 bytes
Para sabores com EOF = 0, as células restantes do início não permitiram as células de quebra de 8 bits.
Espera o programa A na primeira linha e B na segunda linha.
Experimente online
Isso usa nós de duas células para simular as fitas de A e B, com a saída de A ocupando células contíguas à esquerda do nó mais à esquerda.
Solução alternativa de 173 bytes:
Experimente online
Originalmente, meu design era baseado em uma fita duplamente infinita, que exigia muito mais trabalho para mover para a esquerda (mover dados ao ultrapassar a célula mais à esquerda encontrada anteriormente) e fazer a transição de A para B (limpar os dados em vez de apenas passar pela célula à direita) encontrado anteriormente).
Obrigado a Sylwester e Dorian pelos truques e idéias.
fonte
,[..,]
e B do programa,[...,]
.s/x/>>/g
no final, mas estou mais interessado em melhorias que reduzirão a saída no momento.