Spirala alfanumeryczna

24

Zadanie jest bardzo proste: po podaniu danych wyjściowych wypuść jedną z następujących spiral:

Input = 1daje spiralę z literą Azaczynającą się w lewym górnym rogu:

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 = 2daje spiralę z literą Arozpoczynającą się w prawym górnym rogu:

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 = 3daje spiralę z literą Arozpoczynającą się w prawym dolnym rogu:

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 = 4daje spiralę z literą Arozpoczynającą się w lewym dolnym rogu:

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

Jak widać, spirala zawsze porusza się zgodnie z ruchem wskazówek zegara i przesuwa się z zewnątrz do wewnątrz .

Zasady są proste:

  • Musisz podać pełny program przy użyciu STDIN i STDOUT lub najbliższego odpowiednika, jeśli nie jest to możliwe.
  • Biorąc pod uwagę input ( 1, 2, 3, 4), wypisz odpowiednią spiralę.
  • Końcowe białe znaki są dozwolone
  • Wiodące białe znaki są dozwolone, jeśli są używane konsekwentnie
  • Jako wynik należy użyć dużej litery, małe litery nie są dozwolone.
  • To jest , więc wygrywa program z najmniejszą liczbą bajtów!
Adnan
źródło
3
Związane . Ten rodzaj czuje się jak dupek, ale nie mogę go znaleźć: P
FryAmTheEggman
2
Bardziej blisko spokrewniony .
Peter Taylor,
2
czy potrzebne są miejsca?
Maltysen,
@Maltysen Tak, są wymagane.
Adnan,

Odpowiedzi:

5

CJam, 45 43 42 bajtów

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

Sprawdź to tutaj.

Wyjaśnienie

'[,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
źródło
10

Japt , 53 bajty 58 59 60

Zaoszczędź 5 bajtów dzięki @ETHproductions

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

Wykorzystuje to polecenie obrotu, które nigdy nie myślałem, że będzie tak przydatne

Wyjaśnienie i nieugolfowany

"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

Wypróbuj online

Złe Owce
źródło
O dziwo, kiedy próbuję uruchomić program online, dręczy mnie i narzeka, że ​​nie może znaleźć zmiennej f.
DavidC,
@DavidCarraher Polecam wypróbować na Firefox, to jest przeglądarka, w której interpreter wydaje się działać najlepiej
Downgoat
Tak, działa w przeglądarce Firefox. Miły.
DavidC,
OOH nieźle! Za pomocą kilku skrótów Unicode możesz zmniejszyć liczbę bajtów o pięć:"FGHIJK EXYZ0L DW781M CV692N BU543O ATSRQP"¸zU ®¬¸} ·
ETHprodukcje
@ETHproductions nie widziała ich wcześniej, dzięki!
Evil Sheep,
3

Mathematica 156 bajtów

Konwertuje początkowy ciąg liter "ABCDEFTUVWXGS567YHR498ZIQ3210JPONMLK"na tablicę. Neststosuje się fdo n-1czasów tablic , gdzie n jest liczbą wejściową. fdziała przez Transpose-tablicę, a następnie Reversestosowane do każdego wiersza. gkonwertuje końcową tablicę na ciąg.

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

Przykład

g[4]

wydajność


Gdyby dane wyjściowe można było podać w postaci tablicy, funkcja gbyłaby niepotrzebna.

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
źródło
Formularz infix może być używany w niektórych obszarach.
LegionMammal978,
3

MATLAB, 61 89 bajtów

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

Zobaczę, czy uda mi się to trochę zdjąć. Nie jestem pewien.

Spowoduje to utworzenie tablicy wszystkich liter od A do Z, po których następują cyfry od 0 do 9, a następnie pobiera spiralę i używa jej do uporządkowania danych we właściwej kolejności. Tablica jest następnie obracana o wartość określoną przez użytkownika, a następnie drukowana.

Dane wyjściowe konsekwentnie wykorzystują wiodące spacje, jak dopuszcza to pytanie (w rzeczywistości bez dodatkowych kosztów bajtowych, zamiast tego mogłyby robić końcowe spacje). Oto przykład:

 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

Jak zauważyłem, że wymagane są spacje, ten oryginalny kod (dla 61) jest nieprawidłowy, ponieważ nie dodaje spacji między każdym znakiem. Ale dodam go tutaj w celach informacyjnych.

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

i produkuje:

ABCDEF
TUVWXG
S567YH
R498ZI
Q3210J
PONMLK
Tom Carpenter
źródło
2

JavaScript ES6, 165 172

Prosta rotacja, zaczynająca się od zakodowanego ciągu

Uwaga 1 bajt zapisany 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`
`)

Fragment testowy:

// 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
źródło
Możesz wstawiać same znaki nowego wiersza w ciągi szablonów, o `<newline>`jeden bajt krótszy niż `\n`.
user81655,
@ user81655 dzięki, nawet 1 bajt się liczy, ale i tak jest tak strasznie długi
edc65
1

Pyth - 60 bajtów

Zaszyfruj ciąg i używa operacji macierzowych, aby uzyskać wszystkie opcje.

jjL\ @[_CKc6"ABCDEFTUVWXGS567YHR498ZIQ3210JPONMLK"KC_K__MK)Q

Pakiet testowy .

Maltysen
źródło
2
+<G6"zamiast "ABCDEFzapisuje 2 bajty.
PurkkaKoodari,
1

Rubinowy, 173 bajtów

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

Nie golfowany:

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

Stosowanie:

->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
źródło
1

Python, 152 bajty

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
źródło