Мотивация : иногда определенные элементы в списке не учитываются при подсчете итогов. Например, подсчет пассажиров самолета в рядах, где дети сидят на коленях у родителей.
Задача : написать программу для разбиения списка элементов на куски. Каждый блок (кроме, возможно, последнего) имеет одинаковый размер , где размер определяется как число элементов, передающих функцию предиката.
Правила :
- Ваша программа должна занять
- список предметов
- положительный целочисленный размер куска
- функция предиката (принимает элемент и возвращает истину или ложь)
- Вы должны вернуть входной список, разбитый на куски
- Каждый кусок представляет собой список элементов
- В целом, предметы должны оставаться в том же порядке, ни один из которых не игнорируется.
- Количество элементов, передаваемых предикатом в каждом чанке (кроме, возможно, последнего), должно соответствовать размеру входного чанка.
- элементы, не соответствующие предикату, не должны учитываться в этом размере
- Элементы, не соответствующие предикату:
- все еще включены в выходные чанки
- выделяется для самого раннего чанка, в случае, если чанк «полон», но следующие элементы не соответствуют предикату
- таким образом, последний кусок может не состоять исключительно из элементов, не соответствующих предикату
- Конечный кусок может иметь размер меньше размера фрагмента, потому что все элементы были учтены.
Неисчерпывающие примеры:
Простейший пример - рассмотреть 1
s и 0
s, где есть функция предиката x ==> x > 0
. В этом случае sum
каждый блок должен соответствовать размеру блока.
- элементы:,
[]
размер:,2
предикат:x > 0
->[]
или[[]]
- элементы:,
[0, 0, 0, 0, 0, 0]
размер:,2
предикат:x > 0
->[[0, 0, 0, 0, 0, 0]]
- элементы:,
[0, 1, 1, 0]
размер:,2
предикат:x > 0
->[[0, 1, 1, 0]]
- элементы:,
[0, 1, 1, 0, 1, 0, 0]
размер:,2
предикат:x > 0
->[[0, 1, 1, 0], [1, 0, 0]]
- элементы:,
[0, 1, 0, 0, 1, 0, 1, 1, 0]
размер:,2
предикат:x > 0
->[[0, 1, 0, 0, 1, 0], [1, 1, 0]]
И давайте закончим с пассажирами самолета, где дети сидят на коленях у родителей . A
для взрослого, b
для ребенка, плоскость ряда 3
широкая, взрослый всегда указан перед своим ребенком:
- элементы:,
[A, b, A, b, A, A, A, b, A, b, A, A, b]
размер:,3
предикат:x => x == A
->[[A, b, A, b, A], [A, A, b, A, b], [A, A, b]]
code-golf
set-partitions
Том Винер
источник
источник
Ответы:
Желе , 10 байт
Полная программа, принимающая монадическую функцию черного ящика в качестве первого необязательного аргумента, список в качестве второго необязательного аргумента и размер фрагмента в качестве третьего необязательного аргумента, который печатает представление Python результирующего списка списков (чтобы избежать неявного разрушения Jelly списки, содержащие символы).
Попробуйте онлайн! (обратите внимание, что список символов передается в программу Jelly путем форматирования его как строки в кавычках Python)
Как?
источник
Брахилог , 37 байт
Попробуйте онлайн!
Я был приятно удивлен, обнаружив, что это - в значительной степени переформулировка вопроса - успешно завершается и дает правильный результат.
Предполагается, что предикат присутствует как предикат 2 под этим кодом. Выводит список списков («чанков») или
false
для пустого ввода.Объяснение:
источник
Apl (Dyalog Unicode)
1716 байт (SBCS)Спасибо Адаму за то, что он спас мне 1 байт.
Попробуйте онлайн! В целях объяснения я оставлю 17-байтовое решение.
⍺⍺¨⍵
применяет предикат к списку, возвращая логический вектор,+\
генерирует промежуточный итог,1⌈
заменяет начальные0
s на1
s,⌈⍺÷⍨
делит каждый элемент на размер фрагмента и округляет до⍵⊆⍨
исходного вектора этот вектористочник
w⊆⍨⌈⎕÷⍨1⌈+\⎕¨w←⎕
Чисто ,
9692 байтаИспользует именованную функцию,
f :: a -> Bool
разрешенную в соответствии с мета-консенсусом.Попробуйте онлайн!
Расширен (с подсветкой по умолчанию для отображения комментариев):
источник
Java 10,
207186159148 байтJava определенно не является подходящим языком для этой задачи (или любой проблемы с Codegolf, конечно ..)
-21 байт благодаря @OOBalance
Попробуйте онлайн.
Объяснение:
Формат ввода черного ящика:
Предполагается, что именованная функция
boolean f(Object i)
присутствует, что разрешено в соответствии с этим мета-ответом .У меня есть абстрактный класс,
Test
содержащий функцию по умолчаниюf(i)
, а также лямбду выше:Для тестовых случаев я перезаписываю эту функцию
f
. Например, последний тестовый пример называется так:источник
(or any codegolf-challenge of course..)
Да, я не знаю, вы избили мои Чистые ответы, по крайней мере, в нескольких случаях. Во всяком случае, я всегда с нетерпением жду ваших ответов.Arrays.copyOfRange
!.sublist
. Ваша функциональность остается такой же, кроме этого, но она экономит много байтов и удаляет импорт. (И теперь это также работает для тестового случая с символами вместо целых чисел.)R , 58 байт
Попробуйте онлайн!
источник
С (ССЗ) ,
7066 байтЯ использую структуру, чтобы отметить начало подсписка, поскольку C не знает о таких вещах.
Спасибо потолку за предложения.
Попробуйте онлайн!
источник
Haskell, 72 байта
Попробуйте онлайн!
источник
MATL, 19 байт
Основанный на превосходном ответе jslip APL .
MATL на самом деле не имеет пользовательских функций как таковых, но у него есть способ вызвать среду, в которой он работает (MATLAB / Octave), поэтому он использует это для функции предиката. Использование будет примерно таким , но эта функциональность отключена в сети из соображений безопасности, поэтому вот версия, в которой
isodd
вместо этого используется жестко закодированная функция предиката: попробуйте ее в MATL Online .источник
JavaScript (ES6), 69 байт
Сохранено 3 байта благодаря @tsh
Принимает ввод в синтаксис карри
(size)(predicate)(array)
.Попробуйте онлайн!
источник
s=>p=>g=a=>a.every(x=>p(x)?k--:++j,j=k=s)?[a]:[a.splice(0,j),...g(a)]
Рубин , 57 байт
Попробуйте онлайн!
Анонимная лямбда принимает входной массив
a
, размер чанкаn
и предикатg
. Поддерживает счетчикc
элементов, соответствующих предикату, и группирует элементы по количеству уже использованных фрагментов. К сожалению, начальное значение -1 / n не округляется до 0, поэтому нам нужно потратить несколько байтов, чтобы исправить это.источник
R , 100 байт
Попробуйте онлайн!
перехитрила ловко от DigEmAll
источник
Python 2 , 92 байта
Попробуйте онлайн!
источник
JavaScript (Node.js) , 90 байт
Попробуйте онлайн!
Вызывать как
F(2, x => x > 0)([0, 1, 1, 0])
источник
Mathematica, 82 байта
Ungolfed:
l
список ввода;s
размер куска;p
является неназванной / анонимной / чистой / лямбда-функцией, которая возвращает истину / ложь, работая с элементами списка.Last@Reap[...]
возвращает список списков каждого элемента, который былSow
-n внутри...
. Они сгруппированы в подсписки, вторым аргументомe~Sow~t
которых является сокращениеSow[e, t]
.Мне пришлось инициализировать счетчики -1, чтобы обработать размер куска 1, в противном случае мне нужно будет проверить
Mod[i, s]
(i~Mod~s
) равным 1, чего никогда не произойдет.Остальная часть кода объясняется в блоке ungolfed.
источник