2つのリストの共通部分を設定する


10

目標は、整数の2つのリストの積集合を計算することです。共通部分は、両方の入力リストで少なくとも1回見つかった整数の順序付けされていない一意のグループとして定義されます。

入力

入力は任意の形式(関数パラメーター、stdioなど)にすることができ、整数の2つのリストで構成されます。多くの場合、負でない数の整数が含まれている(つまり、並べ替えられていない、重複が含まれている、長さが異なる、空であるなど)以外は、各リストについて何も想定していません。各整数は、言語のネイティブな符号付き整数型に適合し、1桁以上の10進数であり、符号付きであると想定されています。

入力例:

1 4 3 9 8 8 3 7 0
10 1 4 4 8 -1

出力

出力は、2つのリストの共通部分を任意のフォーマット(戻り値、stdioなど)に設定した整数のリストのようなものです。出力をソートする必要はありませんが、常にソートされる実装を提供することはできます。出力は、順序付けされていない有効なセットを形成する必要があります(たとえば、重複する値が含まれていてはなりません)。

テストケースの例(出力の順序は重要ではないことに注意してください):

最初の2行は入力リスト、3行目は出力です。(empty)空のリストを示します。

(empty)
(empty)
(empty)

1000
(empty)
(empty)

3 1 2 4 3 1 1 1 1 3
3 1 -1 0 8 3 3 1
1 3

1 2 1
3 3 4
(empty)

得点

これはコードゴルフです。バイト単位の最短の回答が優先されます。

標準のループホールは禁止されています。セットのような操作用に設計されていない組み込み機能を使用できます。

禁止されている組み込み機能:

  • 複製の作成/削除を設定する
  • セット差/交差/ユニオン
  • 一般的なメンバーシップテスト(たとえばin、Python のキーワードに類似したindexOfもの、関数のようなもの)。Pythonがinキーワードを再利用してこの構成を作成しているにもかかわらず、「リスト内のforeach項目」構成の使用が許可されていることに注意してください(他の制限に違反していない場合)。
  • これらの禁止されているビルトインは「バイラル」です。つまり、これらのサブ機能のいずれかを含む大きなビルトインがある場合、同様に禁止されます(たとえば、リストのメンバーシップによるフィルタリング)。

上記のリストにない組み込みはすべて許可されます(例:並べ替え、整数の等価性テスト、インデックスによるリストの追加/削除、フィルタリングなど)。

たとえば、次の2つの例のスニペット(Pythonに似たコード)を見てください。

# prohibited: filters by testing if each value in tmpList is a member of listA
result = tmpList.filter(listA)

# ok: filtering by a lambda which manually iterates over listA and checks for equality
def my_in_func(val, slist):
    for a in slist:
        if(val == a):
            return True
    return False
result = filter(lambda v: my_in_func(val, listA), tmpList)

これらのセットのような機能を自分で実装してもかまいません。それらはスコアに加算されます。

ソリューションは妥当な時間内に完了する必要があります(たとえば、2つのリスト(それぞれ長さ1000まで)のハードウェアでは、1分もかかりません)。


5
ちなみに、do X with Yには混乱と誤解がよく見られるため、公式にチャレンジを書くときに避けるべきことの 1つです。
Dennis

2
@Dennisええ、私はこの問題が本当にそれらの1つになっていると思います:(私が最初にそれを書いたとき、私はそれが興味深い問題になることを望んでいましたが、ルールセットの作成を開始したらすぐに、私はただ挑戦を殺すべきでした。
helloworld922 2016年

ランレングスエンコーディングを実行するビルトインは許可されていますか?
isaacg 2016年

それで大丈夫です。
helloworld922 2016年

1
出力に重複がありますか?
アダム

回答:



4

MATL、18バイト

YY_iti!=Xa)hStdfQ)

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

これは2つのステップで機能します。最初に交差点が計算されます。重複している可能性があります。これは、1つの配列のすべての要素をもう1つの配列のすべての要素と比較し、2番目に存在する最初の配列の要素を保持することに基づいています。

その後、重複が削除されます。このため、前のステップの配列がソートされ、前のステップと異なる場合はエントリが保持されます。-inf最初の(すなわち最低)値が失われないように値が付加されます。

YY_                 % push -infinity
   it               % take first input. Duplicate
     i!             % take second input. Transpose
        =           % test all combinations of elements of the two inputs for equality
        Xa          % row vector that contains true for elements of first array that 
                    % are present in the second, possibly duplicated
          )         % index into first array to keep only those elements. Now we need
                    % to remove duplicates
           h        % append -infinity
            S       % sort
             tdf    % duplicate. Find entries that differ from the preceding
                Q)  % add 1 and index into array to keep only non-duplicates

4

ゼリー、13バイト

=S¥Ðf
ṂrṀ{ç³ç

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

使い方

ṂrṀ{ç³ç  Main link. Arguments: A (list 1), B (list 2)

Ṃ        Yield m, the minimum of A.
  Ṁ{     Yield M, the maxmimum of A.
 r       Create an inclusive range from m to M.
    f³   Apply the helper link with right argument A.
      f  Apply the helper link with right argument B.


=S¥Ðf    Helper link. Arguments: n (integer in range), L (list, A or B)

=        Test all elements of L for equality with n.
 S       Add the results.
  ¥      Combine the two previous links into a dyadic chain.
   Ðf    Filter by the result of the sums.

@isaacg修正されました。
デニス

3

golflua、68文字

\f(a,b)k={}~@_,v p(a)~@_,w p(b)?w==v k[w]=w$$$~@_,v p(k)I.w(v," ")$$

と呼ばれる

> f({1,2,3,4},{3,4,5})
3 4
> f({3,1,2,4,3,1,1,1,1,3},{3,1,-1,0,8,3,3,1})
3 1

通常のLuaでは、これは

function foo(a,b)
   local k={}
   for i,v in pairs(a)
      for j,w in pairs(b)
         if v==w then
            k[v] = v
         end
      end
   end
   for i,v in pairs(k)
      print(v," ")
   end
end

つまり、基本的には2つのテーブルの各要素を繰り返し処理し、同等の値のみを格納しています。値をキー(k[w]=w)として使用することで、すべての重複を排除しています。次に、インデックスと値を反復して新しいテーブルを出力しますpairs


3

JavaScript(ES6)、66バイト

(a,b)=>a.filter((e,i)=>b.some(f=>e==f)&a.slice(0,i).every(f=>e-f))

を使用しindexOfないと、許可されているとは確信していません。


3

Pyth、12 11バイト

eMrSsq#RQE8

デモンストレーション

説明:

eMrSsq#RQE8
               Implicit: Q is one of the lists.
     q#RQE     For every element in the first list, filter the second list on
               equality with that element.
    s          Concatenate. We now have the intersection, with duplicates.
  rS      8    Sort and run length encode, giving counts and elements.
eM             Take just the elements.

ソートとrleは1バイトを節約します。
ジャクベ2016年

@Jakube rleは重複を削除する組み込み関数だと思います。
isaacg 2016年

以前に並べ替え、後でrleのカウントを削除した場合にのみ、重複が削除されます。少し灰色の部分ですが、辞書を使っているようです。基本的には、各要素の追加データを格納するセットです。
ジャクベ2016年

@Jakube OPは大丈夫だと言っています。ありがとう!
isaacg 2016年

2

bash + GNU coreutils、184バイト

[ -z "$1" ] && exit
p='{if(a[$0]++==0)print $0}'
while read A; do
while read B; do
[ $A = $B ] && echo $A
done < <(grep -oP '\d*'<<<$1|awk "$p")
done < <(grep -oP '\d*'<<<$2|awk "$p")

呼び出し:

./codegolf.sh '12 4 654 12 3 56' '4 4 56 33 3 3 3'

出力:

4
56
3

交差が空の場合、出力はありません。このスクリプトはソートせず、最初のセットが空であるかどうかの妥当性チェックを行います。説明:

[ -z "$1" ] && exit  # Exit if first set is empty
p='{if(a[$0]++==0)print $0}' # The AWK program we will use
while read A; do   # read the list with two
while read B; do   # encapsulated loops
[ $A = $B ] && echo $A   # if they match, then print
done < <(grep -oP '\d*'<<<$1|awk "$p")
done < <(grep -oP '\d*'<<<$2|awk "$p")
# the process substitution greps the numbers and pipes them to awk. Our awk program makes them unique without sorting; it uses associative arrays with index names same as lines (our numbers here).

知っておくべきボーナス:grep -o .これを数値ではなくランダムな文字列で行うように変更できます。


2

Perl 6の、26の 37バイト

{%(@^a.grep(any(@^b)):p.invert).keys}

使用法

> my &f = {%(@^a.grep(any(@^b)):p.invert).keys}
-> @a, @b { #`(Block|559823336) ... }
> f([3,1,2,4,3,1,1,1,1,3], [3,1,-1,0,8,3,3,1])
(1 3)

生意気な非競争の答え

> [3,1,2,4,3,1,1,1,1,3]  [3,1,-1,0,8,3,3,1]
set(3, 1)

または退屈な古いf機能でそれが好きなら

> my &f = &infix:<∩>
sub infix:<∩> (|p is raw) { #`(Sub+{<anon|130874592>}+{Precedence}|102325600) ... }
> f([3,1,2,4,3,1,1,1,1,3], [3,1,-1,0,8,3,3,1])
set(3, 1)

.uniqueを使用しないように回答を更新しました
ホットキー

1
invert代わりに値を使用する場合、実際には必要ありません。24バイト
Jo King

2

網膜、63バイト

最後の2行は重複を削除します。入力は、コンマで区切られた2つのスペース区切りリストです。出力は空白区切りです。

+`( -?\d+)\b(.*,.*)\1\b
$1_$2
-?\d+\b|_|,

+`(-?\d+)(.*)\1
$1$2

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

出力の重複が許可されている場合、私のプログラムは42バイトになります。


2

Jq 1.5、99バイト

def f(a;b):(a+b|min)as$m|[range($m;a+b|max)|[]]|.[a[]-$m][0]=1|.[b[]-$m][1]=1|.[[[1,1]]]|map(.+$m);

拡張

def f(a;b):
     (a+b|min) as $m         # find smallest value in either array
   | [range($m;a+b|max)|[]]  # create array of [] for indices [min,max]
   | .[ a[]-$m ][0]=1        # store 1 in [0] at corresponding indices of a
   | .[ b[]-$m ][1]=1        # store 1 in [1] at corresponding indices of b
   | .[[[1,1]]]              # find all the indices where we stored a 1 for a and b
   | map(.+$m)               # convert back from indices to values
;

これにより、{}オブジェクトの使用が回避され、jqにはビット操作がないため、配列でオブジェクトをエミュレートします。

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


2

公理、411バイト

b(x,v)==(l:=1;h:=#v;repeat(l>h=>break;m:=(l+h)quo 2;x<v.m=>(h:=m-1);x>v.m=>(l:=m+1);return m);0);g(a,b)==(if #a>#b then(v:=a;w:=b)else(v:=b;w:=a);c:=sort(v);for x in w repeat(if binSearch(x,c)~=0 then return 1);0)
f(a:List INT,b:List INT):List INT==(r:List INT:=[];#a*#b=0=>r;x:=sort(a);y:=sort(b);i:=1;repeat(i>#x=>break;v:=x.i;binSearch(v,y)=0=>(i:=i+1);r:=concat(r,v);while i<=#x and x.i=v repeat i:=i+1);r)

ゴルフを外してテストする

--suppose v.1<=v.2<=....<=v.#v as the default function sort() produce
--   binary serch of x in v, return the index i with v.i==x
--   return 0 if that index not exist
--traslated in Axiom from C  book
--Il Linguaggio C, II Edizione 
--Brian W.Kerninghan, Dennis M.Ritchie
binSearch(x,v)==
    l:=1;h:=#v
    repeat
       l>h=>break
       m:=(l+h)quo 2
       x<v.m=>(h:=m-1) 
       x>v.m=>(l:=m+1)
       return m
    0

--N*log(N)+n*log(n)+N*n*log(n) so it is N*n*log(n) or n*N*log(N)
ListIntersection(a:List INT,b:List INT):List INT==
    r:List INT:=[];#a*#b=0=>r
    x:=sort(a);y:=sort(b)
    i:=1
    repeat
        i>#x=>break
        v:=x.i
        binSearch(v,y)=0=>(i:=i+1)
        r:=concat(r,v)
        while i<=#x and x.i=v repeat i:=i+1
    r

(5) -> f([],[])
   (5)  []
                                                       Type: List Integer
(6) -> f([1000],[])
   (6)  []
                                                       Type: List Integer
(7) -> f([3,1,2,4,3,1,1,1,1,3],[3,1,-1,0,8,3,3,1])
   (7)  [1,3]
                                                       Type: List Integer
(8) -> f([1,2,1],[3,3,4])
   (8)  []
                                                       Type: List Integer

2

公理、257バイト

W(x,y)==>while x repeat y;f(a,b)==(r:List INT:=[];#a*#b=0=>r;x:=sort(a);y:=sort(b);i:=1;j:=1;repeat(j>#y=>break;W(i<=#x and x.i<y.j,i:=i+1);i>#x=>break;W(j<=#y and y.j<x.i,j:=j+1);j>#y=>break;v:=y.j;if x.i=v then(r:=concat(r,v);W(j<=#y and y.j=v,j:=j+1)));r)

これはbinsearchを使用せずに...しかし、大きなOはわかりません... Unglofedと結果:

--N*log(N)+n*log(n)+???
ListIntersection(a:List INT,b:List INT):List INT==
    r:List INT:=[];#a*#b=0=>r
    x:=sort(a);y:=sort(b)
    i:=1;j:=1
    repeat
        j>#y=>break
        while i<=#x and x.i<y.j repeat i:=i+1
        i>#x=>break
        while j<=#y and y.j<x.i repeat j:=j+1
        j>#y=>break
        v:=y.j;if x.i=v then 
                        r:=concat(r,v)
                        while j<=#y and y.j=v repeat j:=j+1
    r

(3) -> f([3,1,2,4,3,1,1,1,1,3],[3,1,-1,0,8,3,3,1])
   (3)  [1,3]
                                                       Type: List Integer
(4) -> f([],[])
   (4)  []
                                                       Type: List Integer
(5) -> f([1,2,1],[3,3,4])
   (5)  []
                                                       Type: List Integer

多くのテストを実行していないため、バグが発生する可能性があります...


2

ゼリー、12バイト

pEÐfḢ€ĠḢ€$ị$

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


Tioでは、3、1、2、4、3、1、1、1、1、3入力と3入力が[3]ではなく出力[1、2、3]を返す
RosLuP

@RosLuP [3]代わりに試してください3
HyperNeutrino 2017年

2つのリストは共通で1を持っている場合、結果は空集合、[1]の場合は2つのリストの交差点の結果は[](他の例として)を返すかどうかは、私の意見ではOKだろう
RosLuP

@RosLuP私はそれを助けることができない、それがジェリーが出力をする方法です。空の場合[]とシングルトンリストの場合は要素。Wikiページ(アトム)に移動して、Python Stringifyビルトインを追加できますが、これにより私の答えは長くなり、厳密なI / Oはばかげています
HyperNeutrino 2017年

[]の方法で入力リストのみを受け入れ(例[1]、[1,2,3] []、[]、[]など)、リスト[]の方法でのみ出力リストを出力することは私にとっては問題ありません(その入力として)。リストの括弧が{}または()の場合は、上記のスピーチを正しいものに対して繰り返します。これは私が思うことだけに
当てはまり

2

ハスク、9バイト

mo←←kIfE*

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

m            Map
 o←←         taking the first element from the first element
    kI       over lists of identical values from
        *    the Cartesian product of the two input lists
      f      filtered by
       E     both elements of a pair being equal.

GitHubでHuskのソースコードを見ると、k( "keyon")は、リストを並べ替えて隣接する値をグループ化する構成として実装されているため、実際に "groupOn"の実装を見つけることはできませんが、そうではないと仮定してもおそらく安全です。 Haskellは関数型言語であり、隣接する等しい値をグループ化することは、リンクリストを削減する操作が非常に簡単であるため、何も問題はありません。(に変更することで、ここで使用できる他の型シグネチャ「keyby」の実装を見つけることができますが、Haskellがわからないため、正確に機能するかどうかはわかりません。)kI=

また、あらゆる種類の集合演算が許可されていないことに気づく前に思いついた素敵な小さなBrachylogの回答: ⟨∋∈⟩ᵘ


2

R、 141 83バイト

l=sapply(strsplit(readLines(file("stdin"))," "),as.numeric)
r=rle(sort(unlist(l)))[[2]]
r[sapply(r,function(x)any(x==l[[1]])&any(x==l[[2]]))]

ジュゼッペによって改善

function(a,b){r=rle(sort(c(a,b)))[[2]];r[sapply(r,function(x)any(x==a)&any(x==b))]}

オンラインで試す ここに ここに


これは機能していないようです。私はおそらくそれを間違って使用しようとしているので、多分あなたはトライイットオンラインへのリンクを提供するべきです!使用方法を示し、課題の要件を満たしていることを示します。(回答に関する説明も害にはなりません。)
無関係の文字列

入力aを想定することはできずb、事前に定義されています。入力を関数の引数として受け取るか、STDINから受け取る必要があります。
Giuseppe

1
ゴルファーはこれを次のように
ジュゼッペ

1
@db「ヘッダー」は「コード」セクションで定義された無名関数に名前を付け(無名関数は完全に受け入れ可能)、フッターがそれを呼び出します。ヘッダー、コード、フッターのセクションはすべて1つのコードですが、「コード」セクションの一部のみがバイトとしてカウントされます:-)
Giuseppe

1

Python3、51バイト

lambda a,b:[v for v in a if{n:1 for n in b}.get(v)]

入力リストに重複が含まれる可能性がある場合:

Python3、67バイト

lambda a,b:list({v:1 for v in a if {n:1 for n in b}.get(v)}.keys())

1

PHP78、77バイト

function($a,$b){foreach($a as$x)foreach($b as$y)$x==$y?$c[$x]=$x:0;return$c;}

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

フリルはありませんが、ルールに準拠しています(私はそう思います)。

出力

[], []
[]

[1000], []
[]

[3,1,2,4,3,1,1,1,1,3], [3,1,-1,0,8,3,3,1]
[3,1]

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