Anda harus menulis program atau fungsi yang menerima daftar bilangan bulat yang berbeda sebagai input dan output atau mengembalikan jumlah kemunculan nomor input dalam piramida angka terbalik berikut.
Mulai dari daftar asli di setiap langkah kami membuat yang baru dengan nilai maksimal dari setiap pasangan angka yang berdekatan (misalnya 5 1 2 6
menjadi 5 2 6
). Kami berhenti ketika hanya ada satu nomor dalam daftar.
Piramida penuh 5 1 2 6
adalah
5 1 2 6
5 2 6
5 6
6
Jumlah kejadian yang dihasilkan adalah 3 1 2 4
(untuk 5 1 2 6
masing - masing).
Memasukkan
- Daftar satu atau lebih bilangan bulat tanpa pengulangan. (mis
1 5 1 6
. tidak valid.)
Keluaran
- Daftar bilangan bulat positif. The
i
elemen th daftar adalah jumlah kejadian darii
jumlah masukan th di piramida.
Contohnya
Input => Output
-5 => 1
8 4 => 2 1
5 9 7 => 1 4 1
1 2 3 9 8 6 7 => 1 2 3 16 3 1 2
6 4 2 1 3 5 => 6 4 2 1 3 5
5 2 9 1 6 0 => 2 1 12 1 4 1
120 5 -60 9 12 1 3 0 1200 => 8 2 1 3 16 1 4 1 9
68 61 92 58 19 84 75 71 46 69 25 56 78 10 89 => 2 1 39 2 1 27 6 5 1 6 1 2 14 1 12
Ini adalah kode-golf sehingga entri terpendek menang.
Teka-teki bonus: dapatkah Anda menyelesaikan masalah O(n*log n)
tepat waktu?
Jawaban:
Pyth,
1917 byteLihat Peragaan Online atau Test Suite lengkap (iterasi 4 byte pertama di atas contoh).
Yang ini sedikit lebih pintar daripada pendekatan naif. Setiap angka segitiga dapat direpresentasikan sebagai nilai maksimal dari subset terhubung
Q
. Di baris pertama menggunakan himpunan bagian panjang 1, baris kedua dari segitiga menggunakan himpunan bagian panjang 2, ...Penjelasan
Untuk memvisualisasikan ini sedikit.
m.:QhdUQ
dan input[5, 1, 2, 6]
memberi saya semua himpunan bagian yang mungkin:Dan
mmeSk.:QhdUQ
memberi saya masing-masing maksimum (yang sesuai persis dengan baris di piramida):Pyth,
2322 byteIni hanya pendekatan sederhana "lakukan apa yang diperintahkan" kepada Anda.
Lihat Demonstrasi Online atau Test Suite lengkap (iterasi 4 byte pertama di atas contoh).
Penjelasan
meSd.:G2
memetakan setiap pasangan[(G[0], G[1]), (G[1], G[2]), ...]
ke elemen maksimal.Y
adalah daftar kosong, oleh karena ituaYG
ditambahkanG
keY
.u...QQ
berulang kali menerapkan kedua fungsi ini (len(Q)
waktu) dimulai denganG = Q
dan memperbaruiG
setelah setiap kali dijalankan.m/sYdQ
memetakan setiap elemen dari daftar input ke hitungannya dalamY
daftar yang diratakan .sumber
Python, 81
Solusi membagi dan menaklukkan. Elemen maksimum
M
merembes sampai ke piramida, membelahnya menjadi empat persegi panjangM
dan dua sub-piramida.Jadi, hasil keseluruhan adalah output untuk sublist kiri, diikuti oleh luas persegi panjang, diikuti oleh output untuk sublist kanan.
Variabel input
L
digunakan kembali untuk menyimpan hasil sehingga daftar kosong dipetakan ke daftar kosong.Konstruk dalam solusi bertele-tele dengan Python. Mungkin beberapa bahasa dengan pencocokan pola dapat mengimplementasikan kodesemu berikut?
sumber
f@{}=##&@@{};f@{a___,l_,b___}/;l>a~Max~b:={f@{a},Length@{a,0}Length@{b,0},f@{b}}
CJam,
2322 byteMasih mencari opsi bermain golf.
Ini adalah fungsi CJam (semacam). Ini mengharapkan nomor input pada stack dan mengembalikan jumlah output yang sesuai pada stack juga. Sebuah contoh:
Daun-daun
di tumpukan.
Cukup yakin bahwa ini tidak
O(n log n)
tepat waktu.Perluasan kode :
Mari kita lihat cara kerjanya dengan membuat contoh
5 1 2 6
Di baris kedua,
5 1 2 6
menjadi5 2 6
karena5, 2 and 6
adalah maksimum[5 1], [1 2] and [2 6]
masing - masing. Di baris ketiga, itu menjadi5 6
karena masing5 and 6
-[5 2] and [2 6]
masing maksimum . Ini juga dapat ditulis sebagai maksimum[5 1 2] and [1 2 6]
masing - masing. Demikian pula untuk baris terakhir,6
maksimum[5 1 2 6]
.Jadi pada dasarnya kita membuat irisan panjang yang tepat mulai dari irisan panjang
1
, yang pada dasarnya adalah angka asli, masing-masing dibungkus dalam array, hingga akhirnya irisan panjangN
untuk baris terakhir, di manaN
adalah jumlah bilangan input.Cobalah online di sini
sumber
Mathematica, 72 byte
sumber
Python, 81
Setiap entri piramida adalah maksimum dari sublist di atas kerucut atasnya. Jadi, kami membuat semua daftar ini, diindeks dengan interval
[i,j]
dengan0 < i < j <= len(L)
, dan menghitung berapa banyak waktu setiap elemen muncul sebagai maksimum.Cara yang lebih pendek untuk menghitung sub-intervensi kemungkinan akan menghemat karakter. Parametriisasi indeks tunggal dari pasangan
[i,j]
akan menjadi pendekatan yang masuk akal.sumber
Pip , 56 + 1 = 57 byte
Tidak bersaing banyak dengan voodoo CJam, saya khawatir. Sepertinya saya perlu algoritma yang lebih baik. Jalankan dengan
-s
bendera untuk mendapatkan output yang dibatasi ruang.Tidak disatukan, dengan komentar:
Redefinisi
r
setiap kali melalui karya sebagai berikut:sumber
APL (24)
Ini adalah fungsi yang mengambil daftar, seperti itu;
Penjelasan:
{
...}⍵
: terapkan fungsi berikut untuk ⍵:⍵≡⍬:⍵
: jika ⍵ kosong, kembalikan ⍵2⌈/⍵
: buat daftar berikutnya⍵,∇
: return ⍵, diikuti oleh hasil menerapkan fungsi ini ke daftar berikutnya⍵∘.=
: bandingkan setiap elemen dalam ⍵ dengan setiap elemen dalam hasil fungsi+/
: jumlah baris (mewakili elemen dalam ⍵)sumber
Haskell, 78 byte
Penggunaan:
f [68,61,92,58,19,84,75,71,46,69,25,56,78,10,89]
->[2,1,39,2,1,27,6,5,1,6,1,2,14,1,12]
.Bagaimana itu bekerja
sumber
JavaScript, 109 byte
Saya pikir saya menemukan cara yang menarik untuk melakukan ini, tetapi hanya setelah saya selesai menyadari kode terlalu lama untuk bersaing. Oh well, tetap posting ini kalau-kalau seseorang melihat potensi golf lebih lanjut.
Saya menggunakan rumus berikut di sini:
Dengan cara ini orang tidak perlu benar-benar menghasilkan seluruh piramida atau himpunan bagian dari itu. (Itulah sebabnya saya awalnya berpikir itu akan berjalan di O (n), tapi untungnya, kita masih membutuhkan loop dalam.)
sumber
MATLAB: (266 b)
MEMASUKKAN
vektor harus dalam bentuk [abcd ...]
contoh:
[2 4 7 11 3]
KELUARAN
kejadian pola.
PENJELASAN:
jika [abcd] adalah input, program menghitung ghij hasil sebagai
g = (a> b) + (a> b) (a> c) + (a> b) (a> c) * (a> d) = (a> b) (1+ (a> c) ( 1+ (a> c))))
h = (b> a) + (b> c) + (b> a) (b> c) + (b> c) (b> d) + (b> a) (b> c) (b> d ) = ... 'disederhanakan'
i = (c> b) + (c> d) + (c> b) (c> d) + (c> b) (c> a) + (c> d) (c> b) (c> a ) = ..
j = (d> c) + (d> c) (d> b) + (d> c) (d> b) * (d> a) = ...
sumber
J (49)
Saya kira ada beberapa ruang untuk perbaikan ...
sumber