Sur la rumeur que Codegolf aura un tournoi Rock-Paper-Scissors, vous vous penchez sur le sujet des mots sans carré . Un mot en lettres R
, P
, S
est sans carré si elle ne contient pas de séquence qui se répète deux fois. Autrement dit, le mot ne peut pas être écrit comme
a x x b
où a
et b
sont des mots de toute longueur et x
est un mot d' une longueur d' au moins un, tout en les lettres R
, P
, S
.
Tâche
Ecrire un programme qui génère les sans carrés mots des lettres R
, P
, S
de la longueur n
où le nombre 1 <= n <= 10
est pris comme entrée.
Exemple
Par exemple, les mots sans carré de longueur 3 sont
RPR
, RSR
, RPS
, RSP
, SPS
, SRS
, SRP
, SPR
, PRP
, PSP
, PSR
,PRS
et ceux de longueur 4 sont
RPRS
, RPSR
, RPSP
, RSRP
, RSPR
, RSPS
, PRPS
, PRSR
, PRSP
, PSRP
, PSRS
, PSPR
, SRPR
, SRPS
, SRSP
, SPRP
, SPRS
,SPSR
et notez que par exemple SPSP
ou PRPR
ne sont pas sans carré
Règles
- C'est le codegolf, le programme le plus court gagne, les failles standard sont fermées.
- Vous pouvez imprimer les mots ou les créer en mémoire.
- Votre programme peut être écrit en fonction.
Les références
Entrée Wikipedia sur les mots sans carré
Le nombre de mots ternaires sans carré de longueur donnée est en https://oeis.org/A006156
En relation: Mots ternaires sans carré de longueur arbitraire
n>3
serait une bonne idée, car il y a eu une certaine confusion entre les caractères répétés et les séquences répétées.Réponses:
Rubis, 39 octets
Cette fonction hilarante et inefficace génère toutes les chaînes de longueur N situées alphabétiquement entre N Ps et N Ss, puis filtre la grande majorité qui contient des caractères non RPS. La vérification réelle utilise juste un quadratfrei backreference Regexp:
(.+)\1
.65 octets plus idiomatiques qui se terminent dans un délai raisonnable pour N = 10:
Edit: Sauvegardé un octet grâce à G B.
la source
Gelée ,
1514 octetsEssayez-le en ligne!
Comment ça marche
la source
Rétine , 28 octets
Essayez-le en ligne!
Prend entrée en unaire .
Explication
Cela génère toutes les chaînes composées
RPS
de longueurn
. Pour ce faire, nous remplaçons à plusieurs reprises la première1
de chaque ligne. Réfléchissons à la ligne que<1>
, où<
tout est en face du match et>
est tout après le match (ils sont$`
et$'
respectivement dans la syntaxe de substitution regex, mais ceux regard moins intuitif). Nous remplaçons le1
parR>¶<P>¶<S
, où¶
sont les sauts de ligne. Ainsi , le résultat complet de cette substitution est en fait<R>¶<P>¶<S>
, ce qui est trois exemplaires de la ligne, le1
remplacer parR
,P
,S
respectivement, dans chacun des trois exemplaires. Ce processus s'arrête une fois que tous les1
s ont été substitués.Enfin, nous rejetons simplement toutes les lignes contenant une répétition.
la source
1(.*)
avec ,$1R¶$1P¶$1S
mais l'octet de comptage est le même.Coque ,
1514 octets-1 octet grâce à Zgarb!
Essayez-le en ligne!
Construit toutes les séquences possibles de la bonne longueur et ne conserve que celles dont toutes les sous-chaînes (sauf la vide) sont composées de deux moitiés différentes.
Merde, je voulais vraiment battre Jelly ici.
la source
Mathematica, 61 octets
Essayez-le en ligne!
la source
Java 8,
285277 octetsBien que Java soit presque toujours verbeux, dans ce cas, ce n'est certainement pas le bon langage pour un défi comme celui-ci. Générer des permutations avec des sous-chaînes est mauvais pour les performances et inefficace.
Peut certainement être joué au golf un peu plus, cependant.
-8 octets grâce à @Jakob .
Explication:
Essayez-le ici. (Les performances sont trop mauvaises pour les cas de test supérieurs à 3, mais cela fonctionne localement ..)
la source
n->p("",((1<<3*n)+"").replaceAll(".","PRS"),n)
. Aussi, pourquoi ne pas factoriserfor(;i<1;p(...));
àwhile(i<l)p(...);
?for(;...;)
out of codegolfing-habbit pour être honnête. Dans le pire des cas, c'est le même nombre d'octets quewhile(...)
dans le meilleur des cas, quelque chose peut être placé à l'intérieur de la boucle for pour économiser des octets. J'essaie donc de ne pas utiliserwhile
du tout dans le golf de code, car cela ne profite jamais au décompte d'octets de toute façon. Soit il l'augmente, soit il reste le même, donc personnellement je ne me soucie pas de la meilleure lisibilité. ;)PRS
séquences, alors que votre boucle d'origine en a généré une avec 2 ^ ( n -2) séquences.n
fois "PRS" est correct. Le mien générait plus car il économisait des octets (et diminuait les performances, mais qui s'en soucie avec codegolf). ;)Python 3 ,
9796 octetsRenvoie un ensemble de chaînes.
Essayez-le en ligne!
la source
Julia 0,6 , 65 octets
Essayez-le en ligne!
la source
Perl 5 , 37 octets
Essayez-le en ligne!
La fonction renvoie un tableau des chaînes libres carrées.
Expliqué:
Le
glob
génère toutes les combinaisons de R, S et P de longueur égale à l'entrée. L'grep
instruction filtre ceux qui ne sont pas sans carré.la source
R , 97 octets
Essayez-le en ligne!
combn(rep(c('p','r','s'),n),n,paste,collapse='')
calcule toutes lesn
chaînes -character avecp
,r
,s
mais il fait double emploi , malheureusement , beaucoup (*), donc nous uniquify, et prendre celles qui correspondent à l'expression rationnelle(.+)\1
, en utilisant la correspondance de style perl, nous imprimer la liste résultante.(*) techniquement, il génère toutes les combinaisons de
3n
lettresp,r,s
répétées 3 fois prisesn
à la fois, puis s'appliquepaste(..., collapse='')
à chaque combinaison plutôt que de calculer3^n
directement les cordes, mais c'est plus golfique qu'unexpand.grid
(le vrai produit cartésien).la source
JavaScript (Firefox 30-57), 69 octets
Comme toutes les sous-chaînes de mots sans carré sont également sans carré, la vérification peut être effectuée de manière récursive.
la source
Haskell ,
10198 octetsEssayez-le en ligne!
la source
JavaScript (ES6), 93 octets
Convertit tous les entiers de 0 à 3ⁿ en base (rembourrée inversée) 3 en utilisant
RPS
comme chiffres et les filtre pour les mots sans carré.la source
Julia, 88
Rien d'extraordinaire.
la source
C # / LINQ, 169
Il doit y avoir une meilleure façon de le faire :)
la source
F #, 143
la source
k, 56 octets
L'absence de regex natif place k bien derrière la courbe pour une fois. Je suis allé avec une solution récursive, car les caractères pour l'implémenter ont été enregistrés par une vérification sans carré plus simple.
est l'opérateur ternaire de k, ici nous faisons des choses intéressantes pour une longueur non nulle, et retournons une seule chaîne vide si on lui demande des mots de longueur nulle.
prend le produit cartésien de "RPS" et tous les mots n-1 sans carré. , /: \: joint chaque élément de la droite vers la gauche, donnant un tableau de longueur 3 de tableaux de longueur n. , / aplatit cela en un tableau de longueur 3n.
prend les n premières lettres de chaque chaîne et les compare au deuxième n, puis réduit le tableau uniquement là où elles ne correspondent pas. Parce que nous savons que le résultat précédent est sans carré, seules les sous-chaînes commençant au premier caractère doivent être mises en correspondance - simplifier la vérification ici valait les caractères dépensés pour implémenter la récursivité. Finalement,
applique le lambda au jeu de résultats initial à sa gauche, en itérant sur chaque longueur de sous-chaîne de 1 à (longueur de mot) -1. ! x génère une liste de 0 à x-1, puis 1_ supprime le premier élément (puisque les sous-chaînes de longueur 0 correspondront toujours)
En sacrifiant quelques caractères, nous pouvons utiliser .zs pour faire référence à soi-même plutôt que de compter sur le nom de la fonction, et au lieu de vérifier les sous-chaînes jusqu'à la longueur n-1, vérifiez uniquement les performances du plancher (n / 2). Il trouve tous les 49 mots de longueur (dont il y a 5207706) en environ 120 secondes sur un 7700k, au-dessus de celui que je rencontre dans la limite de 4 Go de k 32 bits gratuit.
la source
Python 2 , 99 octets
Essayez-le en ligne!
la source