Rotierende Spiralen

12

Wenn Sie ein Quadrat mit einem Text haben, der eine Spirale von Zeichen darstellt, drehen Sie ihn!

Die Spirale beginnt in der Mitte und bewegt sich gegen den Uhrzeigersinn zum äußeren Rand, beginnend links von der Mitte:

987
216
345

Dies wird in die Zeichenfolge übersetzt 123456789. Die Drehung erfolgt nach links . Wenn Sie sie also um eine Position drehen, wird dies der Fall sein 234567891. Dies wird vertreten durch:

198
327
456

Eingang

Die Eingabe besteht aus der Spirale und der Entfernung, um die sie gedreht werden soll.

Der Abstand ist immer eine positive Ganzzahl oder Null und kann an die Datentypbeschränkung Ihrer Sprache angehängt werden.

Die Spirale sollte als Zeichenfolge mit einem Linienbegrenzer Ihrer Wahl (einschließlich ohne Begrenzer) verwendet werden. Es wird immer ein Quadrat ohne Begrenzungszeichen sein und eine ungerade Seitenlänge haben.

Angenommen, alle Zeichen sind alphanumerisch [A-Za-z0-9].

Ausgabe

Ausgang ist die gedrehte Spirale. Es sollte ein Quadrat in mehreren Zeilen sein (gedruckt oder zurückgegeben).

Beispiele

Eingang

3
tne
atd
bin

Ausgabe

bat
nit
den

Eingang

18
efilr
naepo
umshf
tootr
butte

Ausgabe

rettu
omseb
oofft
trliu
hpean

Dies ist Codegolf, wobei die Punktzahl wie üblich in Bytes gezählt wird.

Geobits
quelle

Antworten:

6

CJam, 45 44 Bytes

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

Teste es hier.

Erläuterung

Die faule Lösung: Wickeln Sie die Spirale aus, verwenden Sie die eingebaute Array-Rotation von CJam und rollen Sie die Spirale wieder auf.

]]       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
quelle