Motivación : a veces, ciertos elementos de una lista no cuentan para sus totales. Por ejemplo, contando pasajeros de avión en filas, donde los bebés se sientan en el regazo de los padres.
Desafío : escriba un programa para dividir una lista de elementos en trozos. Cada fragmento (excepto posiblemente el último) tiene el mismo tamaño , donde el tamaño se define como el número de elementos que pasan una función de predicado.
reglas :
- Su programa debe tomar
- una lista de artículos
- un tamaño de fragmento entero positivo
- una función de predicado (toma un elemento y devuelve verdadero o falso)
- Debe devolver la lista de entrada dividida en fragmentos
- Cada fragmento es una lista de elementos
- En general, los artículos deben permanecer en el mismo orden, sin descartar ninguno
- El número de elementos que pasan el predicado en cada fragmento (excepto posiblemente el último) debe coincidir con el tamaño del fragmento de entrada.
- los elementos que fallan en el predicado no deben contar para este tamaño
- Los elementos que fallan en el predicado son
- todavía incluido en los fragmentos de salida
- asignado al primer fragmento, en el caso de que un fragmento esté "lleno", pero los siguientes elementos son los que fallan en el predicado
- por lo tanto, el fragmento final no puede consistir únicamente en elementos que fallan el predicado
- El fragmento final puede tener un tamaño menor que el tamaño del fragmento porque todos los elementos se han contabilizado.
Ejemplos no exhaustivos:
El ejemplo más simple es considerar 1sy 0s, donde está la función predicado x ==> x > 0. En este caso, el sumde cada fragmento debe coincidir con el tamaño del fragmento.
- elementos:,
[]tamaño:,2predicado:x > 0-> cualquiera[]o[[]] - elementos:,
[0, 0, 0, 0, 0, 0]tamaño:,2predicado:x > 0->[[0, 0, 0, 0, 0, 0]] - elementos:,
[0, 1, 1, 0]tamaño:,2predicado:x > 0->[[0, 1, 1, 0]] - elementos:,
[0, 1, 1, 0, 1, 0, 0]tamaño:,2predicado:x > 0->[[0, 1, 1, 0], [1, 0, 0]] - elementos:,
[0, 1, 0, 0, 1, 0, 1, 1, 0]tamaño:,2predicado:x > 0->[[0, 1, 0, 0, 1, 0], [1, 1, 0]]
Y terminemos con los pasajeros del avión donde los bebés se sientan en el regazo de un padre . Apara adultos, bpara bebés, la fila del avión tiene 3asientos anchos, los adultos siempre aparecen antes que su bebé:
- elementos:,
[A, b, A, b, A, A, A, b, A, b, A, A, b]tamaño:,3predicado:x => x == A->[[A, b, A, b, A], [A, A, b, A, b], [A, A, b]]
fuente

Respuestas:
Jalea , 10 bytes
Un programa completo que toma la función de caja negra monádica como el primer argumento opcional, la lista como el segundo argumento opcional y el tamaño del fragmento como el tercer argumento opcional que imprime una representación de Python de la lista de listas resultante (para evitar la destrucción implícita de Jelly de listas que contienen caracteres).
Pruébalo en línea! (tenga en cuenta que una lista de caracteres se pasa a un programa Jelly formateándolo como una cadena citada por Python)
¿Cómo?
fuente
Brachylog , 37 bytes
Pruébalo en línea!
Me sorprendió gratamente descubrir que esto, más o menos una reformulación de la pregunta, finaliza con éxito y produce una salida correcta.
Asume que el predicado está presente como predicado 2 debajo de este código. Emite una lista de listas ("fragmentos") o
falsepara una entrada vacía.Explicación:
fuente
Apl (Dyalog Unicode)
1716 bytes (SBCS)Gracias a Adám por salvarme 1 byte.
Pruébalo en línea! Para fines de explicación, dejaré la solución de 17 bytes.
⍺⍺¨⍵aplica el predicado a la lista que devuelve un vector booleano,+\genera un total acumulado,1⌈reemplaza0s por1s,⌈⍺÷⍨divide cada elemento por el tamaño del fragmento y redondea las⍵⊆⍨particiones del vector original por estefuente
w⊆⍨⌈⎕÷⍨1⌈+\⎕¨w←⎕Limpio ,
9692 bytesUtiliza una función con nombre
f :: a -> Boolpermitida según el meta consenso.Pruébalo en línea!
Ampliado (con resaltado predeterminado para que aparezcan los comentarios):
fuente
Java 10,
207186159148 bytesJava definitivamente no es el lenguaje adecuado para este desafío (o cualquier desafío de codegolf, por supuesto ...)
-21 bytes gracias a @OOBalance
Pruébalo en línea.
Explicación:
Formato de entrada de caja negra:
Asume que hay una función con nombre
boolean f(Object i), que se permite de acuerdo con esta meta respuesta .Tengo una clase abstracta que
Testcontiene la función predeterminadaf(i), así como la lambda anterior:Para los casos de prueba, sobrescribo esta función
f. Por ejemplo, el último caso de prueba se llama así:fuente
(or any codegolf-challenge of course..)" ehh no sé, has superado mis respuestas limpias en al menos algunos casos. De todos modos, siempre espero sus respuestas.Arrays.copyOfRange!.sublist. Su funcionalidad sigue siendo la misma, aparte de eso, pero ahorra muchos bytes y elimina la importación. (Y ahora también funciona para el caso de prueba con caracteres en lugar de enteros.)R , 58 bytes
Pruébalo en línea!
fuente
C (gcc) ,
7066 bytesUtilizo una estructura para anotar el inicio de una sublista, ya que C no sabe sobre tales cosas.
Gracias a ceilingcat por las sugerencias.
Pruébalo en línea!
fuente
Haskell, 72 bytes
Pruébalo en línea!
fuente
MATL, 19 bytes
Basado en la excelente respuesta APL de jslip .
MATL realmente no tiene funciones definidas por el usuario como tales, pero tiene una forma de llamar al entorno en el que se está ejecutando (MATLAB / Octave), por lo que esto lo usa para la función de predicado. El uso sería algo como esto , pero esa funcionalidad está deshabilitada en línea por razones de seguridad, así que aquí hay una versión que utiliza una
isoddfunción de predicado codificada en su lugar: Pruébelo en MATL Online .fuente
JavaScript (ES6), 69 bytes
Guardado 3 bytes gracias a @tsh
Toma entrada en la sintaxis de curry
(size)(predicate)(array).Pruébalo en línea!
fuente
s=>p=>g=a=>a.every(x=>p(x)?k--:++j,j=k=s)?[a]:[a.splice(0,j),...g(a)]Ruby , 57 bytes
Pruébalo en línea!
Matriz de entrada que acepta lambda anónima
a, tamaño de fragmentony predicadog. Mantiene un contadorcde elementos que coinciden con el predicado y agrupa los elementos por el número de fragmentos ya usados. Desafortunadamente, el valor inicial -1 / n no se redondea a 0, por lo que tenemos que gastar algunos bytes para solucionarlo.fuente
R , 100 bytes
Pruébalo en línea!
superado fácilmente por digEmAll
fuente
Python 2 , 92 bytes
Pruébalo en línea!
fuente
JavaScript (Node.js) , 90 bytes
Pruébalo en línea!
Invocar como
F(2, x => x > 0)([0, 1, 1, 0])fuente
Mathematica, 82 bytes
Sin golf:
les la lista de entrada;ses del tamaño de un trozo;pes una función sin nombre / anónima / pura / lambda que devuelve verdadero / falso operando en elementos de la lista.Last@Reap[...]devuelve una lista de listas de cada elemento que estabaSow-n dentro de.... Se agrupan en sublistas por el segundo argumento,e~Sow~tque es la abreviatura deSow[e, t].Tuve que inicializar los contadores a -1 para manejar un tamaño de fragmento de 1, de lo contrario tendría que marcar
Mod[i, s](i~Mod~s) igual a 1, lo que nunca podría suceder.El resto del código se explica en el bloque sin golf.
fuente