Eu tenho um programa que gera código Brainfuck formatado. Eu corro meu programa
./example "S"
e a saída é
+[>+
<
+++
]
>--.
que imprime S em Brainfuck.
Seu objetivo é escrever um programa que aceite uma string como entrada e produza o código fonte em outro idioma que imprima essa string.
- O código fonte do seu programa deve ser formatado de forma que represente a string na arte ASCII (impressa horizontalmente, não verticalmente).
- O código-fonte não pode conter a sequência (no entanto, pode conter letras que ocorrem na sequência, apenas não sequencialmente)
De outra forma,
- Aplicam-se brechas padrão .
- O menor código vence.
Nomeie seu envio com o idioma em que está escrito, o idioma em que ele sai e o tamanho total em bytes. Por favor inclua a saída do seu programa quando você digitar a string UNCOPYRIGHTABLE.
Obrigado!
Respostas:
C -> Brainfuck 556 bytes
Excluindo espaços em branco desnecessários. Eu poderia facilmente salvar outras centenas, alterando os dados da fonte
d[]
de hexadecimal para uma string entre aspas.Ele usa uma fonte de calculadora (para baixa entropia, apenas um byte por letra) e um compilador Brainfuck muito ingênuo, inspirado em https://codegolf.stackexchange.com/a/35801/15599 (exceto que eu uso mais em vez de menos). O primeiro
for
loop compila o texto naa
stringb
e também calcula o número de traços necessários para desenhar o código formatado, usando o número mágico hexadecimal de 13 dígitos (todos os caracteres são de 5 a 8 traços).Dado o comprimento total do programa e a contagem de traços, o número de caracteres por traço é calculado (isso pode ser muito pequeno se os caracteres forem iguais ou em ordem crescente e muito grande se os caracteres estiverem em ordem decrescente).
A maior parte do restante do programa é dedicada a decidir se os espaços em branco ou um dos traços precisam ser impressos. Se o cursor estiver sobre um quadrado de traçado, a função
f
será chamada com o número desse traçado como argumento. Retorna um espaço se esse traçado não for necessário para a letra atual ou um caractere do programa, se for. Como o número de caracteres necessários para concluir a arte ASCII pode ser maior que os caracteres do programa, ocasionalmente é inserido um espaço, daí o cálculob[i * v/u]
.Existem quatro pinceladas simples e quatro pinceladas duplas na fonte, numeradas da seguinte forma, que estão presentes ou ausentes, dependendo da letra.
Resultado
Teste em http://copy.sh/brainfuck/
abc
DEF
GHIJK
LMNOP
QRSTU
V W x y Z
COPYABLE
com a maioria das strings com letras em ordem aleatória (não crescente), o tamanho da letra é muito maior e as letras parecem muito melhores. Infelizmente, o tamanho dos arquivos fica muito grande. Não consigo carregar a palavra completa UCOPYRIGHTABLE aqui, COPYABLE é a palavra mais longa que me é permitido.
fonte
Perl → Melhor, 868 bytes
OK, vou fazer a bola rolar. Isso poderia ser um pouco mais complicado, mas minha cabeça está começando a doer ...
Exemplos:
Os exemplos mais curtos podem ser copiados e colados em intérpretes online como este , mas UNCOPYRIGHTABLE parece resultar em um programa que é muito longo para ser manipulado por todos os intérpretes online.
Nota:
O
@
caractere no final da primeira linha de saída diz ao Befunge para parar de correr. Sem ele, o programa continuaria repetindo a mesma palavra para sempre.fonte
C → Brainfuck, 855 bytes
Algumas novas linhas adicionadas para melhorar a legibilidade. Observe que ele é segmentado em letras minúsculas e símbolos. Teste a saída aqui .
Exemplos
Parece muito melhor em um terminal :(
E finalmente,
fonte