Dada una cadena de entrada que consta de solo letras, devuelve el tamaño de paso que da como resultado la cantidad mínima de pasos necesarios para visitar todas las letras en orden sobre un alfabeto de ajuste, comenzando en cualquier letra.
Por ejemplo, tomar la palabra, dog
. Si usamos un tamaño de paso de 1, terminamos con:
defghijklmnopqrstuvwxyzabcdefg Alphabet
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
defghijklmnopqrstuvwxyzabcdefg Visited letters
d o g Needed letters
Para un total de 30 pasos.
Sin embargo, si usamos un tamaño de paso de 11, obtenemos:
defghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefg
^ ^ ^ ^ ^ ^
d o z k v g Visited letters
d o g Needed letters
Para un total de 6 pasos. Esta es la cantidad mínima de pasos, por lo que el resultado de retorno dog
es el tamaño del paso; 11
.
Casos de prueba:
"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
Reglas
- La entrada será una cadena o matriz de caracteres no vacía que constará solo de las letras
a
az
(puede elegir entre mayúsculas o minúsculas) - La salida puede ser 0 indexada (es decir, el rango
0-25
) o 1 indexada (1-26
) - Si hay un empate, puede generar cualquier tamaño de paso o todos
- Este es el código de golf , por lo que gana la menor cantidad de bytes para cada idioma.
Respuestas:
Carbón , 41 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. 0 indexado. Explicación:
Pase sobre los 26 pasos. (En realidad, hago un bucle sobre el alfabeto en minúsculas aquí y uso la variable de índice).
Pase sobre cada carácter de la entrada después del primero.
Realice un bucle 26 veces y genere la cadena de caracteres resultante al realizar 26 pasos en el tamaño de paso dado que comienza (indexado en 0) con el carácter anterior de la entrada.
Encuentre la posición del carácter actual de la entrada en esa cadena, o -1 si no se encuentra.
Tome la suma de todas las posiciones, a menos que no se encuentre una, en cuyo caso use -1.
Ahorre las sumas.
Encuentra la suma mínima no negativa.
Encuentre el tamaño del primer paso con esa suma y suéltelo.
fuente
JavaScript, 143 bytes
Pruébalo en línea!
Gracias a Shaggy, el uso
[...Array(26).keys()]
guarda 9 bytes.fuente
Jalea ,
282623 bytesLa salida está indexada en 0. La entrada es una cadena de bytes y puede ser en cualquier caso, pero en mayúsculas es mucho más rápido.
La entrada de una sola letra tiene que estar en mayúsculas especiales y cuesta 2 bytes. ._.
Pruébalo en línea!
Tenga en cuenta que este es un enfoque de fuerza bruta; las entradas con cuatro o más letras caducarán en TIO. El conjunto de pruebas pretende
_39
"eficiencia".Cómo funciona
fuente
Jalea , 17 bytes
La entrada es una cadena de bytes en STDIN, la salida está indexada en 1.
Pruébalo en línea!
Cómo funciona
fuente
JavaScript (Node.js) ,
123121116114bytesPruébalo en línea!
Comentado
s[k++ >> 5]
fuente
Rubí ,
12111411210810289 bytesPruébalo en línea!
0 indexado. Toma la entrada como una matriz de caracteres.
Gracias a ASCII-only por ideas de golf de 12 bytes.
fuente
p,=*s
truco, pero no estoy tan seguro de la solidez teórica de una solución con un puntaje de penalización codificado ... Entonces, cambié la constante al infinito (aunque su valor permitiría otros 2 bytes de descuento) )Python 2 ,
230222216194169 bytesPruébalo en línea!
-22 bytes desde tsh
-39 bytes de Jo King
Versión anterior con explicación:
Pruébalo en línea!
Esto sería más corto en un idioma con un número primo de letras (no necesitaría elEste envío ahora se utilizafloat('inf')
manejo de bucles infinitos). En realidad, este envío aún lo necesitaría para manejar cadenas como "aaa".26*len(s)
como límite superior, lo que detiene los bucles infinitos.Este envío está indexado en 0 (devuelve valores de 0 a 25 inclusive).
f
toma una cadena (n mayúscula) y devuelve el paso del alfabeto óptimot
es una función auxiliar que toma la secuencia y un paso alfabético y devuelve el número de saltos necesarios para finalizar la secuencia (o26*len(s)
si es imposible).fuente
while a!=A(c)and S<len(s)*26:
y puede eliminarif a==i:return float('inf')
, ya quelen(s)*26
es el límite superior de cualquier respuesta.Rojo , 197 bytes
Pruébalo en línea!
fuente
05AB1E (heredado) ,
332726 bytesUtiliza la versión heredada porque parece haber un error cuando desea modificar / usar el resultado después de un mapa anidado en la nueva versión 05AB1E.
Salida indexada a 0.
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
Python 3 ,
191178162 bytes¡Gracias a todos por todos sus consejos! Esto se ve mucho más parecido al golf.
Pruébalo en línea!
Y mi código original si alguien está interesado.
Convierte la palabra en una lista de valores ASCII, luego recorre los pasos del 0 al 25, verificando cuántos pasos se necesitan para agotar la lista (hay un límite máximo para detener los bucles infinitos).
El número de pasos se agrega a la lista a .
Después del bucle grande for, se imprime el índice del valor más pequeño en a . Esto es igual al valor de i (el tamaño del paso) para esa iteración del bucle, QED.
fuente
range(26)
es suficiente: no necesita especificar el inicio, ya que 0 es el valor predeterminado;a.append(n)
podría sera+=[n]
; la primera línea sería más corta como mapaw=list(map(ord,input()))
(en realidad con su algoritmo actual, en Py2 también podría soltar el ajustelist(...)
); evitar saltos de separación / de línea adicionales tanto como sea posible (por ejemplo, no hay necesidad de nuevas líneas en oneliners:if p>122:p-=26
)n>99
parece sospechoso, ¿es esa una constante arbitraria para salir del bucle infinito? Entonces, probablemente debería ser algo así como 26 * len (w), como nunca se sabe, qué tan grande será la entrada.list(...)
en Py3 y también de un extraif
: 165 bytes . Además, eche un vistazo a este tema de consejos , ¡estoy seguro de que mejorará en gran medida sus habilidades con los consejos de allí!while p!=c and n>len(w)*26:
y deshacerte de esa última sentencia if para -8 bytes.n+=1
yp+=i
en líneas separadas an+=1;p+=i
una.