Hat dieses zusätzliche Pyramidenpuzzle eine einzigartige Lösung?

11

Bestimmen Sie anhand einer Additionspyramide , ob sie gelöst werden kann. Eine Additionspyramide besteht aus Schichten , von denen jede eine Nummer kleiner als die darunter liegende hat. Die Schicht wird als symbolisiert . ist die Basisschicht und ist die Schicht auf . Die te Zahl von wird als . ist die Zahl ganz links von und ist die Zahl rechts von . Sie können sich vorstellen, das sich aufPiPiP1Pi+1PijPiPi,jPi,1PiPi,j+1Pi,jPi+1,jPi,jund in der Mitte, daher der Name "addition Pyramide ".Pi,j+1

  • Pi,j,Pi,jN , dh jede Zahl in der Pyramide ist eine positive ganze Zahl ungleich Null.
  • i>1,Pi,j=Pi1,j+Pi1,j+1 , dh jede Zahl, die sich nicht auf der Basisschicht der Pyramide befindet, ist die Summe von die zwei Zahlen darunter.
  • Wenn hat Zahlen, hat Zahlen daher ist die am weitesten rechts liegende Anzahl von . Einfacher ausgedrückt hat jede Ebene eine Zahl weniger als die darunter liegende Ebene.P1nPini+1Pi,ni+1Pi

Ein Additionspyramiden-Puzzle ist eine Additionspyramide, bei der einige Zahlen entfernt (durch Ersetzt ) wurden. Seine Lösung ist eine Additionspyramide , in der , die Zahlen, die ursprünglich im Puzzle vorhanden waren, haben wurde unverändert gelassen. Ein solches Puzzle kann mehr als eine Lösung haben.Q?PQi,j?,Pi,j=Qi,j

Ihre Aufgabe ist es, anhand eines zusätzlichen Pyramidenrätsels festzustellen, ob es genau eine Lösung gibt.

Eingang

Sie können Eingaben in einer der folgenden Formen erhalten, aber konsistent sein:

  • Array von Schichten.
  • Anordnung von Ebenen, die wie eine Pyramide geformt sind und einen konsistenten nicht-positiven ganzzahligen Wert als Trennzeichen zwischen Elementen (jeweils nur einmal verwendet) sowie linker und rechter Abstand verwenden. Der Separator und die Polsterung müssen identisch sein.
  • Array von Ebenen mit einem konsistenten gültigen rechten oder linken Abstand (Sie müssen konsistent sein und dürfen in diesem Fall nicht den rechten und den linken Abstand mischen).

Bitte beachten Sie, dass ein konsistenter Wert, der keine streng positive Ganzzahl ist, verwendet werden muss, um eine fehlende Zahl darzustellen. Dieser Wert kann nicht als Auffüllung verwendet werden. Sie können die Ebenen auch verkettet nehmen (Sie können sie immer noch trennen), und die Reihenfolge kann entweder von der Basis nach oben oder von oben nach unten erfolgen.

Ausgabe

Einer von zwei konsistenten unterschiedlichen Werten, wobei einer das Vorhandensein einer eindeutigen Lösung und der andere das Fehlen einer Lösung oder das Vorhandensein von mehr als einer Lösung darstellt.

Regeln

  • Qi+1,j=Qi,j+Qi,j+1 ist immer wahr, wenn , dh die Eingabe enthält garantiert keine Zahl über zwei anderen Zahlen, die nicht ihre Summe sind, wenn alle drei Zahlen bekannt sind.Qi,j,Qi,j+1,Qi+1,jN
  • Qi,j,Qi,j? die Pyramide enthält mindestens eine bekannte Zahl.
  • Tu diese Dinge nicht .
  • Dies ist , also gewinnt die kürzeste Antwort! Lassen Sie sich jedoch nicht davon abhalten, eine Lösung zu veröffentlichen, nur weil Ihre Sprache "zu ausführlich" ist.

Testfälle

Eine Anordnung mit den Schichten von der Oberseite zu der Basis ist für diese Testfälle verwendet, mit 0repräsentierte?.

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

Arbeitsbeispiele

Die Testfälle werden hier bearbeitet.

Einzigartige Lösung 1

10???2????1

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

10???2??111

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

10???22?111

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

10?4?22?111

Schritt 4: x+4=10x=6 .

1064?22?111

Die Schritte 5 bis 6 ähneln 4.

10644223111

Hier haben wir also unsere einzigartige Lösung.

Einzigartige Lösung 2

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

Schritt 1: Hier gibt es keinen offensichtlichen Ansatz. Versuchen wir also, die minimal möglichen Werte zu verwenden.

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

Schritte 2-5: Es sieht so aus, als würden die Mindestwerte zu einer Lösung führen. Daher ist dies die einzige Lösung und daher eindeutig.

321616888444422222111111

Hinweis: Es gibt einen Satz über Additionspyramiden-Rätsel im Zusammenhang mit diesem Rätsel, den Sie beweisen können, wenn Sie genau genug nachdenken.

Einzigartige Lösung 3

?11

x=y=1x+y=2

211

Dies ist eine offensichtlich einzigartige Lösung.

Keine Lösung 1

1??

minN=1x,y1x+y2>1

Keine Lösung 2

1055232????

x+y=2x=y=1

10552321111

1+1=3

Nicht eindeutige Lösung

5?????

Zwei Lösungen:

552332112211

Da es mindestens zwei Lösungen gibt, gibt es keine eindeutige Lösung.

Erik der Outgolfer
quelle
Etwas verwandt .
AdmBorkBork

Antworten:

5

Gelee , 18 16 Bytes

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

Probieren Sie es online aus!

Eine monadische Verbindung, die die Pyramide in umgekehrter Reihenfolge nimmt und 1 für wahr und 0 für falsch zurückgibt. Erzeugt alle möglichen Pyramiden mit einer Basis bis zur maximalen Anzahl in der Pyramide und prüft, ob es eine eindeutige Übereinstimmung für die Eingabe gibt.

Vielen Dank an @Arnauld für den Hinweis, dass dies fehlgeschlagen ist [[1,0],[0]]. jetzt korrigiert.

Vielen Dank an @JonathanAlan für das Speichern von 2 Bytes!

Erläuterung

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
quelle
Sehr schön. Wie funktioniert die Logik "Alle Möglichkeiten generieren"?
Jonah
1
@ Jonah die katrtesische Potenz der maximalen Zahl im Gitter mit der Länge der Basis. zB wenn die maximale Anzahl 10 und die Länge der Basis 4 wäre, würde es alles von [1,1,1,1]bis testen [10,10,10,10], dh 10000 Möglichkeiten.
Nick Kennedy
Ausgänge wahrheitsgemäß für [[0,0],[0]].
Kevin Cruijssen
@ KevinCruijssen Ich habe um Klarstellung gebeten, ob Eingaben ohne bekannte Werte gültig sind. Wenn ja, kann ich wechseln , »2was auch den Vorteil hat, die mit meiner letzten Änderung verlorene Effizienz wiederzugewinnen, wenn auch auf Kosten eines Bytes.
Nick Kennedy
2
...Ƭ€Ṗ€a@ċ⁼1spart zwei Bytes (es sei denn, es gibt Randfälle mit dem UND, die von den Tests nicht berücksichtigt werden?)
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;}

Löst eine Ausnahme aus, wenn true, wird normal ausgeführt, wenn false.

Probieren Sie es online aus!

Verkörperung der Unwissenheit
quelle
1

Wolfram Language (Mathematica) , 85 88 Bytes

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

Probieren Sie es online aus!

+3 behoben.

Brute Force: Überprüfen Sie für alle Basen mit Werten , ob die resultierende Pyramide mit der angegebenen Form übereinstimmt, und prüfen Sie, ob die Gesamtzahl der Übereinstimmungen 1 beträgt. Die Eingabe erfolgt als Liste der Ebenen, Basis zuerst, mit Darstellung fehlender Zahlen.1..(sum of all numbers)0

attinat
quelle
1

05AB1E , 25 Bytes

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

Nimmt die Pyramidenschichten auf den Kopf, von der Basis bis zur Spitze (dh [[0,0,0,1],[0,2,0],[0,0],[10]]).

Außerdem scheint es irgendwo in 05AB1E einen Fehler innerhalb einer Karte zu geben. Der ©...®šsollte nur ...yšfür -1 Byte sein.

Probieren Sie es online aus oder überprüfen Sie einige weitere Testfälle .

Eine kleinere Alternative für gleiche Bytes ©.ΓüO}®škönnte sein [Ðg#üO}\): Probieren Sie es online aus.

Erläuterung:

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
quelle
1
Schlägt in vielen einfachen Fällen fehl . Scheint, als würden Sie versuchen, a%b == 0eine Verknüpfung für zu verwenden a == b || a == 0, aber das funktioniert nicht, da a ein Vielfaches von b sein kann.
Grimmy
Separates Problem: Der Code gibt true für Fälle zurück, für [[0,0],[0]]die es unendlich viele Lösungen gibt. Ich denke, ich wechsle nur >zu den korrekt akzentuierten IKorrekturen.
Grimmy
1
@Grimy Behoben durch Verwendung von .S*anstelle von %, also nur +2 Bytes.
Kevin Cruijssen
0

Haskell, 106 Bytes

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]

Nimmt eine umgedrehte Pyramide, z [[0,0,0,1],[0,2,0],[0,0],[10]].

Probieren Sie es online aus!

Der Brute-Force-Ansatz in Haskell:

  • Erstellen Sie alle möglichen Basisebenen t( mapM(\_->[1..sum(sum<$>x)])x), wobei die Zahlen von 1 bis zur Summe aller Zahlen in der Eingabepyramide reichen
  • Erstelle eine Pyramide aus t( iterate(z(+)=<<tail)t)
  • Vergleichen Sie jede Ebene elementweise mit der Eingabe ( z(z(#))x). Die Vergleichsfunktion gibt a # bzurück, Truewenn beide Zahlen gleich oder aNull sind ( a*b==a*a).
  • Nehmen Sie 1für jede passende Pyramide ein und vergleichen Sie die resultierende Liste mit der Singleton-Liste [1].
Nimi
quelle