Desafio
Escreva um programa ou função que tenha uma string, retorne um programa Brainfuck válido que, quando compilado e executado como Brainfuck, retorne essa string.
Suponha que todas as entradas sejam codificadas como ASCII.
Suponha que o programa BF emitido seja executado em um ambiente com uma fita infinita.
Suponha que o ponteiro comece na célula 0 com cada célula inicializada com um valor zero.
Cada exemplo abaixo representa uma saída correta possível para a entrada fornecida. Em particular, os exemplos incluem novas linhas e espaços extras para ajudar a legibilidade humana. As soluções são gratuitas para formatar o código BF emitido de qualquer maneira.
A fita é duplamente infinita.
Todas as células fornecidas pelo intérprete são exatamente células de 8 bits. Estouro e subfluxo envolvem uma questão previsível e sã.
Exemplos
Cadeia de espaço
Dada a entrada , seu programa / função pode retornar:
+++++ +++++
+++++ +++++
+++++ +++++
++ .
Ponto de exclamação
Dada a entrada !
, seu programa / função pode retornar:
+++++ +++++
+++++ +++++
+++++ +++++
+++
.
Duas cartas
Dada a entrada hi
, seu programa / função pode retornar:
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
++++
.
+
.
Isso é código-golfe , então o código com o menor número de bytes vence. Boa sorte.
Respostas:
Gelatina , 8 bytes
Experimente online!
Amostra de execução
Para entrada
hi
, este programa imprime(sem as alimentações de linha) que, por sua vez, são impressas
hi
.Como funciona
fonte
.>
aparece na saída?p
) é mais curto que o anexo a cada (;€
). Esses programas de saída duplicam a célula após a impressão e antes da troca. Como nunca revisitamos a célula, ela não afeta a saída.Brainfuck,
5551 bytesExperimente online!
Exemplo de saída para
hi
(sem os feeds de linha):Explicação
Isso se move pela fita enquanto escreve o programa. O ambiente
,[...,]
é um loop de entrada padrão. Para cada personagem, usamos quatro células:onde
x
está a célula na qual escrevemos a entrada.Esta parte usa célula
a
para escrever uma21
célula emb
uma multiplicação padrão de3
e7
.Agora usamos isso
21
para escrever42
dentroa
e63
para dentroc
multiplicando por2
e3
respectivamente. Em seguida,<+<
volta para a célulax
enquanto transforma o42
em43
(o ponto de código de+
). Recapitular:Agora, o loop de saída principal:
Ou seja, ao decrementar
x
, imprimimos um de+
cada vez.Depois que terminamos, reutilizamos a
+
célula, adicionando3
para dar.
.Finalmente, passamos para o
63
, diminuímos para62
(>
) e produzimos isso também. A próxima iteração usará essa célula comox
.fonte
Brainfuck,
39333231 bytesO algoritmo que coloca 45 na fita é retirado das constantes Brainfuck de Esolang .
Esta resposta pressupõe que o intérprete do programa de saída tenha células delimitadoras; e isso
,
zera a célula atual (implicando que o programa de saída é executado sem entrada). Experimente online!Para uma solução (mais longa) que funciona incondicionalmente, veja minha outra resposta .
Execução de teste
Para entrada
Code Golf
, a seguinte saída é gerada.Experimente online!
Como funciona
Começamos colocando o número inteiro 45 (código de caractere de
-
) em uma célula da fita. O código a seguir consegue isso.Antes de entrarmos no loop, a fita fica assim.
Essas três células - -2 , -1 e 0 - são as únicas que usaremos neste programa.
Na primeira cada iteração do loop, a célula mais à direita é, então essa célula e a célula do meio são decrementadas duas vezes, deixando o seguinte estado.
Nas próximas 126 iterações, a inicial
-
diminui a célula do meio,[>]<
salta para a célula mais à direita e--<--
diminui a célula do meio e a direita. Como resultado, 3 é subtraído da célula do meio (módulo 256 ) e 2 é subtraído da célula mais à direita.Como 254 ÷ 3 (mod 256) = (254 + 256) ÷ 3 = 510 ÷ 3 = 170 e 252 ÷ 3 = 84 , a célula mais à direita é zerada antes da do meio, deixando o seguinte estado.
Da mesma forma que a primeira iteração do loop, a próxima iteração agora subtrai 3 da célula do meio e 2 da célula da esquerda, colocando a cabeça na célula da esquerda.
As iterações subsequentes, como na iteração 126 anterior, subtraem 3 da célula mais à esquerda e 2 da célula mais à direita.
Como 254 ÷ 3 (mod 256) = 170 e 129 ÷ 2 (mod 256) é indefinido, isso é feito 170 vezes, deixando o seguinte estado.
A célula sob a cabeça é zero; o loop termina.
Agora estamos prontos para gerar saída.
fonte
\0
.Brainfuck,
35 1343 bytesEsta resposta não faz suposições sobre o intérprete do programa de saída.Experimente online!
Para uma solução mais curta (que funciona apenas com alguns intérpretes), veja minha outra resposta .
Execução de teste
Para entrada
Code Golf
, a seguinte saída é gerada.Experimente online!
Como funciona
Começamos colocando o número inteiro 43 (código de caractere de
+
) na segunda célula da fita. O código a seguir consegue isso.Isso essencialmente executa a divisão modular 2 ÷ 6 (mod 256) . Como (2 + 256) ÷ 6 = 258 ÷ 6 = 43 , o resultado é 43 , como pretendido.
Agora estamos prontos para gerar saída.
fonte
Pitão - 11 bytes
Experimente online aqui .
fonte
05AB1E,
1211 bytesExplicado
Experimente online
Guardado 1 byte graças a @Adnan
fonte
'+×
em vez deF'+}
salvar um byte.Java, 98 bytes
String
s nada mais são do que imutáveischar[]
com métodos utilitários, então vamos usar o array!Ungolfed:
Programa independente equivalente com 138 bytes de comprimento:
Bônus:
Na verdade, esse aplicativo de 207 bytes codifica um arquivo como um programa BF, como dito no título.
fonte
Vitsy,
1917 bytesObserve que esta resposta é uma das poucas vezes que eu já usei
I
eu
. : DExperimente online!
fonte
O , 13 bytes
Explicação:
fonte
K6, 16 bytes
Uso
Explicação
fonte
Python 3, 43 bytes
O Python coloca um número de vantagens equivalentes ao código ASCII de cada caractere, seguido por
.>
para imprimir e mover para a próxima célula. O golpe cerebral aumenta até o valor correto, imprime e passa para a próxima célula.Saída para
hi
(com novas linhas para maior clareza):A saída desse programa:
fonte
Perl, 25 bytes
Uso
Explicação
Utiliza uma operação de substituição de expressão regular para substituir cada caractere em cada linha fornecida na entrada padrão por um número
+
calculado a partir do valor ordinal desse caractere, em seguida, sai.>
para imprimir e avançar para o próximo caractere.Usa o
-p
sinalizador perl para ler automaticamente a entrada e imprimir o resultado, adicionando 1 extra ao número de bytes.fonte
Java, 91 bytes
Adereços para dorukayhan por me bater nele :)
fonte
C,
726460 bytesVersão não destruída:
Compile e teste com:
gcc -o bfcat bfcatgolf.c && cat 1.txt | ./bfcat > o.txt && beef o.txt
Resultados
hi
- http://paste.ubuntu.com/17995958/quick brown fox jumps over the lazy dog
- http://paste.ubuntu.com/17996059/fonte
c
o bit a bit é inversogetchar
, especialmente se você inverte a inversão novamente?c = ~getchar( )
avaliado como 0 emEOF
.c = ~getchar( )
e~c++
são simplesmente mais curtos que~( c = getchar( ) )
ec--
CJam, 12 bytes
Converte cada caractere em seu valor ASCII e incrementa a célula atual por esse número de vezes antes de imprimi-la. Como temos fita infinita, podemos simplesmente mover para a direita após processar cada caractere.
Experimente online!
fonte
Lua,
676661 bytesSimplesmente itere sobre cada caractere no argumento e imprima uma linha para cada um com
n
+
s seguido de.>
onden
está o valor desse caractere na Tabela ASCII.Usa gmatch como @LeakyNun recomendado no comentário por economizar 1 Bytes sobre a solução gsub
Solução antiga usando gsub
Antigo 67
Para executá-lo, salve-o como um arquivo (
golf.lua
por exemplo) e execute-o comlua golf.lua "hi"
. Parahi
, deve produzirfonte
attempt to index a nil value
, ef = ...
dá o mesmo, efunction f ... end
dáunexpected symbol near ':'
lua file.lua "argument"
, atualizarei o post para fornecer instruções....
um identificador com argv?...
contém os valores na tabelaarg
descompactados. O que significa que ele sempre corresponderá aarg[1]
menos que você o use em uma chamada de função como o último parâmetro, então ele gastará.n=...for n:gmatch"."do print(("+"):rep(c:byte())..".>")end
para 48 bytesJ, 28 bytes
Simples o suficiente.
3&u:
converte caracteres em códigos de caracteres. O resto é apenas repetir'+'
esse número de vezes e concatenar.>
no final de cada linha e;
nivelar o resultado.Alguns resultados
fonte
Pyke, 11 bytes
Experimente aqui!
fonte
Na verdade, 13 bytes
Experimente online!
A estratégia usada aqui é a mesma que em muitas das outras soluções - para cada personagem, produz bastante
+
s para incrementar uma célula inicializada com zero para o ordinal ASCII adequado, produzi-la com.
e passar para a próxima célula com>
.Explicação:
fonte
Mouse-2002, 27 bytes
Isso funciona na teoria e de acordo com a documentação da linguagem, mas a implementação de referência do intérprete do Mouse parece ter um bug no qual a entrada de string acrescenta a
'
, portanto, paraa
essas saídasQue por sua vez, produz
a'
. Isso pode ou não ser bom, então aqui está um de 39 bytes de comprimento que'
nunca sai e, portanto, é provavelmente mais inválido.O que fornece saída correta no impl impl. contanto que não haja
'
s :)Explicado:
fonte
Fator, 58 bytes
Funciona como:
Como o Factor vem com um intérprete Brainfuck, é fácil testar.
bfcat.factor
bfcat-tests.factor
resultado
Yay! todos eles passam.
fonte
Rubi,
40.38 bytesfonte
puts
em vez deprint
, como o formato da saída não é significativo, desde que ele é brainfuck válido e brainfuck não se preocupa com outros personagensSidef , 38 bytes
Ei, do mesmo tamanho que Ruby! só que Sidef não é Ruby: D
Leia alguns caracteres e, para cada byte, faça isso.
fonte
GNU Bash,
10085 bytesObrigado @cat por me salvar 15 bytes!
Postramble
bash bfcat.sh <path to file containing string>
bash bfcat.sh <(echo -n '<string>')
Ungolfed
Referências na versão Ungolfed
Ler arquivo byte por byte
ord
de um char na festançaemitir caractere $ n vezes
fonte
read -rn1
, livrar-se dos espaços depois;
, livrar-se do espaço emdone <"$1"
salvar um total de 9 bytesES6,
119115 bytesf=s=>{a='';for(i in[...s]){b=s[c='charCodeAt'](i)-(s[c](i-1)|0);a+=(b>0?'+'.repeat(b):'-'.repeat(-b))+'.'}return a}
Guardado 4 bytes, graças a @Leibrug
fonte
charCodeAt
a alguns var (digamosc
) e usar assim:s[c](i)
para diminuir em 1 byte e também remover alguns caracteres (eu encontrei 3: space antes[...s]
, substitua OR lógico por bit a bit um e ponto-e-vírgula antesreturn
).Sesos (não concorrente)
Hexdump:
Experimente online!
Montador
fonte
Ruby, 26 bytes
+ 1 byte para a
p
opção de linha de comando. Para, por exemplo, obter o código brainfuck,ABC xyz
você pode executare pegue
fonte
Haskell 50 Bytes
fonte