Spirales tournantes

12

Étant donné un carré de texte représentant une spirale de caractères, faites-le pivoter!

La spirale commence au centre et se déplace dans le sens antihoraire vers le bord extérieur, en commençant à gauche du centre:

987
216
345

Cela se traduit par la chaîne 123456789. La rotation se fait vers la gauche , donc si vous la faites pivoter d'une position, ce sera le cas 234567891. Ceci est représenté par:

198
327
456

Contribution

L'entrée se compose de la spirale et de la distance pour la faire pivoter.

La distance sera toujours un entier positif ou zéro, et peut être plafonnée à la limite de type de données de votre langue.

La spirale doit être considérée comme une chaîne, avec un délimiteur de ligne de votre choix (y compris aucun délimiteur). Ce sera toujours un carré, sans les délimiteurs, et il aura une longueur de côté impaire.

Supposons que tous les caractères sont alphanumériques [A-Za-z0-9].

Production

La sortie est la spirale tournée. Il doit s'agir d'un carré sur plusieurs lignes (imprimé ou retourné).

Exemples

Contribution

3
tne
atd
bin

Production

bat
nit
den

Contribution

18
efilr
naepo
umshf
tootr
butte

Production

rettu
omseb
oofft
trliu
hpean

C'est du golf de code, avec un score compté en octets comme d'habitude.

Géobits
la source

Réponses:

6

CJam, 45 44 octets

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

Testez-le ici.

Explication

La solution paresseuse: déballez la spirale, utilisez la rotation de la matrice intégrée de CJam, enroulez la spirale à nouveau.

]]       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
la source