Учитывая добавленную пирамиду , определите, можно ли ее решить. Дополнительная пирамида состоит из слоев , каждый из которых на одно число меньше, чем тот, что под ним. Слой обозначается как . является базовым слоем, а является слоем поверх . - го числа обозначается как . - крайнее левое число , а - число справа от . Вы можете визуализировать находящийся сверху и в середине, отсюда и название «дополнительнаяпирамида».
- , то есть, каждое число в пирамиде является положительным целым числом от нуля.
- , то есть каждое число, не входящее в базовый слой пирамиды, является суммой двух чисел под ней.
- Если имеет чисел, имеет чисел, поэтому является самым правым числом . Проще говоря, каждый слой имеет на одно число меньше, чем слой под ним.
Дополнение пирамида головоломка является дополнением пирамиды с некоторыми удаленными числами (заменены ). Его решение является дополнением пирамиды , где , то есть числа, которые изначально присутствовали в головоломке, остались без изменений. Такая головоломка может иметь более одного решения.
Ваша задача, учитывая дополнительную пирамидальную головоломку, определить, есть ли у нее одно решение.
вход
Вы можете получить ввод в любой из следующих форм, но будьте последовательны:
- Массив слоев.
- Массив слоев, имеющих форму пирамиды, с использованием непротиворечивого целочисленного значения в качестве разделителя между элементами (используется только один раз каждый раз), а также заполнения слева и справа. Разделитель и отступ должны быть одинаковыми.
- Массив слоев с одинаковым допустимым отступом справа или слева (в этом случае вы должны быть согласованным и не смешивать отступы справа и слева).
Обратите внимание, что для представления пропущенного числа необходимо использовать непротиворечивое значение, которое не является строго положительным целым числом; это значение нельзя использовать в качестве отступа. Кроме того, вы можете взять объединенные слои (вы можете разделить их), и порядок может быть либо от основания к вершине, либо от вершины к основанию.
Выход
Одно из двух последовательных различных значений, где одно представляет наличие уникального решения, а другое - отсутствие решения или наличие нескольких решений.
правила
- всегда будет истинным, если , то есть вход гарантированно не будет содержать число поверх двух других чисел, которое не является их суммой, если известны все три числа.
- то есть пирамида будет содержать хотя бы одно известное число.
- Не делай этого .
- Это код-гольф , поэтому выигрывает самый короткий ответ! Однако не позволяйте этому отговаривать вас от публикации решения только потому, что ваш язык «слишком многословен».
Контрольные примеры
Массив со слоями от вершины до основания используется для этих тестовых случаев с 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
Шаг 1: .
Шаг 2: .
Шаг 3: .
Шаг 4: .
Шаги 5-6 похожи на 4.
Так что здесь у нас есть уникальное решение.
Уникальное решение 2
Шаг 1: Здесь нет очевидного подхода, поэтому давайте попробуем использовать минимально возможные значения.
Шаги 2-5: похоже, что минимальные значения приводят к решению, поэтому это единственное решение и, следовательно, уникальное.
Подсказка: Существует одна теорема о сложении пирамидальных головоломок, связанных с этой загадкой, которую вы можете доказать, если подумаете.
Уникальное решение 3
Это явно уникальное решение.
Нет решения 1
, поэтому решения не существует.
Нет решения 2
, что является противоречием, поэтому решения не существует.
Неуникальное решение
Два решения:
Поскольку существует как минимум два решения, уникального решения не существует.
источник
Ответы:
Желе ,
1816 байтовПопробуйте онлайн!
Монадическая ссылка, которая принимает пирамиду в обратном порядке и возвращает 1 для true и 0 для false. Создает все возможные пирамиды с основанием до максимального числа в пирамиде и проверяет, существует ли одно уникальное совпадение для ввода.
Спасибо @Arnauld за указание, что это не удалось
[[1,0],[0]]
; сейчас исправлено.Спасибо @JonathanAlan за сохранение 2 байта!
объяснение
источник
ṗ
максимального числа в сетке с длиной основания. Например, если максимальное число было 10, а длина основания 4, то он будет проверять все от[1,1,1,1]
до[10,10,10,10]
, то есть 10000 возможностей.[[0,0],[0]]
.‘
чтобы ,»2
который также имеет преимущество восстановления эффективности потерянную с моим последним изменением, хотя и цена байта....Ƭ€Ṗ€a@ċ⁼1
сохраняет два байта (если нет крайних случаев с AND, не удовлетворяемых тестами?)C # (интерактивный компилятор Visual C #) ,
303227 байтВыдает исключение, если true, работает нормально, если false.
Попробуйте онлайн!
источник
Wolfram Language (Mathematica) ,
8588 байтПопробуйте онлайн!
+3 исправлено.
Грубая сила: для всех баз со значениями посмотрите, соответствует ли полученная пирамида заданной форме, и проверьте, равно ли общее число совпадений 1. Принимает входные данные в виде списка уровней, сначала базы, с представлением пропущенных чисел.
1..(sum of all numbers)
0
источник
05AB1E , 25 байтов
Принимает слои пирамиды в перевернутом порядке, от основания до кончика (то есть
[[0,0,0,1],[0,2,0],[0,0],[10]]
).Кроме того, кажется, что где-то в 05AB1E есть ошибка
.Γ
внутри карты ..©...®š
Должно быть только...yš
-1 байт ..Попробуйте онлайн или проверьте еще несколько тестов .
Незначительная альтернатива для равных байтов
©.ΓüO}®š
может быть[Ðg#üO}\)
: Попробуйте онлайн.Объяснение:
источник
a%b == 0
в качестве ярлыка дляa == b || a == 0
, но это не работает, потому что a может быть кратным b.[[0,0],[0]]
, которые имеют бесконечно много решений. Я думаю, что просто переход>
на правильные акцентыI
исправляет это..S*
вместо%
, так что просто +2 байта.Haskell, 106 байт
Принимает вверх ногами пирамиду, например
[[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]
.источник