オーバーフロー防止バッファ


23

バックグラウンド

最近のプログラマーは、バッファーをまっすぐに保つことができないようです!エラーの一般的な原因は、バッファに対して大きすぎる配列インデックスを使用しようとしていることです。あなたのタスクは、大きなインデックスがバッファが処理できるサイズまで縮小されるバッファを実装することです。誰にとっても最適なものを私が正確に決定するので、このバッファを私の正確な仕様に合わせて実装します。

概要

要素が追加されるとサイズが大きくなる挿入専用バッファがあります。バッファにはゼロのインデックスが付けられ、現在のサイズを法としてインデックスが付けられます。このチャレンジの特別なルールは次のとおりです。

  • インデックスiにアイテムを挿入するということは、jを計算し、リストのj番目のアイテムのj = i % buffer.length()後に新しいアイテムを挿入することを意味します。

唯一の特殊なケースは、ゼロを法とする算術演算が機能しないため、バッファが空の場合です。したがって、バッファが現在空の場合、新しいアイテムはインデックス0になります。

バッファにアイテムが1つしかない場合、常に0番目のアイテムの後に挿入します。これは一般的なケースの1つの例にすぎません。

バッファは6つの項目が含まれている場合:[4, 9, 14, 8, 5, 2]あなたは、新しい項目を挿入するように指示され10たインデックスに15、あなたはそれを見つけ15 % 6 == 3、その後、新しいを挿入し10た後8、インデックスで3の結果のバッファを与えます [4, 9, 14, 8, 10, 5, 2]

問題

正の整数の順序付きリストと、それらを挿入する正の整数インデックスを受け取る関数またはプログラムを作成します。

空のバッファから始め、指定された整数を対応するインデックスのバッファに追加します。

指定されたすべての挿入が行われた後、バッファー内にある整数の順序付きリストを出力します。

これはコードとゴルフの課題であるため、最短のコードが優先されます。

入力ガイドライン

必要に応じて入力リストを取得できます。例:

  • ペアのリスト: [ [1,1], [2,4], [3,9], [4,16], [5,25]...]
  • アイテムリストとインデックスリスト: [1, 2, 3, 4, 5...], [1, 4, 9, 16, 25]
  • 平坦化: [1, 1, 2, 4, 3, 9, 4, 16, 5, 25 ...]

入力には常に少なくとも1つの項目と対応するインデックスが含まれると想定できます。

テストケース

上からの正方形の場合:

[(1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49), (8, 64)] -> [1, 2, 8, 7, 6, 5, 4, 3]

これらをランダムに生成しました:

[(11, 9), (13, 14)] -> [11, 13]
[(1, 18), (11, 7), (3, 35), (16, 22)] -> [1, 11, 16, 3]
[(3, 16), (16, 37), (0, 28), (18, 24)] -> [3, 18, 0, 16]
[(7, 26), (8, 20), (11, 39), (1, 23), (17, 27)] -> [7, 8, 11, 1, 17]
[(15, 35), (17, 7), (16, 15), (1, 13), (2, 6), (11, 34)] -> [15, 17, 1, 2, 16, 11]
[(2, 13), (1, 20), (16, 25), (8, 21), (5, 2), (16, 37), (3, 0)] -> [2, 3, 8, 1, 16, 5, 16]
[(6, 20), (15, 15), (12, 26), (10, 27), (17, 13), (7, 18), (4, 16)] -> [6, 10, 17, 12, 7, 4, 15]
[(18, 9), (5, 34), (15, 4), (12, 29), (2, 5), (7, 0), (7, 10), (16, 38)] -> [18, 7, 15, 2, 16, 5, 7, 12]
[(0, 12), (12, 0), (4, 16), (15, 12), (6, 28), (8, 10), (11, 24), (0, 25)] -> [0, 11, 8, 6, 15, 0, 4, 12]
[(6, 12), (14, 13), (10, 33), (11, 35), (1, 3), (0, 28), (15, 27), (8, 10), (1, 2)] -> [6, 14, 10, 1, 11, 8, 15, 0, 1]
[(2, 29), (19, 30), (18, 17), (13, 3), (0, 21), (19, 19), (11, 13), (12, 31), (3, 25)] -> [2, 13, 3, 11, 0, 12, 19, 18, 19]

Python3リファレンス実装

def f(inputs):
    # `inputs` is a list of pairs
    buff = []
    for item, index in inputs:
        if len(buff) == 0:
            buff.insert(0, item)
        else:
            insert_after = index % len(buff)
            buff.insert(insert_after+1, item)
    return buff

入力を逆に取得できますか?
FlipTack

ええ、入力は多かれ少なかれあなたが望むように柔軟にできると思います。
turbulencetoo

回答:


4

MATL24 22バイト

"N?@2)yn\Q:&)@1)wv}@1)

入力は;、最初の行の値と2番目の行のインデックスを含む行列(行区切り記号付き)です。

出力は、改行で区切られた数値として表示される列配列です。

オンラインでお試しください!または、すべてのテストケースを検証し、各結果を1行で表示します。

説明

"          % Input matrix (implicit). For each column 
  N        %   Number of elements in the stack
  ?        %   If nonzero (true for all iterations but the first)
    @2)    %     Push second element of current column: new index
    yn     %     Duplicate current buffer; push its number of elements
    \      %     Modulo
    Q      %     Add 1
    :&)    %     Split buffer at that point. This gives two pieces, one
           %     of which may be empty
    @1)    %     Push first element of current column: new value
    wv     %     Swap; concatenate all stack. This places the new value
           %     between the two pieces of the buffer
  }        %   Else (this is executed only in the first iteration)
    @1)    %     Push first element of current column: new value
           %   End (implicit)
           % End (implicit)
           % Display (implicit)

8

Perl、37バイト

35バイトのコード+ -lpフラグ用の2バイト。

splice@F,1+<>%(@F||1),0,$_}{$_="@F"

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

実装は非常に簡単で、インデックスspliceで配列に挿入@Fします1+<>%(@F||1)@F||1配列が空の場合を処理することに注意してください)。

(一見)比類のないかっこについてだけでいくつかの単語}{(私はそれについてのコメントを持っていた、と私はそれがPerlを知らない人のために非常に奇妙なことだと思うので)、それはPerlのgolfingsでは非常に一般的なトリックです:
-pフラグはコードを囲み、 with(roughly)while(<>){ CODE } continue { print }、(continue各反復後に実行されます)。それでそれらが一致しない }{ので、私はコードをに変えますwhile(<>) { CODE}{ } continue { print }。したがって、コードの直後に空のブロックが作成されますが(これは問題ではありません)、continue1回だけ実行さwhileれます。


3
それは}{...ナット私を運転している
ETHproductions

@ETHproductions私はそれに慣れていますが、他の人に見せることが大好きです。彼らはいつも何かが間違っていると思います!:)(マイナス面は、私のemacsのインデントが乱れていることです。)
ダダ


はい、しました。:
デニス

5

ES6(Javascript)、 585753、50バイト

ゴルフ

a=>a.map((e,i)=>b.splice(1+e[1]%i,0,e[0]),b=[])&&b

入力として、インデックスと値のペアの配列を受け取ります。

編集

  • &&値を返すために使用、-1バイト
  • 削除|0(スプライスは明らかにNaNを適切に処理できるため)-2バイト
  • メイドb=[]第二の"引数"にする(MAP)、-2バイト(のTHX @ETHproductionsを!)
  • b.lengthをmap()インデックス(i)、-3バイトに置き換え(Thx @Patrick Roberts!)

テスト

F=a=>a.map((e,i)=>b.splice(1+e[1]%i,0,e[0]),b=[])&&b

F([[11, 9], [13, 14]])
[ 11, 13 ]

F([[2, 29], [19, 30], [18, 17], [13, 3], [0, 21], [19, 19], [11, 13], [12, 31], [3, 25]])
[ 2, 13, 3, 11, 0, 12, 19, 18, 19 ]

1
いいですね、非再帰的なアプローチを試してみるべきでした。私はあなたが行うことができると思うa=>a.map(e=>...,b=[])&&b
ETHproductions

2
あなたは、変更することで、3つのバイトを引くことができますe=>(e,i)=>して使用してiの代わりにb.length
パトリック・ロバーツ

@PatrickRobertsそれはいいアイデアです!ありがとうございました !
ツェッペリン

5

Haskell70 69バイト

b!(x,i)|b==[]=[x]|j<-1+i`mod`length b=take j b++x:drop j b
foldl(!)[]

オンラインでお試しください!使用法:foldl(!)[] [(1,5),(2,4),(3,7)]。@nimiのおかげで1バイト節約できました!

説明:

b!(x,i)                         -- b!(x,i) inserts x into list b at position i+1
 | b==[] = [x]                  -- if b is empty return the list with element x
 | j <- 1 + i `mod` length b    -- otherwise compute the overflow-save insertion index j
     = take j b ++ x : drop j b -- and return the first j elements of b + x + the rest of b
foldl(!)[]                      -- given a list [(1,2),(3,5),...], insert each element with function ! into the initially empty buffer

モジュラスを計算しないソリューション:(90バイト)

f h t(x,-1)=h++x:t
f h[]p=f[]h p
f h(c:t)(x,i)=f(h++[c])t(x,i-1)
g((x,_):r)=foldl(f[])[x]r

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


j<-1+i`mod`length bバイトを保存します。
-nimi


4

パイソン262の 60バイト

ペアのリストとして入力を受け取り、結果を出力します。 編集:デニスによるアウトゴルフ

b=[]
for x,y in input():b.insert(1+y%(len(b)or 1),x)
print b

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

これは非常に簡単です。入力をループ処理して、アイテムを正しい場所に挿入し、結果を出力します。どのインデックスに挿入するかは、で決定します1+y%(len(b)or 1)。これは、モジュール式のインデックス作成を行う標準的な方法です。or 1空のリストのエッジケースを処理するためのです。


3

JavaScript(ES6)、60バイト

f=([[q,r],...a],z=[])=>z.splice(r%z.length+1,0,q)+a?f(a,z):z

テストスニペット


2

V38 40 35バイト

この答えはリストの定義を曲げ、通常はリスト操作に使用する言語ではありませんが、[count]/{regex}最近Vに追加した言語を使用したかったです。入力はのように取得され[index] [num] [index] [num] ...、返され[num] [num] [num]ます。

Í ¨ä«© ½/¯ÜdÜ+òhea ±^
Hdd2xdG@"
X

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

2つの非表示文字のHexdump:

00000000: cd20 a8e4 aba9 20bd 2faf dc64 dc2b f268  . .... ./..d.+.h
00000010: 6561 20b1 161b 5e0a 4864 6432 7864 4740  ea ...^.Hdd2xdG@
00000020: 220a 58                                  ".X

説明

リスト1 2 3 4 5 6が最終的になるように、dG@"すべての\d+ \d+ペアをフォーマットするコード

a 2^[^3/\d\+
hea 4^[^5/\d\+
hea 6^[^

そしてdG@"、次のようなVコードとしてすべてを実行します:

a 2^[                 | insert " 2" and return to command mode
     ^                | LOOP: go to the first number
      3/\d\+          | find the 3rd number (0 indexed)
h                     | move one character left
 e                    | go to the end of the next word
  a 4^[               | append " 4" and return to command mode
       ^5/\d\+        | basically the same as LOOP on, just with different numbers

ただ、非競合状態でのみ挑戦よりも新しい言語や言語機能のためである、と言って
KritixiのLithos

ああ、それを知らなかったことに感謝します。適合させる
-nmjcman101

2

PHP、72 92バイト

for($b=[];++$i<$argc;)array_splice($b,$b?$argv[$i]%count($b)+1:0,0,$argv[++$i]);print_r($b);

コマンドライン引数からフラット化された入力を取ります。で実行し-nrます。


私はこの答えが無効であることをかなり確信しています:私はFatal error: Uncaught DivisionByZeroError: Modulo by zeroそれを修正し、代わりに出力として試し1 1 1 2 1 3、取得し[1=>null]ました[1,3,2]
-user59178

j+1jに挿入するのではなく、まだ上書きしますか?18 1 7 11 35 3 22 16=> [1,11,16]ではなく[1,11,16,3]
user59178

@ user59178:ああ、insertキーワードを見逃していた。ありがとう。一定。
タイタス

2

Java 7、125 124バイト

import java.util.*;List z(int[]a){List r=new Stack();for(int i=0,q=a.length/2;i<q;)r.add(i<1?0:a[i+q]%i+1,a[i++]);return r;}

インデックスが続く値のフラットリストを受け入れます。二乗テストケースの場合、入力は次のようになります。new int[] {1, 2, 3, 4, 5, 6, 7, 8, 1, 4, 9, 16, 25, 36, 49, 64}

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


1

Mathematica、62バイト

Fold[Insert[#,#2[[1]],Mod[Last@#2,Tr[1^#]]+2/.0/0->-1]&,{},#]&

#ペアのリストであると期待される最初の引数を持つ純粋な関数。空のリストから始めて、次の関数を使用して入力リストを{}残します。Fold#

Insert[                                            Insert
       #,                                          into the first argument
         #2[[1]],                                  the first element of the second argument
                 Mod[                              at the position given by the modulus of
                     Last@#2,                      the second element of the second argument
                             Tr[1^#]               with respect to the length of the first argument
                                    ]+2            plus 2 (plus 1 to account for 1-indexing, plus 1 because we are inserting after that position)
                                       /.          then replace
                                         0/0       Indeterminate
                                            ->     with
                                              -1   negative 1
                                                ]& End of function

1

Perl 6、51バイト

{my @a;.map:{splice @a,(@a??$^b%@a+1!!0),0,$^a};@a}

平坦化された入力を受け取ります。


1

Clojure、87バイト

#(reduce(fn[r[v i]](let[[b e](split-at(+(mod i(max(count r)1))1)r)](concat b[v]e)))[]%)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.