Dans tout langage de programmation ou de script x , écrivez un programme qui prend un code source brainfuck valide de stdin et de sortie, vers stdout, le code source d'un programme, écrit en langage x , qui produirait exactement la même chose que le programme brainfuck.
Votre programme doit fonctionner pour tout programme brainfuck valide, y compris le fichier vide.
Votre score serait égal au nombre d'octets de votre code source, plus le nombre d'octets de votre sortie étant donné l'entrée suivante:
+++++ [-]
+++++ +++++ [
> +++++ ++
> ++ +++ ++++ +
> +++
<<< -
]
> ++ . H
> + . e
++ +++ ++. l
. l
+++ . o
> ++ . space
< +++++ +++ . w
----- --- . o
+++ . r
---- - - . l
----- --- . d
> + . exclamation mark
------lol; useless code :-)--------------------------[.............................................][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]<-<<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><
Par exemple, pour une entrée de [-]
, la sortie de *p=0;
est beaucoup plus favorable quewhile(*p) *p--;
S'il vous arrive d'utiliser des caractères non ASCII, le nombre d'octets doit être calculé à l'aide du codage UTF-8.
Le score le plus bas l'emporte. Cependant, les solutions créatives qui tentent de minimiser la sortie doivent être encouragées par des votes positifs.
byte count of source + (byte count of output)^2
qui encouragerait les gens à se concentrer davantage sur la simplification de la sortie?Réponses:
Perl - 177 (source) + 172 (sortie) = 349
Compter le shebang comme 2 octets, un pour chaque option. Tout d'abord, chacune des huit commandes est traduite dans la plage
p-w
, tout en supprimant tous les autres caractères. Cette chaîne est ensuite encodée en longueur et émise avec un décodeur / interprète minimal. Quelques choses sont optimisées: la chaîne><
ne fait évidemment rien, et une boucle for qui suit directement après une autre peut être supprimée complètement, car elle ne sera jamais entrée.Sortie pour le programme de test:
Un exemple d'exécution:
Perl - 232 (source) + 21 (sortie) = 253
Celui-ci est basé sur l'observation de la FIQ selon laquelle si le programme d'origine ne contient pas d'instruction d'entrée, la sortie sera statique et peut donc être réduite à une seule
print
instruction. Si vous aimez celui-ci, assurez-vous de donner à sa réponse un +1.Donc, ce que nous pouvons faire, c'est diriger
stdout
vers une variable,eval
le code que nous aurions en sortie, et encapsuler le résultat dans unprint
.... mais ça ne marchera pas toujours. Chaque fois que le code à traduire aurait entraîné une boucle infinie, (par exemple
+[.]
), cela ne peut pas être réduit à une seuleprint
instruction, pour des raisons évidentes. Donc, à la place, nous lançons leeval
processus dans un enfant avec un court délai d'expiration, et s'il ne termine pas son exécution dans ce délai, nous générons le programme traduit comme auparavant.Structuré et commenté:
Sortie pour exemple de programme:
Sortie pour
,[.]
:Sortie pour
+[.]
(après 9 secondes):la source
wv.*?(?=w)
c'est faux. Je pense que cela ne supprimera que le code jusqu'au suivant]
, mais vous en avez besoin pour trouver la correspondance]
; vous devez prendre soin de la nidification ...wv[^v]*(?=w)
, ce qui est nettement plus court que l'alternative.Brainfuck, 5 + 540 = 545 octets
5 octets de code, 540 à partir de la sortie du fichier de test donné (en supposant que le décompte soit correct à partir de ma pâte de ce code).
En supposant que EOF est 0.
la source
bfi
( github.com/susam/bfi ). Compilez-le et installez-le, puis exécutez-le comme ceci:bfi input.bf
oùinput.bf
est le fichier brainfuck à interpréter.PHP, 553 + 27 = 580 octets
(553 octets avec tous les espaces blancs, c'est-à-dire les nouvelles lignes et les espaces, supprimés)
Je crains mal au golf PHP, donc cette approche peut être fortement optimisée. Je voulais surtout montrer mon approche de la solution dans quelque chose qui n'était pas BF.
Le signalement des erreurs doit être désactivé, sinon PHP vous détestera. Utilisation: lancez cela comme une page et exécutez-le avec script.php? C = CODE (si le script résultant nécessite une entrée, vous l'exécutez comme out.php? I = INPUT). N'oubliez pas d'url échapper à l'entrée!
Ce que cela fait est fondamentalement ceci - si le script BF contient ",", il s'incorpore à peu près comme le script résultant avec un $ b = 1 attaché; au sommet. S'il ne contient PAS ",", il l'optimise jusqu'à "echo '<sortie BF>'". Idéalement, le script de test dans l'OP ne nécessite aucune entrée. L'addlashs () est juste là pour échapper 'et \.
la source
C ++, 695 + 510 = 1205 octets
Code:
Production:
Code d'origine:
la source
Python - 514 + 352 = 866
Code:
Production:
la source
io
659 + 553 = 1212
Des choses comme
File standardInput readBufferOfLength(1)
vraiment tuer le nombre d'octets mais je ne peux pas le contourner. Je n'ai pas fait d'optimisations pour les symboles répétés ou le manque d'entrée dans le programme BF, mais je continuerai à y travailler, en travaillant également sur celui utilisant les capacités de métaprogrammation d'io.Essai
Rendements
la source
Brainfuck , 109 + 407 = 516
Essayez-le en ligne!
Il supprime uniquement les opérations non BF et ne regarde pas les autres optimisations.
la source
Lua - 328 + 2256 = 2584
(Oh, je viens de réaliser que vous devez aussi ajouter la longueur du résultat, mauvais score, on dirait)
Tiré de cette réponse à moi.
la source
Lua - 319 + 21 = 340
C'est probablement le code le plus court de tous, mais il n'accepte pas d'entrée, il est donc un peu tricheur. J'ai eu une idée pour une autre version avec entrée, voir la fin de ce commentaire.
Lua - 376 + 366 = 742
Cette version doit prouver que lua peut faire mieux que 2584: D
Les deux versions ajoutent 30000 octets de données. Ma deuxième version est basée sur les entrées / sorties: tout après un '.' ou ',' sera supprimé. Ma deuxième version ne permet pas les boucles infinies ([.,], [], Etc.)
Mon idée est d'obtenir:
De votre entrée, avec un supplément «, +».
la source