Bu ilave piramit bulmacasının benzersiz bir çözümü var mı?


12

Bir ilave piramit verildiğinde , çözülüp çözülemeyeceğini belirleyin. Bir ilave piramit , her biri altındaki sayıdan daha az bir sayıya sahip katmanlardan oluşur . Katman , olarak sembolize edilir . temel katmandır ve , üzerindeki . th sayı olarak ifade edilir . en soldaki sayısıdır ve nin sağındaki sayıdır . Sen görselleştirmek olabilir üstünde ikamet edenPiPiP1Pi+1PijPiPi,jPi,1PiPi,j+1Pi,jPi+1,jPi,jve ortada , dolayısıyla "toplama piramidi " adı .Pi,j+1

  • Pi,j,Pi,jN , yani piramitteki her sayı sıfır olmayan bir pozitif tamsayıdır.
  • i>1,Pi,j=Pi1,j+Pi1,j+1 , yani piramidin taban katmanında olmayan her sayı, altındaki iki sayı.
  • Eğer sahip numaraları, sahiptir numara, bu nedenle en sağdaki sayıdır . Daha basit terimlerle, her katmanın altındaki kattan bir sayı daha azdır.P1nPini+1Pi,ni+1Pi

Bir ilave piramit bulmacası , bazı sayıların kaldırıldığı ( İle değiştirilen ) bir ilave piramittir . Çözümü, bir ek piramit , burada , yani bulmacada başlangıçta mevcut olan sayılar değiştirilmedi. Böyle bir bulmacanın birden fazla çözümü olabilir.Q?PQi,j?,Pi,j=Qi,j

İşiniz, bir piramit bulmacası verildiğinde, tam olarak bir çözümü olup olmadığını belirlemek için.

Giriş

Aşağıdaki formlardan herhangi birinde girdi alabilirsiniz, ancak tutarlı olun:

  • Katmanlar dizisi.
  • Öğeler (her seferinde yalnızca bir kez kullanılır) ve sol ve sağ dolgu arasında bir ayırıcı olarak tutarlı bir pozitif olmayan tamsayı değeri kullanan bir piramit şeklinde katman katmanı. Ayırıcı ve dolgu aynı olmalıdır.
  • Tutarlı geçerli bir sağ veya sol dolguya sahip katman dizisi (bu durumda tutarlı olmalı ve sağ ve sol dolguları karıştırmamalısınız).

Eksik bir sayıyı temsil etmek için kesinlikle pozitif bir tam sayı olmayan tutarlı bir değerin kullanılması gerektiğini lütfen unutmayın; bu değer dolgu olarak kullanılamaz. Ayrıca, katmanları birleştirebilirsiniz (yine de ayırabilirsiniz) ve sıralama, tabandan üste veya üstten tabandan olabilir.

Çıktı

Biri benzersiz bir çözümün varlığını ve diğeri bir çözümün yokluğunu veya birden fazla çözümün varlığını temsil eden iki tutarlı ayrı değerden biri.

kurallar

  • Qi+1,j=Qi,j+Qi,j+1 ise her zaman doğru olacaktır. , yani girdinin, üç sayının tamamı biliniyorsa toplamı olmayan diğer iki sayının üstünde bir sayı içermemesi garanti edilir.Qi,j,Qi,j+1,Qi+1,jN
  • Qi,j,Qi,j? , yani piramit bilinen en az bir sayı içerecektir.
  • Yapmayın bunları .
  • Bu , bu yüzden en kısa cevap kazanır! Bununla birlikte, dilinizin "çok ayrıntılı" olması nedeniyle bir çözüm göndermenizi engellemesine izin vermeyin.

Test senaryoları

Tabanına üst katmanları ile bir dizi ile, bu test durumları için kullanılır 0temsil.?

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

Çalışılan örnekler

Test senaryoları burada çalışılıyor.

Eşsiz çözüm 1

10???2????1

Adım 1: .x+y=2x=y=1

10???2??111

Adım 2: .x=y=1x+y=2

10???22?111

Adım 3: .x=y=2x+y=4

10?4?22?111

Adım 4: .x+4=10x=6

1064?22?111

5-6. Adımlar 4'e benzer.

10644223111

İşte burada eşsiz çözümümüz var.

Eşsiz çözüm 2

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

Adım 1: Burada belirgin bir yaklaşım yok, bu yüzden mümkün olan en düşük değerleri kullanmayı deneyelim.

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

Adım 2-5: Minimum değerlerin bir çözümle sonuçlandığı görülmektedir, bu nedenle bu tek çözümdür ve bu nedenle benzersizdir.

321616888444422222111111

İpucu: Bu bulmacayla ilgili ek piramit bulmacaları hakkında yeterince düşünürseniz kanıtlayabileceğiniz bir teorem var.

Eşsiz çözüm 3

?11

Adım 1: .x=y=1x+y=2

211

Bu kesinlikle eşsiz bir çözüm.

Çözüm yok 1

1??

minN=1x,y1x+y2>1 , dolayısıyla çözüm yok.

Çözüm yok 2

1055232????

1-2. Adımlar: .x+y=2x=y=1

10552321111

Oradan , bir çelişki olan izler , bu nedenle çözüm yoktur.1+1=3

Benzersiz olmayan çözüm

5?????

İki çözüm:

552332112211

En az iki çözüm olduğundan benzersiz bir çözüm yoktur.


Yanıtlar:


5

Jöle , 18 16 bayt

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

Çevrimiçi deneyin!

Piramidi ters sırayla alan ve true için 1 ve false için 0 döndüren monadik bir bağlantı. Piramitteki maksimum sayıya kadar bir tabanı olan tüm olası piramitleri oluşturur ve giriş için benzersiz bir eşleşme olup olmadığını kontrol eder.

@Arnauld'a bunun başarısız olduğunu işaret ettiği için teşekkürler [[1,0],[0]]; Şimdi düzeltildi.

@JonathanAlan'a 2 bayt kazandığı için teşekkürler!

açıklama

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

Çok hoş. "Tüm olasılıkları oluştur" mantığı nasıl çalışır?
Jonah

1
@ Tabanın uzunluğundaki ızgaradaki maksimum sayının Catrtesian gücü . örneğin en fazla ise 10 ve taban 4 uzunluğu o kadar her test etmek [1,1,1,1]için [10,10,10,10], örneğin, 10000 olasılıkları.
Nick Kennedy

İçin doğruluk verir [[0,0],[0]].
Kevin Cruijssen

@KevinCruijssen Bilinen değerleri olmayan girdilerin geçerli olup olmadığını açıklığa kavuşturmak istedim. Eğer öyleyse, degisebilirim için »2aynı zamanda bir bayt pahasına da olsa, benim son değişiklikle kayıp verimlilik kazanmak avantajına sahip olan.
Nick Kennedy

2
...Ƭ€Ṗ€a@ċ⁼1iki bayt kaydeder (ve testlerle
Jonathan Allan


1

Wolfram Dili (Mathematica) , 85 88 bayt

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

Çevrimiçi deneyin!

+3 sabit.

Kaba kuvvet: değerlere sahip tüm bazlar için , elde edilen piramidin verilen formla eşleşip eşleşmediğine bakın ve toplam eşleşme sayısının 1 olup olmadığını kontrol edin. İlk önce eksik sayıları temsil eden seviyeler listesi olarak girdi alır .1..(sum of all numbers)0


1

05AB1E , 25 bayt

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

Piramit katmanlarını baş aşağı sırayla alır, taban (uç [[0,0,0,1],[0,2,0],[0,0],[10]]).

Ayrıca, bir harita içinde 05AB1E bir yerde bir hata var gibi görünüyor .. ©...®šSadece ...yš-1 bayt için olmalı ..

Çevrimiçi deneyin veya birkaç test vakasını doğrulayın .

Küçük bir eşit bayt alternatifi ©.ΓüO}®šşunlar olabilir [Ðg#üO}\): Çevrimiçi deneyin.

Açıklama:

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)

1
Birçok kolay durumda başarısız olur . Görünüşe göre a%b == 0kısayol olarak kullanmaya çalışıyorsunuz a == b || a == 0, ancak bu işe yaramıyor çünkü a, b'nin katı olabilir.
Grimmy

Ayrı sorun: Kod [[0,0],[0]], sonsuz sayıda çözümü olan gibi durumlar için true değerini döndürür . Bence >doğru aksanlı Idüzeltmelere geçiyorum .
Grimmy

1
@Grimy +2 bayt .S*yerine kullanılarak sabitlendi %.
Kevin Cruijssen

0

Haskell, 106 bayt

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]

Baş aşağı bir piramit alır, örn [[0,0,0,1],[0,2,0],[0,0],[10]].

Çevrimiçi deneyin!

Haskell'deki kaba kuvvet yaklaşımı:

  • sayıların 1'den giriş piramidindeki tüm sayıların toplamına gittiği tüm olası temel katmanları t( mapM(\_->[1..sum(sum<$>x)])x) oluşturun
  • t( iterate(z(+)=<<tail)t) ' dan bir piramit oluştur
  • her katman elemanını input ( z(z(#))x) ile karşılaştırın. Her iki sayı da eşitse veya sıfırsa ( ) karşılaştırma işlevi a # bgeri döner .Trueaa*b==a*a
  • 1eşleşen her piramit için bir almak ve sonuç listesi tekil listesiyle karşılaştırın [1].
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.