Motivação : Às vezes, certos itens de uma lista não contam para o seu total. Por exemplo, contando passageiros de avião em filas, onde os bebês sentam no colo dos pais.
Desafio : escreva um programa para dividir uma lista de itens em pedaços. Cada pedaço (exceto possivelmente o último) tem o mesmo tamanho , em que tamanho é definido como o número de itens que passam por uma função predicada.
Regras :
- Seu programa deve levar
- uma lista de itens
- um tamanho de pedaço inteiro positivo
- uma função predicada (pega um item e retorna verdadeiro ou falso)
- Você deve retornar a lista de entrada dividida em partes
- Cada pedaço é uma lista de itens
- No geral, os itens devem permanecer na mesma ordem, sem nenhum descartado
- O número de itens que passam o predicado em cada bloco (exceto possivelmente o último) deve corresponder ao tamanho do bloco de entrada.
- itens com falha no predicado não devem contar para esse tamanho
- Itens com falha no predicado são
- ainda incluído nos pedaços de saída
- alocado para o primeiro pedaço, no caso de um pedaço estar "cheio", mas os próximos itens falharem no predicado
- portanto, o pedaço final pode não consistir apenas em itens que falham no predicado
- O pedaço final pode ter tamanho menor que o tamanho do pedaço, porque todos os itens foram contabilizados.
Exemplos não exaustivos:
O exemplo mais simples é considerar 1
s e 0
s, onde está a função predicada x ==> x > 0
. Nesse caso, o sum
de cada pedaço deve corresponder ao tamanho do pedaço.
- itens :,
[]
tamanho2
:, predicado:x > 0
->[]
ou[[]]
- itens :,
[0, 0, 0, 0, 0, 0]
tamanho2
:, predicado:x > 0
->[[0, 0, 0, 0, 0, 0]]
- itens :,
[0, 1, 1, 0]
tamanho2
:, predicado:x > 0
->[[0, 1, 1, 0]]
- itens :,
[0, 1, 1, 0, 1, 0, 0]
tamanho2
:, predicado:x > 0
->[[0, 1, 1, 0], [1, 0, 0]]
- itens :,
[0, 1, 0, 0, 1, 0, 1, 1, 0]
tamanho2
:, predicado:x > 0
->[[0, 1, 0, 0, 1, 0], [1, 1, 0]]
E vamos terminar com os passageiros do avião, onde os bebês se sentam no exemplo do colo dos pais . A
para adulto, b
para bebê, a fila do avião tem 3
assentos largos, o adulto sempre é listado antes do bebê:
- itens :,
[A, b, A, b, A, A, A, b, A, b, A, A, b]
tamanho3
:, predicado:x => x == A
->[[A, b, A, b, A], [A, A, b, A, b], [A, A, b]]
fonte
Respostas:
Gelatina , 10 bytes
Um programa completo que toma a função de caixa preta monádica como o primeiro argumento opcional, a lista como o segundo argumento opcional e o tamanho do bloco como o terceiro argumento opcional que imprime uma representação em Python da lista de listas resultante (para evitar o esmagamento implícito de Jelly na lista). listas contendo caracteres).
Experimente online! (observe que uma lista de caracteres é passada para um programa Jelly formatando-o como uma string citada em Python)
Quão?
fonte
Braquilog , 37 bytes
Experimente online!
Fiquei agradavelmente surpreso ao descobrir que isso - praticamente uma reafirmação da pergunta - termina com êxito e produz saída correta.
Supõe que o predicado está presente como predicado 2 abaixo deste código. Produz uma lista de listas ("chunks") ou
false
para uma entrada vazia.Explicação:
fonte
Apl (Dyalog Unicode)
1716 bytes (SBCS)Obrigado a Adám por me salvar 1 byte.
Experimente online! para fins de explicação, deixarei a solução de 17 bytes.
⍺⍺¨⍵
aplicar o predicado à lista que retorna um vetor booleano+\
gera um total em execução que1⌈
substitui0
s com1
s⌈⍺÷⍨
divide cada elemento pelo tamanho do pedaço e arredonda as⍵⊆⍨
partições do vetor original por estefonte
w⊆⍨⌈⎕÷⍨1⌈+\⎕¨w←⎕
Limpo ,
9692 bytesUsa uma função nomeada
f :: a -> Bool
permitida de acordo com o meta consenso.Experimente online!
Expandido (com destaque padrão para que os comentários apareçam):
fonte
Java 10,
207186159148 bytesDefinitivamente, Java não é a linguagem certa para esse desafio (ou qualquer desafio do codegolf, é claro ..)
-21 bytes graças a @OOBalance
Experimente online.
Explicação:
Formato de entrada da caixa preta:
Supõe que uma função nomeada
boolean f(Object i)
esteja presente, o que é permitido de acordo com esta meta resposta .Eu tenho uma classe abstrata
Test
contendo a função padrãof(i)
, bem como a lambda acima:Para os casos de teste, substituo essa função
f
. Por exemplo, o último caso de teste é chamado assim:fonte
(or any codegolf-challenge of course..)
" ehh eu não sei, você venceu minhas respostas limpas em pelo menos alguns casos. De qualquer forma, estou sempre ansioso por suas respostas.Arrays.copyOfRange
!.sublist
. Sua funcionalidade permanece a mesma, exceto isso, mas economiza muitos bytes e remove a importação. (E agora ele também funciona para o teste-caso com caracteres em vez de números inteiros.)R , 58 bytes
Experimente online!
fonte
C (gcc) ,
7066 bytesEu uso uma estrutura para observar o início de uma sub-lista, pois C não sabe sobre essas coisas.
Obrigado ao ceilingcat pelas sugestões.
Experimente online!
fonte
Haskell, 72 bytes
Experimente online!
fonte
MATL, 19 bytes
Baseado na excelente resposta APL do jslip .
O MATL realmente não possui funções definidas pelo usuário, mas possui uma maneira de chamar o ambiente em que está sendo executado (MATLAB / Octave), portanto, isso é usado para a função predicada. O uso seria algo parecido com isto , mas essa funcionalidade é desativada online por razões de segurança, então aqui está uma versão que usa uma
isodd
função de predicado codificada em vez disso: Experimente no MATL Online .fonte
JavaScript (ES6), 69 bytes
Guardado 3 bytes graças a @tsh
Recebe entrada na sintaxe de currying
(size)(predicate)(array)
.Experimente online!
fonte
s=>p=>g=a=>a.every(x=>p(x)?k--:++j,j=k=s)?[a]:[a.splice(0,j),...g(a)]
Ruby , 57 bytes
Experimente online!
Lambda anônima que aceita matriz de entrada
a
, tamanho de blocon
e predicadog
. Mantém um contadorc
de itens que correspondem ao predicado e agrupa itens pelo número de pedaços já usados. Infelizmente, o valor inicial -1 / n não chega a 0, portanto, temos que gastar alguns bytes para corrigi-lo.fonte
R , 100 bytes
Experimente online!
superado por digEmAll
fonte
Python 2 , 92 bytes
Experimente online!
fonte
JavaScript (Node.js) , 90 bytes
Experimente online!
Invocar como
F(2, x => x > 0)([0, 1, 1, 0])
fonte
Mathematica, 82 bytes
Ungolfed:
l
é a lista de entrada;s
é o tamanho do pedaço;p
é uma função sem nome / anônima / pura / lambda que retorna verdadeiro / falso operando nos elementos da lista.Last@Reap[...]
retorna uma lista de listas de todos os elementos que estavamSow
-n dentro de...
. Eles são agrupados em sublistas cujo segundo argumentoe~Sow~t
é uma abreviaçãoSow[e, t]
.Eu tive que inicializar contadores para -1 para lidar com um tamanho de bloco de 1, caso contrário, eu precisaria verificar
Mod[i, s]
(i~Mod~s
) igual a 1, o que nunca poderia acontecer.O restante do código é explicado no bloco não destruído.
fonte