У моего маленького ребенка есть такая игрушка:
Эта игрушка состоит из 10 складываемых маленьких ведер, которые мы будем насчитывать от 1 (самое маленькое) до 10 (самое большое). Иногда он делает маленькие груды, и игрушка заканчивается так:
Мы можем схематически изобразить груды так:
1 6
4 9 2 7
5 10 3 8
---------- <-- Floor
1 2 3 4 <-- Pile #
Или, говоря по-другому:
[[4,5],[9,10],[1,2,3],[6,7,8]]
Этот набор груд ведра легко переставляется для восстановления исходного набора (первое изображение), просто последовательно помещая груды меньших ведер в груды больших ведер:
1 1 6
2 2 7
1 6 3 6 3 8
4 9 2 7 4 9 7 4 9
5 10 3 8 5 10 8 5 10
---------- > [Pile 3 to 1] > ---------- > [Pile 4 to 2] > ---------- > [Pile 1 to 2] > Done!
1 2 3 4 1 2 3 4 1 2 3 4
Тем не менее, иногда мой ребенок пытается построить башни или выбрасывает ведра, и в итоге сваи становятся непоследовательными, и исходный набор невозможно восстановить, просто поместив одну кучу в другую. Примеры этого:
[[1,3,2],[4]] (the kid tried to build a tower by placing a bigger bucket
over a smaller one, we would need to reorder the buckets
first)
[[1,3,4],[2]] (the kid left aside an unordered bucket, we would need to remove
bucket #1 from pile #1 before restacking)
[[1,2,3],[5]] (the kid lost a bucket, we need to find it first)
Вызов
Получив список списков целых чисел, представляющих набор стопок, верните истинное значение, если списки представляют легко штабелируемый набор стопок, или false в любом другом случае.
- Входные данные будут представлены в виде списка целых чисел, представляющих сегменты сверху вниз для каждого стека.
- Там не будет пустых стартовых куч (вы не получите в
[[1,2,3],[],[4,5]]
качестве входных данных). - Общее количество сегментов может быть любым в пределах разумного целочисленного диапазона.
- У моего ребенка только один набор ведер, поэтому дублирующих элементов не будет.
- Вы можете выбрать любые два непротиворечивых (и связных) значения для истинности или ложности.
- Ведра будут помечены от # 1 до #N, будучи
N
самым большим целым числом в списках целых чисел. Мой ребенок до сих пор не знает понятия нуля. - Вы можете получать входные данные в любом разумном формате, если они представляют собой набор груд куч. Просто укажите это в своем ответе, если вы измените способ получения ввода.
- Это код-гольф , поэтому может выиграть самая короткая программа / функция для каждого языка!
Примеры
Input: [[4,5],[9,10],[1,2,3],[6,7,8]]
Output: Truthy
Input: [[6,7,8,9,10],[1],[2],[3,4,5],[11,12,13]]
Output: Truthy
Input: [[2,3,4],[1],[5,6,7]]
Output: Truthy
Input: [[1,2],[5,6],[7,8,9]]
Output: Falsey (buckets #3 and #4 are missing)
Input: [[2,3,4],[5,6,7]]
Output: Falsey (bucket #1 is missing)
Input: [[1,3,4],[5,7],[2,6]]
Output: Falsey (non-restackable piles)
Input: [[1,4,3],[2],[5,6]]
Output: Falsey (one of the piles is a tower)
Ответы:
Желе ,
65 байтСпасибо @Lynn за сохранение 1 байта.
Попробуйте онлайн!(поставляется с нижним колонтитулом test-suite)
объяснение
источник
ṢFµJ⁼
, что работает, но я не думал обо всех крайних случаях.1
не пропало. Я не уверен, если это гарантируется ОП.J
может вернуть, гарантируя ложный вывод. я что-то пропустил?Python 2 ,
5352 байтаСпасибо за байт xnor
Попробуйте онлайн!
источник
[]
. Довольно хитрый[0]
чтобы диапазон мог начинаться с0
.JavaScript (ES6),
5958 байтобъяснение
Контрольные примеры
Показать фрагмент кода
источник
05AB1E , 4 байта
Попробуйте онлайн!
источник
Haskell , 54 байта
Попробуйте онлайн!
источник
Haskell , 37 байт
Попробуйте онлайн!
Проверяет, является ли составленный отсортированный список лексикографически меньшим, чем бесконечный список
[1,2,3,...]
. Поскольку дубликатов нет, любой отсутствующий сегмент или сегмент не по порядку может привести к значению, превышающему значение,k
указанное вk
первом месте, в результате чего результирующий список будет больше.источник
Pyth, 6 байт
Попробуй это здесь.
Объяснение:
источник
UI
части, пожалуйстаU <col>
естьrange(len(A))
,I <pfn> <any> <n-1:any>
естьA(B, ...) == B
.U <col>
это такrange(len(A))
, но я не понимал, что перенос решения Python будет короче ...PROLOG (SWI), 54 байта
В настоящее время так лучше. Все еще довольно многословно, увы.
Попробуйте онлайн!
s/1
Предикат принимает список в качестве аргумента и верно , если список список легко наращиваемых ведра.Улучшение в алгоритме: если я сортирую список перед тем, как сгладить его, это вынуждает сортировать все подсписки, чтобы предикат был истинным. Слегка «позаимствовано» у желе-ответчика Pietu1998 . Благодаря этому я могу сбросить
forall
более половины программы (оригинальный ответ приведен ниже).Как это работает?
Предикат верен, если все его предложения верны:
Предыдущий ответ, PROLOG (SWI), 109 байт
Попробуйте онлайн!
источник
Pyth ,
9 1611 байт (исправлено)Использует совершенно другой метод из другого ответа. Более короткий, 7-байтовый подход можно найти ниже.
Тестирование.
объяснение
Как это работает?
Давайте возьмем пару примеров, которые облегчают понимание. Давайте предположим, что вход
[[1,3,4],[5,7],[2,6]]
. Суть этого алгоритма заключается в том, что каждая дельта в неоткрытом списке должна быть равна 1, чтобы сегменты можно было наращивать.Во-первых,
S
превращает это в[[1, 3, 4], [2, 6], [5, 7]]
.Тогда,
s
сглаживает его:[1, 3, 4, 2, 6, 5, 7]
.Подставить
0
перед:[0, 1, 3, 4, 2, 6, 5, 7]
.+
получает дельты списка[1, 2, 1, -2, 4, -1, 2]
.tM
уменьшает каждый элемент[0, 1, 0, -3, 3, -2, 1]
.Любое
0
нецелое число является правдивым в Pyth, поэтому мы проверяем, есть ли какой-либо правдивый элемент с.E
(что означает, что стек не может быть сформирован правильно). Мы получаемTrue
.!
сводит на нет результат, который превращаетсяTrue
вFalse
.Если бы вход был, например,
[[6,7,8,9,10],[1],[2],[3,4,5],[11,12,13]]
алгоритм работал бы следующим образом:Сортировка по самому высокому элементу:
[[1], [2], [3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13]]
и сплющенные, с0
префиксом:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
.Дельты:
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
. Все уменьшаются[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
.Там нет правдивого элемента, поэтому мы получаем
False
. По логическому отрицанию, результат естьTrue
.Pyth , 7 байт
Тестирование.
Порт ответа от Python и вариант решения @ Erik .
источник
tM
уменьшением каждого элемента? Я думаю, что уменьшение каждого элемента[1, 2, 1, -2, 4, -1, 2]
даст результат[0, 1, 0, -3, 3, -2, 1]
. Но это не поможет решить проблему, поэтому я, должно быть, неправильно понимаю, что означает уменьшение каждого элемента.tM
уменьшает каждый элемент в списке на1
. В моем объяснении есть ошибка. Починю.Брахилог , 5 байт
Попробуйте онлайн!
Объясненные унификации:
Аналитическое объяснение:
Сначала мы сортируем список списков, а затем объединяем (т.е. выравниваем 1-глубину) (
oc
) так, чтобы сегменты располагались справа налево, если это возможно. Затем, чтобы проверить, правильно ли сложены сегменты (т. Е. Отсутствуют недостающие сегменты или вышки), мы проверяем, что результирующий список имеет инклюзивный диапазон от 1 до его длины. Теперь вместо проверки списка с помощью диапазона [1..n] его длины ({l⟦₁?}
) мы пытаемся найти входные данные для функции, которая генерирует такой диапазон (~⟦₁
), если он есть. Если вход найден, то программа завершается без проблем, поэтому она вызываетtrue.
состояние. Если вход не найден, программа завершается ошибкой, вызываяfalse.
состояние.источник
Python 2 , 43 байта
Попробуйте онлайн!
Проверяет, является ли составленный отсортированный список лексикографически меньшим, чем
[1,2,3,...N]
для большогоN
. Поскольку дубликатов нет, любой отсутствующий сегмент или сегмент не по порядку может привести к значению, превышающему значение,k
указанное вk
первом месте, в результате чего результирующий список будет больше. Длина строки ввода достаточна в качестве верхней границы, поскольку каждое число принимает более 1 символа.источник
MATL , 5 байтов
Попробуйте онлайн!
(Неявный ввод, скажем
{[4,5],[9,10],[1,2,3],[6,7,8]}
)S
- сортировать входные массивы в лексикографическом порядке ({[1,2,3],[4,5],[6,7,8],[9,10]}
)g
- преобразовать в один массив (cell2mat
)t
- дублировать этоf
- найти индексы ненулевых значений. Поскольку здесь все входные данные не равны нулю, возвращает список индексов от 1 до длины (массив) ([1,2,3,4,5,6,7,8,9,10],[1,2,3,4,5,6,7,8,9,10]
)=
- убедитесь, что массив равен диапазону от 1 до длины (массив)источник
Japt ,
131211 байтЭто может быть короче.
Попробуйте или запустите все тесты
объяснение
источник
ä-0 e¥J
илиän0 e¥1
ä
к массивам. Спасибо за сохранение.Скала, 49 байт
Ungolfed:
источник
Japt , 9 байт
Попробуйте онлайн!
источник
g<space>
;)R , 58 байт
Попробуйте онлайн!
NB: ЛОЖЬ - правдивый результат, ИСТИНА - ложный
Пояснение:
источник
seq(a)
за 2 байта? Кроме того, его можно использоватьTRUE
как ложное значение и наоборот (просто укажите в своем ответе), так что вы можете сделатьany(a-seq(a))
для другого байта.seq(a)
поведением по-разному, когдаa
имеет длину 1, и я пропустил, что в этом случае мы получим те же результаты: D Спасибо!C # (.NET Core) ,
157145132 байт-13 байт благодаря TheLethalCoder
Количество байтов также включает в себя
Попробуйте онлайн!
Ungolfed:
источник
x.First()
->x[0]
?Enumerable.Range
->new int[]
иZip
с индексом, если это возможно ..? УдалитеWhere
и поместите условие вAny
.new int[]
подход потребует добавления a,Select()
чтобы получить индекс, и в конечном итоге увеличить число байтов.CJam , 11 байт
Попробуйте онлайн!
Oww
:(
... да!{$:+_,,:)=}
источник
Древесный уголь , 19 байт (не конкурирует?)
Попробуйте онлайн!
-10 байт благодаря ASCII-только .
-3 байта благодаря только ASCII для последующей реализации (см. Историю изменений для возможной конкурирующей версии).
-
для truthy,для falsy.
Input представляет собой одноэлементный список списков, из-за того, как уголь принимает данные
источник
UP
.UPsorted
.▷
используется там делает область применения вещи приоритета , хотя так что, почемуUP
до сих пор существует , но я думаю , вы можете просто не использовать имена функций питона в качестве имени переменной?v
, а также O_O, это даже не вызов искусства ascii (неудивительно, что это так нечистоплотно: PJava 10, 213 байт
Попробуйте онлайн.
Когда я начинал, это казалось хорошей идеей, но эти встроенные функции делают его длиннее ... Можно определенно играть в гольф, используя более ручной подход ...
Вдохновленный @EriktheOutgolfer 4-байтовый 05AB1E ответ «s . 4 против 213 байт, rofl ..>.>
Объяснение:
источник