非ユニーク要素


24

符号付き整数の配列の一意でない要素を見つけるプログラムを作成します。結果の配列は任意の順序にすることができます。

あなたの答えは、入力が変数(dたとえば)に保存されていると仮定し、正しい結果に評価されるスニペットかもしれません。

テストケース

各テストケースは、形式の1行ですinput => output。出力の他の順列も有効であることに注意してください。

[]                        => []
[-1, 0, 1]                => []
[1, 1]                    => [1]
[3, 0, 0, 1, 1, 0, 5, 3]  => [3, 0, 1]
[-34, 0, 1, -34, 4, 8, 4] => [-34, 4]

要素の順序は関係ありません。

これはコードゴルフなので、最短の回答(バイト単位)が勝ちです。



1
これは整数の配列用であるため、コードは異なります。ずっと短いと思います。それは文字列です。
garg10may

1
入力を配列ではなく行として受け入れることはできますか?たとえば、の代わりに[-1, 0, 1]、次のように入力できます(\ nを改行に置き換え"-1\n0\n1"ます)。
アディソンクランプ

1
出力はリストである必要がありますか、それともセットは受け入れられますか?
デニス

そして、その形式で出力する必要がありますか?
アディソンクランプ

回答:


16

K5、5バイト

変数にすでに入力されたと仮定するとd

?d^?d

別個の要素(テイク?以外のD)を(d^)Dの別個の要素(?d)。きれいに対称的ですか?これは、「except」演算子が左引数から右引数の最初の出現のみを削除するために機能します。

より一般的には、

nu: {?x^?x}

動作中:

  nu'(();-1 0 1;1 1;3 0 0 1 1 0 5 3;-34 0 1 -34 4 8 4)
(()
 ()
 ,1
 0 1 3
 -34 4)

編集:

一意でない要素が最初に出現する順序を保持したい場合は、4バイトの追加コストを除いて、一意の要素を削除する前後にソースリストを逆にすることができます。

  nu: {?|(|x)^?x}
  nu'(();-1 0 1;1 1;3 0 0 1 1 0 5 3;-34 0 1 -34 4 8 4)
(()
 ()
 ,1
 3 0 1
 -34 4)

10

CJam、10

このコメントに基づいて)配列が既に変数Dにあると仮定します:

D{De=(},_&

オンラインで試す

説明:

D{…},   filter items of D based on the block
  De=   count occurrences in D
  (     decrement (resulting in true/false for duplicate/unique)
_&      remove duplicates from the results

注:pきれいに印刷する場合はaを追加します。そうしないと、デフォルトで区切り文字なしで結果の配列が出力されます。質問はスニペットが「正しい結果を評価する」だけでよいと指定しているため、これは受け入れられます。

標準入出力バージョン、13:

q~_{1$e=(},&p

オンラインで試す

説明:

q~      read and evaluate the input array
_       duplicate the array
{…},    filter items based on the block
  1$    copy the array
  e=    count occurrences
  (     decrement (resulting in true/false for duplicate/unique)
&       set intersection with the initial array (removes duplicates)
p       pretty print

1
13:q~$e`{((<~}%p
Sp3000

3
@ Sp3000コメントを読む前に別の13バイトバージョンを見つけました:)順序も保持されます。
aditsu

9

ハスケル-32

import Data.List;f l=nub$l\\nub l

インポートでも、かなり短いです。a \\ b各要素の最初の発生除去bからのa、そしてnubユニークなリストのすべての要素を作ります。


7

Pyth、7バイト

S{.-Q{Q

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

使い方

Pythは評価された入力を自動的に保存し、Q未使用の戻り値をすべて出力します。

     {Q  Convert Q into a set. This removes duplicates.
  .-Q    Perform "bagwise" difference of Q and set(Q).
         This removes the first occurrence of all elements in Q.
 {       Convert to set to deduplicate.
S        Sort. Returns a list.

7

SQL、44 42バイト

SELECT*FROM D GROUP BY I HAVING COUNT(*)>1

整数がテーブルDに格納されていると仮定しても問題ないでしょうか?これは、SQLServer、PostgreSQL、およびその他の両方で機能します。2バイトの@manatworkに感謝します。


iがテーブルdの唯一のフィールドであると仮定すると、PostgreSQLではこれをに減らすことができますselect*from d group by 1having count(*)>1。(MySQLとSQLiteのパーサーは分離されていないselect*from部分も処理しますが、理解していません1having。)
manatwork

@manatworkはそれを応援します。SQLサーバーもを理解しselect*fromます。が好きでは1havingない..としてそれを残すI having
-MickyT

6

Mathematica、29 26バイト

入力が次の場所に保存されていると仮定しますd

Select[d⋃d,d~Count~#>1&]

それ以外の場合は、名前のない関数として29バイトです。

Cases[#⋃#,n_/;#~Count~n>1]&

ここで、d⋃d(または#⋃#)は重複を削除するためのゴルフのトリックです-セット結合をそれ自体と一緒に取得することにより、Mathematicaはリストをセットとして解釈し、重複を自動的に削除しますが、実際の結合は何もしません。

その後、両方のメソッドは、元のリストに表示される要素を少なくとも2回単純にフィルタリングします。


6

JavaScript(ES6)、37バイト

JavaScriptコンソールでこれを実行します。

e={};d.filter(x=>(e[x]=1+e[x]||0)==1)

JavaScriptが完全であると見なされるにconsole.logalert、何らかの明示的な「出力/印刷」関数(など)が必要であることは一般に受け入れられています。チャレンジに「プログラムまたは関数を書く」と書かれている場合、関数は十分に戻ります。それはさておき、非常に効率的なソリューションです!
Mwr247

1
@ Mwr247質問は、回答が正しい結果に評価されるスニペットである可能性があることを示しています
クリスチャンルパスク

1
私はその段落を誤って解釈したようです。謝罪=)
Mwr247

@ Mwr247問題ありません!:)
クリスチャンルパスク

6

Matlab / Octave、40

入力値は実数(複雑ではない)であると想定しています。入力は変数にありますd

unique(d(sum(triu(bsxfun(@eq,d,d')))>1))

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


入力する必要はありません。変数 'd'のデータを想定できます
-garg10may

1
@ garg10mayありがとう。更新しました。あなたの投稿でそれを指定する必要があります
ルイスメンドー

の場合、出力は正しくありませんd = [3, 0, 0, 1, 1, 0, 5, 3]。2つあります0
alephalpha

@alephalphaありがとう!修正(さらに8バイト)
ルイスメンドー

短い:d(sum(triu(bsxfun(@eq,d,d')))==2)。またはオクターブで:d(sum(triu(d==d'))==2)
alephalpha

6

Python 3.5、30

[x for x in{*d}if~-d.count(x)]

Python 3.5のセットの展開を使用します。~-Falsyである1 0へのカウントを取る減算1、。

これはリストを提供します。セットを指定しても問題ない場合、セットの内包表記を使用して、1文字を節約し、バージョン3.5は不要です。

{x for x in d if~-d.count(x)}

SyntaxError: invalid syntaxPython 3の場合、3.5でのみ有効ですか?Pythonが難解になり始めたのはいつですか。
garg10may

@ garg10may 3.6の
...-Sp3000

1
@ Sp3000すごい。Scalaと同じセットアップのように見えます。他の選択肢よりもはるかに読みやすい。
発がん性物質

6

PowerShell、31 29バイト

($d|group|?{$_.Count-1}).Name

それ$dがすでに(与えられているように)移入されていると仮定します-例えば$d=@(-34,0,1,-34,4,8,4)

配列をGroup-Objectコマンドレットにパイプします。コマンドレットは、類似項目をグループ化し、基本的に配列の配列であるオブジェクトを吐き出します。それをWhere-Object?演算子)にパイプし、Count2つ以上(重複がある)を持ち.Name、それらのアイテムを出力します。最初の順序を保持するという副次的なボーナスもあります。

編集-DankoDurbićのおかげで2バイト節約


1
私はあなたが交換することができると思う$_.Count-gt1$_.Count-1すべてのために真であると思われるCountものよりも大きいです。
ダンコドゥルビッチ

@DankoDurbićすばらしい!
AdmBorkBork

6

APL(Dyalog Unicode)13 9 バイトSBCS

匿名の暗黙の接頭辞関数。

∊(⊂1↓⊣¨)⌸

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

()⌸ 一意の各要素(左引数)およびそれが発生するインデックス(右引数)に対して、次の暗黙関数を適用します。

⊣¨ 右側(インデックス)の左側の1つ(一意の要素)

1↓ 落とす

 囲みます(ゼロのパディングを防止して、不規則な行列を作成します)

ϵ nlist(平坦化)


5

ジュリア、30 29バイト

∪(d[find(sum(d.==d',1)-1)])

d.==d'i,jがtrueの場合は対称マトリックスを作成し、d[i]==d[j]それ以外の場合はfalseを作成します。sum1つの次元でmingしてから1を引くと、要素が1つしかない場合はゼロが生成され、複数ある場合は非ゼロが生成されます。findゼロ以外の要素のインデックスを取得し、配列d自体のインデックス作成に使用します。(ユニオン)はunique、この方法で使用される場合と同様に機能し、繰り返しを削除します。

古いソリューション:

∪(filter(i->sum(d.==i)>1,d))

シンプル-エントリごとに、配列に複数のエントリがあるかどうかをチェックします。複数あるフィルターは「フィルター」によって返され、次に(結合)uniqueこのように使用された場合のように動作し、繰り返しを削除します。

注:元々は関数として持っていましたが、質問で配列を変数に保存することができますd。質問で提案されているように、そのために選択しました。


5

Pythonの2.7、36 42

list(set(filter(lambda x:d.count(x)>1,d)))

編集:質問で必要な形式に準拠するために、式をlist(..)で囲みます


これはリストではなくセットを出力します
-garg10may

それで、list(...)の呼び出しでスニペットを囲む必要がありますか?
ダイエット

はい、出力は配列のみである必要があります。
garg10may


5

R、31 24バイト

7バイトのflodelに感謝します。

入力が既ににあると仮定しますd

コード:

unique(d[duplicated(d)])

編集:aditsuが指すように3つ以上の重複がある場合に正しく出力されるようになりました


2
それは美しく見えます!しかし、4番目のテストケースは正しくないようです
...-aditsu

1
論理引数も受け入れるためwhich、削除でき[ます。
flodel

5

Pythonの3 - 33の 30バイト

{_ for _ in d if d.count(_)>1}

d入力としてのRepl出力。



4

Pyth、7バイト

ft/QT{Q

説明:

ft/QT{Q
           Q = eval(input())
     {Q    set(Q) - deduplicate
f          filter - with T as the filter variable.
  /QT      count in Q of T
 t         minus 1.

フィルターは、要素のセットから一度だけ出現するすべての要素を削除します。


4

LINQ、62 54バイト

ちょっと新しいが、ここには何もありません。

d.GroupBy(c=>c).Where(g=>g.Count()>1).Select(g=>g.Key)

サイトへようこそ!LINQはわかりませんが、スコアを改善するためにこれから削除できる空白がいくつかあります。
DLosc


3

シェル+ GNU coreutils、12

sort|uniq -d

テスト出力:

$ printf "%s\n" -34 0 1 -34 4 8 4 | ./nonuniq.sh 
-34
4
$ 

3

Mathematica、23バイト

入力が保存されている場合d

Pick[#,#2>1]&@@@Tally@d

関数として、24バイト:

Pick[#,#2>1]&@@@Tally@#&

たとえば、

d = {3, 0, 0, 1, 1, 0, 5, 3}
Tally@d

これを返します:

   {{3, 2},
    {0, 3},
    {1, 2},
    {5, 1}}

(各サブリストの最初の要素は要素で、2番目の要素は出現頻度です)。このリストに適用すると、Pick[#,#2>1]&@@@変換されます

{Pick[3,2>1], Pick[0,3>1], Pick[1,2>1], Pick[5,1>1]}

そして、2番目の引数が最初の引数にPick評価される場所Trueが返されます。


3

K(K5ではない)、10バイト

x@&1<#:'=x

入力がであると仮定しますx。K5以外の回答をするのは楽しいと思いました!


3

Perl 6、16バイト

リストが格納されていると仮定すると、$_次のスニペットのいずれかを使用できます。
(具体的に許可された)

(--«.BagHash).Set.keys # 23 bytes
keys .Bag (-) .Set # 18 bytes
# U+2216 SET MINUS
keys .Bag∖.Set # 16 bytes in utf8

あなたがバッグを手に入れることを気にしないなら、あなたは去ることができましたkeys 

$_ = [3, 0, 0, 1, 1, 0, 5, 3];
.Bag∖.Set  3 # True
.Bag∖.Set  5 # False

これらのいずれにも、符号付き整数のみで動作するという制限はありません。または、その問題については数値だけでさえも制限されません。

say keys .Bag∖.Set given |(<a b c d a a c>), 1/3, 2/3 - 1/3;
# (a c 0.333333)



2

Common Lisp、57バイト

(remove-duplicates(remove-if(lambda(x)(<(count x d)2))d))

2

オクターブ、33バイト

[~,a]=unique(d);d(a)=[];unique(d)
  • 各一意の整数の最初の出現のインデックスを検索し、
  • それらの発生を削除し、
  • 残りの配列の一意の要素を見つけます。

ここにイデオネがあります。すべてのサンプル入力を使用して呼び出すことができるように、スニペットを関数でラップしました。


2

Java 8、80バイト

x.stream().filter(i->x.indexOf(i)!=x.lastIndexOf(i)).collect(Collectors.toSet())

xに数値の入力リストが含まれると仮定します。


2

PHP、35 37バイト

かなり簡単です:

array_diff_key($a,array_unique($a))

注:;質問に次のように記載されているため、行末に追加しませんでした。

あなたの答えは、入力が変数(dなど)に保存されると仮定し、正しい結果に評価されるスニペットである可能性があります

したがって、このスニペットは次のように使用でき、正しい結果に評価されます。

print implode(' ', array_diff_key($a,array_unique($a)));

別のメモ

上記のコードは、チャレンジで提供されるすべてのテストケースで機能します。これらのすべてで、一意でない文字は多くても重複しています。要素が2回以上出現する可能性がある場合、別の要素がarray_unique()必要になり、長さが49バイトに増加します

array_unique(array_diff_key($a,array_unique($a)))

編集

  • 置き換えて2バイトを節約しましarray_diff_assocarray_diff_keyJörgHülsermannに感謝します。

1
array_diff_key代わりにarray_diff_assoc
ヨルクヒュルサーマン

@JörgHülsermann良いキャッチ。ありがとう。数日以内に他の提案をご覧ください。
ここにユーザー名を挿入します
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.