Supposons que vous enfilez une chaîne de Froot Loops pour un collier, un bracelet, un lacet ou autre chose. Il y a 6 couleurs en boucle: r ed, o gamme, y ellow, g reen, b Lue, et p urple. Vous voulez que votre brin commence avec le rouge à l'extrême gauche et effectue un cycle dans l'ordre arc-en-ciel allant vers la droite, se terminant par le violet. C'est-à-dire que vous voulez que votre brin soit représenté par la chaîne roygbp
répétée un certain nombre de fois (éventuellement 0).
Le problème est que vous avez déjà bouclé vos boucles, et non dans un ordre particulier. Quelles boucles devez-vous manger et ne pas manger pour pouvoir maximiser le nombre de cycles arc-en-ciel corrects allant de gauche à droite, avec la toute première boucle rouge et la dernière boucle violette?
Ecrivez un programme ou une fonction qui prend une chaîne arbitraire de caractères roygbp
et affiche ou renvoie une chaîne de même longueur avec e
à la place des boucles à manger et n
à la place des boucles à ne pas manger.
Par exemple, si votre fil Froot Loop ressemblait à
l'entrée serait
gorboypbgbopyroybbbogppbporyoygbpr
et de gauche à droite, nous pouvons trouver 3 roygbp
séquences complètes d' arc-en-ciel, mais certaines boucles doivent être rongées. Ainsi, la sortie serait
eenenneennenennneeeeneennenennnnne
résultant en un cycle parfait de 3 cycles:
S'il n'y a pas de cycles complets d'arc-en-ciel dans l'entrée, la sortie sera tout e
et le brin se termine sans boucle. Par exemple, l'entrée proygb
a une sortie eeeeee
. Inversement, proygbp
a sortie ennnnnn
.
Vous pouvez supposer que tous les brins d’entrée ont au moins une boucle.
Le code le plus court en octets gagne.
r
ou pourraitoygbproygbpr
aussi être qualifié?Réponses:
Pyth, 31 octets
Incroyablement inefficace, explication à venir.
yUlz
génère tous les sous-ensembles possibles de tous les indices possibles dez
(l'entrée) dans l'ordre. Par exemple, si l'entrée estabc
:Puis
hf!
trouve le premierT
dans la liste ci-dessus tel que:jk.DzT"roygbp"k
faux..D
prend une chaîne et une liste d’index et supprime les éléments de ces index. Ainsi l'.D"abcd",1 3
est"ac"
. Depuis.D
renvoie une liste (ce qui ne devrait pas être le cas, corrigera dans les futures versions de Pyth), je utilisejk
(k
est""
) pour le joindre ensemble dans une chaîne. La:_"roygbp"k
pièce remplace chaque instance d'un cycle par la chaîne vide.Étant donné que la chaîne vide est fausse, les paragraphes ci-dessus expliquent comment trouver le plus petit ensemble d'indices nécessaire pour obtenir une chaîne composée uniquement de cycles.
:*lz\n_\e
transforme ensuite cette liste d’index ennnnneeennene
chaîne.la source
Hexagony ,
920722271 octetsSix types de boucles de fruits, vous dites? C'est pour cela que Hexagony a été conçu .
Ok, ça ne l'était pas. Oh mon Dieu, qu'est-ce que je me suis fait ...
Ce code est maintenant un hexagone de côté 10 (il a commencé à 19). Cela pourrait probablement être joué un peu plus, peut-être même à la taille 9, mais je pense que mon travail est fait ici ... Pour référence, il y a 175 commandes réelles dans la source, dont beaucoup sont des miroirs potentiellement inutiles (ou ont été ajoutées pour annuler une commande depuis un passage à niveau).
Malgré l'apparente linéarité, le code est en fait à deux dimensions: Hexagony le réorganisera en un hexagone normal (qui est également un code valide, mais tous les espaces sont facultatifs dans Hexagony). Voici le code non plié dans tous ses aspects ... eh bien, je ne veux pas dire "beauté":
Explication
Je n'essaierai même pas de commencer à expliquer tous les chemins d'exécution compliqués de cette version golfée, mais l'algorithme et le flux de contrôle global sont identiques à cette version non golfée, qui pourrait être plus facile à étudier pour les plus curieux après avoir expliqué l'algorithme:
Honnêtement, dans le premier paragraphe, je ne plaisantais qu'à moitié. Le fait que nous ayons affaire à un cycle de six éléments était en fait une aide précieuse. Le modèle de mémoire de Hexagony est une grille hexagonale infinie où chaque bord de la grille contient un entier signé à précision arbitraire, initialisé à zéro.
Voici un schéma de la disposition de la mémoire que j'ai utilisée dans ce programme:
Le long bit droit à gauche est utilisé comme une chaîne
a
de taille arbitraire terminée par 0 qui est associée à la lettre r . Les lignes pointillées sur les autres lettres représentent le même type de structure, chacune pivotée de 60 degrés. Initialement, le pointeur de la mémoire pointe vers le bord étiqueté 1 , face au nord.Le premier bit linéaire du code définit "l'étoile" intérieure des arêtes sur les lettres
roygbp
et définit l'arête initiale sur1
, de sorte que nous sachions où se termine / commence le cycle (entrep
etr
):Après cela, nous sommes de retour sur le bord étiqueté 1 .
Maintenant, l’idée générale de l’algorithme est la suivante:
e
libellé dans le bord ? , parce que tant que le cycle n’est pas terminé, nous devons supposer que nous devrons aussi manger ce personnage. Ensuite, nous nous déplacerons dans l'anneau jusqu'au prochain caractère du cycle.e
s dans le ? bords avecn
s, parce que maintenant nous voulons que ce cycle reste sur le collier. Ensuite, nous passons à l’impression de code.e
etn
). Ensuite, nous recherchons l’ arête 1 (pour ignorer le reste d’un cycle potentiellement incomplet) avant de passer également à l’impression de code.e
pour chaque caractère. Ensuite, il passe à la ? bord associé au personnage. Si c'est négatif, nous terminons simplement le programme. Si c'est positif, nous l'imprimons simplement et passons au caractère suivant. Une fois le cycle terminé, nous revenons à l’étape 2.Une autre chose qui pourrait être intéressante est la façon dont j'ai implémenté les chaînes de taille arbitraire (car c'est la première fois que j'utilise de la mémoire non limitée dans Hexagony).
Imaginez que nous sommes à un moment où nous sommes encore la lecture des caractères pour r (afin que nous puissions utiliser le schéma comme est) et un [0] et un 1 ont déjà été rempli de personnages (tout au nord-ouest d'entre eux est toujours zéro ) Par exemple, nous venons peut-être de lire les deux premiers caractères
og
de l'entrée dans ces bords et nous lisons maintenant uny
.Le nouveau caractère est lu dans le en bord. Nous utilisons le ? bord pour vérifier si ce caractère est égal à
r
. (Il y a un truc astucieux ici: Hexagony ne peut faire la distinction que entre positif et non positif, donc vérifier l’égalité par soustraction est ennuyeux et nécessite au moins deux branches. Mais toutes les lettres sont moins qu’un facteur 2 les unes des autres, donc on peut comparer les valeurs en prenant le modulo, qui ne donnera zéro que si elles sont égales.)Parce que
y
est différentr
, on déplace le (non marqué) bord gauche de dans et copier ley
là. Nous allons maintenant plus loin dans l’hexagone, en copiant le caractère d’un bord à chaque fois, jusqu’à ce que nous ayonsy
le bord opposé de dans . Mais maintenant, il y a déjà un caractère dans un [0] que nous ne voulons pas écraser. Au lieu de cela, nous "glissons"y
autour du prochain hexagone et vérifions un 1 . Mais il y a aussi un personnage là-bas, alors nous allons un autre hexagone plus loin. Maintenant, un [2] est toujours égal à zéro, nous copions donc ley
dans ça. Le pointeur de mémoire se déplace maintenant le long de la chaîne vers l'anneau intérieur. Nous savons quand nous avons atteint le début de la chaîne, car les arêtes (non étiquetées) entre les a [i] sont toutes égales à zéro alors que ? est positif.Ce sera probablement une technique utile pour écrire du code non trivial dans Hexagony en général.
la source
Hexagonie , 169 octets
La réponse de Martin Büttner m'a inspiré (c'est aussi son esolang) et j'ai décidé de le faire en taille 8. (Je suis convaincu que c'est aussi possible en taille 7, mais c'est très difficile. J'ai déjà passé quatre jours -stop sur ce point.)
Disposé en hexagone:
Le programme n'utilise pas réellement l'
#
instruction. J'ai donc utilisé ce caractère pour indiquer les cellules réellement inutilisées. De plus, chaque cellule non-op qui est traversée dans une seule direction est un miroir (par exemple,_
si elle est horizontale), vous savez donc que tous les.
caractères sont parcourus dans plus d'une direction.Explication
Au début, nous exécutons la séquence d'instructions
r''o{{y''g{{b''p"")"
. Celles-ci sont éparpillées un peu au hasard dans le code car je les ai insérées après avoir écrit tout le reste. J'ai l'habitude]
de passer plusieurs fois au pointeur d'instruction suivant; De cette façon, je peux me téléporter essentiellement dans un autre coin de l'hexagone. Le reste du programme est exécuté par le point d'instruction n ° 3.La mémoire ressemble maintenant à ce qui suit, avec les bords importants étiquetés avec les noms que je vais utiliser dans cette explication:
Les bords étiquetés signifient ce qui suit:
in
: Nous utilisons ce bord pour stocker un caractère lu à partir de STDIN.%
: Nous utilisons ce bord pour effectuer une opération modulo sur le caractère lu sur stdin (in
) et le caractère « valide » en cours (r
,o
, etc.), qui seront0
si elles sont égales. J'ai volé cette astuce à la réponse de Martin Büttner, mais le reste du programme est différent.#
: Tant que nous lisons des caractères "non valides" (c'est-à-dire des couleurs que nous devons manger), nous incrémentons ce bord. Ainsi, ce bord se souvient du nombre dee
s que nous devons sortir plus tard.r?
: Toujours0
sauf là où se trouve la partier
(rouge). Cela nous indique quand nous avons terminé un cycle.Le programme procède ainsi:
#
. Sinon, passez au segment suivant de la mémoire dans le sens des aiguilles d'une montre.r?
c'est positif, nous avons fait toute une révolution. Faites un tour complet et une sortie#
e
s et 1n
par segment. Cela#
ramène chacun à0
. (Lee
est placé sur un bord non étiqueté, mais pour len
détournement#
, nous avons opté pour0
une*
multiplication par la suite, ce qui fonctionne, car nous savons que tous les%
bords sont nuls à ce moment.)#
+1e
s jusqu'à ce que vous retourniez à oùr?
est positif, puis quittez.Après une exécution complète, la mémoire se présente approximativement comme suit à la fin. Vous remarquerez les arêtes contenant
101
(le code ASCII dee
); l'un desin
bords est-1
(EOF); tous les#
bords sont à 0; et le pointeur de mémoire se termine aur?
bord positif .la source
Retina ,
1488579 octetsVous pouvez l'exécuter à partir d'un seul fichier source avec l'
-s
indicateur interpréteur.Explication
Commençons par les choses simples:
S'ajoute
#roygbp
à la fin de la chaîne, que nous utiliserons pour calculer le cycle de lettres de manière dynamique.La prochaine (longue) étape consiste à déterminer les boucles à conserver et à les remplacer
n
. Nous verrons dans quelques instants comment cela fonctionne.Cela supprime notre assistant de recherche à la fin de la chaîne.
Ceci remplace tous les caractères qui n'ont pas été remplacés dans la deuxième étape par
e
, complétant la transformation.Revenons maintenant à la deuxième étape.
La structure de base utilise une astuce que j'ai découverte il y a quelques mois pour remplacer les caractères sélectionnés dans une correspondance globale:
où
...
correspond à un motif arbitrairement complexe. Cela correspond au caractère à remplacer.
, puis commence une recherche (à lire de droite à gauche). Le lookbehind capture tout dans le groupe correspondant au personnage correspondantprefix
. Ensuite, il se tourne vers un regard vers l' avant , qui commence maintenant depuis le début de la chaîne et peut contenir un motif complexe. Après le caractère que nous souhaitons remplacer dans ce modèle, nous mettons un regard facultatif derrière , qui vérifie si leprefix
groupe correspond ici. Si c'est le cas, il capture une chaîne vide dans leflag
groupe. Si ce n'est pas le cas, car il est facultatif, cela n'affecte en rien l'état du moteur des expressions rationnelles et est ignoré. Enfin, une fois que le préfixe a été mis en correspondance avec succès, il ne reste que la\k<flag>
fin, qui ne correspond que si le drapeau a été défini à un moment donné pendant le calcul.Maintenant déverrouillons un peu la longue expression rationnelle en utilisant les groupes nommés et le mode freespacing:
J'espère que vous reconnaissez le plan général présenté ci-dessus. Il suffit donc de regarder ce que j'ai rempli
...
.Nous voulons capturer le prochain caractère du cycle dans le groupe
char
. Nous faisons cela en nous rappelant également la chaîne allant#
du caractère actuel danscycle
. Pour obtenir le caractère suivant, nous utilisons un préfixe pour rechercher le#
. Maintenant, nous essayons de faire correspondrecycle
et ensuite correspondre le caractère suivant danschar
. Ce sera généralement possible, sauf s'ilchar
s'agit du dernier caractèrep
. Dans ce cas,\k<cycle>
correspondra au reste de la chaîne et il ne restera plus aucun caractère à capturerchar
. Ainsi, le moteur effectue un retour arrière, omet la référence arrièrecycle
et correspond simplement au premier caractèrer
.Maintenant que nous avons le caractère suivant dans le cycle
char
, nous recherchons la prochaine occurrence possible de ce caractère avec.*?\k<char>
. Ce sont les caractères que nous voulons remplacer, alors nous mettons laprefix
vérification après. Ces étapes (recherche de la prochaine étapechar
du cycle, recherche de la prochaine occurrence, définition éventuelle de l'indicateur) sont maintenant simplement répétées avec a+
.C'est en fait tout ce qu'il y a à trouver la sous-séquence cyclique, mais nous devons également nous assurer de terminer par un
p
. C’est assez simple: vérifiez que la valeur actuellement stockéechar
correspondp
à la fin de la chaîne.*\k<char>$
. Cela garantit également que notre chaîne de recherche n'est pas utilisée pour terminer un cycle incomplet, car nous avons besoin de la finp
pour cette vérification.la source
Python 2,
133 130 126121 octetsLa première boucle obtient des cycles et la seconde supprime un cycle incomplet
3 octets sauvés grâce à JF et 5 de DLosc
la source
r
etn
comme cecir=n=''
:?R=r.count
ne fonctionne pas comme chaînes sont immuablesR
est''.count
même quandr
est changé.Perl 5,
7665 octetsUne pincée d'expressions régulières pures et non diluées.
Trouve d'abord ce qui ne devrait pas être mangé. Ce qui reste est mangeable.
Tester
la source
[^o]*
etc., pouvez-vous utiliser.*?
(quantificateur non gourmand)?\s
lieu de\n
la classe de caractère négatif de la première version.r(.*?)o(.*?)y(.*?)g(.*?)b(.*?)p
n$1n$2n$3n$4n$5n
[^n\s]
e
(4 fichiers, 57 octets).Lua, 101 octets
Utilise les motifs Lua de façon créative; Je pense que c'est une approche intéressante.
Il remplace tous les caractères non consommés par "*", remplace tous les caractères alphanumériques par "e", puis remplace tous les "*" s par "n".
la source
Javascript (ES6), 118
Fiddle testé dans Firefox. J'entends maintenant que Chrome prend en charge les fonctions de flèche, mais je ne l'ai pas encore testé avec Chrome.
Ungolfed:
la source
...
notation.gawk, 96
Construit le modèle de recherche
"([^r]*)r([^o]*)o([^y]*)y([^g]*)g([^b]*)b([^p]*)p"
et le remplacement"\\1n\\2n\\3n\\4n\\5n\\6n"
. Après ce remplacement, tout ce qui est déclaré nourriture ("e") est déclaré, cela ne fait pas partie d'un arc-en-ciel complet.Cette combinaison garantit automatiquement qu'aucun arc-en-ciel ne sera blessé pendant cette opération et qu'aucun arc-en-ciel coupé ne se présentera à la fin.
la source
Pyth, 42 octets
Essayez-le en ligne: démonstration
la source
CJam, 41 octets
Une approche de force brute qui essaie toutes les variations manger / ne pas manger et sélectionne celle qui donne le collier le plus long et le plus valide.
Essayez-le en ligne dans l' interprète CJam .
la source
CJam, 50 octets
Essayez-le en ligne
C'est un peu plus long que certaines des autres soumissions, mais c'est très efficace avec une complexité linéaire. Il balaye la chaîne d'entrée et fait correspondre les caractères un par un.
La partie centrale de l’algorithme est en réalité assez compacte. Environ la moitié du code sert à supprimer le cycle incomplet à la fin.
la source
C90, 142-146 octets (jusqu'à 119, en fonction)
Fonctionne en temps linéaire pour manger efficacement ces boucles de fruits qui ne peuvent pas faire partie d'un joli arc-en-ciel. Ensuite, un post-traitement supprime toute boucle partielle à la fin.
Voici quatre versions:
Version 1 (146 octets), appelez avec
[name] [string]
:main(int a,char**b){char*v=b[1],*s="roygbp",i=0,k=0;for(;v[i];++i)if(s[k]==v[i]){++k;k%=6;v[i]='n';}else v[i]='e';while(k-->0)v[--i]='e';puts(v);}
Version 2 (142 octets), appel avec
[name] [string] [rainbow order]
:main(int a,char**b){char*v=b[1],*s=b[2],i=0,k=0;for(;v[i];++i)if(s[k]==v[i]){++k;k%=6;v[i]='n';}else v[i]='e';while(k-->0)v[--i]='e';puts(v);}
Ceci vous permet de définir votre propre commande arc-en-ciel avec les couleurs de votre choix tant qu'elles ne le sont pas
n
oue
. Cela raccourcit le code!Version 3 (123 octets), appelez comme la version 1:
main(int a,char**b){char*v=b[1],*s="roygbp",i=0,k=0;for(;v[i];++i)if(s[k]==v[i]){++k;k%=6;v[i]='n';}else v[i]='e';puts(v);}
Celle-ci vous donne le maximum de votre arc-en-ciel! Les arcs-en-ciel de fuite incomplets sont prometteurs! Nous ne devrions pas les manger!
Version 4 (119 octets), appelez comme la version 2:
main(int a,char**b){char*v=b[1],*s=b[2],i=0,k=0;for(;v[i];++i)if(s[k]==v[i]){++k;k%=6;v[i]='n';}else v[i]='e';puts(v);}
Identique à la version 3, mais MOAR RAINBOW TYPES!
Limitation mineure: la machine doit avoir des caractères signés (le cas général) et la chaîne doit être assez courte. Affiche un message
\n
de fin pour plus de clarté.La version 1 est la seule qui réponde clairement aux exigences, bien que la version 2 puisse être discutée. Les versions 3 et 4 donnent une interprétation moins correcte (mais toujours amusante) de la question.
la source
Pyth, 38 octets
Je sais que c'est beaucoup plus long que la réponse de orlp, mais celle-ci fonctionne en temps linéaire: o)
Essayez-le ici .
En bref, ce programme remplace tous les caractères après le dernier "p" par des espaces, puis effectue une itération sur chaque caractère de la chaîne résultante. Si le caractère est le suivant dans la séquence 'roygbp', imprimez 'n', sinon indiquez 'e'.
J'ai eu du mal à trouver un moyen plus rapide de traiter la chaîne d'entrée.
_>_zJ
en particulier se sent maladroit, mais<Jz
ne donne pas la chaîne requise quandJ == 0
, c'est-à-dire quand l'entrée se termine par un 'p'.la source
Haskell, 138 octets
g
le faitla source
f
et enz
tant que infixe:'n'%'n'='n'
etc. En outre, certaines parenthèses dans la définition deg
peuvent être supprimées avec$
.Javascript (ES6),
8582 octetsLa règle "le collier doit se terminer par un violet" était à l’origine un grand obstacle, faisant passer mon score de 66 à 125, mais j’ai trouvé un moyen plus rapide de le surmonter (heureusement!).
Explication:
Ce code parcourt chaque caractère de l'entrée et les remplace par
r
oue
avec cette logique:p
, ET si le personnage est le suivant dans l'arc-en-ciel, conservez-le (remplacez-le parn
).e
).Ungolfed:
Suggestions bienvenues!
la source
Python 2, 254 octets
Boucles!
Excusez le jeu de mots. : P
la source