Motivation : Parfois, certains éléments d'une liste ne comptent pas dans vos totaux. Par exemple, compter les passagers d'un avion en rangées, où les bébés sont assis sur les genoux d'un parent.
Défi : écrire un programme pour diviser une liste d'articles en morceaux. Chaque bloc (sauf éventuellement le dernier) a la même taille , où la taille est définie comme le nombre d'éléments passant une fonction de prédicat.
Règles :
- Votre programme doit prendre
- une liste d'articles
- une taille de bloc entière positive
- une fonction de prédicat (prend un élément et renvoie vrai ou faux)
- Vous devez renvoyer la liste d'entrée divisée en morceaux
- Chaque morceau est une liste d'articles
- Globalement, les articles doivent rester dans le même ordre, aucun n'est ignoré
- Le nombre d'éléments passant le prédicat dans chaque bloc (sauf éventuellement le dernier) doit correspondre à la taille du bloc d'entrée.
- les éléments qui échouent au prédicat ne doivent pas compter dans cette taille
- Les éléments qui échouent au prédicat sont
- toujours inclus dans les morceaux de sortie
- alloué au premier morceau, dans le cas où un morceau est "plein" mais les éléments suivants sont ceux qui échouent au prédicat
- ainsi le dernier morceau peut ne pas être composé uniquement d'éléments ne respectant pas le prédicat
- Le morceau final peut être de taille inférieure à la taille du morceau car tous les articles ont été pris en compte.
Exemples non exhaustifs:
L'exemple le plus simple consiste à considérer 1
s et 0
s, où se trouve la fonction de prédicat x ==> x > 0
. Dans ce cas, le sum
de chaque bloc doit correspondre à la taille du bloc.
- éléments:,
[]
taille2
:, prédicat:x > 0
->[]
ou[[]]
- articles:,
[0, 0, 0, 0, 0, 0]
taille2
:, prédicat:x > 0
->[[0, 0, 0, 0, 0, 0]]
- articles:,
[0, 1, 1, 0]
taille2
:, prédicat:x > 0
->[[0, 1, 1, 0]]
- articles:,
[0, 1, 1, 0, 1, 0, 0]
taille2
:, prédicat:x > 0
->[[0, 1, 1, 0], [1, 0, 0]]
- articles:,
[0, 1, 0, 0, 1, 0, 1, 1, 0]
taille2
:, prédicat:x > 0
->[[0, 1, 0, 0, 1, 0], [1, 1, 0]]
Et terminons avec les passagers de l' avion où les bébés sont assis sur les genoux d'un parent . A
pour adulte, b
pour bébé, la rangée de l'avion est 3
large, les adultes sont toujours répertoriés avant leur bébé:
- articles:,
[A, b, A, b, A, A, A, b, A, b, A, A, b]
taille3
:, prédicat:x => x == A
->[[A, b, A, b, A], [A, A, b, A, b], [A, A, b]]
la source
Réponses:
Gelée , 10 octets
Un programme complet prenant la fonction de boîte noire monadique comme premier argument facultatif, la liste comme deuxième argument facultatif et la taille de bloc comme troisième argument facultatif qui imprime une représentation Python de la liste résultante des listes (pour éviter le broyage implicite de Jelly de listes contenant des caractères).
Essayez-le en ligne! (notez qu'une liste de caractères est passée à un programme Jelly en le formatant comme une chaîne entre guillemets Python)
Comment?
la source
Brachylog , 37 octets
Essayez-le en ligne!
J'ai été agréablement surpris de constater que cela - à peu près une reformulation de la question - se termine avec succès et produit une sortie correcte.
Suppose que le prédicat est présent en tant que prédicat 2 sous ce code. Sort une liste de listes ("morceaux"), ou
false
pour une entrée vide.Explication:
la source
Apl (Dyalog Unicode)
1716 octets (SBCS)Merci à Adám de m'avoir sauvé 1 octet.
Essayez-le en ligne! à des fins d'explication, je vais laisser la solution de 17 octets.
⍺⍺¨⍵
applique le prédicat à la liste renvoyant un vecteur booléen+\
génère un total cumulé1⌈
remplace le début0
s par1
s⌈⍺÷⍨
divise chaque élément par la taille du bloc et arrondit les⍵⊆⍨
partitions du vecteur d'origine par cela source
w⊆⍨⌈⎕÷⍨1⌈+\⎕¨w←⎕
Nettoyer ,
9692 octetsUtilise une fonction nommée
f :: a -> Bool
autorisée selon le méta consensus.Essayez-le en ligne!
Développé (avec mise en surbrillance par défaut pour faire apparaître les commentaires):
la source
Java 10,
207186159148 octetsJava n'est certainement pas le bon langage pour ce défi (ou tout défi de codegolf bien sûr ..)
-21 octets grâce à @OOBalance
Essayez-le en ligne.
Explication:
Format d'entrée de la boîte noire:
Suppose qu'une fonction nommée
boolean f(Object i)
est présente, ce qui est autorisé en fonction de cette méta-réponse .J'ai une classe abstraite
Test
contenant la fonction par défautf(i)
, ainsi que la lambda ci-dessus:Pour les cas de test, j'écrase cette fonction
f
. Par exemple, le dernier cas de test est appelé comme ceci:la source
(or any codegolf-challenge of course..)
" ehh je ne sais pas, vous avez battu mes réponses Clean dans au moins quelques cas. Quoi qu'il en soit, j'attends toujours vos réponses avec impatience.Arrays.copyOfRange
!.sublist
. Votre fonctionnalité reste la même à part cela, mais elle économise beaucoup d'octets et supprime l'importation. (Et maintenant, cela fonctionne également pour le cas de test avec des caractères au lieu d'entiers.)R , 58 octets
Essayez-le en ligne!
la source
C (gcc) ,
7066 octetsJ'utilise une structure pour noter le début d'une sous-liste, car C ne sait pas de telles choses.
Merci à plafondcat pour les suggestions.
Essayez-le en ligne!
la source
Haskell, 72 octets
Essayez-le en ligne!
la source
MATL, 19 octets
Basé sur l'excellente réponse APL de jslip .
MATL n'a pas vraiment de fonctions définies par l'utilisateur en tant que telles, mais il a un moyen d'appeler l'environnement sur lequel il s'exécute (MATLAB / Octave), donc cela l'utilise pour la fonction de prédicat. L'utilisation serait quelque chose comme ça , mais cette fonctionnalité est désactivée en ligne pour des raisons de sécurité, alors voici une version qui utilise une
isodd
fonction de prédicat codée en dur à la place: Essayez-la sur MATL Online .la source
JavaScript (ES6), 69 octets
Sauvegardé 3 octets grâce à @tsh
Prend une entrée dans la syntaxe de curry
(size)(predicate)(array)
.Essayez-le en ligne!
la source
s=>p=>g=a=>a.every(x=>p(x)?k--:++j,j=k=s)?[a]:[a.splice(0,j),...g(a)]
Rubis , 57 octets
Essayez-le en ligne!
Lambda anonyme acceptant un tableau d'entrée
a
, une taille de blocn
et un prédicatg
. Gère un compteurc
d'éléments correspondant au prédicat et regroupe les éléments en fonction du nombre de morceaux déjà utilisés. Malheureusement, la valeur initiale -1 / n n'est pas arrondie à 0, nous devons donc dépenser quelques octets pour le corriger.la source
R , 100 octets
Essayez-le en ligne!
dominé par digEmAll
la source
Python 2 , 92 octets
Essayez-le en ligne!
la source
JavaScript (Node.js) , 90 octets
Essayez-le en ligne!
Appeler en tant que
F(2, x => x > 0)([0, 1, 1, 0])
la source
Mathematica, 82 octets
Non golfé:
l
est la liste d'entrée;s
est la taille d'un morceau;p
est une fonction sans nom / anonyme / pure / lambda qui renvoie true / false opérant sur les éléments de la liste.Last@Reap[...]
renvoie une liste de listes de chaque élément qui étaitSow
-n à l'intérieur de...
. Ils sont regroupés en sous-listes dont le deuxième argumente~Sow~t
est l'abréviation deSow[e, t]
.J'ai dû initialiser les compteurs à -1 pour gérer une taille de bloc de 1, sinon je devrais vérifier
Mod[i, s]
(i~Mod~s
) égal à 1, ce qui ne pourrait jamais arriver.Le reste du code est expliqué dans le bloc non golfé.
la source