Rotating Spiral

12

Diberi teks persegi mewakili spiral karakter, putar itu!

Spiral dimulai di tengah dan bergerak berlawanan arah jarum jam ke tepi luar, mulai dari kiri tengah:

987
216
345

Ini berarti string 123456789. Rotasi dilakukan ke kiri , jadi jika Anda memutarnya satu posisi, itu akan menjadi 234567891. Ini diwakili oleh:

198
327
456

Memasukkan

Input terdiri dari spiral dan jarak untuk memutarnya.

Jarak akan selalu berupa bilangan bulat positif atau nol, dan dapat dibatasi pada batas tipe data bahasa Anda.

Spiral harus diambil sebagai string, dengan garis pembatas pilihan Anda (termasuk tidak ada pembatas). Itu akan selalu menjadi persegi, tidak termasuk pembatas, dan memiliki panjang sisi yang aneh.

Asumsikan semua karakter adalah alfanumerik [A-Za-z0-9].

Keluaran

Output adalah spiral yang diputar. Ini harus berupa bujur sangkar pada banyak garis (baik dicetak atau dikembalikan).

Contohnya

Memasukkan

3
tne
atd
bin

Keluaran

bat
nit
den

Memasukkan

18
efilr
naepo
umshf
tootr
butte

Keluaran

rettu
omseb
oofft
trliu
hpean

Ini kode golf, dengan skor dihitung dalam byte seperti biasa.

Geobit
sumber

Jawaban:

6

CJam, 45 44 byte

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

Uji di sini.

Penjelasan

Solusi malas: buka spiral, gunakan rotasi array bawaan CJam, gulung spiral lagi.

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