Passer comme un lapin!


41

Avec une liste d'entiers non négatifs dans n'importe quel format raisonnable, parcourez-la en ignorant autant d'éléments que chaque nombre entier indiqué.


Voici un exemple travaillé:

[0, 1, 0, 2, 5, 1, 3, 1, 6, 2] | []
 ^ First element, always include it
[0, 1, 0, 2, 5, 1, 3, 1, 6, 2] | [0]
    ^ Skip 0 elements
[0, 1, 0, 2, 5, 1, 3, 1, 6, 2] | [0, 1]
          ^ Skip 1 element
[0, 1, 0, 2, 5, 1, 3, 1, 6, 2] | [0, 1, 2]
                   ^ Skip 2 elements
[0, 1, 0, 2, 5, 1, 3, 1, 6, 2] | [0, 1, 2, 3]
Skip 3 elements; you're done

Un autre exemple travaillé, pas si égal à tous les deltas:

[4, 5, 1, 3, 8, 3, 0, 1, 1, 3, 1, 2, 7, 4, 0, 0, 1, 2] | []
 ^ First element, always include it
[4, 5, 1, 3, 8, 3, 0, 1, 1, 3, 1, 2, 7, 4, 0, 0, 1, 2] | [4]
                ^ Skip 4 elements
[4, 5, 1, 3, 8, 3, 0, 1, 1, 3, 1, 2, 7, 4, 0, 0, 1, 2] | [4, 3]
                            ^ Skip 3 elements
[4, 5, 1, 3, 8, 3, 0, 1, 1, 3, 1, 2, 7, 4, 0, 0, 1, 2] | [4, 3, 3]
                                        ^ Skip 3 elements
[4, 5, 1, 3, 8, 3, 0, 1, 1, 3, 1, 2, 7, 4, 0, 0, 1, 2] | [4, 3, 3, 4]
Skip 4 elements; you're done

Un exemple hors limites:

[0, 2, 0, 2, 4, 1, 2] | []
^ First element, always include it
[0, 2, 0, 2, 4, 1, 2] | [0]
    ^ Skip 0 elements
[0, 2, 0, 2, 4, 1, 2] | [0, 2]
             ^ Skip 2 elements
[0, 2, 0, 2, 4, 1, 2] | [0, 2, 4]
Skip 4 elements; you're done (out of bounds)

Règles

  • Vous ne pouvez utiliser aucune astuce ennuyeuse parmi celles-ci , elles rendent le défi ennuyeux et sans intérêt.
  • Vous devez uniquement renvoyer / imprimer le résultat final. La sortie STDERR est ignorée.
  • Vous ne pouvez pas obtenir l'entrée sous forme de chaîne de chiffres dans aucune base (par exemple, "0102513162" pour le premier cas).
  • Vous devez utiliser un ordre de gauche à droite pour la saisie.
  • Comme dans les exemples travaillés, si vous sortez des limites, l'exécution se termine comme si c'était le cas.
  • Vous devriez utiliser 0pour sauter 0 éléments.
  • Étant donné la liste vide ( []) en entrée, vous devriez retourner [].

Cas de test

[]                                                     => []
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]                     => [0, 1, 3, 7]
[5, 1, 2, 3, 4, 5, 2, 1, 2, 1, 0, 0]                   => [5, 2, 1, 0]
[0, 1, 0, 2, 5, 1, 3, 1, 6, 2]                         => [0, 1, 2, 3]
[4, 5, 1, 3, 8, 3, 0, 1, 1, 3, 1, 2, 7, 4, 0, 0, 1, 2] => [4, 3, 3, 4]
[0, 2, 0, 2, 4, 1, 2]                                  => [0, 2, 4]

C'est du , alors la réponse la plus courte gagne!


1
Est-il possible d'avoir des zéros à la fin de mon tableau? me sauverait ~ 18 octets
Roman Gräf

@EriktheOutgolfer Pouvons-nous sortir un tableau de chaînes et avoir des chaînes vides?
TheLethalCoder

1
@TheLethalCoder Désolé, je dirais non car ce n'est pas raisonnable, ne pouvez-vous pas simplement supprimer les sigles ""?
Erik l'Outgolfer

2
@ RomanGräf Désolé, mais non, ce serait trop ambigu, car il y a des cas où vous devriez avoir des points de fin 0dans la sortie.
Erik le golfeur

Réponses:



13

Python 2 , 49 44 * 41 octets

44 barré est encore régulier 44 :(

* -3 grâce à @ ASCII uniquement .

l=input()
while l:print l[0];l=l[l[0]+1:]

Essayez-le en ligne!

Imprime les résultats séparés par une nouvelle ligne, comme l'OP autorisé dans le chat. Je ne pense pas qu'il puisse être plus court en tant que programme complet non récursif .


Comment cela marche-t-il?

  • l=input() - Lit la liste à partir de l'entrée standard.

  • while l: - Abuse du fait que les listes vides sont faussées en Python, boucle jusqu'à ce que la liste soit vide.

  • print l[0]; - Imprime le premier élément de la liste.

  • l=l[l[0]+1:]- "Saute comme un lapin" - Coupe le premier l[0]+1de la liste.

Prenons un exemple

Compte tenu de la liste [5, 1, 2, 3, 4, 5, 2, 1, 2, 1, 0, 0]comme entrée, le code effectue les opérations suivantes (selon la définition ci - dessus) - imprime le premier élément de la matrice: 5, couper la première 6: [2, 1, 2, 1, 0, 0]. Nous avons ensuite imprimer 2et couper les 3 premiers: [1,0,0]. De même, nous produisons 1, coupons les 2 premiers et nous obtenons [0]. Bien sûr, 0est imprimé et le programme se termine.




9

JavaScript (ES6), 42 39 35 octets

a=>a.map((n,i)=>a.splice(i+1,n))&&a

let f = 
a=>a.map((n,i)=>a.splice(i+1,n))&&a

console.log(f([]))                                                     // => []
console.log(f([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))                     // => [0, 1, 3, 7]
console.log(f([5, 1, 2, 3, 4, 5, 2, 1, 2, 1, 0, 0]))                   // => [5, 2, 1, 0]
console.log(f([0, 1, 0, 2, 5, 1, 3, 1, 6, 2]))                         // => [0, 1, 2, 3]
console.log(f([4, 5, 1, 3, 8, 3, 0, 1, 1, 3, 1, 2, 7, 4, 0, 0, 1, 2])) // => [4, 3, 3, 4]
console.log(f([0, 2, 0, 2, 4, 1, 2]))                                  // => [0, 2, 4]

Ancienne solution 39 octets

a=>a.map(n=>i--||r.push(i=n),r=i=[])&&r

-3 octets grâce à @ThePirateBay


39 octetsa=>a.map(n=>i--||r.push(i=n),r=i=[])&&r


8

Mathematica, 46 44 octets

SequenceCases[#,{x_,y___}/;Tr[1^{y}]<=x:>x]&

Alternatives:

SequenceCases[#,{x_,y___}/;x>=Length@!y:>x]&
SequenceCases[#,l:{x_,___}/;x>Tr[1^l]-2:>x]&

7

C #, 68 octets

a=>{for(int i=0;i<a.Count;i+=a[i]+1)System.Console.Write(a[i]+" ");}

Essayez-le en ligne!

Version complète / formatée:

namespace System
{
    class P
    {
        static void Main()
        {
            Action<Collections.Generic.List<int>> f = a =>
            {
                for (int i = 0; i < a.Count; i += a[i] + 1)
                    System.Console.Write(a[i] + " ");
            };

            f(new Collections.Generic.List<int>() { });Console.WriteLine();
            f(new Collections.Generic.List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 });Console.WriteLine();
            f(new Collections.Generic.List<int>() { 5, 1, 2, 3, 4, 5, 2, 1, 2, 1, 0, 0 });Console.WriteLine();
            f(new Collections.Generic.List<int>() { 0, 1, 0, 2, 5, 1, 3, 1, 6, 2 });Console.WriteLine();
            f(new Collections.Generic.List<int>() { 4, 5, 1, 3, 8, 3, 0, 1, 1, 3, 1, 2, 7, 4, 0, 0, 1, 2 });Console.WriteLine();
            f(new Collections.Generic.List<int>() { 0, 2, 0, 2, 4, 1, 2 });Console.WriteLine();

            Console.ReadLine();
        }
    }
}

Le renvoi d'une liste est plus long à 107 octets.

a=>{var l=new System.Collections.Generic.List<int>();for(int i=0;i<a.Count;i+=a[i]+1)l.Add(a[i]);return l;}

2
Pourquoi quelqu'un a-t-il voté contre?
TheLethalCoder

Pour arrondir votre score et faire un 5k parfait?
Thomas Ayoub

@ThomasAyoub Nous pouvons seulement supposer que c'était quelqu'un avec un TOC oui.
TheLethalCoder

6

Husk , 8 à 6 octets

←TU¡Γ↓

Essayez-le en ligne!

-2 octets (et une idée de solution totalement nouvelle) grâce à Leo!

Explication

J'utilise la fonction de correspondance de modèle de liste Γ. Il prend une fonction fet une liste avec tête xet queue xs, et s'applique fà xet xs. Si la liste est vide, Γrenvoie une valeur par défaut cohérente avec son type, dans ce cas une liste vide. Nous prenons fpour être , ce qui laisse tomber des xéléments de xs. Cette fonction est ensuite itérée et les éléments résultants sont rassemblés dans une liste.

←TU¡Γ↓  Implicit input, e.g. [0,2,0,2,4,1,2]
    Γ↓  Pattern match using drop
   ¡    iterated infinitely: [[0,2,0,2,4,1,2],[2,0,2,4,1,2],[4,1,2],[],[],[],...
  U     Cut at first repeated value: [[0,2,0,2,4,1,2],[2,0,2,4,1,2],[4,1,2],[]]
 T      Transpose: [[0,2,4],[2,0,1],[0,2,2],[2,4],[4,1],[1,2],[2]]
←       First element: [0,2,4]

Vous pouvez supprimer la valeur par défaut de ø et tout fonctionnera comme par magie :)
Leo


@Leo Oh wow, c'est intelligent!
Zgarb

Pourquoi as-tu fait ça?
Erik l'Outgolfer

@ErikTheOutgolfer C'était une erreur (je suis au téléphone et j'ai apparemment poussé quelque chose par accident). J'essaie de le défaire ...
Zgarb


5

Pyth, 22 octets

VQ aY.(Q0VeY .x.(Q0 ;Y

Suppression d'un octet inutile


J'y vois 23 octets.
Erik l'Outgolfer

Typo :) désolé ...
Dave

3
Je ne sais pas pourquoi vous votez à la baisse. Il est possible que, lorsque vous modifiez votre réponse en corrigeant votre réponse, cela déclenche un "vote négatif automatique". Les raisons de cet abaissement automatique du nombre de voix sont déroutantes et terribles, mais cela se produit si le système considère que votre réponse est de "qualité médiocre" sur la base de son analyse heuristique. Il est également possible que quelqu'un n'ait pas aimé votre réponse, mais je ne vois rien de mal à cela pour le moment, donc je ne suis pas sûr de savoir pourquoi ce serait le cas.
Assistant de blé

Je suis content que vous utilisiez Pyth!
isaacg le


3

Retina , 36 octets

Le nombre d'octets suppose un codage ISO 8859-1.

.+
$*
((1)*¶)(?<-2>1*¶)*
$1
%M`.
0$

Les entrées et les sorties sont séparées par des sauts de ligne.

Essayez-le en ligne! (Utilise des virgules au lieu de sauts de ligne pour permettre des suites de tests pratiques.)


3

Brain-Flak , 64 octets

([]){{}(({})<>)<>{({}[()]<{}>)}{}([])}{}<>([]){{}({}<>)<>([])}<>

Essayez-le en ligne!

([]){{}                          ([])}{}                         # Until the stack is empty
       (({})<>)<>                                                # Copy TOS to off stack
                 {({}[()]<{}>)}{}                                # Pop TOS times
                                        <>([]){{}({}<>)<>([])}<> # Reverse off stack

7
Putain de merde! J'ai écrit une solution, puis j'ai fait défiler l'écran pour la poster, mais il s'avère que nous avons écrit exactement la même solution, octet par octet! Même des détails mineurs comme ({}[()]<{}>)vs ({}<{}>[()])étaient les mêmes! Quelle coïncidence!
DJMcMayhem

@DJMcMayhem vole toute la gloire XD
Christopher

J'ai également fait un octet pour la solution identique octet, mais je l'ai golfé 4 octets . Juste un peu de compétition retardée :)
Wheat Wizard

2

Mathematica, 64 50 octets

±x_List:=Prepend[±Drop[x,1+#&@@x],#&@@x]
±_=±{}={}

Je n'ai pas pu résister à l'idée de continuer à jouer à ce code bien ordonné; ma réponse est ci-dessous.
Mr.Wizard

2

C # (.NET Core) , 68 octets

n=>{var t="";for(int i=0;i<n.Length;i+=n[i]+1)t+=n[i]+" ";return t;}

Essayez-le en ligne!

Prend l'entrée en tant que tableau d'entiers, retourne une chaîne contenant les valeurs non ignorées.


Belle façon de le faire et revient au même compte que l’impression.
TheLethalCoder

J'aime les solutions simples. Encore faut-il apprendre LINQ cependant, comme je l'ai vu raccourcir tant de c # lambdas ..
dimanche

La raccourcit car vous pouvez obtenir un retour implicite la plupart du temps. Bien que ce soit un tiraillement entre un retour implicite avec using System.Linq;une boucle normale.
TheLethalCoder

2

R, 58 octets

f=function(x,p=1){cat(z<-x[p]);if(p+z<sum(x|1))f(x,p+z+1)}

Fonction récursive. Prend un vecteur xcomme argument et introduit un pointeur p. Ceci affiche l’entrée correspondante de x, vérifie si p+x[p]les limites sont dépassées et, dans le cas contraire, appelle la fonction pour le nouveau pointeur.

f=function(x,p=1,s=x[1])`if`((z<-x[p]+p+1)>sum(x|1),s,f(x,z,c(s,x[z])))

C'est une solution comparable qui renvoie un vecteur correct au lieu d'imprimer les chiffres.


qu'en est-il une entrée de numeric(0)? aka tableau vide.
Giuseppe

@ Giuseppe Je vais jeter un oeil quand je suis derrière mon pc
JAD


2

Java (OpenJDK 8), 53 bytes

Thanks to @PunPun1000 and @TheLethalCoder

a->{for(int n=0;;n+=1+a[n])System.out.println(a[n]);}

Try it online!


Would printing the results, like in my C# answer, save you anything?
TheLethalCoder

@TheLethalCoder Ill try
Roman Gräf

Can you save a byte by moving n into the loop?
TheLethalCoder

Plus this doesn't seem to work at the moment.
TheLethalCoder

You're missing a paren after the (a[n+=1+a[n]]. Function also throws an error after outputting the correct value, I don't know the concensus on whether this is allowed or not (the question does say anything to standard error is ignore). If that was the intention, then you can remove the n<a.length in the for loop. Finally the TIO code doesn't run as is, even with the paren. The function should be a Consumer<int[]> and use func.accept(test)
PunPun1000

2

Alice, 15 bytes

/$.. \h&
\I@nO/

Try it online!

Input and output a linefeed-separated lists of decimal integers.

Explanation

/   Switch to Ordinal mode.
I   Read a line.
.   Duplicate it.
n   Logical NOT (gives truthy if we're at EOF).
/   Switch to Cardinal.
    The IP wraps around to the left.
\   Switch to Ordinal.
$@  Terminate the program if we're at EOF.
.   Duplicate the input line again.
O   Print it.
\   Switch to Cardinal.
h   Increment the value.
&   Store the result in the iterator queue.
    The program wraps around to the beginning.

Storing an integer n in the iterator queue causes the next command to be executed n times. Mirrors like / are not commands, so the next command will be I. Therefore if we just read and printed a value x, we will read x+1 values on the next iteration, with the last of them ending up on top of the stack. This skips the required number list elements.


2

Mathematica, 37 (30?)

Further golfing of user202729's fine method.

±{a_,x___}={a}~Join~±{x}~Drop~a
±_={}

The rules don't seem to explicitly specify the output format, so maybe:

±{a_,x___}=a.±{x}~Drop~a
±_={}

Output for the second function looks like: 0.2.4.{} — notably {} is still returned for an empty set, conforming to the final rule.


1
±Drop[{x},a] can be ±{x}~Drop~a because ± has a lower precedence than Infix.
JungHwan Min

@JungHwanMin I missed that; thanks!
Mr.Wizard


2

Brain-Flak, 64 60 bytes

4 bytes save based on an idea from 0 '

([]){{}(({})<>())<>{({}[()]<{}>)}{}([])}{}<>{({}[()]<>)<>}<>

Try it online!

Annotated

([]){{}            #{Until the stack is empty}
  (({})<>())<>     #{Put n+1 to the offstack}
  {({}[()]<{}>)}{} #{Remove n items from the top}
([])}{}            #{End until}
<>                 #{Swap stacks}
{({}[()]<>)<>}<>   #{Move everything back onto the left stack decrementing by 1}


1

Python 2.4, 85 bytes

No chance to win in python with it, but I love oneliners and this one might be interesting to others.
Turns out, there is a fancy magic trick to access building list inside comprehension, but it works only in 2.4 and with some edits in <= 2.3
locals()['_[1]'] it is. Python creates secret name _[1] for list, while it is created and store it in locals. Also names _[2], _[3]... are used for nested lists.

lambda n:[j for i,j in enumerate(n)if i==len(locals()['_[1]'])+sum(locals()['_[1]'])]

So it counts number of already added elements plus their sum. Result is the index of next desired element.
I think, that there should be a way to avoid enumerate. Like accessing input array directly by index: [ n[len(locals()['_[1]'])+sum(locals()['_[1]'])] for ... ]. But I can't figure out a compact way to protect it from index-out-of-range (while keeping it oneliner)

enter image description here


1

Swift, 63 bytes

func a(d:[Int]){var i=0;while i<d.count{print(d[i]);i+=d[i]+1}}

This is my first entry, ever, so I'm not 100% sure on the rules, but hopefully this answer suffices. I'm a little unsure of rules on how to get the input into a system. I have a shorter answer if I was allowed to assume a function somewhere that can return the input.


Welcome to PPCG! The default rules are that you can either have code that works as a full program, so input (usually) in STDIN and output (usually) to STDOUT, or a function, so input (usually) from function parameters and output (usually) from function return.
Stephen

@StepHen - thanks! I guess that makes my other version invalid then. Looking forward to contributing more!
AnonymousReality

1

Perl 6, 31 bytes

{(@_,{.[1+.[0]..*]}...^0)[*;0]}

Test it

Expanded:

{  # bare block lambda with implicit parameter 「@_」
  (
    # generate a sequence

    @_,

    {
      .[ # index into previous value in the sequence
        1 + .[0]  # start by skipping one plus the first element
                  # of the previous value in the sequence
        ..  *     # use that to create a Range with no end
      ]
    }

    ...^  # keep doing that until: (and throw away last value)
    0     # it generates an empty list

  )[ *; 0 ]  # from every value in the sequence, get the first element
}

To help understand how the code works, without [*;0] this would generate a sequence like the following:

[0, 1, 0, 2, 5, 1, 3, 1, 6, 2],
   (1, 0, 2, 5, 1, 3, 1, 6, 2),
         (2, 5, 1, 3, 1, 6, 2),
                  (3, 1, 6, 2)

1

Jelly, 8 bytes

ḢṄ‘ṫ@µL¿

A full program printing the results each followed by a newline (empty list produces no output).

Try it online!

How?

ḢṄ‘ṫ@µL¿ - Main link: list of non-negative integers  e.g. [2,5,4,0,1,2,0]
       ¿ - while:           Iteration:  1                  2             3          4        5
      L  -   length (0 is falsey)       7                  4             3          1        0
     µ   - ...do:                                                                            stop
Ḣ        -   head (pop & modify)        2 ([5,4,0,1,2,0])  0 ([1,2,0])   1 ([2,0])  0 ([0])
 Ṅ       -   print it (and yield it)   "2\n"              "0\n"         "1\n"      "0\n"
  ‘      -   increment                  3                  1             2          1
   ṫ@    -   tail from index            [0,1,2,0]          [1,2,0]      [0]         []
         -
         -                       i.e. a resulting in the printing of: '''2
                                                                         0
                                                                         1
                                                                         0
                                                                         '''

Finally a Jelly answer! BTW I can do it in 7 bytes.
Erik the Outgolfer

And I also have a list-returning function in 18 bytes.
Erik the Outgolfer

1

Python 3, 35 bytes

f=lambda h=0,*t:t and[h,*f(*t[h:])]

Try it online!

Run it with f(*l) where l is your input. Arguably stretching the rules for input, but I just love advanced unpacking.




En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.