Espirales giratorias

12

Dado un cuadrado de texto que representa una espiral de caracteres, ¡gírelo!

La espiral comienza en el centro y se mueve en sentido antihorario hasta el borde exterior, comenzando a la izquierda del centro:

987
216
345

Esto se traduce en la cadena 123456789. La rotación se realiza hacia la izquierda , por lo que si la gira una posición, lo hará 234567891. Esto está representado por:

198
327
456

Entrada

La entrada consiste en la espiral y la distancia para rotarla.

La distancia siempre será un número entero positivo o cero, y puede limitarse en el límite de tipo de datos de su idioma.

La espiral debe tomarse como una cadena, con un delimitador de línea de su elección (incluido sin delimitador). Siempre será un cuadrado, sin incluir delimitadores, y tendrá una longitud lateral extraña.

Suponga que todos los caracteres son alfanuméricos [A-Za-z0-9].

Salida

La salida es la espiral girada. Debe ser un cuadrado en varias líneas (ya sea impreso o devuelto).

Ejemplos

Entrada

3
tne
atd
bin

Salida

bat
nit
den

Entrada

18
efilr
naepo
umshf
tootr
butte

Salida

rettu
omseb
oofft
trliu
hpean

Este es el código de golf, con la puntuación contada en bytes como de costumbre.

Geobits
fuente

Respuestas:

6

CJam, 45 44 bytes

]]l~LqN/{(W%@+\zW%}h;m<{1$,/(W%a@W%z+\s}h;N*

Pruébalo aquí.

Explicación

La solución perezosa: desenvuelva la espiral, use la rotación de matriz incorporada de CJam, vuelva a enrollar la espiral.

]]       e# Push [""]. We'll later use this to roll up the spiral.
l~       e# Read the integer and evaluate it.
L        e# Push an empty string: we'll unroll the input into this.
qN/      e# Read the spiral and split it into lines.
{        e# While the top of the stack is truthy...
  (W%    e#   Pull the first line off the spiral and reverse it.
  @+     e#   Pull up the string we've built so far and prepend the reversed line.
  \zW%   e#   Swap with the remaining spiral, and rotate the spiral.
}h       e# This terminates when the centre character has been added to the string and
         e# the spiral becomes an empty array.
;        e# Discard the empty array.
         e# Note that we've unrolled the spiral from outside in, but we've also built up
         e# the string in reverse, which gives us the string from inside out.
m<       e# Rotate to the left by the given number of characters.
{        e# While the top of the stack is truthy...
  1$,    e#   Copy the spiral so far and get the number of lines.
  /      e#   Split the string into chunks of that size.
  (W%a   e#   Pull off the first chunk, reverse it and wrap it in an array.
  @zW%   e#   Pull up the spiral so far, rotate it.
  +      e#   Prepend the chunk to the spiral as a line.
  \s     e#   Swap with the other chunks and flatten them into a string again.
}h       e# This terminates when the string has been used up completely.
;        e# Discard the empty string.
N*       e# Join the lines with linefeed characters.
Martin Ender
fuente