アイテムを収集して配置する


13

このチャレンジの目標は、リスト内の選択されたアイテムを収集し、それらをリスト内の特定の場所に移動することです。

視覚的な例として、入力値を取る(ブラックボックス化整数で表される)と(青色のボックスで表される、項目が選択され、真の意味がtruthy値の対応するリストTtruthyとFfalsyあります)。

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

最初の論理ステップは、真実ではなくマークされたアイテムを対応するリストに分けることです。各リストの相対的な順序を維持する必要があることに注意してください(つまり、選択したアイテムの順序はでなければならず1,4,5、選択していないアイテムの順序はでなければなりません2,3,6,7)。

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

2番目の論理ステップには、選択されていないアイテムの残りのリストにインデックスが与えられ、指定されたインデックスのアイテムの前にすべての選択されたアイテムを挿入します。インデックス作成が0から始まると仮定して、インデックス3に選択範囲を挿入するとします。これは、7ボックスの前のスポットに対応するため、選択したアイテムはの前に挿入する必要があり7ます。

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

最終的なソリューションは2,3,6,1,4,5,7です。

この論理図は、これを行う方法の1つを示していることに注意してください。出力が常に同じ観測可能な結果を​​生成する限り、プログラムは同じ論理手順を実行する必要はありません。

入力

プログラムには3つの入力が与えられます。

  1. アイテムを表す整数のリスト。これは空のリストである可能性があります。このリストは常に一意の正の整数で構成され、必ずしもソート順ではありません(つまり、5はリストに2回含まれません)。
  2. アイテムのリストと同じ長さの真実/偽の値のリスト。真実の値は、同じインデックスのアイテムが選択されたことを表します。
  3. 選択を挿入する場所を表す整数。リストの最初の項目のインデックスは、プログラムの実行ごとに一定である限り選択できます(たとえば、最初の項目はインデックス0またはインデックス1です)。プログラムが準拠している規則を指定してください。このインデックスは範囲内にある必要があります[starting_idx, ending_idx+1]。つまり、常に有効なインデックスになります。ケースインデックスがの場合ending_idx+1、選択はリストの最後に挿入する必要があります。この整数は、言語のネイティブ整数型に適合すると仮定できます。

入力は、任意のソース(stdio、関数パラメーターなど)から取得できます。

出力

出力は、アイテムの最終シーケンスを表すリストです。これは、任意のソース(stdio、戻り値、関数出力パラメーターなど)に対して行うことができます。任意の入力をインプレースで変更できます(たとえば、変更可能なリストを関数パラメーターとして指定し、そのリストで関数をインプレースで動作させる)。

テストケース

以下のテストケースはすべて、0ベースのインデックス付けを前提としています。0と1を使用して、それぞれセレクションマスクの偽/真の値を示しました。

テストケースのリストはたまたまフォーマットされています[a,b,c]が、入力リストが有限の順序のシーケンスを表している限りは問題ありません。

入力:

[]
[]
0

出力:

[]

入力:

[1,2,3,4,5,6,7]
[1,0,0,1,1,0,0]
3

出力:

[2,3,6,1,4,5,7]

入力:

[1,2,3,4,5,6,7]
[1,0,0,1,1,0,0]
0

出力:

[1,4,5,2,3,6,7]

入力:

[1,2,3,4,5,6,7]
[1,0,0,1,1,0,0]
4

出力:

[2,3,6,7,1,4,5]

入力:

[1,2,3,4,5,6,7]
[1,1,1,1,1,1,1]
0

出力:

[1,2,3,4,5,6,7]

入力:

[1,2,3,4,5,6,7]
[0,0,0,0,0,0,0]
5

出力:

[1,2,3,4,5,6,7]

入力:

[1,3,2,5,4,6]
[1,0,0,1,1,0]
3

出力:

[3,2,6,1,5,4]

得点

これはコードゴルフです。バイト単位の最短回答が優先されます。標準的な抜け穴は禁止されています。必要なビルトインを使用できます。


入力と出力を「 "1 2 3"、 "1 0 0"、1 '」のようにできますか?
betseg

はい、2つの有限順序整数シーケンスと整数インデックスを表すものなら何でも構いません。
helloworld922

最初の配列には負のアイテムまたはゼロが含まれますか?
リーキー修道女

私はノーと言いたいのですが、私はあなたがこれを必要とする解決策に興味を持っています。そのため、最初のリストには正の整数のみが含まれていると想定できます。
helloworld922

@PeterTaylor no。「真実/偽の値のリスト...」を読むように修正しました。真実/偽の値の「タイプ」を説明する良い名前はありますか?ブールのような?
helloworld922

回答:


10

MATL、9バイト

&)i:&)bwv

このソリューションは、2番目の入力としてT(true)およびF(false)値の配列を受け入れます。また、空の配列を使用した最初のテストケースでは、出力は生成されません。

オンラインでお試しください!すべてのテストケース用にわずかに変更されたバージョン

説明

    % Implicitly grab the first two inputs
&)  % Index into the first array using the boolean, places two items on the stack:
    % 1) The values where the boolean is TRUE and 2) the values where it is FALSE.
i   % Explicitly grab the third input (N)
:   % Create an array from 1...N
&)  % Index into the FALSE group using this array as an index. Puts two items on the stack:
    % 1) The first N elements of the FALSE group and 2) other members of the FALSE group
b   % Bubble the TRUE members up to the top of the stack
w   % Flip the top two stack elements to get things in the right order
v   % Vertically concatenate all arrays on the stack
    % Implicitly display the result

5

Mathematica、66 62バイト

@MartinEnderから4バイトを保存しました

a=#2~Extract~Position[#3,#4>0]&;##&@@@Insert[##~a~0,##~a~1,#]&

無名関数。1から始まるインデックス、リスト、およびマーカーを入力として受け取り、並べ替えられたリストを出力として返します。


3

Haskell、70バイト

m%n=[e|(e,b)<-zip m n,b]
(l#s)p|(h,t)<-splitAt p$l%(not<$>s)=h++l%s++t

使用例:([1,2,3,4,5,6,7]#[True,False,False,True,True,False,False]) 3-> [2,3,6,1,4,5,7]

使い方:

m%n=[e|(e,b)<-zip m n,b]        -- helper function, that extracts the elements of m
                                -- with corresponding True values in n
(l#s)p                          -- l: list of values
                                   s: list of booleans
                                   p: position to insert
  |                   (not<$>s) -- negate the booleans in s
                    l%          -- extract elements of l
          splitAt p             -- split this list at index p
   (h,t)<-                      -- bind h to the part before the split
                                -- t to the part after the split
     = h++l%s++t                -- insert elements at True positions between h and t

3

JavaScript(ES6)、76バイト

(a,b,c)=>(d=a.filter((_,i)=>!b[i]),d.splice(c,0,...a.filter((_,i)=>b[i])),d)

1

ゼリー、10 バイト

¬+\>⁵Ḥ³oỤị

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

使い方

¬+\>⁵Ḥ³oỤị  Main link.
            Arguments: x (list of Booleans), y (list of inputs), z (index)
¬           Logical NOT; invert all Booleans in x.
 +\         Take the cumulative sum.
            This replaces each entry with the number of zeroes up to that entry.
   >⁵       Compare the results with z.
            This yields 0 for the first z zeroes, 1 for all others. The behavior
            for ones is not important.
    Ḥ       Unhalve; multiply the previous resulting by 2.
     ³o     Take the element-wise logical NOT of x and the previous result.
            This replaces all but the first z zeroes in x with twos.
       Ụ    Grade up; sort the indices of the result according to the corr. values.
        ị   Retrieve the items of y at those indices.

0

C#、132バイト

int[]r(int[]a,bool[]b,int l){var x=a.Where((i,j)=>!b[j]);return x.Take(l).Concat(a.Where((i,j)=>b[j])).Concat(x.Skip(l)).ToArray();}

権利なし:

    public static int[] r(int[] a,bool[] b,int l)
    {
        var x = a.Where((i, j) => !b[j]);
        return x.Take(l).Concat(a.Where((i, j) => b[j])).Concat(x.Skip(l)).ToArray();
    }

改善のアイデアに感謝します。


0

Python 3、91バイト

def f(a,x,i):b=[c for c,z in zip(a,x)if z<1];return b[:i]+[c for c in a if(c in b)<1]+b[i:]

where aは要素/番号のリスト、xTrue/Falseリストおよびiインデックスです。

読みやすさを向上させる複数行バージョン:

def f(a,x,i):
    b=[c for c,z in zip(a,x)if z<1]
    return b[:i]+[c for c in a if(c in b)<1]+b[i:] 

どのように機能しますか?

呼び出しzip(a,x)により、タプルのリストが作成され、各タプルに情報が含まれます(element,0|1)。次に、リスト内包表記を使用して、0/False値が関連付けられている要素を判別し、変数に格納しますb

その[c for c,z in zip(a,x)if z<1]ため、0False)値が関連付けられているすべての要素を含むリストを作成します。

その後、True|1値が関連付けられている要素のリスト(:にa存在しない要素を確認することで決定されbます[c for c in a if(c in b)<1])は、指定されたインデックスに0False)値が関連付けられている(リストb)を持つすべての要素とともにリストに挿入されますi結果のリストが返されます。


0

Python 3、106 93バイト

def f(x,y,z):
 t,f=[],[]
 for n in range(len(x)):(f,t)[y[n]].append(x[n])
 f[z:z]=t
 return f

古いバージョン:

def f(x,y,z):
 t,f=[],[]
 for n in range(len(x)):
  if y[n]:t+=[x[n]]
  else:f+=[x[n]]
 f[z:z]=t
 return f
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.