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
Des la cuarta letra del alfabeto, así que la movemos cuatro puntos a la derecha. Después de envolver, eso cambia la cadena a oDg. oes la letra 15, (15 mod 3) = 0, por lo que no se mueve. ges la séptima letra - (7 mod 3) = 1, por lo que la cadena se convierte goD.
hi*bye
- hes la octava letra, muévala 8 puntos -- hi*bye=>- i*hbye
- ies la novena letra, muévala 9 puntos -- i*hbye=>- *hbiye
- bes la segunda letra, muévela 2 puntos -- *hbiye=>- *hiybe
- yes la letra 25, muévela 25 puntos -- *hiybe=>- *hibye
- ees 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*byeejemplo. 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 ... endcódigo en mi código que olvidé hacerlo. ¡Gracias por notarlo!while ... enden(...)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=-zaa,m=m,abit, 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]pdirectamente, 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<=mcomparaciones, pero resultó que la eliminaciónkfue mejor porque guardé más bytes en sangrías de la línea extra para establecerkde lo que guardé usandok.