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 (
D
dalam hal ini, jadi kita lanjutkan denganEFG...
). KetikaZ
tercapai, ia kembali dari siklusA
.
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 kode-golf , 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
Jawaban:
Arang , 31 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Catatan: deverbosifier menampilkan pemisah trailing untuk beberapa alasan. Penjelasan:
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).
sumber
Python 2 , 176 byte
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%4
adalah arahnya (→ ↓ ← ↑), dan kami melangkah ini berkali-kali:Peluang golf
Apakah ada cara yang lebih pendek untuk memetakan
s%4
ke1,0,-1,0
daripadaabs(2-s%4)-1
?Apakah ada cara yang lebih pendek untuk memetakan
s%4
ke0,1,0,-1
daripadas%2-s%4/3*2
?Kredit
sumber
21/(s%4+3)%3-1
:s%2-2*(s%4>2)
( 179 byte ). Mungkin masih bisa golfC,
305281 byteTerima kasih untuk @Mr. Xcoder untuk menghemat empat byte!
Cobalah online!
sumber
#define
forfor(
(yang sebenarnya menyimpan byte). +1 dari saya. :)Python 2 ,
262260254245 byteCobalah online!
Metode baru dengan lebih banyak matematika!
Mengembalikan daftar char-list.
Versi lama:
Python 2 ,
322321308298 byteCobalah online!
sumber
.49
memadai dalam kasus itu, atau gagal untuk input yang sangat besar?i<j
, karena Anda menggunakannya empat kali?+1==1+
dari metode saya sebelumnyaPerl 5, 177 +2 (-nl) = 179 byte
2 byte disimpan berkat Xcali
Cobalah online
sumber
-1
alih-alih$#O
. Juga menggunakan$,
bukan$n
akan membiarkan Anda menghapus ruang sebelumnyafor
di$_.=$"x$n for@O
s/ (?=\S)/n/e
kes/.*\K /n/e
APL (Dyalog Classic) , 47 byte
Cobalah online!
sumber