La spirale alfanumerica


24

Il compito è molto semplice, quando viene dato un input, emette una delle seguenti spirali:

Input = 1dà una spirale con la lettera che Ainizia nell'angolo in alto a sinistra:

A B C D E F
T U V W X G
S 5 6 7 Y H
R 4 9 8 Z I
Q 3 2 1 0 J
P O N M L K

Input = 2dà una spirale con la lettera che Ainizia nell'angolo in alto a destra:

P Q R S T A
O 3 4 5 U B
N 2 9 6 V C
M 1 8 7 W D
L 0 Z Y X E
K J I H G F

Input = 3dà una spirale con la lettera che Ainizia nell'angolo in basso a destra:

K L M N O P
J 0 1 2 3 Q
I Z 8 9 4 R
H Y 7 6 5 S
G X W V U T
F E D C B A

Input = 4dà una spirale con la lettera che Ainizia nell'angolo in basso a sinistra:

F G H I J K
E X Y Z 0 L
D W 7 8 1 M
C V 6 9 2 N
B U 5 4 3 O
A T S R Q P

Come puoi vedere, la spirale procede sempre in senso orario e si sposta dall'esterno verso l' interno .

Le regole sono semplici:

  • È necessario fornire un programma completo utilizzando STDIN e STDOUT, o l'equivalente più vicino se non è possibile.
  • Dato un input ( 1, 2, 3, 4), genera la spirale correlata.
  • Gli spazi bianchi finali sono consentiti
  • Gli spazi bianchi principali sono consentiti se utilizzati in modo coerente
  • È necessario utilizzare lettere maiuscole per l'output, le lettere minuscole non sono consentite.
  • Questo è , quindi vince il programma con il minor numero di byte!

3
Correlato . Questo tipo di
sentimento


2
gli spazi sono necessari?
Maltysen,

@Maltysen Sì, sono richiesti.
Adnan,

Risposte:


5

CJam, 45 43 42 byte

'[,65>A,+W%(s{W%z_,@s/(@.+}A*ri{W%z}*Sf*N*

Provalo qui.

Spiegazione

'[,65>  e# Push the upper-case alphabet.
A,+     e# Append the digits.
W%      e# Reverse everything.
(s      e# Pull off the 9 and turn it into a string.
{       e# Repeat this 10 times to roll the string up in a spiral...
  W%z   e#   Rotate the existing grid clockwise.
  _,    e#   Duplicate grid so far and get the number of rows.
  @s    e#   Pull up the list of characters and flatten it into one string.
  /     e#   Split the string into chunks of the size of the number of rows.
  (     e#   Pull off the first chunk.
  @.+   e#   Pull up the grid so far and prepend the chunk as a new column.
}A*     e# We now have the spiral as desired, with the A in the bottom left corner.
ri      e# Read input and convert to integer.
{       e# Repeat this code that often..
  W%z   e#   Rotate the spiral clockwise.
}*
Sf*     e# Join each line with spaces.
N*      e# Join the lines with linefeeds.

10

Japt , 53 byte 58 59 60

5 byte salvati grazie a @ETHproductions

"FGHIJK EXYZ0L DW781M CV692N BU543O ATSRQP"¸zU ®¬¸} ·

Questo utilizza il comando di rotazione che non avrei mai pensato fosse così utile

Spiegazione && Ungolfed

"FGHIJK EXYZ0L DW781M CV692N BU543O ATSRQP"qS zU m_q qS} qR

             // Implicit: U = input
"FGH...SRQP" // String, " " represent newlines
qS           // Split   " "
zU           // Rotate
m_           // Loop the lines
  q qS}      // Insert spaces
qR           // Join by newlines

Provalo online


Stranamente, quando provo a eseguire il programma online, si oppone e si lamenta che non riesce a trovare la variabile f.
David C

@DavidCarraher Consiglio di provare su Firefox, questo è il browser in cui l'interprete sembra funzionare meglio
Downgoat

Sì, funziona su Firefox. Bello.
David C

Ooh bello! Usando alcune scorciatoie Unicode, puoi ridurre il numero di byte di cinque:"FGHIJK EXYZ0L DW781M CV692N BU543O ATSRQP"¸zU ®¬¸} ·
ETHproductions

@ETHproductions non li aveva mai visti prima, grazie!
Evil Sheep,

3

Mathematica 156 byte

Converte una stringa di lettere iniziale "ABCDEFTUVWXGS567YHR498ZIQ3210JPONMLK"in un array. Nestsi applica fa quei n-1tempi dell'array , dove n è il numero di input. ffunziona Transposeinserendo l'array seguito da Reverseapplicato a ciascuna riga. gconverte l'array finale in una stringa.

s=StringJoin;r=Riffle;f=Nest[Reverse/@Transpose@#&,Partition[Characters@"ABCDEFTUVWXGS567YHR498ZIQ3210JPONMLK",6],#-1]&;
g@n_:=s@r[s/@(r[#," "]&/@f[n]),"\n"]

Esempio

g[4]

produzione


Se l'output potesse essere fornito come un array, la funzione non gsarebbe necessaria.

f[4]

{{"F", "G", "H", "I", "J", "K"}, {"E", "X", "Y", "Z", "0", "L "}, {" D "," W "," 7 "," 8 "," 1 "," M "}, {" C "," V "," 6 "," 9 "," 2 ", "N"}, {"B", "U", "5", "4", "3", "O"}, {"A", "T", "S", "R", "Q "," P "}}


Il modulo Infix può essere utilizzato in alcune aree.
LegionMammal978,

3

MATLAB, 61 89 byte

b=[65:90 48:57];n=zeros(12,6);n(2:2:end)=rot90(b(37-spiral(6)),input('')-2);disp([n' ''])

Vedrò se riesco a smettere un po '. Non sono sicuro però.

Questo crea una matrice di tutte le lettere dalla A alla Z seguite da 0 a 9, quindi prende una spirale e la usa per disporre i dati nell'ordine corretto. L'array viene quindi ruotato in base alla quantità specificata dall'utente e quindi stampato.

L'output utilizza costantemente spazi iniziali come consentito dalla domanda (in realtà senza costi di byte aggiuntivi, potrebbe invece fare spazi finali). Ecco un esempio:

 F G H I J K
 E X Y Z 0 L
 D W 7 8 1 M
 C V 6 9 2 N
 B U 5 4 3 O
 A T S R Q P

Come ho visto che sono richiesti spazi, questo codice originale (per 61) non è valido perché non aggiunge uno spazio tra ogni carattere. Ma lo aggiungerò qui come riferimento.

b=['A':'Z' '0':'9'];disp(rot90(b(37-spiral(6)'),6-input('')))

e produce:

ABCDEF
TUVWXG
S567YH
R498ZI
Q3210J
PONMLK

2

JavaScript ES6, 165 172

Rotazione semplice, a partire da una stringa codificata

Nota 1 byte salvato thx @ user81655

p=prompt();alert("ABCDEF TUVWXG S567YH R498ZI Q3210J PONMLK".split` `.map((r,y,a)=>[...r].map((c,x)=>p<2?c:a[p<3?5-x:p<4?5-y:x][p<3?y:p<4?5-x:5-y]).join` `).join`
`)

Snippet di prova:

// Test: redefine alert to write inside the snippet
alert=x=>P.innerHTML=x

p=prompt();
alert(
  "ABCDEF TUVWXG S567YH R498ZI Q3210J PONMLK"
  .split` `
  .map(
    (r,y,a)=>
    [...r].map(
      (c,x)=>p<2?c:
      a
       [p<3?5-x:p<4?5-y:x]
       [p<3?y:p<4?5-x:5-y]
    ).join` `
  ).join`\n`
)
<pre id=P></pre>


È possibile inserire i caratteri di nuova riga all'interno di stringhe di modello di `<newline>`un byte più brevi di `\n`.
user81655

@ user81655 thx, conta anche 1 byte, ma è comunque terribilmente lungo
edc65

1

Pyth - 60 byte

Codifica hardcoding della stringa e utilizza le operazioni matrice per ottenere tutte le opzioni.

jjL\ @[_CKc6"ABCDEFTUVWXGS567YHR498ZIQ3210JPONMLK"KC_K__MK)Q

Test Suite .


2
+<G6"invece di "ABCDEFsalva 2 byte.
PurkkaKoodari,

1

Rubino, 173 byte

->i{_,r,o=->s{s.map{|i|i*' '}},->s{s.transpose.map{|i|i.reverse}},%W(ABCDEF TUVWXG S567YH R498ZI Q3210J PONMLK).map(&:chars);puts i<2?_[o]:i<3?_[t=r[o]]:i<4?_[r[t]]:_[r[r[t]]]}

Ungolfed:

-> i {
  _ = -> s { s.map{|i| i*' ' } }
  r = -> s { s.transpose.map{|i| i.reverse } }
  o = %W(ABCDEF TUVWXG S567YH R498ZI Q3210J PONMLK).map(&:chars)
  puts i<2?_[o]:i<3?_[t=r[o]]:i<4?_[r[t]]:_[r[r[t]]]
}

Uso:

->i{_,r,o=->s{s.map{|i|i*' '}},->s{s.transpose.map{|i|i.reverse}},%W(ABCDEF TUVWXG S567YH R498ZI Q3210J PONMLK).map(&:chars);puts i<2?_[o]:i<3?_[t=r[o]]:i<4?_[r[t]]:_[r[r[t]]]}[4]
F G H I J K
E X Y Z 0 L
D W 7 8 1 M
C V 6 9 2 N
B U 5 4 3 O
A T S R Q P

1

Python, 152 byte

s=[r for r in "ABCDEF TUVWXG S567YH R498ZI Q3210J PONMLK".split(" ")]
for i in range(1,int(input())):s=zip(*list(s)[::-1])
for x in s:print(" ".join(x))
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.