Допустим, ваша задача - рисовать столбы, а клиент просит вас нарисовать столб с четырьмя красными и тремя желтыми. Вы можете сделать это довольно легко следующим образом:
r y r y r y r
Только с желтыми и красными полосами. Теперь предположим, что ваш клиент просит вас нарисовать столб с 2 красными секциями, 2 желтыми секциями и 1 зеленой секцией . Есть несколько способов нарисовать свой столб
g y r y r
y g r y r
y r g y r
y r y g r
y r y r g
g r y r y
r g y r y
r y g r y
r y r g y
r y r y g
y r g r y
r y g y r
Точнее вот 12 способов покрасить шест. Это взрывает больше цветов и разделов, которые участвуют
Теперь, если ваш клиент говорит, что он хочет 3 красных раздела и 1 желтый, нет никакого способа нарисовать такой столб. Потому что независимо от того, как вы пытаетесь расположить секции, две красные секции соприкасаются, а когда две красные секции соприкасаются, они становятся одной красной секцией.
И это в значительной степени наше единственное правило для рисования столбов
Соседние секции не могут быть одного цвета
задача
Учитывая список требуемых цветов и разделов, выведите количество возможных способов покраски полюса в соответствии с запросом. Вы можете представлять цвета любым разумным способом (целые числа, символы, строки), но вам никогда не будет предоставлено более 255 различных цветов одновременно. Если вы хотите, вы можете даже не назначать цвета именам и просто взять список подсчетов разделов, если это проще.
Тестовые случаи
Их довольно сложно вычислить вручную, особенно когда они становятся больше. Если у кого-то есть предложенный тестовый пример, я добавлю его.
[4,3] -> 1
[2,2,1] -> 12
[3,1] -> 0
[8,3,2] -> 0
[2,2,1,1]-> 84
источник
[1, 1, 1, 1, 2, 2, 2]
? Я так полагаю.Ответы:
Математика, 37
44486062байтовВзять входные данные как список целых чисел
{1, 1, 1, 2, 2}
. Попробуйте это на Wolfram Sandbox .Метод сопоставления с образцом, спасибо @ Не дерево!
Split
разбивает один список на подсписки последовательных элементов, например,{1, 1, 2, 3, 4, 4}
в{{1, 1}, {2}, {3}, {4, 4}}
{{_}..}
есть, а именно{{_}, {_}, {_}, ...}
. Шаблон соответствует списку унарных подсписков.Differences
метод, 48 байтов:Код использует,
Differences
чтобы определить, являются ли смежные элементы одинаковыми.Шаг за шагом:
Permutations@#
генерирует все перестановки входного списка в список N! * N.Differences/@
вычисляет разницу между N элементами и выдает список N! * (N-1).1##&@@@
рассчитывает умножение всех списков. Если список содержит0
(два смежных элемента одинаковы), результатом будет0
, в противном случае ненулевое, значение N! список.Clip[]
действует какSign[]
, преобразовать список из (-inf, inf) в [-1, 1]Tr@Abs
превращает все-1
в1
и теперь список длины N! содержит только0
(недействительно) и1
(допустимо). Итак, мы просто суммируем список.источник
Permutations@#~Count~Except@{___,x_,x_,___}&
.Count[Split/@Permutations@#,{{_}..}]&
37 байт!Желе , 7 байт
Попробуйте онлайн!
Принимает входные данные, например,
[1,1,1,1,2,2,2]
для[4,3]
.[8,3,2]
TestCase занимает слишком много времени , чтобы работать на TIO.Как это работает
источник
Œ!QIẠ€S
? Попробуйте онлайн!P
более чем любой и все атом для его простоты.P€
аẠ€
не все равно будет работать.05AB1E , 7 байтов
Попробуйте онлайн!
-1 спасибо nmjcman101 за другой ответ.
источник
Mathematica, 50 байтов
Попробуйте в Mathics или в песочнице Wolfram !
Вводит данные, как в тестовых случаях - например,
{4,3}
означает «4 красные полосы, 3 желтые полосы».Это наивная реализация формулы, которую я нашел здесь . «Наивный» означает «Я понятия не имею, как работает математика, поэтому, пожалуйста, не спрашивайте меня об объяснениях…»
источник
Python 3.5 , 65 байт
Попробуйте онлайн!
источник
Ruby 2.4, 47 байт
Входной список символов: Для теста
[4,3]
, вход может быть%w[a a a a b b b]
,"1111222".chars
или какой -либо другой метод массива форматирования , что это действительно в Ruby.Требуется 2.4 для
Enumerator#uniq
(более ранние версии были доступны только вArray
классе). Таким образом, ссылка TIO добавляет 5 байтов, чтобы сначала преобразовать перечислитель перестановки в массивto_a
, поскольку он не имеет вышеуказанной функции.Попробуйте онлайн!
источник
R, 72 байта
Создает функцию
Принимает участие в форме
[1,1,1,1,2,2,2]
согласно комментарию Эрика Outgolfer. Использованиеcombinat
«ыpermn
функции , чтобы создать список всех перестановок, а затем ,unique
чтобы получить все отдельные записи.sapply
затем применяет следующую функцию ко всем записям:Который оценивает
Обратите внимание, что это
x
не то же самое, чтоx
во входе большой функции. Использование другого символа в этой функции было бы глупоpryr::f
верить, что большой функции нужен другой аргумент.В любом случае, когда данная перестановку, эта функция принимает разницу между вектором:
2 1 3 4 2 1 -> -1 2 1 -2 -1
.!
преобразует ненулевые вFALSE
и нули вTRUE
, поэтому вектор становитсяFALSE FALSE FALSE FALSE FALSE
. Подводя итог, чтобы проверить, есть лиTRUE
s (TRUE
будет означатьdiff=0
-> два одинаковых последовательных числа). Мы можем снова инвертировать это,!
чтобы получить логическое значение того, есть ли последовательные значения в перестановке или нет.Суммирование по этим логическим значениям дает нам общее количество перестановок, где это не так.
Не работает для
[8,3,2]
тестового набора, потому что для хранения этих перестановок требуется вектор 46 ГБ.источник
Желе , 11 байт
Попробуйте онлайн!
источник
Python 2 ,
14089 байтФормат ввода
'aaaabbb'
для тестового примера[4,3]
.Попробуйте онлайн!
источник
Шелуха , 8 байт
Попробуйте онлайн! Принимает ввод в формате
"aaabb"
для[3,2]
. Тайм-аут на самом длинном тестовом случае.объяснение
Ничего особенного, только подсчитав уникальные перестановки, где все группы смежных элементов имеют длину 1.
источник
Рубин,
8476 байтРекурсивная лямбда-функция. Просматривает каждый возможный цвет и дозирует рекурсивный поиск по дереву, считая количество раз, когда оно использует все полосы.
Пояснение (для старой версии):
источник
x=p
как начальное условие? в этом случаеp
действует как псевдонимnil
и должен соответствовать проверке, для которой он используется.MATL ,
118 байтФормат ввода
[1 1 1 1 2 2 2]
для[4 3]
и т. Д.Недостаточно памяти для последнего контрольного примера.
Попробуйте онлайн!
объяснение
источник