Diberikan bilangan bulat ganjil positif tunggal sebagai input, kembalikan zigzag konvergen sebagai daftar string, daftar daftar karakter, atau string yang dipisahkan baris baru, dalam bentuk ini:
#
#
#
#
#
#
#
#
#
#
#
Anda dapat mengganti #
dengan karakter non-spasi kosong yang konsisten. Trailing whitespace pada setiap baris diizinkan dan baris tambahan tambahan diizinkan.
Zig-zag dimulai pada kolom 1
dan untuk setiap baris bergerak ke kanan satu kolom, hingga mencapai kolom n
(di mana n
input). Kemudian, ia bergerak ke kiri ke 2
, kemudian ke kanan n-1
, lalu ke kiri 3
, dengan kedua batas menyatu sampai zigzag berakhir di kolom tengah ( (n+1)/2
).
Uji Kasus
Contoh di atas adalah test case untuk 5
.
Berikut ini adalah kasus uji individual:
3
#
#
#
#
7
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
1
#
Jawaban:
C (gcc) , 89 byte
Cobalah online!
Bekerja dengan menganalisis urutan jumlah spasi sebagai (untuk n = 7):
Dan untuk n = 3:
Kita dapat melihat bahwa angka tengah (
a
dalam kode) berjalan dari [n-1, n / 2). Kemudian, perbedaan antara angka pertama dan angka tengah adalah:Jadi, jika kita telah
b
melalui [- (2a-n), 2a-n],a-abs(b)
akan memberi kita urutan yang diinginkan. Ini pada dasarnya adalah apa yang dilakukan kode.sumber
Arang ,
108 byteCobalah online! Tautan adalah untuk mengucapkan versi kode. Sunting: Disimpan 2 byte, terima kasih kepada @dzaima karena telah menunjukkan bahwa saya tidak harus menggunakan
#
s.sumber
Python 2 , 78 byte
Cobalah online!
sumber
Jelly , 14 byte
Cobalah online!
Program lengkap.
Penggunaan
1
.-1 terima kasih kepada Jonathan Allan .
-1 terima kasih kepada Jonathan Allan .
sumber
’R
->Ṗ
untuk satu byte.”X
->1
untuk yang lain.Haskell , 72 byte
Cobalah online!
Kami mendefinisikan daftar tak terbatas
r
sebagai diagonal#
s mulai dari sudut kiri atas.Kami kemudian mendefinisikan fungsi
g
yang melakukan pekerjaan paling berat.g
akan mengambil daftar dan berulang kali membalikkannya dan menghapus elemen pertama sampai daftar kosong, lalu menyatukan hasil dari setiap tindakan.Fungsi utama kami di sini adalah fungsi point-free. Fungsi ini dimulai dengan mengambil
n
elemen dari daftar yang tak terbatasr
, kemudian memotong elemen pertama dan berlakug
. Terakhir kita harus menambahkan#
kembali ke awal, ini karena spesifikasi untuk pertanyaannya sedikit aneh, saya tidak yakin mengapa diagonal pertama selalu lebih panjang dari yang seharusnya, tetapi itu, jadi kita harus tambahkan aa#
.sumber
("#":).g.init.(
menerimar)
tetapi terima kasih!SOGL V0.12 , 19 byte
Coba Di Sini!
sumber
05AB1E , 22 byte
Cobalah online!
Penggunaan
8
.sumber
05AB1E , 6 byte
Cobalah online!
sumber
S
. Jadi output akan menjadi dua kali lebih lama. Saya belum tahu tentang + dan ×. Mereka membuat pola yang sangat menarik ketika Anda menggabungkannya dengan angkaS
, tapi tidak cukup memperhatikan output ..>.> Dan+
dan×
pada dasarnya builtin untuk[0,4,4,0,2,6,6,2]
dan[1,5,5,1,3,7,7,3]
. Dan8
akan diatur ulang ke tempat asal Anda memulai. Di sini sedikit lebih banyak informasi.CJam , 29 byte
Cobalah online!
Penggunaan
8
.sumber
Pyth, 23 byte
Coba di sini.
sumber
JavaScript, 127 byte
Hitung sasaran (
g
) untuk sampai ke. Ketika tujuan ini tercapai, berbaliklah ke tujuan berikutnya. Juga menggunakan trik untuk menghindari penggunaanMath.round()
dengan menambahkan0.5
ke setiap nomor yang tidak rata.sumber
Haskell, 74 byte
Cobalah online!
Bagaimana itu bekerja:
Setiap panggilan rekursif untuk
f
menambahkan diagonal berikutnya.sumber
Sekam , 19 byte
Cobalah online!
Penjelasan
Ini terasa agak kikuk.
sumber
Python 3 , 82 byte
Cobalah online!
sumber
Retina , 71 byte
Cobalah online! Penjelasan: Tiga tahap pertama mengkonversi input ke dalam bentuk di
:> :
mana jumlah karakter antara:
s adalah nomor input. Dua tahap terakhir kemudian memantul>
(atau<
, ketika bergerak ke kiri) di antara:
s. Tahap keempat memotong pantulan, mencetak bagian-bagian string yang diperlukan setiap kali. The;
berhenti string dari yang dicetak setelah loop.sumber
05AB1E , 16 byte
Cobalah online!
Penjelasan
sumber
K (Kona), 27 byte
Menghasilkan urutan numerik yang mendasari dengan berulang kali membalikkan dan menjatuhkan kepala vektor sampai kosong.
sumber
PHP, 65 byte
Jalankan sebagai pipa dengan
-nF
atau uji secara online .penjelasan:
iterasi pertama:
$n
adalahNULL
, jadi--$n
tidak memiliki efek dan mengevaluasi untukNULL
-> mengatur
$n
dan$d
untuk pra-pengurangan argumen1. kenaikan
$x
untuk genap$d
, penurunan untuk$d
cetak 2. ganjil
X
, baris baru dan$x
spasiiterasi lebih lanjut: pengurangan
$n
; ketika hits0
, setel ulang$n
(dan$d
) ke argumen yang telah ditentukan sebelumnyafinale: cetak satu lagi
X
.sumber
Japt , 31 byte
Solusi rekursif yang mengembalikan array garis.
Cobalah online! menggunakan
-R
bendera untuk menggabungkan output dengan baris baru.sumber
Python 2,
159145141136 byteSudah ada versi Python yang cukup bagus untuk masalah ini, tetapi saya pikir saya masih akan memposting satu liner yang mengerikan. (Tanpa titik koma!)
Sunting: 14 byte ke bawah, menggunakan jumlah alih-alih pemahaman daftar ganda
Sunting: Baru saja diperhatikan di python 2 Anda dapat menggunakan input alih-alih raw_input. Saya selalu menggunakan yang terakhir.
sumber
Mathematica,
142102 byte (independen)Solusi ini memiliki rasa yang khas:
UnitVector[#,1-Sum[(-1)^Floor[#+1/2-Sqrt[9/4+#*#-#-2x]],{x,k}]]~Table~{k,0,#(#-1)/2}/.{0->" ",1->"X"}&
Ini pada dasarnya menghitung segmen mana kita (dengan membalik fungsi angka segitiga) dan kemudian bergerak ke kiri atau kanan dengan menambahkan kekuatan -1.
Anda dapat mengujinya di Wolfram Code Sandbox dengan menempelkan kode suka
UnitVector[#,1-Sum[(-1)^Floor[#+1/2-Sqrt[9/4+#*#-#-2x]],{x,k}]]~Table~{k,0,#(#-1)/2}/.{0->" ",1->"X"}&@6//MatrixForm
dan menekan Shift + Enter atau Numpad Enter atau mengklik Gear -> "Evaluate Cell".Ini kebetulan memiliki panjang yang sama dengan port salah saya yang asli dari solusi Python 2 Erik (Port ini memberikan output untuk input yang lebih tinggi):
(Print[X];l=Range@#;Do[Do[Print[StringRepeat[" ",l[[j]]]<>"X"],{j,Length@l}];l=l[[-2;;1;;-1]],{i,#}])&
sumber