Um dos códigos mais fáceis de escrever por uma linguagem de programação é uma sequência de caracteres de impressão de programas (ex. "Olá, mundo!"). No entanto, é o m e e s o t e r i c linguagens de programação como Brainfuck , mesmo este código mais simples é muito chato para escrever.
Sua tarefa é escrever um programa (não precisa ser escrito no cérebro), que imprime um programa Brainfuck (tamanho mínimo) imprimindo o texto fornecido.
Entrada
Uma sequência de caracteres (entre 1
e 255
) é fornecida por qualquer formato (variável, argumento, stdin, arquivo, ...).
Saída
A saída é um código válido (sem correspondência [
e ]
) de falha cerebral (suponha uma célula de quebra automática de 8 bits não assinada e um número ilimitado de células para a esquerda e a direita) imprimindo a seqüência exata que foi fornecida como entrada.
Por exemplo, uma saída possível para entrada A
é ++++++++[<++++++++>-]<+.
.
Seu programa não deve levar muito tempo ( >2m
) para ser executado.
O programa BF não deve levar muito tempo ( >10s
) para ser executado.
Pontuação
(Observação: o método de pontuação atual pode mudar, pois não é fácil calcular ...)
O tamanho do programa (gerando código BF) em si não importa. No entanto, os códigos BF codificados no código do programa não estão OK. Apenas intervalo aceitável (ex um código BF imprimir um único personagem. 0x01
: +.
) De códigos BF pode ser codificado.
A pontuação é a soma do comprimento dos códigos BF que imprimem essas seqüências.
- Uma string
Hello, world!
anexada a um único0x0A
(\n
) (ou seja, o programa "Olá, mundo!") - Caractere único de
0x01
~0xFF
- A soma do comprimento desses códigos de 255 BF é multiplicada
1/16
, arredondada e adicionada à pontuação.
- A soma do comprimento desses códigos de 255 BF é multiplicada
- Lista dos primeiros 16 cordões, gerados por divisão uma sequência aleatória de bytes gerado em 11-11-11 por
0x00
, remover todas as cadeias de comprimento zero. - Lenna.png , removendo todos os
0x00
s. - Letras da música 99 garrafas de cerveja , começando com
99 bottles~
, novas linhas são0x0A
, parágrafos são separados por dois se0x0A
nenhum caractere de nova linha no final. - Outras strings que você pode fornecer.
Seu programa pode incluir o cálculo da própria pontuação.
Obviamente, o código de menor pontuação será o vencedor.
Lenna.png
vai dominar a pontuação, pois é de longe a maior contribuição. Talvez normalizar um pouco por tamanho?Respostas:
Em Java, calcula um pequeno fragmento de BF que pode converter qualquer número em qualquer outro número. Cada byte de saída é gerado transformando o último byte de saída ou um 0 novo na fita.
Os trechos são gerados de três maneiras. Primeiro, por simples repetições de
+
e-
(por exemplo,++++
converte 7 para 11), combinando trechos conhecidos (por exemplo, se A converte 5 em 50 e B converte 50 em 37, AB converte 5 em 37) e multiplicações simples (por exemplo,[--->+++++<]
multiplica o número atual por 5/3). As multiplicações simples aproveitam a envolvente para gerar resultados incomuns (por exemplo,--[------->++<]>
gera 36 a partir de 0, onde o loop executa 146 vezes, com um total de 4 envolventes descendentes e 1 ascendente).Estou com preguiça de calcular minha pontuação, mas ele usa cerca de 12,3 operações de BF por byte
Lenna.png
.fonte
Bem, aqui está a pior solução possível, apesar de uma boa aparência no próprio Brainfuck:
A pontuação é provavelmente a pior que provavelmente veremos sem torná-la intencionalmente ruim.
Trabalhando no cálculo da pontuação real.
fonte
+
's e uma.
[-]
para limpar a célula entre cada personagem.Python 3.x
Bem, não vou ganhar nenhum prêmio pelo código de saída mais curto, mas talvez pelo programa gerar o código ...
'Olá, mundo! \ N':
fonte
print("".join(["+"*ord(i)+".[-]"for i in input()]))
.[-]
por.>
Não sei ao certo como é bom, mas me diverti escrevendo isso. (Em Clojure ...)
Provavelmente existem soluções mais eficientes e mais elegantes, mas isso segue meu padrão de pensamento de maneira linear, por isso foi mais fácil.
fonte
Ponto:
478748641439404086426 (sem dados gerados aleatoriamente)(4085639 dos quais são de Lenna.png. Isso é 99,98%)
Eu não entendo a parte com os dados aleatórios. Não preciso de uma conta pela qual tenho que pagar para obter os dados?
Muito ingênuo. Aqui está o código gerado para "1Aa" (49, 65, 97) com uma pequena documentação:
O código Java é um pouco feio, mas funciona. A instrução gerada por taxa de bytes de entrada é provavelmente melhor quanto maior o valor médio de bytes.
Se você deseja executá-lo, é necessário colocar o Lenna.png no mesmo diretório que o arquivo .class. Ele imprime a pontuação no console e grava o código BF gerado em um arquivo chamado "output.txt".
Vou fazer algumas pequenas melhorias, mas provavelmente não muito.Feito.fonte
BrainF ** k
Eu sou um péssimo programador de BF, então essa resposta provavelmente é bastante ineficiente. Não tenho certeza da pontuação, mas ela deve ter um desempenho um pouco melhor do que a resposta existente no seu texto médio. Em vez de zerar a célula após cada caractere, este se "ajustará" a um novo caractere com subtração se o caractere anterior fornecido for maior.
(Observe que este é o código que escrevi há muito tempo e que me adaptei novamente para esta competição. Espero sinceramente que tenha feito a conversão corretamente, mas se ela falhar em alguma entrada, avise-me.)
Uma versão mostrando o estado da fita em todo o código:
Código gerado para
Hello, World!
:Esta é minha primeira resposta no CG.SE! Se eu estraguei alguma coisa, me avise!
fonte
> <>
Escrevi isso em resposta a uma pergunta marcada como duplicada, e mesmo que este não seja o melhor golfe (para essa pergunta específica, pelo menos), achei que seria um desperdício se não a compartilhasse. toda a sua glória nojenta e repugnante. Realmente, estou meio surpreso que isso funcione. Vou dar algumas sugestões para jogar golfe, já que esse foi meu principal objetivo em sua criação.
Como observação lateral, na segunda linha, os três caracteres iniciais
.21
poderiam ser substituídosv
por dois espaços, se isso facilitar a leitura. Não gosto de ver espaços nos meus programas, porque isso significa que há espaço desperdiçado (literalmente). Também é um remanescente de um dos muitos protótipos.O modo como ele funciona é realmente simples e, francamente, seria difícil pensar em uma maneira de implementar outro algoritmo. Ele imprime no entanto muitos "+" s precisam ser impressos para o primeiro caractere e, em seguida, imprime mais "+" s ou "-" s conforme necessário para cada caractere adicional, separando cada seção com pontos. O que eu acho interessante sobre o programa é que ele modifica seu próprio código-fonte para imprimir "+" ou "-" (substitui o "+" na linha 3 pelo caractere apropriado após determinar se o caractere atual é maior que ou inferior ao anterior).
Saída para
Hello, World!
:Eu posso pontuar isso da maneira que ele deveria ser pontuado, mas tenho quase certeza de que perderia e não sei ler algo como lenna.png em> <>.
Se essa resposta lhe interessa e você gostaria de uma explicação, pergunte por todos os meios, mas por enquanto deixarei sem uma só por causa da distorção e da distorção.
EDIÇÃO 1: Já faz um tempo, mas eu consegui jogar 2 bytes com uma revisão quase completa da maneira como o programa decide se imprime um sinal de mais ou menos. É um retorno decepcionante para uma grande revisão, mas pelo menos funciona.
fonte
minha solução JavaScript é rápida e suja :)
saída para
Hello World\n
Fonte:
fonte
Eu construí algo em Java. Não calculou a pontuação. Textos com 3 ou menos caracteres são codificados com uma multiplicação por letra, por exemplo, "A" =
++++++++[>++++++++<-]>+.
. Os textos com mais de 3 caracteres são codificados com uma lista calculada dividida em 3 áreas. A primeira área é x vezes 49, depois mais x vezes 7 e finalmente mais x. Por exemplo "A" é 1 * 49 + 2 * 7 + 2A string fornecida "### INSERIR TEXTO AQUI ###" se torna
--->-->-->-->-->->->->->->->-->->->->->-->->->->->-->-->-->-->+[-[>+++++++<-]<+++]>---->++>++>++>+>>+>+>->+>++>+>++>->++>++>+>>->+>->+>++>++>++>+[-[>+++++++<-]<++++]>---->--->--->--->+>>-->+++>+++>++>--->+>--->+++>+>--->+>->+++>++>+++>+>--->--->--->+[-<++++]>[.>]
"Olá Mundo!" torna-se
--->->>>>>-->-->->>>>>-->+[-[>+++++++<-]<+++]>---->>--->-->-->-->+++>+>++>-->->-->--->+>+[-[>+++++++<-]<++++]>---->->>>>+++>->+>>+++>->>->++>+[-<++++]>[.>]
fonte
Python 3
Esta é essencialmente apenas uma versão ligeiramente melhorada da resposta das variáveis iced. (-1 Byte do Assistente de Trigo, -5 do FatalError, -2 do jez)
fonte
:
. Provavelmente, isso também poderia ser feito como uma compreensão da lista para salvar bytes.print("".join(["+"*ord(i)+".[-]"for i in input()]))
join()
uma expressão de gerador em vez de uma compreensão de lista:print("".join("+"*ord(i)+".[-]"for i in input()))
print("".join("+"*ord(i)+".>"for i in input()))
(isso também reduz a pontuação, pois você perde 2 bytes na saída)