Czy ta piramida dodana ma unikalne rozwiązanie?


12

Biorąc pod uwagę dodatkową piramidę , określ, czy można ją rozwiązać. Piramida dodatkowa składa się z warstw , z których każda ma jedną liczbę mniejszą niż ta pod nią. Warstwa jest symbolizowana jako . to warstwa podstawowa, a to warstwa na szczycie . Numer th jest oznaczona jako . to liczba po lewej stronie , a to liczba po prawej stronie . Możesz wizualizować znajdujący się na szczyciePi P i P 1 P i + 1 P i j P i P i , j P i , 1 P i P i , j + 1 P i , j P i + 1 , j P i , jiPiP1Pi+1PijPiPi,jPi,1PiPi,j+1Pi,jPi+1,jPi,ji na środku, stąd nazwa „ piramida dodawania ”.Pi,j+1

  • ∀Pi,j,Pi,j∈N∗ , czyli każda liczba w piramidzie jest niezerową liczbą całkowitą dodatnią.
  • ∀i>1,Pi,j=Pi−1,j+Pi−1,j+1 , co oznacza, że ​​każda liczba spoza warstwy podstawowej piramidy jest sumą dwie liczby poniżej.
  • Jeśli ma liczb, ma liczb, dlatego jest najbardziej liczbą . Mówiąc prościej, każda warstwa ma jedną liczbę mniejszą niż warstwa pod nią.P1nPin−i+1Pi,n−i+1Pi

Dodanie piramidy logiczna stanowi piramidy dodanie niektórych liczby usuniętych (zastąpione ). Jego rozwiązaniem jest piramida dodawania , w której , czyli liczby, które pierwotnie były obecne w pozostały niezmienione. Taka łamigłówka może mieć więcej niż jedno rozwiązanie.Q?P∀Qi,j≠?,Pi,j=Qi,j

Twoim zadaniem jest, biorąc pod uwagę piramidę dodania, ustalić, czy ma dokładnie jedno rozwiązanie.

Wejście

Możesz uzyskać dane wejściowe w dowolnej z następujących form, ale zachowaj spójność:

  • Tablica warstw.
  • Układ warstw, w kształcie piramidy, wykorzystujący stałą wartość całkowitą nie dodatnią jako separator między elementami (używanymi tylko raz za każdym razem), a także lewe i prawe wypełnienie. Separator i wypełnienie muszą być takie same.
  • Tablica warstw ze spójną poprawną prawą lub lewą wyściółką (musisz być spójny i nie mieszać prawej i lewej wyściółki).

Należy pamiętać, że do reprezentowania brakującej liczby należy użyć stałej wartości, która nie jest ściśle dodatnią liczbą całkowitą; tej wartości nie można użyć jako dopełnienia. Możesz także wziąć połączone warstwy (nadal możesz je rozdzielić), a kolejność może być od podstawy do góry lub od góry do podstawy.

Wynik

Jedna z dwóch spójnych odrębnych wartości, gdzie jedna reprezentuje obecność unikalnego roztworu, a druga brak roztworu lub obecność więcej niż jednego roztworu.

Zasady

  • Qi+1,j=Qi,j+Qi,j+1 zawsze będzie prawdziwe, jeśli , to znaczy, że dane wejściowe na pewno nie będą zawierać liczby na dwóch innych liczbach, która nie jest ich sumą, jeśli wszystkie trzy liczby są znane.Qi,j,Qi,j+1,Qi+1,j∈N∗
  • ∃Qi,j,Qi,j≠? , to znaczy piramida będzie zawierać co najmniej jedną znaną liczbę.
  • Nie rób tych rzeczy .
  • To jest , więc wygrywa najkrótsza odpowiedź! Nie pozwól jednak, aby zniechęciło Cię to do opublikowania rozwiązania tylko dlatego, że Twój język jest „zbyt gadatliwy”.

Przypadki testowe

W tych przypadkach testowych używana jest tablica z warstwami od góry do podstawy, z 0reprezentowaniem.?

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

Sprawdzone przykłady

Przypadki testowe są tutaj obsługiwane.

Unikalne rozwiązanie 1

10???2????1

Krok 1: .x+y=2↔x=y=1

10???2??111

Krok 2: .x=y=1↔x+y=2

10???22?111

Krok 3: .x=y=2→x+y=4

10?4?22?111

Krok 4: .x+4=10↔x=6

1064?22?111

Kroki 5-6 są podobne do 4.

10644223111

Oto nasze unikalne rozwiązanie.

Unikalne rozwiązanie 2

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

Krok 1: Nie ma tutaj oczywistego podejścia, więc spróbujmy użyć minimalnych możliwych wartości.

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

Kroki 2-5: Wygląda na to, że wartości minimalne dają rozwiązanie, dlatego jest to jedyne rozwiązanie i dlatego jest wyjątkowe.

321616888444422222111111

Wskazówka: Istnieje twierdzenie o dodawaniu łamigłówek piramidowych związanych z tą łamigłówką, które możesz udowodnić, jeśli myślisz wystarczająco dużo.

Unikalne rozwiązanie 3

?11

Krok 1: .x=y=1→x+y=2

211

Jest to oczywiście unikalne rozwiązanie.

Brak rozwiązania 1

1??

minN∗=1→x,y≥1→x+y≥2>1 , więc nie ma rozwiązania.

Brak rozwiązania 2

1055232????

Kroki 1-2: .x+y=2↔x=y=1

10552321111

Stąd wynika, że , co jest sprzecznością, dlatego nie ma rozwiązania.1+1=3

Nietypowe rozwiązanie

5?????

Dwa rozwiązania:

552332112211

Ponieważ istnieją co najmniej dwa rozwiązania, nie ma unikalnego rozwiązania.


Odpowiedzi:


5

Galaretka , 18 16 bajtów

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

Wypróbuj online!

Łącze monadyczne, które bierze piramidę w odwrotnej kolejności i zwraca 1 dla wartości true i 0 dla wartości false. Generuje wszystkie możliwe piramidy o podstawie do maksymalnej liczby w piramidzie i sprawdza, czy istnieje jedno unikalne dopasowanie dla danych wejściowych.

Dzięki @Arnauld za wskazanie, że to się nie udało [[1,0],[0]]; teraz poprawione.

Dzięki @JonathanAlan za zapisanie 2 bajtów!

Wyjaśnienie

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

Bardzo dobrze. Jak działa logika „generuj wszystkie możliwości”?
— Jonah

1
@Jonah Moc Catrtesańska ṗmaksymalnej liczby w siatce o długości podstawy. np. gdyby maksymalna liczba wynosiła 10, a długość podstawy 4, to sprawdziłby wszystko od [1,1,1,1]do [10,10,10,10], tj. 10000 możliwości.
— Nick Kennedy

Dane wyjściowe są zgodne z prawdą [[0,0],[0]].
— Kevin Cruijssen

@KevinCruijssen Poprosiłem o wyjaśnienie, czy dane wejściowe bez znanych wartości są prawidłowe. Jeśli tak, mogę zmienić, ‘na »2co ma również tę zaletę, że odzyskuje wydajność utraconą podczas mojej ostatniej zmiany, aczkolwiek kosztem bajtu.
— Nick Kennedy

2
...Ƭ€Ṗ€a@ċ⁼1oszczędza dwa bajty (chyba, że ​​istnieją przypadki brzegowe z AND, które nie są pokrywane przez testy?)
— Jonathan Allan


1

Wolfram Language (Mathematica) , 85 88 bajtów

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

Wypróbuj online!

+3 naprawione.

Brute force: dla wszystkich baz z wartościami sprawdź, czy wynikowa piramida pasuje do podanej formy i sprawdź, czy całkowita liczba dopasowań wynosi 1. Pobiera dane wejściowe jako listę poziomów, najpierw podstawową, z reprezentowaniem brakujących liczb.1..(sum of all numbers)0


1

05AB1E , 25 bajtów

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

Układa warstwy piramidy w odwrotnej kolejności, od podstawy do końca (tj [[0,0,0,1],[0,2,0],[0,0],[10]].).

Wydaje się, że gdzieś w 05AB1E jest błąd, który znajduje się .Γwewnątrz mapy. ©...®šPowinien być tylko ...yšna 1 bajt.

Wypróbuj online lub sprawdź kilka innych przypadków testowych .

Mniejszą alternatywą dla bajtów ©.ΓüO}®šmoże być [Ðg#üO}\): Wypróbuj online.

Wyjaśnienie:

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
Nie udaje się w wielu łatwych przypadkach . Wygląda na to, że próbujesz użyć a%b == 0skrótu a == b || a == 0, ale to nie działa, ponieważ a może być wielokrotnością b.
— Grimmy,

Osobny problem: kod zwraca wartość true dla przypadków podobnych [[0,0],[0]], które mają nieskończenie wiele rozwiązań. Myślę, że po prostu zmiana >na poprawne akcentowanie to Inaprawia.
— Grimmy,

1
@Grimy Naprawiono za pomocą .S*zamiast zamiast %, więc tylko +2 bajty.
— Kevin Cruijssen

0

Haskell, 106 bajtów

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]

Bierze piramidę do góry nogami, np [[0,0,0,1],[0,2,0],[0,0],[10]].

Wypróbuj online!

Podejście brutalnej siły w Haskell:

  • utwórz wszystkie możliwe warstwy podstawowe t( mapM(\_->[1..sum(sum<$>x)])x), w których liczby zaczynają się od 1 do sumy wszystkich liczb w piramidzie wejściowej
  • utwórz piramidę z t( iterate(z(+)=<<tail)t)
  • porównaj każdą warstwę pod względem elementu z input ( z(z(#))x). Funkcja porównania a # bzwraca, Truejeśli obie liczby są równe lub awynoszą zero ( a*b==a*a).
  • weź 1za każdą pasującą piramidę i porównaj wynikową listę z listą singletonów [1].
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.