うさぎのようにスキップ!


41

任意の妥当な形式の非負整数のリストが与えられたら、それを繰り返し、あなたが踏むすべての整数が言う数の要素をスキップします。


これが実際の例です:

[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

別の有効な例、すべてが等しいデルタではありません:

[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

範囲外の例:

[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)

ルール

  • あなたはこれらの中に退屈なチートを使用することはできません、彼らは挑戦を退屈で面白くないものにします。
  • 最終結果のみを返却/印刷してください。STDERR出力は無視されます。
  • 任意のベースの数字列として入力を取得することはできません(たとえば、最初の場合は「0102513162」)。
  • 入力には左から右の順序を使用する必要があります。
  • 動作した例のように、範囲外になると、実行はそうでないかのように終了します。
  • 00個の要素をスキップするために使用する必要があります。
  • 空のリスト([])を入力として指定すると、を返す必要があり[]ます。

テストケース

[]                                                     => []
[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]

これはなので、最短の回答が勝ちます!


1
配列の末尾にゼロを入れても大丈夫ですか?〜18バイトの私を救う
ローマグラーフ

@EriktheOutgolfer文字列配列を出力し、末尾に空の文字列がありますか?
TheLethalCoder

1
それは合理的ではありませんので、@TheLethalCoder申し訳ありませんが、私は何も言わないだろう芋...あなただけの末尾に削除することはできません""のか?
エリックアウトゴルファー

2
@RomanGräf申し訳ありませんが、いいえ、0出力に末尾のs が必要な場合があるため、あいまいすぎます。
エリックアウトゴルファー

回答:


14

Python 2、36バイト

f=lambda x:x and x[:1]+f(x[x[0]+1:])

オンラインでお試しください!


私はアウトゴルフされることを期待していましたが、それほど悪くはありませんでした:)
Xcoder氏17

x[0]代わりにできませんx[:1]か?
エリックアウトゴルファー

@EriktheOutgolferはい、それはリストである必要があり、それは次のようになります[x[0]]
ロッド

@Rodあなたはして任意のバイトを保存していないx[:1]...とにかくf=lambda x:x and[x[0]]+f(x[x[0]+1:])
エリックOutgolfer

13

Pythonの249の44 * 41バイト

取り消し線44は、まだ通常の44です:(

* -3 @ ASCII-onlyのおかげ

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

オンラインでお試しください!

OPがチャットで許可されているため、結果を改行で区切って出力します。非再帰的な完全プログラムとして短くなるとは思わない。


これはどのように作動しますか?

  • l=input() -標準入力からリストを読み取ります。

  • while l: -空のリストはPythonでは偽であるという事実を悪用し、リストが空になるまでループします。

  • print l[0]; -リストの最初の要素を印刷します。

  • l=l[l[0]+1:]-「ウサギのように飛ばす」- l[0]+1リストの最初をトリムします。

例を見てみましょう

リスト[5, 1, 2, 3, 4, 5, 2, 1, 2, 1, 0, 0]を入力として指定すると、コードは以下を実行します(上記の説明に従って)-配列の最初の項目を出力し5ます:、最初の6:をトリミングします[2, 1, 2, 1, 0, 0]。次に2、最初の3を印刷してトリミングします[1,0,0]。同様に、1最初の2 を出力し、切り取り、取得し[0]ます。もちろん、0印刷され、プログラムは終了します。




9

JavaScript(ES6)、42 39 35バイト

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]

古いソリューション39バイト

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

@ThePirateBayのおかげで-3バイト


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


8

Mathematica、46 44バイト

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

代替案:

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

7

C#、68バイト

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

オンラインでお試しください!

フル/フォーマット済みバージョン:

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();
        }
    }
}

リストを返すのは107バイトです。

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
なぜ誰かがこれを断ったのですか?
TheLethalCoder

スコアを丸めて、完璧な5kを作成するには
トーマスAyoub

@ThomasAyoub私たちは、それがOCDを持っている人であると推測できます。
TheLethalCoder

6

8 6バイト

←TU¡Γ↓

オンラインでお試しください!

-2バイト(および完全に新しいソリューションアイデア)、Leoのおかげです!

説明

リストパターンマッチ機能を使用していますΓ。これは、関数取るfと頭でリストxと尾をxs、そして適用fするxxs。リストが空の場合、Γそのタイプと一致するデフォルト値、この場合は空のリストを返します。私たちは取るfように低下する、xの要素をxs。次に、この関数が繰り返され、結果の要素がリストに収集されます。

←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]

デフォルト値のøをドロップしても、すべてが魔法のように機能します:)
レオ

それとも、さらに少ないバイトのため、tio.run/##yygtzv7//1HbhJDQQwvPTX7UNvn////RBjpGOiBsomOoYxQLAA
レオ

@レオああすごい、それは賢いです!
ズガルブ

なぜこれをCWしたのですか?
エリックアウトゴルファー

@ErikTheOutgolferそれは間違いでした(私は自分の携帯電話で、どうやら偶然に何かをプッシュしました)。元に
戻そ


5

Pyth、22バイト

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

無駄なバイトを削除しました


そこに23バイトがあります。
エリックアウトゴルファー

タイプミス:)申し訳ありません...
デイブ

3
反対票を投じる理由がわかりません。回答を修正して編集すると、これが「自動採決」をトリガーする可能性があります。この自動ダウンボートの理由は混乱を招き、ひどいものですが、ヒューリスティックに基づいて回答が「低品質」であるとシステムが判断した場合に起こります。また、誰かがあなたの答えを好まなかった可能性もありますが、現時点では間違っているとは思わないので、なぜそうなるのかわかりません。
小麦ウィザード

Pythをご利用いただきありがとうございます。
-isaacg



3

Brain-Flak、64バイト

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

オンラインでお試しください!

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

7
なんてこった!ソリューションを作成し、それを下にスクロールして投稿しましたが、まったく同じソリューションをバイト単位で作成したことがわかりました!({}[()]<{}>)vsのようなマイナーな詳細も({}<{}>[()])同じでした!なんて偶然!
DJMcMayhem

@DJMcMayhemがすべての名声XDを盗む
クリストファー

また、バイト単位で同一のソリューションを作成しましたが、4バイト削減しました。少し遅れた競争:)
小麦ウィザード

2

Mathematica、64 50バイト

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

このきちんとしたコードをさらにゴルフすることに抵抗できませんでした。私の答えは以下です。
ミスターウィザード

2

C#(.NET Core)、68バイト

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

オンラインでお試しください!

入力を整数の配列として受け取り、スキップされない値を含む文字列を返します。


それを行うには良い方法であり、印刷と同じカウントで来ます。
-TheLethalCoder

シンプルなソリューションが大好きです。それでもLINQを学ぶ必要があります。これは、非常に多くのc#ラムダを短縮するのを見たからです
。– jkelm

ほとんどの場合、暗黙的に返品できるため、短縮します。ただし、暗黙的なreturn with using System.Linq;と通常のループとの間ではありません。
TheLethalCoder

2

R、58バイト

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

再帰関数。x引数としてベクトルを取り、ポインターを開始しますp。これは、の対応するエントリを出力し、範囲外になるxかどうかp+x[p]をチェックし、範囲外になる場合は、新しいポインターの関数を呼び出します。

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])))

これは、数字を出力する代わりに適切なベクトルを返す同等のソリューションです。


の入力はnumeric(0)どうですか?別名空の配列。
ジュゼッペ

私は私のPCの後ろにいる時、私はそれを見てみましょう@Giuseppe
JAD


2

Java(OpenJDK 8)、53バ​​イト

@ PunPun1000と@TheLethalCoderに感謝

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

オンラインでお試しください!


私のC#の答えのように、結果を印刷して何かを節約できますか?
TheLethalCoder

@TheLethalCoder試してみよう
ローマン

nループに移動してバイトを節約できますか?
TheLethalCoder

さらに、これは現時点では機能していないようです。
TheLethalCoder

の後にかっこがありません(a[n+=1+a[n]]。関数は正しい値を出力した後もエラーをスローします。これが許可されているかどうかについてのコンセンサスはわかりません(質問は標準エラーに対して何も言わないが無視します)。それが意図だった場合n<a.length、forループを削除できます。最後に、TIOコードは、丸括弧であってもそのままでは実行されません。関数はa Consumer<int[]>である必要がありますfunc.accept(test)
-PunPun1000

2

アリス、15バイト

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

オンラインでお試しください!

改行で区切られた10進整数のリストを入力および出力します。

説明

/   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.

整数nを反復子キューに格納すると、次のコマンドがn回実行されます。のようなミラー/はコマンドではないため、次のコマンドはになりますI。したがって、値xを読み取って出力しただけであれば、次の反復でx + 1の値を読み取り、最後の値をスタックの一番上に配置します。これにより、必要な番号リスト要素がスキップされます。


2

Mathematica、37(30?)

user202729の洗練された方法のさらなるゴルフ。

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

ルールは出力形式を明示的に指定していないようです。

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

2番目の関数の出力は次のようになります0.2.4.{}。—特に{}、空のセットに対しては、最終的なルールに準拠して引き続き返されます。


1
±Drop[{x},a]ことができます±{x}~Drop~aので、±より低い優先順位を持っていますInfix
ジョンファンミン

@JungHwanMin私はそれを見逃した。ありがとう!
ミスター・ウィザード


2

Brain-Flak64 60バイト

0からのアイデアに基づいて4バイト節約

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

オンラインでお試しください!

注釈付き

([]){{}            #{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バイト

Pythonで勝つチャンスはありませんが、私はonelinersが大好きで、これは他の人にとって興味深いかもしれません。
結局のところ、理解内の建物リストにアクセスするための派手な手品がありますが、それは2.4でのみ機能し、<= 2.3
locals()['_[1]']でのいくつかの編集ではそうです。Pythonは_[1]listのシークレット名を作成しますが、作成されて保存しlocalsます。また、名前_[2]_[3]...はネストされたリストに使用されます。

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

そのため、すでに追加されている要素の数とその合計がカウントされます。結果は、次に必要な要素のインデックスです。
列挙を避ける方法があるべきだと思います。インデックスによって入力配列に直接アクセスするのと同じです[ n[len(locals()['_[1]'])+sum(locals()['_[1]'])] for ... ]。しかし、範囲外のインデックスから保護するためのコンパクトな方法を見つけることはできません(1ライナーを維持しながら)

ここに画像の説明を入力してください


1

Swift、63バイト

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

これが私の最初のエントリーですので、ルールについて100%確信はありませんが、うまくいけばこの答えで十分です。システムに入力を取得する方法についての規則が少しわかりません。入力を返すことができる機能をどこかで引き受けることが許された場合、私はより短い答えを持っています。


PPCGへようこそ!デフォルトのルールでは、完全なプログラムとして動作するコードを使用できるため、入力(通常)でSTDINに、出力(通常)でSTDOUTに、または関数であるため、入力(通常)から関数パラメーターと出力(通常)関数が戻ります。
スティーブン

@StepHen-ありがとう!そうすると、他のバージョンが無効になります。もっと貢献することを楽しみにしています!
AnonymousReality

1

Perl 6、31バイト

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

試して

拡張:

{  # 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
}

コードがどのように機能するかを理解しやすくするために、[*;0]これがないと次のようなシーケンスが生成されます。

[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

ゼリー、8 バイト

ḢṄ‘ṫ@µL¿

結果を印刷する完全なプログラムで、それぞれに改行が続きます(空のリストは出力を生成しません)。

オンラインでお試しください!

どうやって?

ḢṄ‘ṫ@µ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
                                                                         '''

最後にゼリーの答え!ところで私は7バイトでそれを行うことができます。
エリックアウトゴルファー

また、18バイトのリストを返す関数もあります。
エリックアウトゴルファー




弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.