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,jN , czyli każda liczba w piramidzie jest niezerową liczbą całkowitą dodatnią.
  • i>1,Pi,j=Pi1,j+Pi1,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ą.P1nPini+1Pi,ni+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?PQi,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,jN
  • 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=2x=y=1

10???2??111

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

10???22?111

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

10?4?22?111

Krok 4: .x+4=10x=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=1x+y=2

211

Jest to oczywiście unikalne rozwiązanie.

Brak rozwiązania 1

1??

minN=1x,y1x+y2>1 , więc nie ma rozwiązania.

Brak rozwiązania 2

1055232????

Kroki 1-2: .x+y=2x=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.

Erik the Outgolfer
źródło
Nieco spokrewniony .
AdmBorkBork

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
Nick Kennedy
źródło
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
2

C # (interaktywny kompilator Visual C #) , 303 227 bajtów

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;}

Zgłasza wyjątek, jeśli true, działa normalnie, jeśli false.

Wypróbuj online!

Wcielenie ignorancji
źródło
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

attinat
źródło
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)
Kevin Cruijssen
źródło
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].
nimi
źródło