この追加ピラミッドパズルには独自のソリューションがありますか?


11

追加のピラミッド与えて、それが解決できるかどうかを判断します。追加ピラミッドは、複数のレイヤーで構成され、各レイヤーはその下の数字よりも1つ小さい数字を持ちます。レイヤーはとして記号化されています。はベースレイヤーで、は上のレイヤーです。の番目の番号はとして示されます。はの左端の数で、は右側の数です。あなたが視覚化できるの上に存在するPi 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,jそしてミドル、その名"付加でピラミッド "。Pi,j+1

  • Pi,j,Pi,jN、つまり、ピラミッド内のすべての数値はゼロ以外の正の整数です。
  • i>1,Pi,j=Pi1,j+Pi1,j+1、つまり、ピラミッドのベースレイヤーにないすべての数値は、その下の2つの数字。
  • 場合有するの数字、有するの番号を、従っての右端の数である。簡単に言えば、各レイヤーには、その下のレイヤーよりも1つ小さい数字があります。P1nPini+1Pi,ni+1Pi

また、ピラミッドパズル 、いくつかの数字との付加ピラミッドは(に置き換え削除されます)。その解決策は、追加のピラミッド。ここで、、つまり、パズルに元々存在していた数字は変更されずに残されました。このようなパズルには複数の解決策があります。Q?PQi,j?,Pi,j=Qi,j

あなたの仕事は、ピラミッドパズルを追加して、それが1つのソリューションを持っているかどうかを判断することです。

入力

次のいずれかの形式で入力を取得できますが、一貫性があります。

  • レイヤーの配列。
  • 一貫した非正の整数値を要素間のセパレーターとして使用するピラミッド型のレイヤー(毎回1回のみ使用)、および左右のパディング。セパレータとパディングは同じでなければなりません。
  • 一貫した有効な右または左のパディングを持つレイヤーの配列(この場合、一貫していて、右と左のパディングを混在させないでください)。

厳密に正の整数ではない一貫した値を使用して、欠落している数値を表す必要があることに注意してください。この値はパディングとして使用できません。また、レイヤーを連結することもできます(それらを分離することもできます)。順序は、ベースからトップ、またはトップからベースのいずれかです。

出力

2つの一貫した異なる値の1つ。1つは一意のソリューションの存在を表し、もう1つはソリューションの不在または複数のソリューションの存在を表します。

ルール

  • Qi+1,j=Qi,j+Qi,j+1は、場合、常に真になります。。つまり、3つの数値がすべてわかっている場合、合計ではない2つの数値の上に数値が含まれないことが保証されます。Qi,j,Qi,j+1,Qi+1,jN
  • Qi,j,Qi,j?つまり、ピラミッドには少なくとも1つの既知の数値が含まれます。
  • これらのことをしないでください。
  • これはなので、最短の答えが勝ちです!ただし、あなたの言語が「冗長すぎる」という理由だけで、ソリューションを投稿することを思いとどまらせないでください。

テストケース

ベース上から層を有する配列と、これらのテストケースに使用される0代表しますか。?

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

実施例

テストケースはここで機能します。

ユニークなソリューション1

10???2????1

ステップ1:。x+y=2x=y=1

10???2??111

ステップ2:。x=y=1x+y=2

10???22?111

ステップ3:。x=y=2x+y=4

10?4?22?111

ステップ4:。x+4=10x=6

1064?22?111

手順5〜6は4と同様です。

10644223111

したがって、ここに独自のソリューションがあります。

ユニークなソリューション2

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

ステップ1:ここには明確なアプローチはありませんので、可能な最小値を使用してみましょう。

32111111

ステップ2〜5:最小値が解をもたらすように見えるため、これが唯一の解であり、したがって一意です。

321616888444422222111111

ヒント:このパズルに関連する追加のピラミッドパズルに関する定理があり、十分に考えれば証明できます。

ユニークなソリューション3

11

ステップ1:。バツ=y=1バツ+y=2

211

これは明らかにユニークなソリューションです。

解決策なし1

1

N=1バツy1バツ+y2>1なので、解決策はありません。

解決策なし2

1055232

ステップ1-2:。バツ+y=2バツ=y=1

10552321111

そこから、になりますが、これは矛盾であるため、解決策はありません。1+1=3

一意でないソリューション

5

2つのソリューション:

552332112211

少なくとも2つのソリューションがあるため、独自のソリューションはありません。


回答:


5

ゼリー18 16バイト

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

オンラインでお試しください!

逆順でピラミッドを取得し、trueの場合は1、falseの場合は0を返すモナドリンク。ピラミッドの最大数までのベースを持つすべての可能なピラミッドを生成し、入力に一意の一致があるかどうかを確認します。

これが失敗したことを指摘してくれた@Arnauldに感謝し[[1,0],[0]]ます。修正されました。

2バイトを節約してくれた@JonathanAlanに感謝します!

説明

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

非常に素晴らしい。「すべての可能性を生成する」ロジックはどのように機能しますか?
ジョナ

1
@Jonah グリッド内の最大数のCatrtesianパワー。ベースの長さ。たとえば、最大数が10で、ベースの長さが4の場合、から[1,1,1,1]までのすべて[10,10,10,10]、つまり10000の可能性をテストします。
ニックケネディ

の真実を出力し[[0,0],[0]]ます。
ケビンCruijssen

@KevinCruijssen既知の値を持たない入力が有効かどうかを明確にするよう求めました。もしそうなら、私はどちらに変更する»2こともできますが、1バイトのコストではありますが、最後の変更で失われた効率を取り戻すという利点もあります。
ニックケネディ

2
...Ƭ€Ṗ€a@ċ⁼1(エッジケースがテストで仕出し料理ではなくて存在しない限り?)の2つのバイトを節約する
ジョナサン・アラン・


1

Wolfram言語(Mathematica)85 88バイト

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

オンラインでお試しください!

+3修正済み。

ブルートフォース:値を持つすべてのベースについて、結果のピラミッドが指定されたフォームと一致するかどうかを確認し、一致の合計数が1かどうかを確認します。1..(sum of all numbers)0


1

05AB1E、25 バイト

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

ピラミッドレイヤーを上下逆の順序で、つまりベースからチップ(つまり[[0,0,0,1],[0,2,0],[0,0],[10]])に配置します。

また、マップ内にある05AB1Eのどこかにバグがあるようです。これ©...®š...yš、-1バイトだけのはずです。

オンラインそれを試してみたり、さらにいくつかのテストケースを検証します

マイナーのための代替等しいバイトは©.ΓüO}®š可能性があり[Ðg#üO}\)オンラインそれを試してみてください。

説明:

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
多くの簡単なケースで失敗します。のa%b == 0ショートカットとして使用しようとしているようですがa == b || a == 0、aはbの倍数になる可能性があるため機能しません。
グリムミー

別の問題:コードは[[0,0],[0]]、無限に多くの解決策があるケースのようにtrueを返します。>正しいアクセントにI修正するだけで修正できると思います。
グリムミー

1
@Grimyの.S*代わりにを使用して修正した%ため、わずか+2バイト。
ケビンCruijssen

0

Haskell、106バイト

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]

逆さまのピラミッドを取ります[[0,0,0,1],[0,2,0],[0,0],[10]]

オンラインでお試しください!

Haskellのブルートフォースアプローチ:

  • すべての可能なベースレイヤーtmapM(\_->[1..sum(sum<$>x)])x)を作成します。数字は1から入力ピラミッドのすべての数字の合計までです。
  • titerate(z(+)=<<tail)t)からピラミッドを作成します
  • 各レイヤーを要素ごとに入力(z(z(#))x)と比較します。比較関数a # bTrue、両方の数値が等しいかaゼロ(a*b==a*a)の場合に戻ります。
  • 1一致するすべてのピラミッドに対してを取得し、結果のリストをシングルトンリストと比較します[1]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.