Em qualquer linguagem de programação ou script x , escreva um programa que leve um código-fonte válido para o cérebro de stdin e output para stdout, o código-fonte de um programa, escrito na linguagem x , que produziria exatamente a mesma coisa que o programa brainfuck faria.
Seu programa deve funcionar para qualquer programa válido do cérebro, incluindo o arquivo vazio.
Sua pontuação seria igual à contagem de bytes do seu código-fonte, mais a contagem de bytes da sua saída, com a seguinte entrada:
+++++ [-]
+++++ +++++ [
> +++++ ++
> ++ +++ ++++ +
> +++
<<< -
]
> ++ . H
> + . e
++ +++ ++. l
. l
+++ . o
> ++ . space
< +++++ +++ . w
----- --- . o
+++ . r
---- - - . l
----- --- . d
> + . exclamation mark
------lol; useless code :-)--------------------------[.............................................][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]<-<<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><
Por exemplo, para uma entrada de [-]
, a saída de *p=0;
é muito mais favorável do quewhile(*p) *p--;
Se você usar caracteres não ASCII, a contagem de bytes deverá ser calculada usando a codificação UTF-8.
Menor pontuação ganha. No entanto, soluções criativas que tentam minimizar a produção devem ser incentivadas por votos positivos.
byte count of source + (byte count of output)^2
, isso encorajaria as pessoas a se concentrarem mais na simplificação do resultado?Respostas:
Perl - 177 (origem) + 172 (saída) = 349
Contando o shebang como 2 bytes, um para cada opção. Primeiro, cada um dos oito comandos é traduzido para o intervalo
p-w
, ao mesmo tempo em que remove todos os outros caracteres. Essa sequência é codificada e executada no comprimento de execução com um decodificador / intérprete mínimo. Algumas coisas são otimizadas: a sequência><
obviamente não faz nada, e um loop for que segue diretamente após o outro pode ser completamente removido, pois nunca será inserido.Saída para o programa de teste:
Uma amostra de execução:
Perl - 232 (origem) + 21 (saída) = 253
Este é baseado na observação do FIQ de que, se o programa original não contiver uma instrução de entrada, a saída será estática e, portanto, poderá ser reduzida a uma única
print
instrução. Se você gosta deste, certifique-se de dar uma resposta para +1.Então, o que podemos fazer é canalizar
stdout
para uma variável,eval
o código que teríamos de saída e agrupar o resultado em aprint
.... isso nem sempre funciona, no entanto. Sempre que o código a ser traduzido resultasse em um loop infinito (por exemplo
+[.]
), isso não pode ser reduzido a uma únicaprint
instrução, por razões óbvias. Então, em vez disso, iniciamos oeval
processo em um filho com um tempo limite curto e, se não terminar de executar nesse período, produzimos o programa traduzido como antes.Estruturado e comentado:
Saída para o programa de amostra:
Saída para
,[.]
:Saída para
+[.]
(após 9 segundos):fonte
wv.*?(?=w)
está errado. Eu acho que ele só removerá o código até o próximo]
, mas você precisa encontrar a correspondência]
; você precisa cuidar de nidificação ...wv[^v]*(?=w)
, que é significativamente mais curto que a alternativa.Brainfuck, 5 + 540 = 545 bytes
5 bytes de código, 540 da saída do arquivo de teste fornecido (supondo que a contagem seja correta na minha colagem desse código).
Supondo que EOF seja 0.
fonte
bfi
( github.com/susam/bfi ). Apenas compile e instale-o e execute-o da seguinte forma:bfi input.bf
ondeinput.bf
está o arquivo brainfuck a ser interpretado.PHP, 553 + 27 = 580 bytes
(553 bytes com todos os espaços em branco, ou seja, novas linhas e espaços, removidos)
Eu sou péssima em jogar golfe no PHP, então essa abordagem pode ser fortemente otimizada. Eu queria principalmente mostrar minha abordagem da solução em algo que não fosse o melhor.
O relatório de erros deve estar desativado; caso contrário, o PHP o odiará. Uso: jogue isso como uma página e execute-o com script.php? C = CODE (se o script resultante exigir entrada, você o executará como out.php? I = INPUT). Lembre-se de url para escapar da entrada!
O que isso faz é basicamente isso - se o script BF contiver ",", ele se incorporará como o script resultante com um $ b = 1 anexado; no topo. Se NÃO contiver ",", ele será otimizado para "eco '<BF output>'". Convenientemente, o script de teste no OP NÃO requer nenhuma entrada. O addslashes () existe apenas para escapar 'e \.
fonte
C ++, 695 + 510 = 1205 bytes
Código:
Resultado:
Código original:
fonte
Python - 514 + 352 = 866
Código:
Resultado:
fonte
io
659 + 553 = 1212
Coisas como
File standardInput readBufferOfLength(1)
realmente matam a contagem de bytes, mas não consigo contornar isso. Eu não fiz otimizações para símbolos repetidos ou falta de entrada no programa BF, mas continuarei trabalhando nele, também trabalhando em um que faça uso dos recursos de metaprogramação da io.Teste
Rendimentos
fonte
Brainfuck , 109 + 407 = 516
Experimente online!
Ele remove apenas operações que não são BF e não analisa outras otimizações.
fonte
Lua - 328 + 2256 = 2584
(Ah, eu acabei de perceber que você precisa adicionar o tamanho do resultado também, baixa pontuação, parece)
Retirado desta resposta minha.
fonte
Lua - 319 + 21 = 340
Este é provavelmente o código mais curto de todos, mas não aceita entrada, por isso é meio barato. Eu tive uma idéia para outra versão com entrada, veja o final deste comentário.
Lua - 376 + 366 = 742
Esta versão é para provar que lua pode fazer melhor que 2584: D
Ambas as versões adicionam 30000 bytes de dados. Minha segunda versão é baseada em entrada / saída: tudo depois de um '.' ou ',' serão removidos. Minha segunda versão não permite loops infinitos ([.,], [] Etc.)
Minha idéia é obter:
De sua entrada, com um ', +' extra.
fonte