Diberikan piramida tambahan , tentukan apakah itu bisa diselesaikan. Piramida tambahan terdiri dari lapisan , masing-masing memiliki satu nomor kurang dari yang di bawahnya. Layer dilambangkan sebagai . adalah lapisan dasar, dan adalah lapisan di atas . Jumlah dari dilambangkan sebagai . adalah angka paling kiri dari , dan adalah jumlah di sebelah kanan . Anda dapat memvisualisasikan yang berada di atas dan di tengah, maka nama "Selainpiramida".
- , yaitu setiap angka dalam piramida adalah bilangan bulat positif bukan nol.
- , yaitu, setiap angka yang bukan pada lapisan dasar piramida adalah jumlah dari dua angka di bawahnya.
- Jika memiliki angka, memiliki angka, oleh karena itu adalah angka paling kanan dari . Dalam istilah yang lebih sederhana, setiap lapisan memiliki satu angka lebih sedikit dari pada lapisan di bawahnya.
Sebuah Selain piramida puzzle adalah piramida Selain dengan beberapa nomor dihapus (diganti dengan ). Solusinya adalah penambahan piramida , di mana , yaitu angka-angka yang semula ada dalam teka-teki tidak berubah. Teka-teki semacam itu mungkin memiliki lebih dari satu solusi.
Pekerjaan Anda adalah, diberi teka-teki piramida tambahan, untuk menentukan apakah ia memiliki satu solusi.
Memasukkan
Anda bisa mendapatkan input dalam formulir berikut, tetapi konsisten:
- Array lapisan.
- Array lapisan, berbentuk seperti piramida menggunakan nilai integer non-positif yang konsisten sebagai pemisah antara elemen (hanya digunakan sekali setiap kali) serta bantalan kiri dan kanan. Pemisah dan bantalan harus sama.
- Array lapisan dengan padding kanan atau kiri valid yang konsisten (Anda harus konsisten dan tidak mencampur padding kanan dan kiri dalam kasus ini).
Harap perhatikan bahwa nilai konsisten yang bukan bilangan bulat positif mutlak harus digunakan untuk mewakili angka yang hilang; nilai ini tidak dapat digunakan sebagai bantalan. Selain itu, Anda dapat mengambil lapisan-lapisan yang disatukan (Anda masih dapat memisahkannya), dan urutannya dapat dari pangkalan ke atas atau dari atas ke pangkalan.
Keluaran
Salah satu dari dua nilai berbeda yang konsisten, di mana satu mewakili keberadaan solusi yang unik dan yang lainnya tidak adanya solusi atau ada lebih dari satu solusi.
Aturan
- akan selalu benar jika , yaitu input dijamin tidak mengandung angka di atas dua nomor lain yang bukan jumlah mereka jika ketiga angka diketahui.
- , yaitu piramida akan mengandung setidaknya satu nomor yang diketahui.
- Jangan lakukan hal-hal ini .
- Ini kode-golf , jadi jawaban terpendek menang! Namun, jangan biarkan hal itu mencegah Anda dari memposting solusi hanya karena bahasa Anda "terlalu bertele-tele".
Uji kasus
Array dengan lapisan dari atas ke dasar digunakan untuk kasus uji ini, dengan 0
mewakili .
[[10], [0, 0], [0, 2, 0], [0, 0, 0, 1]] -> True
[[32], [0, 0], [0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]] -> True
[[0], [1, 1]] -> True
[[1], [0, 0]] -> False
[[10], [5, 5], [2, 3, 2], [0, 0, 0, 0]] -> False
[[5], [0, 0], [0, 0, 0]] -> False
Contoh yang berhasil
Kasing uji bekerja di sini.
Solusi unik 1
Langkah 5-6 mirip dengan 4.
Jadi di sini kami memiliki solusi unik kami.
Solusi unik 2
Langkah 1: Tidak ada pendekatan yang jelas di sini, jadi mari kita coba gunakan nilai minimum yang mungkin.
Langkah 2-5: Sepertinya nilai minimum menghasilkan solusi, oleh karena itu ini adalah satu-satunya solusi dan karena itu unik.
Petunjuk: Ada teorema tentang teka-teki piramida tambahan yang terkait dengan teka-teki ini yang dapat Anda buktikan jika Anda berpikir cukup keras.
Solusi unik 3
Ini jelas merupakan solusi yang unik.
Tidak ada solusi 1
Tidak ada solusi 2
Solusi non-unik
Dua solusi:
Karena setidaknya ada dua solusi, tidak ada solusi unik.
sumber
Jawaban:
Jelly ,
1816 byteCobalah online!
Tautan monadik yang mengambil piramida dalam urutan terbalik dan mengembalikan 1 untuk true dan 0 untuk false. Menghasilkan semua piramida yang mungkin dengan basis hingga jumlah maksimum dalam piramida dan memeriksa apakah ada satu kecocokan unik untuk input.
Terima kasih kepada @Arnauld untuk menunjukkan bahwa ini gagal
[[1,0],[0]]
; sekarang diperbaiki.Terima kasih kepada @JonathanAlan karena telah menghemat 2 byte!
Penjelasan
sumber
ṗ
dari jumlah maksimum di grid dengan panjang basis. misalnya jika Jumlah maksimum adalah 10 dan panjang dasar 4 maka akan menguji segala sesuatu dari[1,1,1,1]
ke[10,10,10,10]
, yakni 10000 kemungkinan.[[0,0],[0]]
.‘
ke»2
yang juga memiliki keuntungan dari mendapatkan kembali efisiensi hilang dengan perubahan terakhir saya, meskipun dengan biaya dari byte....Ƭ€Ṗ€a@ċ⁼1
menghemat dua byte (kecuali ada kasus tepi dengan DAN tidak dipenuhi oleh tes?)C # (Visual C # Interactive Compiler) ,
303227 byteMelempar pengecualian jika benar, berjalan normal jika salah.
Cobalah online!
sumber
Bahasa Wolfram (Mathematica) ,
8588 byteCobalah online!
+3 diperbaiki.
Brute force: untuk semua pangkalan dengan nilai , lihat apakah piramida yang dihasilkan cocok dengan formulir yang diberikan, dan periksa apakah jumlah total kecocokan adalah 1. Mengambil input sebagai daftar level, pangkalan pertama, dengan mewakili angka yang hilang.
1..(sum of all numbers)
0
sumber
05AB1E , 25 byte
Mengambil lapisan piramida dalam urutan terbalik, dasar ke ujung (yaitu
[[0,0,0,1],[0,2,0],[0,0],[10]]
).Juga, sepertinya ada bug di suatu tempat di 05AB1E dengan
.Γ
di dalam peta ..©...®š
Seharusnya hanya...yš
untuk -1 byte ..Cobalah secara online atau verifikasi beberapa kasus uji lagi .
Alternatif minor sama dengan byte untuk
©.ΓüO}®š
dapat berupa[Ðg#üO}\)
: Cobalah secara online.Penjelasan:
sumber
a%b == 0
sebagai jalan pintasa == b || a == 0
, tetapi itu tidak berhasil karena a bisa kelipatan b.[[0,0],[0]]
, yang memiliki banyak sekali solusi. Saya pikir hanya mengubah>
keI
perbaikan beraksen dengan benar itu..S*
bukan%
, jadi hanya +2 byte.Haskell, 106 byte
Membawa piramida terbalik, misalnya
[[0,0,0,1],[0,2,0],[0,0],[10]]
.Cobalah online!
Pendekatan brute force di Haskell:
t
(mapM(\_->[1..sum(sum<$>x)])x
), di mana angka-angka pergi dari 1 ke jumlah semua angka dalam piramida inputt
(iterate(z(+)=<<tail)t
)z(z(#))x
). Fungsi perbandingana # b
kembaliTrue
jika kedua angka sama ataua
nol (a*b==a*a
).1
untuk setiap piramida yang cocok dan bandingkan daftar yang dihasilkan dengan daftar tunggal[1]
.sumber