Spirali rotanti


12

Dato un quadrato di testo che rappresenta una spirale di caratteri, ruotalo!

La spirale inizia al centro e si sposta in senso antiorario verso il bordo esterno, iniziando a sinistra del centro:

987
216
345

Questo si traduce nella stringa 123456789. La rotazione viene eseguita a sinistra , quindi se la ruoti di una posizione, lo sarà 234567891. Questo è rappresentato da:

198
327
456

Ingresso

L'input è costituito dalla spirale e dalla distanza per ruotarla.

La distanza sarà sempre un numero intero positivo o zero e può essere limitata al limite del tipo di dati della tua lingua.

La spirale dovrebbe essere presa come una stringa, con un delimitatore di linea di tua scelta (incluso nessun delimitatore). Sarà sempre un quadrato, esclusi i delimitatori, e avrà una lunghezza laterale dispari.

Supponiamo che tutti i caratteri siano alfanumerici [A-Za-z0-9].

Produzione

L'output è la spirale ruotata. Dovrebbe essere un quadrato su più righe (stampate o restituite).

Esempi

Ingresso

3
tne
atd
bin

Produzione

bat
nit
den

Ingresso

18
efilr
naepo
umshf
tootr
butte

Produzione

rettu
omseb
oofft
trliu
hpean

Questo è il codice golf, con il punteggio conteggiato in byte come al solito.

Risposte:


6

CJam, 45 44 byte

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

Provalo qui.

Spiegazione

La soluzione pigra: scartare la spirale, utilizzare la rotazione dell'array integrata di CJam, arrotolare nuovamente la spirale.

]]       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.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.