Étant donné un tableau d'entiers non négatifs, votre tâche consiste à n'en conserver que certains éléments, comme décrit ci-dessous.
Disons que le tableau est
[1, 3, 2, 4, 11, 5, 2, 0, 13, 10, 1]
.Tout d' abord obtenir le premier élément du tableau,
n
. Conservez les premiersn
éléments et jetez le suivant (jetez len+1
e). Le nouveau tableau est[1, 2, 4, 11, 5, 2, 0, 13, 10, 1]
.Ensuite, vous saisissez l'élément suivant celui supprimé et faites exactement la même chose. Réappliquant le processus, nous obtenons
[1, 2, 11, 5, 2, 0, 13, 10, 1]
Vous répétez le processus jusqu'à ce que vous arriviez en dehors des limites du tableau / il ne reste aucun élément dans le tableau. Nous nous arrêtons car
11
est supérieure à la longueur du tableau.Vous devez maintenant afficher le résultat.
Les entrées / sorties peuvent être prises / fournies sous n'importe quelle forme standard. Le tableau ne sera jamais vide et ne contiendra que des entiers non négatifs. Toutes les failles standard sont interdites.
C'est du code-golf donc le code le plus court en octets gagne!
Cas de test
Entrée -> Sortie [1, 2, 3, 4, 5] -> [1, 3, 4] [6, 1, 0, 5, 6] -> [6, 1, 0, 5, 6] [1, 3, 2, 4, 11, 5, 2, 0, 13, 10, 1] -> [1, 2, 11, 5, 2, 0, 13, 10, 1] [2, 2, 2, 2, 2, 2] -> [2, 2] [1, 2, 3, 1, 2, 3, 1, 2, 3] -> [1, 2] [3, 1, 2, 4, 0] -> [] *
* Le dernier cas de test implique 0
, j'ai donc décidé de publier le processus de manière à ce qu'il soit plus clair:
[3, 1, 2, 4, 0] --> [3, 1, 2, 0] --> [1, 2, 0] --> [1, 0] --> [0] --> [] )
2
supprimé à la première étape au lieu de3
?[1, 2, 3, 1, 2, 3, 1, 2, 3]
n
", vous commencez toujours par le début du tableau pour conserver lesn
éléments? Ne pas (comme je le pensais à première vue) garder lesn
éléments là où le premier élément est celui quen
vous évaluez?Réponses:
Pyth, 18 octets
Essayez-le ici.
la source
JavaScript (ES6), 45 octets
Cas de test
Afficher l'extrait de code
la source
Haskell , 50 octets
g.pure.(0:)
est une fonction anonyme prenant et renvoyant une liste deInt
s, utilisez comme(g.pure.(0:))[1,2,3,4,5]
.Essayez-le en ligne!
Comment ça fonctionne
g
prend un argument tuple représentant une liste fractionnée.a
est la liste des éléments initiaux conservée à l'étape précédente,_
est l'élément à éliminer,b
est l'élément suivant à utiliser comme longueur etc
est les éléments restants.b
, un nouveau fractionnement est effectué et seg
reproduit. Sinon, il s'arrête aveca
comme résultat.g.pure.(0:)
démarre tout en appelantg
avec le tuple([],0:l)
, où sel
trouve l'entrée et0
est immédiatement supprimée parg
.pure
utilise ici l'Applicative
instance pour les tuples (binaires), et avec le type de résultat([Int],[Int])
place commodément son argument comme deuxième élément dans un tuple avec[]
comme premier élément.la source
Python 3 , 59 octets
Essayez-le en ligne!
la source
Haskell , 51 octets
Essayez-le en ligne! Exemple d' utilisation:
f [1,2,3,4,5]
.la source
Java 8, 68 octets
Ce lambda accepte un mutable
List<Integer>
(supporteremove(int)
, par exempleArrayList
). La sortie est une entrée mutée. Attribuer àConsumer<List<Integer>>
.Essayez-le en ligne
Le flux de contrôle pour ce problème est très ennuyeux. À chaque itération, nous devons supprimer un élément et le placer à la position suivante, et ces deux opérations nécessitent une vérification de plage (et l'une ou l'autre peut déclencher l'achèvement du programme). Une stratégie consiste à effectuer les deux opérations en une seule itération de boucle, la mise à jour de l'index étant protégée par sa propre vérification de plage. Une autre stratégie, qui s'est avérée plus courte, consiste à alterner les opérations à chaque itération de boucle, ce que fait cette solution.
la source
APL (Dyalog Classic) , 32 octets
Explication
Essayez-le en ligne!
la source
Perl 5 , 38 + 1 (-a) = 39 octets
Essayez-le en ligne!
la source
Haskell, 99 octets (88 sans retrait)
la source
VI,
3125 octets<C-?>
correspond àControl + ?
, et<Esc>
àEscape
évidemment. Chacun d'eux compte pour 1 octet (voir méta ).Contribution
Le fichier d'entrée doit contenir 1 entier par ligne + 1 ligne vide à la fin, exemple:
Nous pouvons voir chaque ligne du fichier d'entrée comme un élément de tableau, comme
1 :: 2 :: 3 :: 4 :: 5 :: []
, comme dans certaines langues (caml par exemple).lancement
Vous pouvez démarrer vi avec la commande suivante et saisir la solution trait par trait:
Vous pouvez également utiliser ce one-liner:
Cela devrait produire un fichier
output
avec le résultat correct à partir d'un fichier d'entréeinput
.Explications
Pour présenter la solution, je vais d'abord présenter une solution de 19 octets fonctionnant uniquement pour les tableaux sans 0. Cette solution utilise une macro récursive, utilisée avec peu de modifications dans la solution finale:
Explication d'une solution partielle
L'astuce consiste à utiliser le
"0
registre pour stocker l'entier actuel (et le saut de ligne, très important). Par conséquent, la commande@0
permet de sauter desn
lignes (appelezn
la valeur de"0
). Si le saut dépasse le nombre de lignes dans le fichier, la macro échouera, donc le programme s'arrêtera (en dehors des limites du tableau, comme requis).Mais cette solution ne fonctionne pas si l'entrée contient
0
. En effet, si la"0
valeur du registre est égale0
, alors@0
sautera une ligne (en raison du saut de ligne), pas0
comme nous l'avons aimé. Ainsi, la prochaine commande (dd
) ne supprimera pas le 0e entier, mais le 1er (pas correct).Une solution valide pour gérer le
0
est de toujours incrémenter l'entier avant de le tirer et de le décrémenter juste après. Ainsi, la@0
commande sautera desn+1
lignes (n
est l'entier actuel qui a été incrémenté). Unek
commande est alors nécessaire pour passer à la lignen
(ligne précédente). En utilisant cette astuce, une ligne vide est nécessaire à la fin du fichier d'entrée, pour éviter de sauter en dehors du tableau (donc de terminer le programme), car nous sautons maintenant toujours desn+1
lignes, avant de sauter à la ligne précédente.Explication de la solution finale
Écrire le contenu de la macro dans le fichier avant de l'enregistrer permet d'économiser quelques octets:
qa...q
et d'annuler toutes les modifications après l'enregistrement:let @a="..."
)Modifications
#1
la source
Pyth, 32 octets
Essayez-le en ligne
la source
#VlQ.(Q@QN;Q
fait le travail en 12 octets, et je suis presque sûr qu'il peut être joué encore plusW<Zl=Q+<Q@QZ>Qh@QZ=Z@QZ)Q
(25). L'approche de pizzakingme est cependant bien meilleure.#VlQ .(Q@QN)%;Q
. Les retours des golfeurs Pyth seraient les bienvenus, j'apprends encore!C # (.NET Core) , 74 octets
Essayez-le en ligne!
Cela prend une liste d'entiers et la modifie. J'ai vu quelques réponses Java qui contournent les importations en utilisant le nom complet dans la définition de l'argument Lambda. Si cela n'est pas autorisé, je peux supprimer cette réponse.
la source
System.Collections.Generic.List<int>
lieu deusing System.Collections.Generic
et l'ajout au nombre d'octets. Mais je suppose que ce n'est pas différent de l'utilisation d'un tableau.using
si vous le souhaitez; tant que le lambda lui-même ne dépend pas de l'instruction, vous n'auriez pas à l'inclure dans le nombre d'octets. Personnellement, j'utilise toujours des noms pleinement qualifiés dans le code de test juste pour qu'il soit clair et facilement vérifiable ce que les importations utilisent lambda.R ,
6453 octetsFonction récursive. A une entrée obligatoire
a
, la liste à sauter.i
est l'index du nombre de choses à sauter (par défaut à1
), etd
est l'index de l'élément suivant après que la valeur requise a été supprimée, qui est également l'index de l'élément à supprimer. Renvoienumeric(0)
, un vecteur vide, pour une sortie vide.Essayez-le en ligne!
Non golfé:
la source