A espiral alfanumérica

24

A tarefa é muito simples, quando recebida uma entrada, gera uma das seguintes espirais:

Input = 1dá uma espiral com a letra Acomeçando no canto superior esquerdo:

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á uma espiral com a letra Acomeçando no canto superior direito:

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á uma espiral com a letra Acomeçando no canto inferior direito:

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á uma espiral com a letra Acomeçando no canto inferior esquerdo:

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

Como você pode ver, a espiral sempre roda no sentido horário e se move de fora para dentro .

As regras são simples:

  • Você precisa fornecer um programa completo usando STDIN e STDOUT, ou o equivalente mais próximo, se não for possível.
  • Dada uma entrada ( 1, 2, 3, 4), produza a espiral relacionada.
  • Espaços em branco à direita são permitidos
  • Os espaços em branco à esquerda são permitidos quando usados ​​de forma consistente
  • Você precisa usar letras maiúsculas para a saída, letras minúsculas não são permitidas.
  • Isso é , então o programa com a menor quantidade de bytes vence!
Adnan
fonte
3
Relacionado . Isso parece um idiota, mas não consigo encontrar um: P
FryAmTheEggman 11/15/15
2
Mais intimamente relacionado .
Peter Taylor
2
os espaços são necessários?
Maltysen
@ Maltysen Sim, eles são obrigatórios.
Adnan

Respostas:

5

CJam, 45 43 42 bytes

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

Teste aqui.

Explicação

'[,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.
Martin Ender
fonte
10

Japt , 53 bytes 58 59 60

Economizou 5 bytes graças a @ETHproductions

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

Isso usa o comando rotate que eu nunca pensei que seria tão útil

Explicação && 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

Experimente online

Ovelhas Malvadas
fonte
Estranhamente, quando tento executar o programa online, ele rejeita e reclama que não consegue encontrar a variável f.
10139
@DavidCarraher Eu recomendo a tentar no Firefox, que é o navegador o intérprete parece funcionar melhor em
Downgoat
Sim, funciona no Firefox. Agradável.
12134
Ooh legal! Usando alguns atalhos Unicode, você pode reduzir a contagem de bytes em cinco:"FGHIJK EXYZ0L DW781M CV692N BU543O ATSRQP"¸zU ®¬¸} ·
ETHproductions
@ETHproductions não os viu antes, obrigado!
Evil Sheep
3

Mathematica 156 bytes

Converte a sequência inicial de letras,, "ABCDEFTUVWXGS567YHR498ZIQ3210JPONMLK"em uma matriz. Nestaplica f- se a esses n-1tempos de matriz , em que n é o número de entrada. ffunciona Transpose-ing na matriz seguida por Reverseaplicada a cada linha. gconverte a matriz final em uma string.

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

Exemplo

g[4]

saída


Se a saída pudesse ser fornecida como uma matriz, a função gseria desnecessária.

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 "}}

DavidC
fonte
O formulário Infix pode ser usado em algumas áreas.
usar o seguinte
3

MATLAB, 61 89 bytes

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

Vou ver se consigo diminuir um pouco. Não tenho certeza.

Isso cria uma matriz de todas as letras de A a Z seguidas de 0 a 9, depois pega uma espiral e a usa para organizar os dados na ordem correta. A matriz é girada pela quantidade especificada pelo usuário e impressa.

A saída usa consistentemente os espaços iniciais, conforme permitido pela pergunta (na verdade, sem custo adicional de bytes, ele poderia criar espaços finais). Aqui está um exemplo:

 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

Como vi que são necessários espaços, esse código original (para 61) não é válido porque não adiciona um espaço entre cada caractere. Mas vou adicioná-lo aqui para referência.

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

e produz:

ABCDEF
TUVWXG
S567YH
R498ZI
Q3210J
PONMLK
Tom Carpenter
fonte
2

JavaScript ES6, 165 172

Rotação simples, iniciando a partir de uma string codificada

Nota: 1 byte salvo 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 de teste:

// 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>

edc65
fonte
Você pode colocar os caracteres de nova linha dentro das strings do modelo com `<newline>`um byte menor que `\n`.
user81655
@ user81655 thx, até 1 contagens de bytes, mas é tão terrivelmente longo de qualquer maneira
edc65
1

Pitão - 60 bytes

Codifica a string e usa operações de matriz para obter todas as opções.

jjL\ @[_CKc6"ABCDEFTUVWXGS567YHR498ZIQ3210JPONMLK"KC_K__MK)Q

Conjunto de Teste .

Maltysen
fonte
2
+<G6"em vez de "ABCDEFsalva 2 bytes.
PurkkaKoodari 12/12
1

Ruby, 173 bytes

->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
Vasu Adari
fonte
1

Python, 152 bytes

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))
Gabriele D'Antona
fonte