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 1
sy 0
s, donde está la función predicado x ==> x > 0
. En este caso, el sum
de cada fragmento debe coincidir con el tamaño del fragmento.
- elementos:,
[]
tamaño:,2
predicado:x > 0
-> cualquiera[]
o[[]]
- elementos:,
[0, 0, 0, 0, 0, 0]
tamaño:,2
predicado:x > 0
->[[0, 0, 0, 0, 0, 0]]
- elementos:,
[0, 1, 1, 0]
tamaño:,2
predicado:x > 0
->[[0, 1, 1, 0]]
- elementos:,
[0, 1, 1, 0, 1, 0, 0]
tamaño:,2
predicado:x > 0
->[[0, 1, 1, 0], [1, 0, 0]]
- elementos:,
[0, 1, 0, 0, 1, 0, 1, 1, 0]
tamaño:,2
predicado: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 . A
para adultos, b
para bebés, la fila del avión tiene 3
asientos 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:,3
predicado: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
false
para 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⌈
reemplaza0
s por1
s,⌈⍺÷⍨
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 -> Bool
permitida 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
Test
contiene 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
isodd
funció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 fragmenton
y predicadog
. Mantiene un contadorc
de 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:
l
es la lista de entrada;s
es del tamaño de un trozo;p
es 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~t
que 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