カエルのようにスキップ!


12

以下に説明するように、負でない整数の配列が与えられた場合、タスクはその特定の要素のみを保持することです。

  • 配列がであるとしましょう[1, 3, 2, 4, 11, 5, 2, 0, 13, 10, 1]

  • まず、配列の最初の要素を取得しnます。最初のn要素を保持し、次の要素を破棄します(n+1thは破棄します)。新しい配列は[1, 2, 4, 11, 5, 2, 0, 13, 10, 1]です。

  • 次に、削除した要素の次の要素を取得し、まったく同じことを行います。プロセスを再適用すると、[1, 2, 11, 5, 2, 0, 13, 10, 1]

  • 配列の境界の外側に到達するまで、または配列に要素がなくなるまで、このプロセスを繰り返します。11配列の長さよりも大きいため停止します。

  • 次に、結果を出力する必要があります。

入力/出力は、任意の標準形式で取得/提供できます。配列は決して空ではなく、負でない整数のみを含みます。すべての標準的な抜け穴は禁止されています。

これはので、バイト単位の最短コードが勝ちです!


テストケース

入力->出力

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

*最後のテストケースにはが含まれる0ので、より明確になるようにプロセスを投稿することにしました。

[3, 1, 2, 4, 0] --> [3, 1, 2, 0] --> [1, 2, 0] --> [1, 0] --> [0] --> [] )

この挑戦に触発によってエリックOutgolfer


すべてのテストケースを完全に手書きで書きました。間違いがあると思われる場合はお知らせください。

1
なぜでは2なく最初のステップで削除されるの3ですか?
リーキー修道女

@LeakyNun私の間違い。修正。他の間違いを犯した場合はping

推奨されるテストケース:[1, 2, 3, 1, 2, 3, 1, 2, 3]
ロッド

1
明確にするために、新しい " n"に移動すると、常にn要素を保持するために配列の先頭から開始しますか?(一見思ったように)n最初の要素nが評価対象の要素を保持しないのですか?
ブライアンJ

回答:


1

Pyth、18バイト

#IgZlQB .(Q=Z@QZ)Q

ここで試してみてください。



@LeakyNunそして、私はそれを十分にテストしたと思った!くそ
エリックOutgolfer

少なくとも、指定されたテストケースを確認してください。
リーキー修道女

@LeakyNun時々私は(オハイオ州とところで、私はテストケースのTBFオフの書式設定を削除するには少し怠け者)固定...コードは私にそれが実際にかかわらず...固定何よりも異なる結果を与えていると思う
エリックOutgolfer

5

JavaScript(ES6)、45バイト

f=(a,k=0,x=a[k])=>1/x?f(a.splice(x,1)&&a,x):a

テストケース


4

Haskell、50バイト

g.pure.(0:)は、Intsのリストを取得して返す匿名関数(g.pure.(0:))[1,2,3,4,5]です。として使用します。

g.pure.(0:)
g(a,_:b:c)=g$splitAt b$a++b:c
g(a,_)=a

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

使い方

  • この関数gは、分割リストを表すタプル引数を取ります。aは、前のステップで保持された初期要素のリスト、_破棄bされる要素、長さとして使用される次の要素、およびc残りの要素です。
    • タプルの2番目の部分にaを選択するのbに十分な要素がある場合、新しい分割が実行され、g再帰されます。そうでなければ、a結果として停止します。
  • 無名関数g.pure.(0:)g、タプル([],0:l)で呼び出すことですべてを開始します。ここlで、入力はで、0すぐに破棄されgます。
    • pureここでは、Applicative(バイナリ)タプルのインスタンスを使用し、結果の型で([Int],[Int])は、引数をタプルの2番目の要素[]として最初の要素として便利に配置します。



2

Java 8、68バイト

このラムダは、可変List<Integer>remove(int)たとえばをサポートArrayList)を受け入れます。出力は変更された入力です。に割り当てConsumer<List<Integer>>ます。

l->{for(int i=0,f=0;i<l.size();f^=1)i=f>0?l.remove(i)*0+i:l.get(i);}

オンラインで試す

この問題の制御フローは非常に迷惑です。各反復では、要素を削除して次の位置にある要素を取得する必要があり、これらの操作の両方で範囲チェックが必要です(どちらかがプログラムの完了をトリガーする場合があります)。1つの戦略は、単一のループ反復で両方の操作を実行し、インデックスの更新を独自の範囲チェックで保護することです。より短いことが判明した別の戦略は、ループの反復ごとに操作を交互に行うことです。これがこのソリューションの目的です。


1

APL(Dyalog Classic)、32バイト

1∘{n∇⍣(n≤≢w)⊢w←⍵/⍨(n1+⍺⊃⍵)≠⍳≢⍵}

説明

1∘{                             } bind 1 as starting left argument (⍺)
                             ⍳≢⍵  generate indexes for right argument (⍵)
                   (n1+⍺⊃⍵)      n is 1+item at position  
              w←⍵/⍨              w is  with item at n removed
   n∇⍣(n≤≢w)⊢                     recurse with n as left and w as right arg if n <= length of w

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



1

Haskell、99バイト(インデントなしの88)

f x y
 |y>=l=f x$l-1
 |e>=l=x
 |True=f (take e x ++ drop (1+e) x) e
 where e=x!!y
       l=length x

私はおそらくセーブで1バイトではなく、また、多分、「++」に近い2つのスペースを除去することができ、「真」の「1 = 1」を使用して可能性
ジャコモTecya Pigani

1

VI、31 25バイト

O@0kdd<C-v><C-a>Y<C-v><C-x>gg@a<Esc>"add<C-a>Y<C-x>@a

<C-?>対応Control + ?、および<Esc>Escape明らかに。これらはそれぞれ1バイトとしてカウントされます(metaを参照)。

入力

入力ファイルには、行ごとに1つの整数と最後に1つの空白行が含まれている必要があります。例:

1
2
3
4
5
⁣

入力ファイルの各行は、次のような配列要素として見ることができます。 1 :: 2 :: 3 :: 4 :: 5 :: []一部の言語(camlなど)のように。

打ち上げ

次のコマンドでviを起動し、ストロークごとにソリューションを入力できます。

vi -u NONE input

このワンライナーを使用することもできます:

vi -u NONE -c ':exec "norm O@0kdd\<C-v>\<C-a>Y\<C-v>\<C-x>gg@a\<Esc>\"add\<C-a>Y\<C-x>@a"' -c ":w output" -c ':q' input

これoutputにより、入力ファイルから正しい結果を持つファイルが生成されます。input

説明

ソリューションを紹介するために、最初に0のない配列でのみ動作する19バイトのソリューションを紹介します。このソリューションでは、最終的なソリューションでほとんど変更を加えずに使用される再帰マクロを使用します。

Yqa@0ddYgg@aquggY@a

部分的な解決策の説明

Y                       # yank first line (first integer + line break) to "0 register
 qa                     # start recording a macro ("a register)
   @0                   # jump n lines, where n is the content of the "0 register
     dd                 # delete the current line (n+1th line)
       Y                # yank current line (integer after the previously deleted line)
        gg              # go back to the first line
          @a            # recurse on macro "a"
            q           # finish recording the macro
             u          # cancel modifications done by the execution of the macro
              gg        # go back to the first line
                Y@a     # apply the recorded macro with first parameter equal to the first integer

ここでのコツは、"0レジスタを使用して現在の整数を格納することです(そして、改行も非常に重要です)。したがって、コマンド@0n行をジャンプすることができます(nの値を呼び出す"0)。ジャンプがファイル内の行数を超えると、マクロは失敗するため、プログラムは停止します(必要に応じて、配列の範囲外)。

ただし、入力にが含まれている場合、このソリューションは機能しません0。実際、"0レジスタの値がに等しい場合0、好きなようにでは@0なく、1行ジャンプします(改行のため)0。したがって、次のコマンド(dd)は0番目の整数ではなく、1番目(正しくない)を削除します。

を処理する有効な解決策0は、整数をヤンクする前に常にインクリメントし、直後にデクリメントすることです。したがって、@0コマンドはn+1行をジャンプします(nインクリメントされた現在の整数です)。そのk場合、行n(前の行)に移動するにはコマンドが必要です。このトリックを使用すると、入力ファイルの最後に空行が必要になります。これは、常にジャンプするため、配列の外部へのジャンプ(したがって、プログラムの終了)を避けるためです。n+1です。

最終的な解決策の説明

O                                                       # insert a new line at the beginning of the file, enter insert mode to write the macro content
 @0                                                     # jump n lines                                                       
   k                                                    # go to the previous line
    dd                                                  # delete this line
      <C-v><C-a>                                        # type Control+A (C-v is needed because we are in insert mode) to increment the current integer
                Y                                       # yank the incremented integer
                 <C-v><C-x>                             # decrement the current integer
                           gg                           # go to the first line
                             @a                         # recurse on macro "a"
                               <Esc>                    # exit insert mode : at this step, the first line of the file contains the macro content @0kdd^AY^Xgg@a
                                    "add                # copy @0kdd^AY^Xgg@a line to the register "a and delete the line
                                        <C-a>           # increment the first integer
                                             Y          # yank it (into "0)
                                              <C-x>     # decrement the first integer
                                                   @a   # apply macro in a" (initial @0 will jump n+1 lines, since we incremented the first integer before calling the macro)

登録する前にファイル内にマクロコンテンツを書き込むと、数バイトを保存できます。

  • 書かない qa...q登録後にすべての変更で元に戻す
  • 回避:let @a="..."

編集

#1

  • マクロの内容を(最後の行ではなく)最初の行に書き込みます
  • 入力の変更(最後に1つの空白行)
  • コマンドラインでテストするためにワンライナーを追加します

0

Pyth、32バイト

VlQIgNlQBK@QNI!K=QYBIgKlQB.(QK;Q

オンラインで試す


Pythははるかにエレガント:)があることよりもできる#VlQ.(Q@QN;Q12バイトで仕事をしていません、と私はかなり確信してそれがさらにgolfedすることができますよ
デイブ

昔ながらのPythonicアプローチを維持することで、あなたはできるW<Zl=Q+<Q@QZ>Qh@QZ=Z@QZ)Q(25)pizzakingmeのアプローチははるかに優れています。

4
@KaranElangovan謝罪するものは何もなく、彼らはあなたを助けようとしているだけです。
リーキー修道女

1
最終テストケース用に修正され、15バイトになります:#VlQ .(Q@QN)%;Q。Pythゴルファーからのフィードバックを歓迎します。私もまだ学んでいます!
デイブ

2
このアプローチは無効です。結果を出力するだけでなく、テストケースにも失敗します(少なくとも最後から2番目のケース)。この回答を削除/修正してください。

0

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

n=>{for(int i=n[0];i<n.Count;){n.RemoveAt(i);i=i<n.Count?n[i]:n.Count+1;}}

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

これは、intのリストを取得して変更します。Lambda引数定義で完全修飾名を使用することにより、インポートを回避するJavaの回答を見てきました。これが許可されていない場合、この回答を削除できます。


ラムダ定義でのパラメータータイプの省略について言及している場合、それは許可されています。
ヤコブ

@Jakob私はそれを理解しています。バイトカウントのSystem.Collections.Generic.List<int>代わりに、using System.Collections.Genericそれを追加するために、少し汚い感じがします。しかし、配列を使用することと何の違いもないと思います。
jkelm

ああなるほど。using必要に応じて使用できます。ラムダ自体がステートメントに依存しない限り、バイトカウントに含める必要はありません。個人的には、テストコードで常に完全修飾名を使用しているため、ラムダが使用するインポートが明確で簡単に検証できます。
ヤコブ

0

R64 53バイト

f=function(a,i=1,d=a[i]+1)"if"(is.na(d),a,f(a[-d],d))

再帰関数。1つの必須入力、aスキップするリストがあります。iは、ジャンプするものの数のインデックス(デフォルトは1)でd、必要な値が削除された後の次のアイテムのインデックスです。これは、削除されるアイテムのインデックスでもあります。numeric(0)空の出力の場合、空のベクトルを返します。

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

ゴルフをしていない:

f <- function(a, i = 1, d = a[i] + 1) {
  if(is.na(d)) {   # d is NA if and only if a[i] is out of bounds
    a
  } else {
    f( a[-d], d, a[d] + 1 )   # a[-d] is a with the item at index d removed
  }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.