Spiral alfanumerik

24

Tugasnya sangat sederhana, ketika diberi input, output salah satu spiral berikut:

Input = 1memberikan spiral dengan huruf yang Adimulai di sudut kiri atas:

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 = 2memberikan spiral dengan huruf yang Adimulai di sudut kanan atas:

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 = 3memberikan spiral dengan huruf yang Adimulai di sudut kanan bawah:

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 = 4memberikan spiral dengan huruf yang Adimulai di sudut kiri bawah:

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

Seperti yang Anda lihat, spiral selalu searah jarum jam dan bergerak dari luar ke dalam .

Aturannya sederhana:

  • Anda perlu menyediakan program lengkap menggunakan STDIN dan STDOUT, atau yang setara terdekat jika tidak memungkinkan.
  • Diberikan input ( 1, 2, 3, 4), output spiral terkait.
  • Ruang putih trailing diperbolehkan
  • Ruang putih terkemuka diizinkan bila digunakan secara konsisten
  • Anda perlu menggunakan huruf besar untuk output, huruf kecil tidak diperbolehkan.
  • Ini adalah , jadi program dengan jumlah byte terkecil menang!
Adnan
sumber
3
Terkait . Jenis ini terasa seperti penipuan tetapi saya tidak dapat menemukannya: P
FryAmTheEggman
2
Lebih dekat hubungannya .
Peter Taylor
2
Apakah ruang yang diperlukan?
Maltysen
@Maltysen Ya, mereka diharuskan.
Adnan

Jawaban:

5

CJam, 45 43 42 byte

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

Uji di sini.

Penjelasan

'[,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
sumber
10

Japt , 53 byte 58 59 60

Disimpan 5 byte berkat produk @ETH

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

Ini menggunakan perintah rotate yang saya pikir tidak akan berguna

Penjelasan && Tidak Disatukan

"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

Cobalah online

Domba Jahat
sumber
Anehnya, ketika saya mencoba menjalankan program online, itu menolak dan mengeluh bahwa ia tidak dapat menemukan variabel f.
DavidC
@DavidCarraher Saya sarankan mencoba di Firefox, itulah browser yang menurut penerjemah paling baik
Downgoat
Ya, ini berfungsi di Firefox. Bagus.
DavidC
Ooh, bagus! Dengan menggunakan beberapa pintasan Unicode, Anda dapat memotong jumlah byte sebanyak lima:"FGHIJK EXYZ0L DW781M CV692N BU543O ATSRQP"¸zU ®¬¸} ·
ETHproduksi
@ ETHproductions tidak melihat yang sebelumnya, terima kasih!
Evil Sheep
3

Mathematica 156 byte

Mengubah string awal huruf "ABCDEFTUVWXGS567YHR498ZIQ3210JPONMLK",, menjadi array. Nestberlaku funtuk n-1waktu array itu , di mana n adalah nomor input. fbekerja dengan Transpose-ing array diikuti oleh Reversediterapkan ke setiap baris. gmengubah array terakhir menjadi string.

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

Contoh

g[4]

keluaran


Jika output dapat diberikan sebagai array, fungsi gtersebut tidak diperlukan.

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", "S", "R", "Q "," P "}}

DavidC
sumber
Bentuk infiks dapat digunakan di beberapa daerah.
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' ''])

Saya akan melihat apakah saya bisa menurunkannya sedikit. Namun tidak yakin.

Ini menciptakan array semua huruf dari A ke Z diikuti oleh 0 hingga 9, lalu mengambil spiral dan menggunakannya untuk mengatur data dalam urutan yang benar. Array kemudian diputar dengan jumlah yang ditentukan pengguna dan kemudian dicetak.

Output secara konsisten menggunakan spasi sebagai diizinkan oleh pertanyaan (pada kenyataannya tanpa biaya byte tambahan, itu bisa melakukan spasi tambahan sebagai gantinya). Berikut ini sebuah contoh:

 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

Ketika saya melihat bahwa spasi diperlukan, kode asli ini (untuk 61) tidak valid karena tidak menambah spasi di antara setiap karakter. Tetapi saya akan menambahkannya di sini untuk referensi.

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

dan menghasilkan:

ABCDEF
TUVWXG
S567YH
R498ZI
Q3210J
PONMLK
Tom Carpenter
sumber
2

JavaScript ES6, 165 172

Rotasi sederhana, mulai dari string hardcoded

Catatan 1 byte disimpan 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`
`)

Cuplikan uji:

// 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
sumber
Anda dapat menempatkan karakter baris baru itu sendiri di dalam string templat `<newline>`lebih pendek satu byte dari `\n`.
user81655
@ user81655 thx, bahkan 1 byte penting, tapi tetap saja sangat panjang
edc65
1

Pyth - 60 byte

Hardcodes string dan menggunakan operasi matriks untuk mendapatkan semua opsi.

jjL\ @[_CKc6"ABCDEFTUVWXGS567YHR498ZIQ3210JPONMLK"KC_K__MK)Q

Test Suite .

Maltysen
sumber
2
+<G6"bukannya "ABCDEFmenyimpan 2 byte.
PurkkaKoodari
1

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

Tidak Disatukan:

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

Pemakaian:

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