Étant donné 2 extraits de code brainfuck A
et B
, sortez du code brainfuck C
qui a le même comportement que l'exécution B
avec l'entrée de A
s result. Notez que cela C
doit fonctionner pour toute entrée qui correspond aux hypothèses suivantes, comme si elle était donnée à A
.
Vous pouvez supposer:
- Entrée finie.
- A et B s'arrêtent.
- EOF est systématiquement 0 ou -1.
- Autoriser ou interdire systématiquement les cellules à gauche
- Bande illimitée (sinon l'exigence peut être impossible)
- Habillage cohérent 8 bits ou entier illimité
- Aucun flux (entrée ou sortie pour A ou B) ne contient l'octet représentant EOF
- Les codes A et B peuvent contenir des caractères qui peuvent apparaître dans votre C, et
+-[]<>,.
Par exemple (EOF = 0)
A = ,[..,]
B = ,[...,]
C = ,[......,]
A = >,[>,]<[.<]
B = ,[...,]
C = >>>>,[[-<+<+<+>>>]>>>,]<<<<[.<]
A = >,[>,]<[.<]
B = ,[...,]
C = >,[>,]<[...<]
A = ,.
B = ,.
C = ,>,[,]<.
A = ,.
B = ,.
C = ,.
sont des tests valides
Code le plus court dans chaque langue. Le gagnant de Brainfuck sera accepté.
Shortest code in each language win
etShortest Brainfuck solution will be accepted
sont deux critères gagnants différents.4.Consistently allow or disallow cells to left
. La réponse de tête requiert que les cellules de gauche de la réponse fonctionnent, mais interdisent à A, B et C de ne pas se déplacer après le premier octet. Ma réponse diallows se déplace vers la gauche dans la réponse, A, B et C. Si les règles pour mon programme et C peuvent être différentes de A, et B alors je peux sûrement raccourcir beaucoup ma réponse.>
s au début de ma réponse pour le rendre conforme à une saveur plus restrictive (mais pour le golf, nous devrions également envisager des alternatives). De plus, il me semble clair que A, B et C doivent être de la même saveur l'un que l'autre.Réponses:
brainfuck, 526 octets
Formaté:
En ce qui concerne A, B et C: EOF = 0, les cellules restantes du début ne sont pas autorisées, les cellules d'encapsulation 8 bits.
Attend A
?
suivi de B.Essayez-le en ligne
(Cette réponse peut être rendue compatible avec un interprète brainfuck qui ne permet pas d'aller à gauche du début au prix d'un octet en translittérant
y/<>/></
et en ajoutant un>
.)L'idée de base est d'utiliser une série de remplacements de chaînes afin de simuler les bandes de A et B en utilisant des nœuds à 2 cellules, en accordant une attention particulière au remplacement
.
en A et,
en B afin que le flux de données intermédiaire soit conservé dans un bloc de cellules à gauche de la bande simulée. Le schéma de remplacement de chaîne est le suivant:Insérer
>>
avant ADans A et B, remplacez
>
par>[-]+>
et<
par<<
Dans A, remplacer
.
par>[-]-[>>]+[[>+<-]<[>+<-]<]>+[->>+]<[>>>-<<+[<<]<+>>>[>>]+<<<-]>[+<->]+</
Insérer
>[>>]+>
après A et avant BEn B, remplacer
,
par,[,]>,<<[<<]<[[>]>>[>>]<+<[<<]<[<]>-]>[>]>>[>>]+<*
la source
,[>,]<[.<]?,[...,]
entrée12345
retourne111
, même avec assez>
avant?,[>,]<[.<]
n'est pas valide mais l'>,[>,]<[.<]
est.)>
s à D au besoin.brainfuck , 1287 octets
Essayez-le en ligne!
C'est ici! Le code brainfuck qui compose deux codes brainfuck. Utiliser un "!" pour séparer les deux extraits de code d'entrée. Par exemple extrait A:
>,[>,]<[.<]
snippet B:,[...,]
. Entrée pour mon programme:>,[>,]<[.<]!,[...,]
. Il ne se terminera pas si aucun "!" est trouvé.Cela fait essentiellement la même chose que ma version VBA. Le code généré est le même que dans la version VBA (notez que les exemples dans le post VBA ont été faits avant le dernier changement dans les extraits de brainfuck).
Explication
Voici mon code source:
la source
>[,>]<[.<]!,[...,]
, donc l'extrait A ne produit rien. Bien sûr, cela doit être>,[>,]<[.<]!,[...,]
pour un exemple de travail.VBA,
512489479 octetsExplication
Le code VBA modifie le code brainfuck d'une manière, que la sortie de l'extrait A sera stockée dans une liste et l'entrée de l'extrait B sera lue à partir de cette liste.
Il initialise d'abord certaines variables
Ensuite, il lit l'extrait A et remplace chaque
<
par<<<[+]-<<
, chaque>
par>>>>>>>[+]-<<
et chaque.
par la routine de stockageaprès cela, il supprime la mémoire de l'extrait A et apporte des modifications à la liste stockée, afin qu'il puisse être lu comme entrée pour l'extrait B:
Ensuite, l'extrait B sera lu, tous les
<
sera remplacé par<<<<<
, tout>
sera remplacé par>>>>>
et tout,
sera remplacé par la routine de lecture de liste:Code source de Brainfuck
Ceci est ma source pour les portions de cerveau du code. J'expliquerai cela en détail plus tard.
Sortie pour le cas de test 1:
f ",[..,]",",[...,]"
Essayez-le en ligne!
Sortie pour le cas de test 2:
f ">,[>,]<[.<]",",[...,]"
Essayez-le en ligne!
Sortie pour le cas de test 3:
f ",.",",."
Essayez-le en ligne!
Cas de test complexe: extrait A: construction d'un triangle alphabétique
>+++++[<+++++>-]<+[>>[>[.>]]>++++++++++.--[<++++++++>-]<[+.<]<-]>>,>[.>]++++++++++.[<[.<]>,>[.>]<]
Essayez-le en ligne!Extrait B: trier les entrées par ordre croissant
>>,[>>,]<<[[-<+<]>[>[>>]<[.[-]<[[>>+<<-]<]>>]>]<<]
Essayez-le en ligne!Résultat:
Essayez-le en ligne!
la source
Brainfuck , 785 octets
Essayez-le en ligne!
Pour séparer A de BI opté pour
/
.Explication:
Le code réel qui génère ceci est juste une lecture en boucle avec un drapeau pour A / B et un commutateur qui permet de réduire l'entrée à comparer
>
,<
,/
,,
, et.
et par ailleurs juste sortie de l'entrée. C'est en fait juste un transpilateur où le code transpilé vit dans une structure de données de sorte qu'il n'interfère pas avec les données stockées de A ou les uns des autres. le/
déplace simplement la cellule active vers la première cellule inutilisée. Je l'ai nettoyé à l'origine, mais cela rend le programme et la sortie plus volumineux.Le résultat du programme a le modèle de mémoire suivant:
L'
c
effondrement.cz
est toujours0
Il indique où se trouve le pointeur dans mes données BF émulées. La valeur active est -1 alors que toutes les cellules visitées auront1
. Dans des opérations commeaprint
etbread
certainesc
ont une signification particulière.L'impression de code A saute toutes les cellules de 1 octet pour laisser de la place pour une entrée de plus d'octets qui est des copies avec une sauvegarde dans les octets suivants s'effondrer pour recopier.
La lecture du code B récupère l'entrée de l'entrée. Ici, être destructeur est correct et lorsque vous "lisez" le dernier octet, vous obtenez 0 en EOF quelle que soit l'implémentation.
J'ai commencé en tant que code Extended BrainFuck faisant un résultat EBF. La plupart du débogage a été effectué sur les fichiers de résultats, puis mis à jour vers la source qui l'a généré. Ensuite, j'ai simplement exécuté les opérations indépendamment pour obtenir une sortie BF, mais j'ai remarqué la réponse de Dorian, qui m'a battu longuement, j'ai donc continué à jouer au golf avec la source EBF pour une sortie BF plus petite. La source d'origine est assez lisible et simple par rapport à d'autres choses que j'ai faites avec:
la source
[->+]
dans le programme C provoque l'échec des entrées comme->->,./,.
, et cela pourrait être corrigé en utilisant[->>+]
(en s'assurant que le pointeur démarre sur une cellule avec la parité souhaitée). Pour[-<+]
, je pense que vous pouvez changer le schéma de navigation pour que toute la sortie de A soit différente de zéro?->->,.
et B est,.
, votre interprète préféré produit-il le même C que TIO et C fonctionne-t-il comme prévu sur votre interprète? Parce qu'il échoue sur TIO . (J'ai écrit ceci en réponse à un commentaire qui est maintenant supprimé.)-1
des données utilisateur, mais en fait je l'ai fait sur la ligne "aller à la cellule active, mettre à zéro". J'ai mis à jour ma réponse puis j'ai ajouté un octet: -O mais au moins ça marche. BTW. Si je n'utilise pas scan for-1
to lors de la récupération de l'entrée dans B je devrai déplacer l'octet actif avec une copie>[-<+]<
et j'ajouterai donc plus de caractères que je n'enregistre en le remplaçant+[-<+]-
par[<]
. Si vous ne copiez pas, vous ne pourrez pas savoir si l'octet que vous avez compilé était terminé et copier tous les octets.[-<+]
également l'élimination des bogues (par opposition à la sauvegarde des octets), pour les entrées telles que-./,>++++++[<++++++>-]<.
, qui devraient s'imprimer#
plutôt que%
. :) Mais je vois aussi des opportunités pour économiser des octets. Bonne chance! J'essaierai d'optimiser ma solution de bande doublement infinie, bien que voir ce que vous avez fait me fait penser que peut-être la bande infinie droite est plus golfique à la fin.sed, 165 octets
Pour les saveurs avec EOF = 0, les cellules restantes du début ne sont pas autorisées, les cellules d'emballage 8 bits.
Attend le programme A sur la première ligne et B sur la deuxième ligne.
Essayez-le en ligne
Celui-ci utilise des nœuds à 2 cellules pour simuler les bandes de A et B, la sortie de A occupant des cellules contiguës à gauche du nœud le plus à gauche.
Solution alternative à 173 octets:
Essayez-le en ligne
À l'origine, ma conception était basée sur une bande doublement infinie, qui nécessitait beaucoup plus de travail pour se déplacer vers la gauche (déplacer les données en passant au-delà de la cellule la plus à gauche rencontrée précédemment) et pour passer de A à B (effacer les données au lieu de simplement passer devant la cellule la plus à droite) rencontré précédemment).
Merci à Sylwester et Dorian pour leurs astuces et leurs idées.
la source
,[..,]
et B programme,[...,]
.s/x/>>/g
à la fin, mais je suis plus intéressé par les améliorations qui raccourciront la sortie pour l'instant.