Spiral Alfabet!

13

Lihatlah string berikut. Perhatikan polanya?

ABEFNOPEFGH
DC GQI
MHRJ
LKJI SK
DTL
AIR MANI
BAZYXWV N
EO
DP
CQ
BAZYXWVUTSR

Seperti yang mungkin diperhatikan oleh beberapa orang, pada dasarnya ini adalah spiral dari alfabet, di mana jarak antara baris / kolom secara bertahap meningkat sebesar 1 spasi / baris baru.

Definisi yang ketat

  • Mari kita memiliki penghitung c , yang awalnya 0.
  • Kami menulis pertama c + 1 huruf alfabet dari kiri ke kanan: A.
  • Kemudian, dari atas ke bawah berikutnya (c + 1) (c + 2) / 2 huruf (add B): AB.

  • Dari kiri ke kanan, berikutnya (c + 1) (c + 2) / 2 (tambahkan C):

    AB
     C
    
  • Dan dari bawah ke atas, huruf c + 1 berikutnya (tambahkan D):

    AB
    DC
    
  • Mencapai akhir siklus. Karenanya, mari selisih c (yang menjadi 1). Kemudian, itu dimulai kembali dari langkah pertama, satu-satunya perbedaan adalah bahwa alih-alih menggunakan huruf c + 1 pertama dari alfabet, kita menggunakan huruf c + 1 berikutnya , mulai dari elemen terakhir dari siklus ini ( Ddalam hal ini, jadi kita lanjutkan dengan EFG...). Ketika Ztercapai, ia kembali dari siklus A.

Tugas

Diberikan integer N (yang positif untuk pengindeksan 1 atau non-negatif untuk pengindeksan 0), menghasilkan N pertama siklus dari spiral.

Aturan

  • Anda bisa menggunakan huruf kecil atau alfabet huruf besar, tetapi pilihan Anda harus konsisten (hanya gunakan salah satunya, pencampuran tidak diperbolehkan).

  • Anda dapat mengambil input dan memberikan output melalui salah satu metode standar , dalam bahasa pemrograman apa pun , sambil mencatat bahwa celah ini dilarang secara default.

  • Format output yang dapat diterima: string multiline, daftar string yang mewakili garis, daftar yang berisi banyak daftar karakter, masing-masing mewakili satu baris, atau apa pun yang Anda anggap cocok. Jika Anda tidak memilih format pertama, alangkah baiknya jika Anda menyertakan versi kode yang cukup cetak.

  • Ini adalah , jadi kode terpendek dalam byte (dalam setiap bahasa) yang memenuhi persyaratan menang!


Uji kasus

Bilangan bulat input akan dipisahkan oleh keluaran terkait melalui baris baru, dan tes akan dipisahkan menggunakan tanda hubung. Perhatikan bahwa ini adalah 1-diindeks.

1

AB
DC

--------

2

ABEF
DC G
MH
LKJI 

--------

3

ABEFNOP
DC GQ
MHR
LKJI S
DT
CU
BAZYXWV

-------

4

ABEFNOPEFGH
DC GQI
MHRJ
LKJI SK
DTL
AIR MANI
BAZYXWV N
EO
DP
CQ
BAZYXWVUTSR

-------
5

ABEFNOPEFGHFGHIJ
DC GQIK
MHRJL
LKJI SKM
DTLN
CUMO
BAZYXWV NP
EOQ
DPR
CQS
BAZYXWVUTSR T
RU
QV
PW
LEMBU
NMLKJIHGFEDCBAZY

------

6

ABEFNOPEFGHFGHIJSTUVWX
DC GQIKY
MHRJLZ
LKJI SKMA
DTLNB
CUMOC
BAZYXWV NPD
EOQE
DPRF
CQSG
BAZYXWVUTSR TH
RUI
QVJ
PWK
OXL
NMLKJIHGFEDCBAZY M
SN
RO
QP
PQ
ATAU 
NMLKJIHGFEDCBAZYXWVUTS
Tuan Xcoder
sumber
Testcases harus n = 1,2,3,5,6, saya pikir.
TFeld

Jawaban:

9

Arang , 31 byte

F⮌…⁰NB⁺²⊘×ι⁺³ι⭆α§α⁺λ÷×ι⊕×ι⁺⁹⊗ι⁶

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Catatan: deverbosifier menampilkan pemisah trailing untuk beberapa alasan. Penjelasan:

F⮌…⁰NB

Gambar kotak dengan urutan terbalik (terbesar ke terkecil).

⁺²⊘×ι⁺³ι

Hitung ukuran kotak.

⭆α§α⁺λ

Gambar batas kotak menggunakan alfabet yang diputar.

÷×ι⊕×ι⁺⁹⊗ι⁶

Hitung huruf yang akan muncul di kiri atas kotak (0-diindeks).

Neil
sumber
6

Python 2 , 176 byte

n=input()
k=n*-~n/2+1
a=eval(`[[' ']*k]*k`)
x=y=z=0
for s in range(4*n+4):exec s/4*(s/4+1)/2*"if'!'>a[y][x]:a[y][x]=chr(z%26+65);z+=1\nx+=abs(2-s%4)-1;y+=s%2-s%4/3*2\n"
print a

Cobalah online!

Penjelasan

Kami membangun array kosong dari ruang dengan ukuran yang tepat, lalu memindahkannya seperti ini, dimulai dari sudut kiri atas:

  • 1 langkah →, 1 langkah ↓, 1 langkah ←, 1 langkah ↑

  • 3 langkah →, 3 langkah ↓, 3 langkah ←, 3 langkah ↑

  • 6 langkah →, 6 langkah ↓, 6 langkah ←, 6 langkah ↑

  • 10 langkah →, 10 langkah ↓, 10 langkah ←, 10 langkah ↑

  • ...

Setiap kali kami menemukan sel kosong, kami menaruh huruf di sana dan menggilir ke huruf berikutnya dalam alfabet.

Dalam kode, s%4adalah arahnya (→ ↓ ← ↑), dan kami melangkah ini berkali-kali:

TriangularNumber(s/4) = s/4*(s/4+1)/2.

Peluang golf

  • Apakah ada cara yang lebih pendek untuk memetakan s%4ke 1,0,-1,0daripada abs(2-s%4)-1?

  • Apakah ada cara yang lebih pendek untuk memetakan s%4ke 0,1,0,-1daripada s%2-s%4/3*2?

Kredit

  • Mr. Xcoder menyimpan satu byte.
Lynn
sumber
2
+1 Wow, ini luar biasa. Butuh waktu beberapa saat untuk memikirkan cara kerjanya. Saya menemukan singkatan untuk 21/(s%4+3)%3-1: s%2-2*(s%4>2)( 179 byte ). Mungkin masih bisa golf
Tn. Xcoder
4

C,  305  281 byte

Terima kasih untuk @Mr. Xcoder untuk menghemat empat byte!

#define L(x,y)l[x][y]=a++%26+65;
#define F for(
c,i,j,a,p;f(n){char**l=calloc(8,i=a=n*n*4);F;i--;memset(l[i],32,a))l[i]=malloc(a);F c=a=p=i=0;c<n;++c){F i=p;i<c+p+!c;)L(j=0,c+i++)F p=i;j<=-~c*(c+2)/2;)L(j++,c+i)F;c+i-1;)L(j-1,c+--i)F i=0;i<=c;)L(j+~i++,0)}F i=0;i<j;)puts(l[i++]);}

Cobalah online!

Steadybox
sumber
1
Pertama kali saya melihat #definefor for((yang sebenarnya menyimpan byte). +1 dari saya. :)
Kevin Cruijssen
2

Python 2 , 262 260 254 245 byte

lambda n:[[[' ',chr(65+(4*(i<j)+sum((i<j)*8+2+I*[5,9][i<j]+sum(2*R(I))for I in R(S(i,j)-1))+[i+j,-i-j][i<j])%26)][max(i,j)==S(i,j)*-~S(i,j)/2or i*j<1]for i in R(1+n*-~n/2)]for j in R(1+n*-~n/2)]
R=range
S=lambda x,y:int((8*max(x,y)+1)**.5+.99)/2

Cobalah online!

Metode baru dengan lebih banyak matematika!

Mengembalikan daftar char-list.


Versi lama:

Python 2 , 322 321 308 298 byte

R=range
n=input()
w=1+n*-~n/2;r=[w*[' ']for _ in R(w)];r[0][0]='A';l=R(1,w*w*9);c=lambda:chr(65+l.pop(0)%26)
for i in R(n+1):
 w=1+i*-~i/2;W=w-i
 for x in R(W,w):r[0][x]=c()
 for y in R(1,w):r[y][w-1]=c()
 for x in R(1,w):r[w-1][w+~x]=c()
 for x in R(1,w-W):r[w+~x][0]=c()
for l in r:print`l`[2::5]

Cobalah online!

TFeld
sumber
@ Mr.Xcoder Tidak cukup .49memadai dalam kasus itu, atau gagal untuk input yang sangat besar?
Kevin Cruijssen
1
@KevinCruijssen Tidak yakin, tapi ini pasti berhasil, 260 byte .
Tn. Xcoder
Saya tidak tahu Python dengan baik, tetapi apakah mungkin untuk membuat inline-variabel untuk i<j , karena Anda menggunakannya empat kali?
Kevin Cruijssen
1
245 byte dengan bermain golf+1==1+ dari metode saya sebelumnya
Tn. Xcoder
1

Perl 5, 177 +2 (-nl) = 179 byte

2 byte disimpan berkat Xcali

sub n{chr 65+$c++%26}@O=(n);while($,++<$_){$_.=$"x$,for@O;push@O,($"x length$O[0])x$,;$O[0]=~s/ /n/eg;s/ $/n/e for@O;1while$O[-1]=~s/.*\K /n/e;s/^ /n/e for reverse@O}print for@O

Cobalah online

Nahuel Fouilleul
sumber
Anda dapat menyimpan byte dengan menggunakan -1alih-alih $#O. Juga menggunakan $,bukan $nakan membiarkan Anda menghapus ruang sebelumnya fordi$_.=$"x$n for@O
Xcali
terima kasih, saya sedang mencari perbaikan lain tetapi tidak dapat menemukan saat ini
Nahuel Fouilleul
disimpan 2 byte lagi mengubah regex s/ (?=\S)/n/ekes/.*\K /n/e
Nahuel Fouilleul
0

APL (Dyalog Classic) , 47 byte

(⎕a⍴⍨≢i)@i⍴∘''⊃⌈/i←∪+\↓1⍪⊃⍪⌿(+\⍳⎕)⌿¨⊂⍪∘-⍨∘.≠⍨⍳2

Cobalah online!

ngn
sumber