Cómo se tuercen las cuerdas
El algoritmo de torsión es muy simple. Cada columna se desplaza hacia abajo por su índice (col 0 se mueve hacia abajo 0, col 1 se mueve 1, ...). El cambio de columna se ajusta a la parte superior. Funciona así:
aaaa
bbbb
cccc
Se convierte en:
a
ba
cba
----
cba
cb
c
Con todo debajo de la línea envolviendo a la cima. Ejemplo real:
Original:
\\\\\\\\\\\\
............
............
............
Twisted:
\...\...\...
.\...\...\..
..\...\...\.
...\...\...\
Entrada
La entrada es una matriz de cadenas o una cadena de varias líneas. Todas las líneas tienen la misma longitud.
Salida
La cadena retorcida, salida multilínea a salida estándar (o la alternativa más cercana).
Ejemplos:
( >
denota entrada, el espacio final es importante)
>Hello, world!
>I am another
>string to be
>twisted!
Hwrmoe oo br!
Ieii ,dttr e
s lsna !ohl
ttaltgnw ed
>\\\\\\\\\\\\
>............
>............
>............
\...\...\...
.\...\...\..
..\...\...\.
...\...\...\
>abcdefg
>.......
a.c.e.g
.b.d.f.
>abcdefghij
>..........
>..........
a..d..g..j
.b..e..h..
..c..f..i.
>\\\\.....././
>...../.......
>........././.
>..../.^\\....
\.........../
.\....^..../.
..\../.\../..
...\/...\/...
>cdeab
>deabc
>eabcd
>abcde
cbbbb
ddccc
eeedd
aaaae
>aeimquy37
>bfjnrvz48
>cgkosw159
>dhlptx260
ahknqx147
beloru258
cfipsvy69
dgjmtwz30
>abcdefghi
>jklmnopqr
>stuvwxyz1
>234567890
a3ume7yqi
jb4vnf8zr
skc5wog91
2tld6xph0
Respuestas:
Brachylog , 5 bytes
Pruébalo en línea!
Obtiene entrada como una matriz de columnas (que parece estar dentro de las especificaciones de la pregunta).
iᵇ
- Para cada elemento de la matriz, emparejarlo con su índice (basado en 0)ᵐ
- asignar este predicado a cada elemento del resultado:↻₎
- permutar (la columna) circularmente por la cantidad especificada como el último elemento (el índice)Se extiende fácilmente a una versión que acepta una sola cadena multilínea:
13 bytes
Pruébalo en línea!
fuente
Pyth, 11
Pruébalo aquí
fuente
APL (Dyalog) , 7 bytes
Requiere
⎕io←0
Pruébalo en línea!
⍬⍋⍉
obtiene el rango de 0 al número de columnas invertidas gira⊖
verticalmente⊖⊖⍨⍬⍋⍉
(verticalmente) la entrada invertida (verticalmente) invirtiendo0,1..
⊖
eso, y devuélvelo.fuente
Retina ,
1111019287 bytesEl recuento de bytes supone la codificación ISO 8859-1.
Woo, lo resolvió en una sola sustitución de expresiones regulares. :) (Lo más probable es que haya una solución más corta usando varios, pero ¿dónde está la diversión en eso ...)
Pruébalo en línea!
Explicación
Esto requiere un conocimiento básico de grupos de equilibrio . En resumen, el sabor de expresiones regulares de .NET le permite capturar varias veces con un solo grupo, empujando todas las capturas a una pila. Esa pila también se puede extraer, lo que nos permite usarla para contar cosas dentro de la expresión regular.
Esto empuja una captura en ambos grupos
1
y2
para cada personaje en frente de la partida (en la línea actual). Es decir, cuenta la posición horizontal del partido.El resto está en una anticipación:
Emparejamos cada línea y también la empujamos hacia el grupo
1
, de modo que el grupo1
ahora es la suma de la posición horizontal y vertical (donde esta última se cuenta desde abajo ). Esto esencialmente etiqueta las diagonales de la cuadrícula con valores crecientes a partir de la esquina inferior izquierda. Ese.*
entonces solo mueve el cursor del motor al final de la cadena.Ahora cambiamos a un mirar hacia atrás, que coincide de derecha a izquierda en .NET:
Esto repetidamente hará estallar exactamente las
H
capturas del grupo1
(dondeH
es la altura de la entrada). El propósito de esto es tomar el módulo grupalH
. Luego, el grupo1
contiene la fila (contada desde la parte inferior) de la cual elegir el nuevo personaje en la columna actual.Otra mirada atrás, otra vez desde la derecha.
(?<-1>.+¶)*.+
ahora usa group1
para encontrar la fila desde la cual elegir el nuevo personaje y luego la búsqueda anticipada encuentra la columna correcta usando group2
.El carácter deseado es capturado en grupo
3
y reescrito por la sustitución.fuente
$+
parece útil ... especialmente si solo quieres hacer una sustitución: ^)$+
realidad es bastante inútil ... su descripción en MSDN suena mucho más útil de lo que es porque implica que(a)|(b)
->$+$+
duplicaría todos losa
syb
s, pero en su lugar elimina todos losa
s, porque solo se refiere al último grupo sintáctico . Eso significa que es solo una forma de evitar contar todos los grupos si eres demasiado vago (como yo). Para jugar al golf, solo ahorra bytes cuando tienes más de 9 grupos, lo que probablemente es bastante raro para empezar.Regex.Replace
para Retina, pero aún no pude implementarlo).CJam, 13 bytes
Pruébalo aquí.
Explicación
fuente
TeaScript, 10 bytes
Gracias a la sintaxis extremadamente concisa de TeaScript 3, esto es realmente corto: D
Sería 1 byte más corto si el bucle Sigma no tuviera errores
Pruébalo en línea
Explicación
fuente
Python 3, 164 bytes
No es la mejor respuesta por asomo, pero la primera en Python ...
fuente
)
o]
en la mayoría de los casos, por ejemplo,''.join(l)for l in....
es perfectamente válidoMATLAB,
9236 bytesSuponiendo que la cadena de entrada
s
ya tiene la forma de una matriz / matriz de caracteres 2D, por ejemploExplicación: iterar a través de las columnas de la matriz. Para cada columna, realice un desplazamiento circular de sus elementos por el número de caracteres que equivale al índice de la columna (-1 debido a la indexación de MATLAB).
fuente
Brachylog , 96 bytes
Esto espera una lista de cadenas de códigos de caracteres como entrada y sin salida, p. Ej.
brachylog_main([`aaaa`,`bbbb`,`cccc`],_).
Esa es una respuesta ridículamente larga, y probablemente haya una forma mucho más corta de hacerlo.
Explicación
fuente
JavaScript,
9289 bytes3 bytes de descuento gracias @Neil .
Mostrar fragmento de código
fuente
replace
:m.replace(/./g,(n,j)=>z[((l=z.length)*j+i-j)%l][j])
.[...m].map(
todo el camino hasta e incluyendo el primero.join
.Python 2, 115 bytes
Gracias a la maravilla de haber
zip
logrado reducir esto a una línea. Véalo en acción aquí .fuente
MATL , 18
21bytesLa entrada es de la forma
Pruébalo en línea!
Cómo funciona :
fuente
F #, 105 bytes
Mi primer intento (solo
\n
se requiere un personaje):Uso:
fuente
JavaScript (ES6), 73 bytes
Explicación
Prueba
Mostrar fragmento de código
fuente
Japt, 29 bytes
¡Pruébalo en línea!
Cómo funciona
fuente
Haskell, 81 bytes
reimplementación del ejemplo de CJam, aunque el reverso, el mapa y la enumeración son parte de mapAccumR, el snd elimina el acumulador ya que ya no lo necesitamos, la reversión es solo un efecto secundario del pliegue derecho.
fuente
Haskell, 65 bytes
Ejemplo de uso:
g ["1111","2222","3333"]
->["1321","2132","3213"]
.fuente
MATL , 9 bytes
Pruébalo en línea!
Bastante similar en el núcleo a la respuesta MATL existente de Luis Mendo , pero más corta al usar características que probablemente no estaban en el lenguaje en ese momento: 1.
"
itera a través de las columnas de una matriz automáticamente ahora, por lo que no es costoso construir índices de columnas e indexarlas ( este es el problema), 2.&h
como una forma abreviada de decirN$h
, y 3. final de ciclo implícito si]
no se especifica.Alternativamente, para el mismo bytecount:
Pruébalo en MATL Online
fuente
C (clang) , 114 bytes
Funciona en GCC bajo MinGW. El GCC de TIO se confunde al usar
strlen
en la expresión init del primer bucle for.Pruébalo en línea!
fuente