Dada una cadena, debe mover cada letra (a partir de la primera letra) por su posición en el alfabeto. Si llega al final de la cadena, debe envolverla. Las no letras no necesitan ser movidas.
Ejemplo:
Dog
D
es la cuarta letra del alfabeto, así que la movemos cuatro puntos a la derecha. Después de envolver, eso cambia la cadena a oDg
. o
es la letra 15, (15 mod 3) = 0, por lo que no se mueve. g
es la séptima letra - (7 mod 3) = 1, por lo que la cadena se convierte goD
.
hi*bye
h
es la octava letra, muévala 8 puntos -hi*bye
=>i*hbye
i
es la novena letra, muévala 9 puntos -i*hbye
=>*hbiye
b
es la segunda letra, muévela 2 puntos -*hbiye
=>*hiybe
y
es la letra 25, muévela 25 puntos -*hiybe
=>*hibye
e
es la quinta letra, muévela 5 puntos -*hibye
=>*hibey
No es necesario mover las letras, pero aún así ocupan espacio.
cat
=>tca
F.U.N
=>.F.NU
mississippi
=>msiisppssii
Respuestas:
CJam,
444240 bytesLa salida contiene un salto de línea final.
Pruébalo aquí.
Explicación
En lugar de mover las letras a través de la cadena, elimino repetidamente una letra, gire la cadena en consecuencia y luego vuelva a insertar la letra. Hay un inconveniente para hacer esto: necesitamos poder distinguir el comienzo de la cadena del final de la cadena (que no podemos después de una simple rotación). Es por eso que insertamos un salto de línea al final como protección (la letra antes del salto de línea es el final de la cadena, la letra después del comienzo). La ventaja es que esto devuelve automáticamente la cadena final a la rotación correcta donde el avance de línea está realmente al final de la cadena.
Para ver por qué esto termina en la posición correcta, considere la última iteración del
hi*bye
ejemplo. Después de procesar ele
, la cadena enumerada está en esta posición:Primero, nos dividimos alrededor del salto de línea y concatenamos las partes en orden inverso:
El avance de línea ahora sería al principio o al final de esta cadena. Pero dado que el salto de línea es solo un protector que marca el final de la cadena, esto significa que los caracteres están realmente en el orden correcto. Ahora el salto de línea no es una letra, por lo que la matriz no gira en absoluto. Por lo tanto, cuando agregamos el salto de línea, va a donde pertenece, y todo está en el orden que estamos buscando:
Algunos resultados adicionales si alguien quiere comparar casos de prueba más largos:
Me gusta ese último. :)
fuente
Ruby
125130132139bytesDemostración en línea con pruebas: http://ideone.com/GYJm2u
La inicial (versión sin golf): http://ideone.com/gTNvWY
Editar: ¡ Muchas gracias a manatwork por sus sugerencias!
Edición 2 : recuento de caracteres fijo (inicialmente estaba contando las terminaciones de línea CRLF).
fuente
c.upcase.ord-64
→c.ord%32
.a.join
??? ¿Quién eres y qué has hecho con w0lf? Ciertamente lo escribiría comoa*''
.while ... end
código en mi código que olvidé hacerlo. ¡Gracias por notarlo!while ... end
en(...)while ...
?Python 3,
278275273270260258249248243238 bytesRealmente debería jugar mejor este golf, pero esta es mi solución, gracias a katenkyo por su ayuda con la lógica, y a Cyoce y Mego por su ayuda con el golf.
Editar: Por fin, lo reduje a una declaración de comparación. ¡CORTEJAR! (Y sí, podría mover eso
z=-z
aa,m=m,a
bit, pero eso no ahorra bytes y confunde el código más de lo que pensé que era necesario)Editar: el recuento de bytes estaba desactivado.
Sin golf:
fuente
p[j][0]
puede ser reducido mediante el establecimientoJ=p[j];
al inicio, a continuación, sustituyendo las instancias dep[j][0]
conP[0]
p
directamente, y no una variable que se le hayap[j]
asignado. Además, si miras mi historial de revisiones, tuve una variablek = p[j][0]
para lasa<=k<=m
comparaciones, pero resultó que la eliminaciónk
fue mejor porque guardé más bytes en sangrías de la línea extra para establecerk
de lo que guardé usandok
.