J'ai un programme qui génère du code Brainfuck formaté. Je lance mon programme
./example "S"
et la sortie est
+[>+
<
+++
]
>--.
qui imprime S dans Brainfuck.
Votre objectif est d'écrire un programme qui accepte une chaîne en entrée et génère du code source dans une autre langue qui imprime cette chaîne.
- Le code source des sorties de votre programme doit être formaté de manière à représenter la chaîne de caractères ASCII (imprimé horizontalement et non verticalement).
- Le code source ne peut pas contenir la chaîne (il peut cependant contenir des lettres qui apparaissent dans la chaîne, mais pas de manière séquentielle)
Autrement,
- Des échappatoires standard s'appliquent.
- Le code le plus court gagne.
Veuillez titrer votre soumission avec la langue dans laquelle elle est écrite, la langue qu'elle produit et la taille totale en octets. Veuillez inclure la sortie de votre programme lorsque vous entrez la chaîne UNCOPYRIGHTABLE.
Merci!
Réponses:
C -> Brainfuck 556 octets
Excluant les espaces inutiles. Je pourrais facilement enregistrer une autre centaine en changeant les données de police
d[]
de hex en une chaîne entre guillemets.Cela utilise une police de calculatrice (pour une faible entropie, un seul octet par lettre) et un compilateur Brainfuck très naïf inspiré de https://codegolf.stackexchange.com/a/35801/15599 (sauf que j'utilise plus au lieu de moins). la première
for
boucle compile le texte dansa
la chaîneb
et calcule également le nombre de traits nécessaires pour dessiner le code formaté, en utilisant le nombre magique hexadécimal à 13 chiffres (tous les caractères sont de 5 à 8 traits).Compte tenu de la longueur totale du programme et du nombre de traits, le nombre de caractères par trait est calculé (cela peut être très petit si les caractères sont identiques ou en ordre croissant, et très grand si les caractères sont en ordre décroissant.)
La majeure partie du reste du programme est consacrée à décider si un espace ou un des traits doit être imprimé. Si le curseur se trouve sur un carré de trait, la fonction
f
est appelée avec le numéro de ce trait comme argument. Il renvoie un espace si ce trait n'est pas requis pour la lettre actuelle, ou un caractère du programme s'il l'est. Étant donné que le nombre de caractères requis pour terminer l'art ASCII peut être supérieur aux caractères du programme, un espace est parfois inséré, d'où le calculb[i * v/u]
.Il y a quatre traits simples et quatre doubles traits dans la police, numérotés comme suit, qui sont présents ou absents, selon la lettre.
Production
Testez à http://copy.sh/brainfuck/
abc
DEF
GHIJK
LMNOP
QRSTU
VWXYZ
COPIABLE
avec la plupart des chaînes avec des lettres dans un ordre aléatoire (non ascendant), la taille des lettres est beaucoup plus grande et les lettres sont beaucoup mieux. Malheureusement, la taille des fichiers devient assez importante. Je ne peux pas télécharger le mot complet UCOPYRIGHTABLE ici, COPYABLE est le mot le plus long que je suis autorisé.
la source
Perl → Befunge, 868 octets
OK, je vais faire rouler la balle. Cela pourrait être un peu plus golfé, mais ma tête commence à me faire mal ...
Exemples:
Les exemples plus courts peuvent être copiés-collés dans des interprètes en ligne comme celui-ci , mais UNCOPYRIGHTABLE semble entraîner un programme trop long pour tous les interprètes en ligne.
Remarque:
Le
@
caractère à la fin de la première ligne de sortie indique Befunge pour arrêter l' exécution. Sans cela, le programme répéterait le même mot pour toujours.la source
C → Brainfuck, 855 octets
Quelques nouvelles lignes ont été ajoutées pour améliorer la lisibilité. Notez qu'il se sépare des lettres minuscules et des symboles. Testez la sortie ici .
Exemples
Cela semble beaucoup plus agréable sur un terminal :(
Et enfin,
la source