Étant donné une chaîne d'entrée composée uniquement de lettres, renvoyez la taille de pas qui entraîne le nombre minimum de pas nécessaires pour visiter toutes les lettres dans l'ordre sur un alphabet d'habillage, en commençant par n'importe quelle lettre.
Par exemple, prendre la parole, dog
. Si nous utilisons une taille de pas de 1, nous nous retrouvons avec:
defghijklmnopqrstuvwxyzabcdefg Alphabet
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
defghijklmnopqrstuvwxyzabcdefg Visited letters
d o g Needed letters
Pour un total de 30 étapes.
Cependant, si nous utilisons une taille de pas de 11, nous obtenons:
defghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg
^ ^ ^ ^ ^ ^
d o z k v g Visited letters
d o g Needed letters
Pour un total de 6 étapes. Il s'agit du nombre minimum d'étapes, donc le résultat de retour pour dog
est la taille de l'étape; 11
.
Cas de test:
"dog" -> 11
"age" -> 6
"apple" -> 19
"alphabet" -> 9
"aaaaaaa" -> 0 for 0 indexed, 26 for 1 indexed
"abcdefga" -> 1 or 9
"aba" -> Any odd number except for 13
"ppcg" -> 15
"codegolf" -> 15
"testcase" -> 9
"z" -> Any number
"joking" -> 19
Règles
- L'entrée sera une chaîne non vide ou un tableau de caractères composé uniquement des lettres
a
àz
(vous pouvez choisir entre majuscules ou minuscules) - La sortie peut être 0 indexée (c'est-à-dire la plage
0-25
) ou 1 indexée (1-26
) - S'il y a une égalité, vous pouvez sortir n'importe quelle taille de pas ou tous
- Il s'agit de code-golf , donc le plus petit nombre d'octets pour chaque langue gagne!
Réponses:
Fusain , 41 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. 0 indexé. Explication:
Faites une boucle sur les 26 tailles de pas. (En fait, je boucle sur l'alphabet en minuscules ici et j'utilise la variable d'index.)
Faites une boucle sur chaque caractère de l'entrée après le premier.
Bouclez 26 fois et générez la chaîne de caractères résultante en effectuant 26 pas à la taille de pas donnée commençant (indexé 0) avec le caractère précédent de l'entrée.
Recherchez la position du caractère actuel de l'entrée dans cette chaîne, ou -1 s'il n'est pas trouvé.
Prenez la somme de toutes les positions, sauf si aucune n'a été trouvée, auquel cas utilisez -1.
Économisez les sommes.
Trouvez la somme minimale non négative.
Trouvez la première taille de pas avec cette somme et sortez-la.
la source
JavaScript, 143 octets
Essayez-le en ligne!
Grâce à Shaggy, l'utilisation
[...Array(26).keys()]
économise 9 octets.la source
Gelée ,
282623 octetsLa sortie est indexée 0. L'entrée est un bytestring et peut être dans tous les cas, mais les majuscules sont beaucoup plus rapides.
L'entrée d'une seule lettre doit être placée dans un boîtier spécial et coûte 2 octets. ._.
Essayez-le en ligne!
Notez qu'il s'agit d'une approche par force brute; les entrées de quatre lettres ou plus expireront sur TIO. La suite de tests préfère
_39
«l'efficacité».Comment ça marche
la source
Gelée , 17 octets
L'entrée est un bytestring sur STDIN, la sortie est indexée 1.
Essayez-le en ligne!
Comment ça marche
la source
JavaScript (Node.js) ,
123 121 116114 114 octetsEssayez-le en ligne!
Commenté
s[k++ >> 5]
la source
Ruby ,
12111411210810289 bytesEssayez-le en ligne!
0 indexé. Prend l'entrée comme un tableau de caractères.
Merci à ASCII uniquement pour les idées de golf d'une valeur de 12 octets.
la source
p,=*s
astuce, mais je ne suis pas sûr de la robustesse théorique d'une solution avec un score de pénalité codé en dur ... Donc, j'ai changé la constante à l'infini (bien que votre valeur autorise encore 2 octets de moins) ).Python 2 ,
230222 222216194169 octetsEssayez-le en ligne!
-22 octets de tsh
-39 octets de Jo King
Version plus ancienne avec explication:
Essayez-le en ligne!
Ce serait plus court dans une langue avec un nombre premier de lettres (ne nécessiterait pas laCette soumission utilise maintenantfloat('inf')
gestion de boucles infinies). En fait, cette soumission aurait toujours besoin de cela pour gérer des chaînes comme "aaa".26*len(s)
comme limite supérieure, ce qui arrête les boucles infinies.Cette soumission est indexée sur 0 (renvoie des valeurs de 0 à 25 inclus).
f
prend une chaîne (n majuscule) et renvoie le pas d'alphabet optimalt
est une fonction d'aide qui prend la chaîne et un pas d'alphabet et renvoie le nombre de sauts nécessaires pour terminer la chaîne (ou26*len(s)
si cela est impossible).la source
while a!=A(c)and S<len(s)*26:
et vous pouvez supprimerif a==i:return float('inf')
, carlen(s)*26
est la limite supérieure de toute réponse.Rouge , 197 octets
Essayez-le en ligne!
la source
05AB1E (hérité) ,
332726 octetsUtilise la version héritée car il semble y avoir un bogue lorsque vous souhaitez modifier / utiliser le résultat après une carte imbriquée dans la nouvelle version 05AB1E.
Sortie indexée 0.
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source
Python 3 ,
191178162 octetsMerci à tous pour tous vos conseils! cela ressemble beaucoup plus à un golf.
Essayez-le en ligne!
Et mon code d'origine si quelqu'un est intéressé.
Transforme le mot en une liste de valeurs ASCII, puis parcourt les étapes de 0 à 25, vérifiant le nombre d'étapes nécessaires pour épuiser la liste (il existe un plafond pour arrêter les boucles infinies).
Le nombre d'étapes est ajouté à la liste a .
Après la grande boucle for, l'index de la plus petite valeur dans a est imprimé. Ceci est égal à la valeur de i (la taille du pas) pour cette itération de la boucle, QED.
la source
range(26)
suffit - vous n'avez pas besoin de spécifier le début, car 0 est la valeur par défaut;a.append(n)
pourrait êtrea+=[n]
; la première ligne serait plus courte que mapw=list(map(ord,input()))
, (en fait avec votre algorithme actuel, dans Py2, vous pouvez également supprimer lelist(...)
wrapping); éviter les ruptures espacement / ligne supplémentaires autant que possible (par exemple, pas besoin de nouvelles lignes dans Citations:if p>122:p-=26
)n>99
semble suspect, est-ce une constante arbitraire pour sortir de la boucle inifinite? Ensuite, cela devrait probablement être quelque chose comme 26 * len (w), comme vous ne le savez jamais, quelle sera la taille de l'entrée.list(...)
dans Py3 et aussi d'un extraif
: 165 octets . Jetez également un œil à cette rubrique de conseils , je suis sûr que vous améliorerez considérablement vos compétences en utilisant des conseils à partir de là!while p!=c and n>len(w)*26:
et vous débarrasser de cette dernière instruction if pour -8 octets.n+=1
etp+=i
sur des lignes séparéesn+=1;p+=i
en un seul.