Чи має ця складна пірамідальна головоломка унікальне рішення?


12

Давши піраміду додавання , визначте, чи можна її вирішити. Піраміда додавання складається з шарів , кожен з яких на одне число менше, ніж той, що знаходиться під ним. Шар символізується як . - базовий шар, а - шар на вершині . й номер позначається як . - найлівіше число , а - число праворуч від . Ви можете візуалізувати знаходиться поверхПiПiП1Пi+1ПijПiПi,jПi,1ПiПi,j+1Пi,jПi+1,jПi,jі посередині, звідси і назва " піраміда додавання ".Пi,j+1

  • Pi,j,Pi,jN , тобто кожне число в піраміді є ненульовим додатним цілим числом.
  • i>1,Pi,j=Pi1,j+Pi1,j+1 , тобто кожне число, що не знаходиться на базовому шарі піраміди, є сумою два числа під ним.
  • Якщо має чисел, має числа, тому - це найправіше число . Простіше кажучи, кожен шар має на одне число менше, ніж шар під ним.P1nPini+1Pi,ni+1Pi

Додаток піраміди-головоломки - це додаткова піраміда з деякими числами, видаленими (заміненими ). Її рішення - це піраміда додавання , де , тобто числа, які були спочатку присутні у головоломці залишилися без змін. Така головоломка може мати більше одного рішення.Q?PQi,j?,Pi,j=Qi,j

Ваше завдання задається головоломкою з додатковою пірамідою, щоб визначити, чи має вона саме одне рішення.

Вхідні дані

Ви можете отримати інформацію в будь-якій з наступних форм, але будьте послідовними:

  • Масив шарів.
  • Масив шарів, що мають форму піраміди, використовуючи послідовне непозитивне ціле значення як роздільник між елементами (використовується лише один раз кожного разу), а також лівою та правою накладками. Сепаратор і прокладка повинні бути однаковими.
  • Масив шарів з послідовною дійсною правою чи лівою підкладкою (ви повинні бути послідовними, а не змішувати правий і лівий накладки в цьому випадку).

Зауважте, що для представлення відсутнього числа необхідно використовувати послідовне значення, яке не є суто позитивним цілим числом; це значення не можна використовувати як накладку. Крім того, ви можете взяти шари, з'єднані (ви можете ще їх розділити), і впорядкування може бути або від основи до верху, або від верху до основи.

Вихідні дані

Одне з двох послідовних відмінних значень, де одне представляє наявність унікального рішення, а інше відсутність рішення або наявність більше одного рішення.

Правила

  • Qi+1,j=Qi,j+Qi,j+1 завжди буде істинним, якщо , тобто вхід гарантується, що не буде містити номер над двома іншими числами, що не є їх сумою, якщо всі три числа відомі.Qi,j,Qi,j+1,Qi+1,jN
  • Qi,j,Qi,j? , тобто піраміда буде містити щонайменше одне відоме число.
  • Не роби цього .
  • Це , тому найкоротша відповідь виграє! Однак не дозволяйте це відштовхувати вас від публікації рішення лише тому, що ваша мова "занадто багатослівна".

Тестові справи

Масив із шарами зверху до основи використовується для цих тестових випадків, із 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: .х+у=2х=у=1

10???2??111

Крок 2: .х=у=1х+у=2

10???22?111

Крок 3: .х=у=2х+у=4

10?4?22?111

Крок 4: .х+4=10х=6

1064?22?111

Кроки 5-6 схожі на 4.

10644223111

Тож тут у нас є наше унікальне рішення.

Унікальне рішення 2

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

Крок 1: Тут очевидного підходу немає, тому спробуємо використати мінімально можливі значення.

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

Кроки 2-5: Схоже, що мінімальні значення призводять до рішення, тому це єдине рішення і тому унікальне.

321616888444422222111111

Підказка: Існує теорема про складання пірамідних головоломок, пов’язаних із цією головоломкою, яку ви можете довести, якщо ви думаєте досить важко.

Унікальне рішення 3

?11

Крок 1: .х=у=1х+у=2

211

Це, очевидно, унікальне рішення.

Немає рішення 1

1??

хвN=1х,у1х+у2>1 , тому рішення немає.

Немає рішення 2

1055232????

Кроки 1-2: .х+у=2х=у=1

10552321111

Звідси випливає, що , що є суперечливістю, тому рішення немає.1+1=3

Не унікальне рішення

5?????

Два рішення:

552332112211

Оскільки існує щонайменше два рішення, немає єдиного рішення.


Відповіді:


5

Желе , 18 16 байт

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

Спробуйте в Інтернеті!

Монадійне посилання, яке приймає піраміду в зворотному порядку і повертає 1 для істинного і 0 для помилкового. Створює всі можливі піраміди з базою до максимального числа в піраміді та перевіряє, чи є одна унікальна відповідність для введення.

Дякуємо @Arnauld за те, що він зазначив, що це не вдалося [[1,0],[0]]; тепер виправлено.

Дякуємо @JonathanAlan за збереження 2 байтів!

Пояснення

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 Каттеріанська потужність максимального числа в сітці з довжиною основи. наприклад , якщо максимальне число було 10 , а довжина підстави 4 , то було б перевірити всі , від [1,1,1,1]до [10,10,10,10], тобто 10000 можливостей.
Нік Кеннеді

Виходи truthy для [[0,0],[0]].
Kevin Cruijssen

@KevinCruijssen Я попросив роз'яснити, чи не коректним є введення даних без відомих значень. Якщо так, то я можу змінити , щоб , »2який також має перевагу відновлення ефективності втрачену з моїм останнім зміною, хоча і ціна байта.
Нік Кеннеді

2
...Ƭ€Ṗ€a@ċ⁼1економить два байти (хіба є крайові випадки з AND, на які не
Джонатан Аллан

2

C # (Visual C # Interactive Compiler) , 303 227 байт

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

Викидає виняток, якщо є істинним, працює нормально, якщо помилково.

Спробуйте в Інтернеті!


1

Мова Вольфрама (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, але це не працює, оскільки а може бути кратним b.
Grimmy

Окреме питання: код повертає істину для таких випадків [[0,0],[0]], у яких нескінченно багато рішень. Я думаю, що просто змінившись >на правильно акцентовані Iвиправлення, що.
Grimmy

1
@Grimy Виправлено за допомогою, .S*а не %лише 2 байти.
Kevin 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]].

Спробуйте в Інтернеті!

Підхід грубої сили в Хаскеллі:

  • створити всі можливі базові шари t( mapM(\_->[1..sum(sum<$>x)])x), де числа переходять від 1 до суми всіх чисел у вхідній піраміді
  • створити піраміду з t( iterate(z(+)=<<tail)t)
  • порівнюйте кожен елемент елементу з введенням ( z(z(#))x). Функція порівняння a # bповертається, Trueякщо обидва числа рівні або aдорівнюють нулю ( a*b==a*a).
  • візьміть 1для кожної піраміди, яка відповідає, і порівняйте отриманий список з одиночним списком [1].
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.