Ini adalah Pascal's Braid:
1 4 15 56 209 780 2911 10864 40545 151316 564719
1 3 11 41 153 571 2131 7953 29681 110771 413403 1542841
1 4 15 56 209 780 2911 10864 40545 151316 564719
Saya benar-benar mengarangnya. Sejauh ini yang saya tahu, Blaise Pascal tidak memiliki rambut kepang, mungkin itu terbuat dari rambut, bukan angka.
Itu didefinisikan seperti ini:
- Kolom pertama memiliki satu
1
di tengah. - Kolom kedua memiliki
1
di bagian atas dan di bawah. - Sekarang kita bergantian antara meletakkan nomor di tengah atau dua salinan angka di bagian atas dan bawah.
- Jika angka tersebut berada di bagian atas atau bawah, itu akan menjadi jumlah dari dua angka yang berdekatan (misalnya
56 = 15 + 41
). Jika Anda sedikit memiringkan kepala, ini seperti langkah dalam segitiga Pascal. - Jika angkanya di tengah, itu akan menjadi jumlah dari ketiga angka yang berdekatan (misalnya
41 = 15 + 11 + 15
).
Tugas Anda adalah mencetak (sebagian) kepang ini.
Memasukkan
Anda harus menulis sebuah program atau fungsi, yang menerima integer tunggal n
, memberikan indeks kolom terakhir yang akan dikeluarkan.
Anda dapat memilih apakah kolom pertama (hanya mencetak satu 1
di garis tengah) sesuai dengan n = 0
atau n = 1
. Ini harus menjadi pilihan yang konsisten di semua input yang mungkin.
Keluaran
Keluarkan Pascal's Braid hingga n
kolom ke - th. Spasi putih harus sama persis dengan tata letak contoh di atas, kecuali bahwa Anda dapat menyambungkan garis yang lebih pendek ke panjang garis yang lebih panjang dengan spasi dan Anda dapat secara opsional menampilkan satu baris feed baris tambahan.
Dengan kata lain, setiap kolom harus sama persis dengan jumlah (atau pasangan angka yang sama) di kolom itu, angka dalam kolom berturut-turut tidak boleh tumpang tindih dan tidak boleh ada spasi di antara kolom.
Anda dapat mencetak hasilnya ke STDOUT (atau alternatif terdekat), atau jika Anda menulis suatu fungsi, Anda dapat mengembalikan string dengan konten yang sama atau daftar tiga string (satu untuk setiap baris).
Keterangan lebih lanjut
Anda dapat berasumsi bahwa n
tidak akan kurang dari indeks kolom pertama (jadi tidak kurang dari 0
atau 1
tergantung pada indeks Anda). Anda juga dapat mengasumsikan bahwa angka terakhir dalam jalinan kurang dari 256 atau angka terbesar yang dapat diwakili oleh tipe bilangan bulat asli bahasa Anda, mana yang lebih besar . Jadi jika tipe integer asli Anda hanya dapat menyimpan byte, Anda dapat mengasumsikan bahwa yang terbesar n
adalah 9
atau 10
(tergantung pada apakah Anda menggunakan berbasis 0 atau 1 n
) dan jika itu dapat menyimpan bilangan bulat 32-bit yang ditandatangani, n
akan paling banyak 33
atau 34
.
Aturan standar kode-golf berlaku. Kode terpendek menang.
OEIS
Berikut adalah beberapa tautan OEIS yang relevan. Tentu saja, ini berisi spoiler untuk berbagai cara untuk menghasilkan angka dalam jalinan:
- Atas / bawah: A001353 atau A010905 atau A106707 atau A195503
- Tengah: A001835 atau A079935
- Keduanya: A002530
Uji Kasus
Kasing uji ini menggunakan pengindeksan 1 basis. Setiap test case terdiri dari empat baris, dengan yang pertama menjadi input dan tiga sisanya menjadi output.
1
1
---
2
1
1
1
---
3
1
1 3
1
---
5
1 4
1 3 11
1 4
---
10
1 4 15 56 209
1 3 11 41 153
1 4 15 56 209
---
15
1 4 15 56 209 780 2911
1 3 11 41 153 571 2131 7953
1 4 15 56 209 780 2911
---
24
1 4 15 56 209 780 2911 10864 40545 151316 564719 2107560
1 3 11 41 153 571 2131 7953 29681 110771 413403 1542841
1 4 15 56 209 780 2911 10864 40545 151316 564719 2107560
Jawaban:
Jelly ,
313029 byteIni adalah tautan monadik; itu menerima indeks kolom berbasis 0 sebagai argumen dan mengembalikan daftar string.
Cobalah online!
Bagaimana itu bekerja
sumber
Pyth , 44 byte
Pembuatan angka membutuhkan 20 byte, dan pemformatannya membutuhkan 24 byte.
Cobalah online!
sumber
Python 2, 120 byte
Cobalah di Ideone.
sumber
MATL , 38 byte
Cobalah online!
Menghitung array dengan angka (unik) membutuhkan 17 byte pertama. Memformat mengambil 21 byte yang tersisa.
Penjelasan
Bagian 1: menghasilkan angka
Ini menghasilkan sebuah array dengan nomor dari baris pertama dan kedua dalam urutan yang meningkat:
[1; 1; 3; 4; 11; 15; ...]
. Dimulai dengan1
,1
. Setiap nomor baru secara iteratif diperoleh dari dua sebelumnya. Dari mereka, yang kedua dikalikan dengan1
atau2
tergantung pada indeks iterasi, dan kemudian dijumlahkan ke yang pertama untuk menghasilkan nomor baru.Jumlah iterasi sama dengan input
n
. Ini berarti bahwan+2
angka-angka dihasilkan. Setelah dihasilkan, array perlu dipangkas sehingga hanyan
entri pertama yang disimpan.Bagian 2: memformat output
Untuk setiap angka dalam array yang diperoleh, ini menghasilkan dua string: representasi string dari angka, dan string dengan panjang yang sama yang terdiri dari karakter 0 berulang (karakter 0 ditampilkan sebagai spasi dalam MATL). Bahkan untuk iterasi, dua string ini ditukar.
Kedua string ini kemudian digabungkan secara vertikal. Jadi
n
array char 2D dihasilkan sebagai berikut (menggunakan·
untuk mewakili karakter 0):Array ini kemudian digabungkan secara horizontal untuk menghasilkan
Akhirnya, array char 2D ini dibagi menjadi dua baris, dan yang pertama diduplikasi ke atas tumpukan. Tiga string ditampilkan secara berurutan, masing-masing pada garis yang berbeda, menghasilkan output yang diinginkan
sumber
Haskell, 101 byte
Menentukan fungsi
f :: Int → [String]
.Michael Klein mengingatkan saya bahwa saya tidak perlu memanggil
unlines
hasilnya, menghemat 7 byte. Terima kasih!Saya menyimpan byte dengan menggantinya
" 9"!!mod i 2
dengancycle" 9"!!i
.Tiga byte lagi dengan menulis dua daftar korektif daripada menggunakan
drop
.Pacar saya menunjukkan bahwa saya dapat menyimpan dua byte lagi dengan memulai jawaban saya di
0
alih-alih1
.sumber
C,
183177176 bytePenjelasan
C tidak akan pernah memenangkan hadiah untuk singkatnya terhadap bahasa tingkat yang lebih tinggi, tetapi latihan ini menarik dan praktik yang baik.
Makro F mencukur enam byte dengan biaya keterbacaan. Variabel dideklarasikan secara global untuk menghindari deklarasi berganda. Saya membutuhkan buffer karakter untuk sprintf, tetapi karena K&R longgar dengan pengecekan tipe, sprintf dan printf dapat menafsirkan t [9] sebagai pointer ke buffer 36-byte. Ini menyimpan deklarasi terpisah.
Fungsi pencetakan cantik, di mana r adalah nomor baris. Sprintf memformat angka dan menghitung lebar kolom. Untuk menghemat ruang, kami hanya memanggil ini tiga kali, satu untuk setiap baris output; ekspresi ri & 1 menyaring apa yang akan dicetak.
Fungsi titik masuk, argumen adalah jumlah kolom. Menghitung array a dari nilai kolom a [], lalu memanggil fungsi pencetakan p satu kali untuk setiap baris output.
Permintaan contoh (tidak termasuk dalam jumlah jawaban dan byte):
Diperbarui
Memasukkan saran sprintf sebaris dari tomsmeding. Itu mengurangi hitungan dari 183 menjadi 177 karakter. Ini juga memungkinkan menghapus kawat gigi di sekitar blok printf (sprintf ()) karena hanya satu pernyataan sekarang, tetapi itu hanya menyelamatkan satu karakter karena masih membutuhkan ruang sebagai pembatas. Jadi turun ke 176.
sumber
w
mana ia digunakan? Anda sepertinya hanya menggunakannya sekali.itoa
bukan sprintf?PowerShell v2 +, 133 byte
44 byte untuk menghitung nilai-nilai, 70 byte untuk merumuskan ASCII
Mengambil input
$n
sebagai kolom tanpa indeks. Mengatur awal susunan urutan kami$a=1,1
. Kami kemudian beralih ke$n
dengan1..$n|%{...}
untuk membangun array. Setiap iterasi, kami menggabungkan jumlah (dua elemen lalu) + (elemen sebelumnya) * (apakah kami ganjil atau genap indeks). Ini akan menghasilkan$a=1,1,3,4,11...
hingga$n+2
.Jadi, kita perlu mengiris
$a
untuk hanya mengambil0..$n
elemen pertama , dan menyalurkannya melalui loop lain|%{...}
. Setiap iterasi yang kami tetapkan helper$z
sama dengan sejumlah spasi plus elemen saat ini sebagai string. Kemudian, kami membagi-bagi apakah itu digabungkan ke$x
(baris atas dan bawah) atau$y
(baris tengah) dengan ganjil genapif
/else
. Kemudian, kami menghitung jumlah spasi untuk$l
dengan mengambil angka saat ini, mengelompokkannya, dan mengambilnya.Length
.Akhirnya, kami menempatkan
$x
,,$y
dan$x
sekali lagi pada pipeline, dan output tersirat. Karena.ToString()
pemisah default untuk array saat mencetak ke STDOUT adalah baris baru, kami mendapatkannya secara gratis.Contoh
sumber
PHP 265 byte
Tidak golf:
Python 278 byte
sumber
Ruby, 120 byte
Mengembalikan string multiline.
Cobalah online!
sumber
Matlab, 223 karakter, 226 byte
Tidak dikumpulkan dan berkomentar:
sumber
PHP,
135124123120 bytemengambil keuntungan dari typecasts implisit dan variabel variabel
sepertiga dari kode (37 byte) masuk ke spasi, 64 byte sama sekali digunakan untuk output
kerusakan
sumber
Batch, 250 byte
Karena baris pertama dan ketiga sama, kita hanya perlu membangun dua string. Di sini
d
mewakili string yang berakhir dengan entri terakhir dans
mewakili string yang berakhir dengan spasi; empat baris terakhir memastikan bahwa mereka dicetak dalam urutan yang sesuai.i
hanyalah penghitung putaran (sedikit lebih murah daripada menghitung mundur dari%1
).j
adalah beralih antara menggandakan nomor sebelumnya sebelum menambahkannya ke nomor saat ini untuk mendapatkan nomor berikutnya.m
dann
berisi angka-angka itu.l
, serta digunakan sebagai sementara untuk menghitung angka berikutnya, juga mendapatkan digitnya diganti dengan ruang untuk keluars
;s
dand
ditukar setiap kali melalui variabel perantarat
.sumber