Introduction et crédit
Aujourd'hui sans prélude sophistiqué: veuillez mettre en œuvre takewhile
.
Une variation de ceci (sur une structure de données non triviale) était une affectation à mon cours de programmation fonctionnelle universitaire. Ce devoir est maintenant fermé et a été discuté en classe et j'ai la permission de mon professeur de le poster ici (j'ai demandé explicitement).
spécification
Contribution
L'entrée sera une liste (ou le concept équivalent de votre langue) d'entiers positifs.
Sortie
La sortie doit être une liste (ou le concept équivalent de votre langue) d'entiers positifs.
Que faire?
Votre tâche est d'implémenter takewhile
(les langues intégrées sont autorisées) avec le prédicat que le nombre considéré est pair (pour se concentrer sur le temps).
Donc, vous parcourez la liste du début à la fin et pendant que la condition (est paire), vous copiez dans la liste de sortie et dès que vous frappez un élément qui ne rend pas la condition vraie, vous abandonnez l'opération et la sortie (un exemple étape par étape est ci-dessous). Cette fonctionnalité d'ordre supérieur est également appelée takeWhile ( takewhile
).
Boîtes de coin potentielles
L'ordre de la liste de sortie par rapport à la liste d'entrée ne peut pas être modifié, par exemple [14,42,2]
peut ne pas devenir [42,14]
.
La liste vide est une entrée et une sortie valides.
Qui gagne?
Il s'agit de code-golf, donc la réponse la plus courte en octets l'emporte!
Les règles standard s'appliquent bien sûr.
Vecteurs de test
[14, 42, 2324, 97090, 4080622, 171480372] -> [14, 42, 2324, 97090, 4080622, 171480372]
[42, 14, 42, 2324] -> [42, 14, 42, 2324]
[7,14,42] -> []
[] -> []
[171480372, 13, 14, 42] -> [171480372]
[42, 14, 42, 43, 41, 4080622, 171480372] -> [42, 14, 42]
Exemple pas à pas
Example Input: [42, 14, 42, 43, 41, 4080622, 171480372]
Consider first element: 42
42 is even (21*2)
Put 42 into output list, output list is now [42]
Consider second element: 14
14 is even (7*2)
Put 14 into output list, output list is now [42,14]
Consider third element: 42
42 is even (21*2)
Put 42 into output list, output list is now [42,14,42]
Consider fourth element: 43
43 is not even (2*21+1)
Drop 43 and return the current output list
return [42,14,42]
Réponses:
Mathematica, 18 octets
Un autre glorieux intégré qui est battu par un facteur de 3 par les langues de golf sans le ...
la source
Haskell, 13 octets
span
divise la liste d'entrée en une paire de listes juste avant le premier élément où le prédicat (->even
) est faux.fst
prend le premier élément de la paire.Version alternative, 13 octets:
break
est l'opposé despan
, c'est-à-dire qu'il fractionne la liste au premier élément où le prédicat est vrai.Bien sûr, il y a aussi
mais cela fait 14 octets.
la source
MATL , 6 octets
Essayez-le en ligne!
Explication
la source
to~Y<)
fonctionne aussi, mais j'aime mieux celui-ci :-)Hexagonie , 19
Lisible:
Essayez-le en ligne!
Cela peut probablement être joué par un octet ou deux, mais cela pourrait nécessiter une mise en page vraiment ingénieuse, qui pourrait être plus facilement trouvée via la force brute (même si cela peut prendre un certain temps pour le trouver).
Explication de haut niveau
Le programme suit principalement ce pseudocode:
Ce qui abuse de la façon dont Hexagony essaie de lire un nombre une fois que STDIN est vide (il renvoie un zéro). Un grand merci à Martin pour son aide dans l'élaboration de cette approche.
Explication complète
Je n'ai pas encore tripoté Mono pour faire tourner l' IDE ésotérique fantastique de Timwi , alors je me suis appuyé sur Martin pour me fournir de jolies photos utiles!
Tout d'abord, une petite introduction au flux de contrôle de base en hexagonie. Le premier pointeur d'instruction (IP), qui est le seul utilisé dans ce programme, commence en haut à gauche du code source hexagonal et commence à se déplacer vers la droite. Chaque fois que l'IP quitte le bord de l'hexagone, il déplace les
side_length - 1
rangées vers le milieu de l'hexagone. Étant donné que ce programme utilise un côté hexagonal de trois côtés, l'IP se déplacera toujours de deux lignes lorsque cela se produit. La seule exception est si elle se déplace hors de la ligne du milieu, où elle se déplace conditionnellement vers le haut ou le bas de l'hexagone, en fonction de la valeur du bord de mémoire actuel.Maintenant, un peu sur les conditions. Les seules conditions dans les Hexagony de flux de commande sont
>
,<
et le bord intermédiaire de l'hexagone. Ils suivent tous une règle constante: si la valeur sur le front de mémoire actuel est nulle ou si le flux de contrôle négatif se déplace vers la gauche et s'il est positif, le contrôle circule vers la droite. Les crochets supérieurs et inférieurs redirigent l'IP à des angles de soixante degrés, tandis que le bord de l'hexagone contrôle la ligne sur laquelle l'IP saute.Hexagony a également un modèle de mémoire spécial, où toutes les données sont stockées sur les bords d'une grille hexagonale infinie. Ce programme n'utilise que trois arêtes: une pour stocker deux, une pour le nombre actuellement lu et une pour le nombre modulo deux. Cela ressemble à quelque chose comme:
Je ne vais pas expliquer avec soin où nous sommes en mémoire à chaque moment pendant l'explication du programme, alors revenez ici si vous êtes confus par où nous sommes en mémoire.
Avec tout cela à l'écart, l'explication réelle peut commencer. D'abord, nous remplissons le bord "2" en mémoire avec un 2, puis nous exécutons un no-op et déplaçons le pointeur de mémoire vers la droite (
2.}
).Ensuite, nous commençons la boucle du programme principal. Nous lisons le premier nombre de STDIN puis nous frappons un conditionnel (
?<
). S'il n'y a plus de chiffres dans STDIN, cela lit un zéro dans le bord de mémoire actuel, nous tournons donc à gauche sur le@
, ce qui termine le programme. Sinon, nous rebondissons sur un miroir, déplaçons le pointeur de mémoire vers l'arrière et vers la gauche, enroulons autour de l'hexagone pour calculer le reste de la division de l'entrée par 2, puis frappons un autre conditionnel (/"%>
).Si le reste était un (c.-à-d. Que le nombre était impair), nous tournons à droite en suivant le chemin bleu ci-dessus en commençant par exécuter à nouveau le no-op, puis nous enroulons autour du bas de l'hexagone, multiplions le bord actuel par 10, puis ajoutons huit, rebondissez sur quelques miroirs, effectuez la même multiplication et addition à nouveau, en obtenant 188 sur le bord actuel, en revenant au sommet de l'hexagone, en exécutant à nouveau le no-op et en terminant enfin le programme (
.8/\8.@
). Ce résultat alambiqué était un heureux accident, j'avais à l'origine écrit un peu de logique beaucoup plus simple, mais j'ai remarqué que je pouvais le supprimer en faveur du no-op, ce que je pensais être plus dans l'esprit d'Hexagony.Si le reste était nul, nous tournerons à gauche en suivant le chemin rouge ci-dessus. Cela nous amène à déplacer le pointeur de mémoire vers la gauche, puis à y imprimer la valeur (la valeur d'entrée) sous forme de nombre. Le miroir que nous rencontrons agit comme un no-op en raison de la direction dans laquelle nous nous déplaçons (
{/!
). Ensuite, nous frappons le bord de l'hexagone qui agit comme un conditionnel avec un seul résultat, car la valeur d'entrée d'avant a déjà été testée pour être positive, nous nous déplaçons donc toujours vers la droite (si vous vous imaginez face à la direction de l'IP) . Nous multiplions ensuite l'entrée par 10 et en ajoutons deux, seulement pour changer de direction, envelopper et écraser la nouvelle valeur avec la valeur ascii de la lettre majuscule M, 77. Ensuite, nous frappons quelques miroirs et sortons sur le bord du milieu de l'hexagone avec un trampoline (2<M\>$
). Puisque 77 est positif, nous nous déplaçons à droite vers le bas de l'hexagone et à cause du trampoline sautez la première instruction (!
). Nous multiplions ensuite le bord de mémoire actuel par 10 et ajoutons 8, obtenant 778. Nous sortons ensuite cette valeur mod 256 (10) sous forme de caractère ASCII, qui se trouve être une nouvelle ligne. Enfin, nous quittons l'hexagone et revenons au premier?
qui remplace le 778 avec la prochaine valeur d'entrée.la source
Pyth,
1397 octetsCrédits à @FryAmTheEggman pour 2 octets (assez délicats)!
Explication:
Testez-le ici .
la source
G
s introduits, un pour la conditions%R2G
et un comme argument de la fonctionP
.Gelée , 5 octets
Essayez-le en ligne! ou vérifiez tous les cas de test .
Comment ça marche
la source
Python 2,
4342 octetsLa fonction modifie son argument en place .
Merci à @xnor d'avoir joué un octet de manière vraiment intelligente!
Testez-le sur Ideone .
la source
"1'"in`map(bin,x)`
pour Python 2.ed, 13
Parce que les vrais programmeurs utilisent l' éditeur de texte standard .
Prend l'entrée comme un entier sur chaque ligne; sorties dans le même format.
Cela trouve simplement le premier nombre impair (nombre se terminant par un chiffre impair) et supprime de cette ligne jusqu'à la fin du fichier.
la source
Clojure, 21 octets
Clojure est enfin un peu en compétition! (grâce à la tâche étant intégrée) Voir en ligne https://ideone.com/BEKmez
la source
Python,
4544 octetsTestez-le sur Ideone .
la source
R, 25 octets
Ou équivalent
la source
05AB1E,
87 octetsExplication
Essayez-le en ligne
Solution précédente de 8 octets
Explication
Essayez-le en ligne
la source
Brainf ***, 263 octets
J'ai pris un petit extrait d' ici
Je donnerais une explication mais même moi, je ne sais plus comment cela fonctionne.
Attend l'entrée en tant que nombres séparés par l'espace (par exemple
2 432 1
)la source
+
et en>
utilisant une certaine logique?>
plus efficaces mais je ne les comprends pas assez maintenantPyth, 7 octets
Essayez-le ici!
Ce que j'ai essayé de faire à Pyke mais l'index est cassé dans cette atmosphère
la source
Raquette, 22 octets
Le
λ
caractère compte pour 2 octets.Je n'ai jamais vu Racket utilisé auparavant dans aucune des réponses de golf que j'ai vues, j'ai donc dû le faire au moins une fois!
la source
Labyrinthe , 14 octets
L'entrée et la sortie sont des listes séparées par des sauts de ligne (bien qu'en principe, l'entrée puisse utiliser n'importe quel séparateur non numérique).
Essayez-le en ligne!
C'est probablement le programme Labyrinthe le plus compact que j'aie jamais écrit.
Fait intéressant,
takewhile(odd)
c'est beaucoup plus simple:Explication
Le primaire Labyrinth habituel:
?
dans ce cas), se déplaçant vers l'est.Le flux principal dans le programme est une boucle unique autour du périmètre:
En l'occurrence, nous savons que le haut de la pile est zéro après
!
et"
que l'IP est garanti de ne pas se tourner vers le centre.`
et%
d'autre part sont utilisés comme conditions où l'IP peut se déplacer vers le centre de telle sorte que@
le programme se termine, ou il peut continuer à se déplacer dans le périmètre.Regardons le code dans la boucle:
Et puis la boucle recommence.
Cela soulève la question de savoir pourquoi
takewhile(odd)
c'est tellement plus simple. Il y a deux raisons:0
(ce qui est pair), nous n'avons pas besoin d'un contrôle EOF séparé. La liste serait alors coupée de toute façon.N % 2
is0
(par opposition à1
), ce qui signifie qu'au lieu du flux de contrôle conditionnel, nous pouvons simplement diviser l'autre copieN
parN % 2
: si l'entrée est impaire, cela part justeN
et nous nous sommes même débarrassés deN % 2
(donc nous ne faisons pas '' t besoin;
), mais si l'entrée est paire, cela termine simplement le programme avec une erreur de division par zéro (silencieuse).Par conséquent, l'autre code est une simple boucle qui ne permet aucune ramification.
la source
Brachylog ,
1916 octetsExplication
Aujourd'hui, j'ai appris une astuce intéressante (qui a été utilisée dans la réponse de 19 octets):
~b.hH
est plus courte que:[H]rc.
d'ajouter un élément au début d'une liste. Le premier signifie "La sortie est le résultat avec un élément supplémentaire au début, et le premier élément de la sortie estH
" , tandis que l'autre est simple "La sortie est la concaténation de[[H], Result]
".la source
J, 10 octets
Explication
la source
1{.2&|<;._2]
est intéressant (bien que plus long)$
au lieu de{.
Python, 41 octets
Tronque
l
jusqu'à l'index de la première occurrence d'un nombre impair. L'index est trouvé en recherchant un1
dans les valeurs modulo2
. Pour éviter qu'aucun nombre impair ne soit trouvé, un1
est placé à la fin.la source
C #, 50 octets
la source
a=>a.TakeWhile(x=>x%2<1);
CJam , 11 octets
Merci à @Dennis pour deux corrections et un octet!
Il s'agit d'un bloc de code (équivalent à une fonction; autorisé par défaut) qui attend le tableau d'entrée sur la pile et laisse le tableau de sortie sur la pile.
Essayez-le en ligne!
Explication
la source
Rétine , 17 octets
Le saut de ligne arrière est important. L'entrée et la sortie sont des listes séparées par des espaces.
Essayez-le en ligne!
Il s'agit d'une simple substitution d'expression régulière, elle correspond au premier nombre impair (c'est-à-dire un nombre se terminant par un chiffre impair), et si possible l'espace qui le précède ainsi que tout ce qui le suit et le remplace par une chaîne vide, c'est-à-dire tous les éléments de là partir de l'entrée.
Comme le souligne Leaky Nun, en prenant la liste en binaire, nous pouvons économiser 6 octets, mais cela semble un peu tricheur, donc je continuerai probablement à compter la version décimale:
la source
JavaScript (Firefox 30-57), 30 octets
la source
V , 13 octets
Essayez-le en ligne!
Explication:
Idéalement, le même code fonctionne pour vérifier tous les cas de test simultanément.
la source
Dyalog APL , 11 octets
2|
division reste de la division avec 2~
nier∧\
AND-scan (s'éteint à partir du premier 0)/⍨
sélectionner oùla source
Rubis, 25 octets
Je pense que je perds ...
la source
->a{a.take_while &:even?}
ou au moins->a{a.take_while(&:even?)}
?Pyke, 8 octets
Interprète corrigé, utilisez d'autres liens
Utilise la méthode de Dennis sauf que ma fonction split_at inclut le changement - probablement un bogue
Ou avec correction de bug, 7 octets
Essayez-le ici!
Ou après le 2ème bugfix, 6 octets
Essayez-le ici!
Explication:
la source
GolfScript, 11 octets
Il s'agit d'un programme GolfScript complet qui lit un littéral de tableau GolfScript stratifié (par exemple
[28 14 7 0]
) et imprime le même tableau avec le premier élément impair et tout ce qu'il a supprimé:Essayez-le en ligne. (Aussi: version étendue avec faisceau de test. )
Version dé-golfée avec commentaires:
Cette solution est basée sur l'
{ },
opérateur de filtre GolfScript , qui exécute le contenu du bloc de code sur chaque élément d'un tableau et sélectionne les éléments du tableau pour lesquels le code du bloc renvoie une valeur vraie (c'est-à-dire non nulle) sur haut de la pile.Ainsi, par exemple,
{1&},
sélectionnerait tous les nombres impairs dans un tableau et{~1&},
sélectionnerait tous les nombres pairs. Le défi consiste donc à créer un filtre qui sélectionne les nombres pairs jusqu'à ce qu'il trouve le premier impair , puis ne sélectionne aucun nombre.La solution que j'ai utilisée est de remplacer le masque de bits constant
1
(utilisé pour extraire le bit le plus bas de chaque numéro d'entrée) par une variable sur la pile qui stocke le résultat (0 ou 1) de l'itération de boucle de filtre précédente (et est initialisée à 1 avant la boucle). Ainsi, dès que le filtre renvoie 0 une fois, le masque binaire est également défini sur 0, ce qui empêche le filtre de retourner à nouveau 1.la source
Forth, 114 octets
Forth n'a pas vraiment de listes. Les paramètres doivent être poussés sur la pile dans l'ordre inverse, comme c'est généralement le cas dans Forth. Le résultat sera laissé sur la pile dans le même ordre. Cela ne fonctionne pas sur Ideone pour une raison quelconque, mais cela fonctionne sur repl. La nouvelle ligne est nécessaire pour lever toute ambiguïté?
Essayez-le en ligne
Non golfé, avec commentaires:
Ce programme (ma tentative précédente) imprime les résultats jusqu'à ce qu'il atteigne un nombre impair. Tout ce qui reste (non pris) sera laissé sur la pile.
Échoue si seulement des entiers pairs
la source
Befunge, 35 octets
Ce code gère les nombres compris entre 0 et 65535
Format d'entrée:
Voici une version qui affiche les valeurs à la fin du processus:
Vous pouvez tester le code ici , mais vous devrez ajouter une ligne de fin avec des espaces de fin, comme l'indique cette interprétation:
Je ne sais pas si cela est acceptable, car je n'ai pas compté cette fin dans le nombre d'octets
nb: il semble que parce que je stocke le numéro dans le code, l'interpréteur ne laissera pas ce programme s'exécuter deux fois dans le bon façon. Vous devrez le recharger.
Comment ça marche: L'interprète suit les flèches et saute une instruction lors du passage de '#'
Les points gris sont testés et la ligne rouge supprime les variables inutiles de la pile
En utilisant ici dans l'interpréteur ci-dessus, les valeurs enregistrées sont affichées dans le code en utilisant leurs représentations (je ne connais pas le format). Oui, Befunge est un langage assez réfléchissant
la source