Apakah puzzle piramida tambahan ini memiliki solusi yang unik?

12

Diberikan piramida tambahan P , tentukan apakah itu bisa diselesaikan. Piramida tambahan terdiri dari lapisan , masing-masing memiliki satu nomor kurang dari yang di bawahnya. Layer i dilambangkan sebagai Pi . P1 adalah lapisan dasar, dan Pi+1 adalah lapisan di atas Pi . Jumlah j dari Pi dilambangkan sebagai Pi,j . Pi,1 adalah angka paling kiri dari Pi , dan Pi,j+1 adalah jumlah di sebelah kananPi,j . Anda dapat memvisualisasikanPi+1,j yang berada di atasPi,j danPi,j+1 di tengah, maka nama "Selainpiramida".

  • Pi,j,Pi,jN , yaitu setiap angka dalam piramida adalah bilangan bulat positif bukan nol.
  • i>1,Pi,j=Pi1,j+Pi1,j+1 , yaitu, setiap angka yang bukan pada lapisan dasar piramida adalah jumlah dari dua angka di bawahnya.
  • Jika P1 memiliki n angka, Pi memiliki ni+1 angka, oleh karena itu Pi,ni+1 adalah angka paling kanan dari Pi . Dalam istilah yang lebih sederhana, setiap lapisan memiliki satu angka lebih sedikit dari pada lapisan di bawahnya.

Sebuah Selain piramida puzzle Q adalah piramida Selain dengan beberapa nomor dihapus (diganti dengan ? ). Solusinya adalah penambahan piramida P , di mana Qi,j?,Pi,j=Qi,j , 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

  • Qi+1,j=Qi,j+Qi,j+1 akan selalu benar jikaQi,j,Qi,j+1,Qi+1,jN , yaitu input dijamin tidak mengandung angka di atas dua nomor lain yang bukan jumlah mereka jika ketiga angka diketahui.
  • Qi,j,Qi,j?, yaitu piramida akan mengandung setidaknya satu nomor yang diketahui.
  • Jangan lakukan hal-hal ini .
  • Ini , 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 0mewakili ?.

[[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

10???2????1

x+y=2x=y=1

10???2??111

x=y=1x+y=2

10???22?111

x=y=2x+y=4

10?4?22?111

x+4=10x=6

1064?22?111

Langkah 5-6 mirip dengan 4.

10644223111

Jadi di sini kami memiliki solusi unik kami.

Solusi unik 2

32????????????????????

Langkah 1: Tidak ada pendekatan yang jelas di sini, jadi mari kita coba gunakan nilai minimum yang mungkin.

32??????????????111111

Langkah 2-5: Sepertinya nilai minimum menghasilkan solusi, oleh karena itu ini adalah satu-satunya solusi dan karena itu unik.

321616888444422222111111

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

?11

x=y=1x+y=2

211

Ini jelas merupakan solusi yang unik.

Tidak ada solusi 1

1??

minN=1x,y1x+y2>1

Tidak ada solusi 2

1055232????

x+y=2x=y=1

10552321111

1+1=3

Solusi non-unik

5?????

Dua solusi:

552332112211

Karena setidaknya ada dua solusi, tidak ada solusi unik.

Erik the Outgolfer
sumber
Agak terkait .
AdmBorkBork

Jawaban:

5

Jelly , 18 16 byte

FṀ‘ṗLSƝƬ€Ṗ€a@ċ⁼1

Cobalah 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

F                | Flatten
 Ṁ               | Maximum
  ‘              | Increase by 1
   ṗ             | Cartesian power of this with:
    L            | - Length of input
        €        | For each:
       Ƭ         | - Repeat the following until no change
     SƝ          |   - Sum of neighbours
         Ṗ€      | Remove last element from each list
           a@    | Logical and input with each list
             ċ   | Count times input appears
              ⁼1 | Check if equal to 1
Nick Kennedy
sumber
Sangat bagus. Bagaimana cara kerja logika "hasilkan semua kemungkinan"?
Jonah
1
@ Jonah kekuatan Catrtesian 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.
Nick Kennedy
Keluaran jujur ​​untuk [[0,0],[0]].
Kevin Cruijssen
@KevinCruijssen Saya sudah meminta klarifikasi apakah input tanpa nilai yang diketahui valid. Jika demikian, saya bisa mengubah ke »2yang juga memiliki keuntungan dari mendapatkan kembali efisiensi hilang dengan perubahan terakhir saya, meskipun dengan biaya dari byte.
Nick Kennedy
2
...Ƭ€Ṗ€a@ċ⁼1menghemat dua byte (kecuali ada kasus tepi dengan DAN tidak dipenuhi oleh tes?)
Jonathan Allan
2

C # (Visual C # Interactive Compiler) , 303 227 byte

n=>{int i=n.Max(x=>x.Max()),j=n.Count,t=0,k,m=0,z;for(;t<Math.Pow(i,j);){k=t++;var s=n.Select(_=>(a:k%i+1,k/=i).a).ToList();if(n.All(x=>(z=0,b:x.All(o=>o==s[z++]|o<1),s=s.Skip(1).Select((a,b)=>a+s[b]).ToList()).b))m++;}m/=m-1;}

Melempar pengecualian jika benar, berjalan normal jika salah.

Cobalah online!

Perwujudan Ketidaktahuan
sumber
1

Bahasa Wolfram (Mathematica) , 85 88 byte

Count[l=Length@#;NestList[2#~MovingMedian~2&,#,l-1]&/@Range@Max@#~Tuples~l,#/. 0->_]==1&

Cobalah 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

attinat
sumber
1

05AB1E , 25 byte

ZÌLsgãε©.Γü+}¨®š.S*˜O_}OΘ

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:

Z        # Get the flattened maximum of the (implicit) input (without popping)
 Ì       # Increase it by 2
  L      # Create a list in the range [1, max+2]
   sg    # Swap to get the input again, and get the length (amount of layers)
     ã   # Create a cartesian product of this list repeated that many times
ε        # Map each inner list to:
 ©       #  Store it in variable `®` (without popping)
       #  Collect all results until the following doesn't change anymore:
    ü    #   Get the pairwise:
     +   #    Sums
   }®š   #  After we've collected all, prepend the original list `®`
 .S      #  Now compare this potential pyramid with the (implicit) input-pyramid
         #  (-1 if a<b; 0 if a==b; 1 if a>b)
   *     #  Multiply that with the (implicit) input-pyramid
    ˜O   #  Then take the flattened sum
      _  #  And check that this sum equals 0 (1 if truhy; 0 if falsey)
}O       # After the map, take the sum to get the amount of truthy values
  Θ      # And trutify it (== 1), since we must output distinct values instead of truthy/falsey
         # (after which the result is output implicitly)
Kevin Cruijssen
sumber
1
Gagal pada banyak kasus mudah . Sepertinya Anda mencoba menggunakan a%b == 0sebagai jalan pintas a == b || a == 0, tetapi itu tidak berhasil karena a bisa kelipatan b.
Grimmy
Pisahkan masalah: kode mengembalikan true untuk kasus-kasus seperti [[0,0],[0]], yang memiliki banyak sekali solusi. Saya pikir hanya mengubah >ke Iperbaikan beraksen dengan benar itu.
Grimmy
1
@Grimy Diperbaiki dengan menggunakan .S*bukan %, jadi hanya +2 ​​byte.
Kevin Cruijssen
0

Haskell, 106 byte

z=zipWith
a#b=a*b==a*a
f x=[1|t<-mapM(\_->[1..sum(sum<$>x)])x,all and$z(z(#))x$iterate(z(+)=<<tail)t]==[1]

Membawa piramida terbalik, misalnya [[0,0,0,1],[0,2,0],[0,0],[10]].

Cobalah online!

Pendekatan brute force di Haskell:

  • buat semua lapisan dasar yang mungkin t( mapM(\_->[1..sum(sum<$>x)])x), di mana angka-angka pergi dari 1 ke jumlah semua angka dalam piramida input
  • buat piramida dari t( iterate(z(+)=<<tail)t)
  • bandingkan setiap layer elemen dengan input ( z(z(#))x). Fungsi perbandingan a # bkembali Truejika kedua angka sama atau anol ( a*b==a*a).
  • ambil 1untuk setiap piramida yang cocok dan bandingkan daftar yang dihasilkan dengan daftar tunggal [1].
nimi
sumber