L'un des codes les plus simples écrits par un langage de programmation est une séquence d'impression de caractères de programme (ex. "Bonjour, monde!"). Cependant, s o m e e s o t e r i c langages de programmation comme Brainfuck , même ce code le plus simple est assez ennuyeux d'écrire.
Votre tâche consiste à écrire un programme (pas besoin d'écrire en brainfuck), qui imprime un programme Brainfuck (de longueur minimale) imprimant le texte donné.
Contribution
Une séquence de caractères (entre 1
et 255
) est donnée par n'importe quel format (variable, argument, stdin, fichier, ...).
Sortie
La sortie est un code brainfuck valide (pas de correspondance [
et non ]
) (supposez une cellule d'encapsulation 8 bits non signée et un nombre illimité de cellules à gauche et à droite) imprimant la chaîne exacte qui a été donnée en entrée.
Par exemple, une sortie possible pour l'entrée A
est ++++++++[<++++++++>-]<+.
.
Votre programme ne devrait pas prendre beaucoup de temps ( >2m
) pour s'exécuter.
Le programme BF ne devrait pas prendre beaucoup de temps ( >10s
) pour s'exécuter.
Notation
(Remarque: la méthode de notation actuelle peut changer, car elle n'est pas facile à calculer ...)
La longueur du programme (génération du code BF) lui - même n'a pas d' importance. Cependant, les codes BF codés en dur dans le code de programme ne sont pas OK. Seule plage acceptable (ex un code BF impression d' un caractère unique. 0x01
: +.
) De code BF peut être codé en dur.
Le score est la somme de la longueur des codes BF imprimant ces chaînes.
- Une chaîne
Hello, world!
ajoutée avec un simple0x0A
(\n
) (c'est-à-dire le programme "Hello, world!") - Caractère unique de
0x01
~0xFF
- La somme de la longueur de ces 255 codes BF est multipliée par
1/16
, arrondie et ajoutée au score.
- La somme de la longueur de ces 255 codes BF est multipliée par
- Liste des 16 premières chaînes, générées en fractionnant une séquence aléatoire d'octets générés le 11-11-11 par
0x00
, supprimant toutes les chaînes de longueur nulle. - Lenna.png , supprimant tous les
0x00
s. - Paroles de la chanson 99 bouteilles de bière , en commençant par
99 bottles~
, les sauts de ligne sont0x0A
, les paragraphes sont séparés par deux0x0A
s, et aucun caractère de saut de ligne à la fin. - Autres chaînes que vous pouvez fournir.
Votre programme peut inclure le calcul du score de lui-même.
Bien sûr, le code ayant obtenu le score le plus bas sera le gagnant.
Lenna.png
va dominer le score, car il est de loin la plus grande entrée. Peut-être normaliser un peu par taille?Réponses:
En Java, calcule un court extrait BF qui peut convertir n'importe quel nombre en n'importe quel autre nombre. Chaque octet de sortie est généré en transformant le dernier octet de sortie ou un nouveau 0 sur la bande.
Les extraits sont générés de trois manières. D'abord par de simples répétitions de
+
et-
(par exemple,++++
convertit 7 en 11), en combinant des extraits connus (par exemple si A convertit 5 en 50 et B convertit 50 en 37, puis AB convertit 5 en 37) et des multiplications simples (par exemple,[--->+++++<]
multiplie le nombre actuel par 5/3). Les multiplications simples profitent du wraparound pour générer des résultats inhabituels (par exemple,--[------->++<]>
génère 36 à partir de 0, où la boucle s'exécute 146 fois, avec un total de 4 wraparounds décroissants et 1 ascendant).Je suis trop paresseux pour calculer mon score, mais il utilise environ 12,3 opérations BF par octet
Lenna.png
.la source
Eh bien, voici la pire solution possible, bien que plutôt jolie à Brainfuck:
Le score est probablement le pire que nous puissions voir sans le rendre intentionnellement mauvais.
Travailler sur le calcul du score réel.
la source
+
.
[-]
pour effacer la cellule entre chaque personnage.Python 3.x
Eh bien, je ne vais pas gagner de prix pour le code de sortie le plus court mais peut-être pour le programme pour générer le code ...
"Bonjour le monde! \ N":
la source
print("".join(["+"*ord(i)+".[-]"for i in input()]))
.[-]
par.>
Je ne sais pas à quel point c'est bon, mais je me suis amusé à écrire ceci. (À Clojure ...)
Il existe probablement des solutions plus efficaces et plus élégantes, mais cela suit mon schéma de pensée de manière quelque peu linéaire, donc c'était plus facile.
la source
But:
478748641439404086426 (sans données générées aléatoirement)(4085639 de Lenna.png. C'est 99,98%)
Je ne reçois pas la partie avec les données aléatoires. N'ai-je pas besoin d'un compte pour lequel je dois payer pour obtenir les données?
Assez naïf. Voici le code généré pour "1Aa" (49, 65, 97) avec une petite documentation:
Le code Java est un peu moche mais ça marche. Le rapport d'instructions générées par octet d'entrée est probablement meilleur si la valeur d'octet moyenne est élevée.
Si vous voulez l'exécuter, vous devez mettre Lenna.png dans le même répertoire que le fichier .class. Il imprime la partition sur la console et écrit le code BF généré dans un fichier appelé "output.txt".
Je vais apporter quelques petites améliorations mais probablement pas beaucoup.Terminé.la source
BrainF ** k
Je suis un mauvais programmeur BF, donc cette réponse est probablement assez inefficace. Je ne suis pas sûr du score, mais il devrait fonctionner légèrement mieux que la réponse existante sur votre texte moyen. Plutôt que de mettre à zéro la cellule après chaque caractère, celui-ci "s'ajustera" à un nouveau caractère avec soustraction si le caractère précédent donné est plus grand.
(Remarque, il s'agit d'un code que j'ai écrit il y a longtemps et que j'ai réutilisé pour ce concours. J'espère sincèrement que j'ai fait la conversion correctement, mais s'il échoue pour une entrée, faites-le moi savoir.)
Une version montrant l'état de la bande dans tout le code:
Code généré pour
Hello, World!
:Ceci est ma première réponse sur CG.SE! Si j'ai foiré quelque chose, faites le moi savoir!
la source
> <>
J'ai écrit cela en réponse à une question marquée pour un doublon, et même si ce n'est pas le plus grand golf (pour cette question spécifique, au moins), je me suis dit que ce serait une sorte de gaspillage si je ne le partageais pas dans toute sa gloire de charabia dégoûtant. Vraiment, je suis à moitié surpris que ça marche même. Je prendrai toutes les suggestions pour le jouer car c'était mon objectif principal dans sa création.
En remarque, dans la deuxième ligne, les trois premiers caractères
.21
pourraient être remplacés parv
suivis de deux espaces si cela est plus facile à lire. Je n'aime pas voir les espaces dans mes> <> programmes car cela signifie qu'il y a de l'espace gaspillé (littéralement). Il s'agit également d'un vestige d'un des nombreux prototypes.La façon dont il fonctionne est vraiment simple, et franchement, j'aurais du mal à penser à un moyen de mettre en œuvre un autre algorithme. Il imprime cependant de nombreux "+" doivent être imprimés pour le premier caractère, puis imprime plus de "+" ou "-" selon les besoins pour chaque caractère supplémentaire, en séparant chaque section par des points. Ce que je trouve cool à propos du programme, c'est qu'il modifie son propre code source pour qu'il affiche "+" ou "-" (il remplace le "+" sur la ligne 3 par le caractère approprié après avoir déterminé si le caractère actuel est supérieur ou moins que le précédent).
Sortie pour
Hello, World!
:Je pourrais marquer cela comme il était censé être marqué, mais je suis presque certain que je perdrais et je ne sais pas entièrement comment lire quelque chose comme lenna.png dans> <>.
Si cette réponse vous intéresse et que vous souhaitez une explication, demandez certainement, mais pour l'instant je vais la laisser sans raison juste à cause de la tournure et de la tournure.
EDIT 1: Cela fait un moment mais j'ai pu jouer sur 2 octets avec une refonte presque complète de la façon dont le programme décide d'imprimer un plus ou un moins. C'est un retour quelque peu décevant pour une grande refonte mais au moins ça marche.
la source
ma solution JavaScript c'est rapide et sale :)
sortie pour
Hello World\n
La source:
la source
J'ai construit quelque chose en Java. N'a pas calculé le score. Les textes de 3 caractères ou moins sont codés avec une multiplication par lettre, par exemple "A" =
++++++++[>++++++++<-]>+.
. Les textes de plus de 3 caractères sont codés avec une liste calculée divisée en 3 zones. La première zone est x fois 49, puis plus x fois 7 et enfin plus x. Par exemple, "A" est 1 * 49 + 2 * 7 + 2La chaîne fournie "### INSERER LE TEXTE ICI ###" devient
--->-->-->-->-->->->->->->->-->->->->->-->->->->->-->-->-->-->+[-[>+++++++<-]<+++]>---->++>++>++>+>>+>+>->+>++>+>++>->++>++>+>>->+>->+>++>++>++>+[-[>+++++++<-]<++++]>---->--->--->--->+>>-->+++>+++>++>--->+>--->+++>+>--->+>->+++>++>+++>+>--->--->--->+[-<++++]>[.>]
"Bonjour le monde!" devient
--->->>>>>-->-->->>>>>-->+[-[>+++++++<-]<+++]>---->>--->-->-->-->+++>+>++>-->->-->--->+>+[-[>+++++++<-]<++++]>---->->>>>+++>->+>>+++>->>->++>+[-<++++]>[.>]
la source
Python 3
Il s'agit essentiellement d'une version légèrement améliorée de la réponse d'icedvariables. (-1 octet de Wheat Wizard, -5 de FatalError, -2 de jez)
la source
:
. Cela pourrait également être fait comme une compréhension de liste pour économiser des octets.print("".join(["+"*ord(i)+".[-]"for i in input()]))
join()
print("".join("+"*ord(i)+".[-]"for i in input()))
print("".join("+"*ord(i)+".>"for i in input()))
(cela réduit également le score puisque vous perdez 2 octets en sortie))