配列の繰り返しをカウントする


20

配列を受け取り、複数回発生する整数の数を返す必要があります。

[234, 2, 12, 234, 5, 10, 1000, 2, 99, 234]

2342が複数回出現するため、これは2を返します。

[234, 2, 12, 234]
[2, 12, 234, 5, 10, 1000, 2]

リストの長さが100kを超えることはありません。また、リスト内の整数は常に-100k〜100kの範囲になります。

整数が複数回出現する場合、整数をカウントする必要があります。したがって、整数が3回出現した場合でも、1つの繰り返し整数としてカウントされます。

テストケース

[1, 10, 16, 4, 8, 10, 9, 19, 2, 15, 18, 19, 10, 9, 17, 15, 19, 5, 13, 20]  = 4
[11, 8, 6, 15, 9, 19, 2, 2, 4, 19, 14, 19, 13, 12, 16, 13, 0, 5, 0, 8]     = 5
[9, 7, 8, 16, 3, 9, 20, 19, 15, 6, 8, 4, 18, 14, 19, 12, 12, 16, 11, 19]   = 5
[10, 17, 17, 7, 2, 18, 7, 13, 3, 10, 1, 5, 15, 4, 6, 0, 19, 4, 17, 0]      = 5
[12, 7, 17, 13, 5, 3, 4, 15, 20, 15, 5, 18, 18, 18, 4, 8, 15, 13, 11, 13]  = 5
[0, 3, 6, 1, 5, 2, 16, 1, 6, 3, 12, 1, 16, 5, 4, 5, 6, 17, 4, 8]           = 6
[11, 19, 2, 3, 11, 15, 19, 8, 2, 12, 12, 20, 13, 18, 1, 11, 19, 7, 11, 2]  = 4
[6, 4, 11, 14, 17, 3, 17, 11, 2, 16, 14, 1, 2, 1, 15, 15, 12, 10, 11, 13]  = 6
[0, 19, 2, 0, 10, 10, 16, 9, 19, 9, 15, 0, 10, 18, 0, 17, 18, 18, 0, 9]    = 5
[1, 19, 17, 17, 0, 2, 14, 10, 10, 12, 5, 14, 16, 7, 15, 15, 18, 11, 17, 7] = 5

どういう意味Once it counts the repetition, don't count againですか?また、特定の整数の繰り返しを見つけたいので、与えられていない場合、どの整数を検索するのかをどのように知るのでしょうか?最後に、テストケースは少しわかりにくいです。出力と入力はどちらですか?
無知の具体化

4
これを編集して、少しわかりやすくしました。これはあなたが意図したものですか?また、それらのテストケースの回答を入力してください。
Rɪᴋᴇʀ

1
私は彼らが間違って行く場合、私は申し訳ありませんが、テストケースにいくつかの答えを追加した
MickyT

1
これが意図したものであることが確認されるまで、この質問を終了することに投票しました。
Rɪᴋᴇʀ

4
関連(一意でないアイテムの量ではなく、一意でないアイテムを出力します)。
ケビンクルーッセン

回答:


15

R、20バイト

これはあなたが望んでいることですか?tablescan入力値の出現回数をカウントするために使用します。カウントが1より大きいかどうかをテストし、真を合計します。

sum(table(scan())>1)

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


私の心はduplicated最初に行きました-謙虚tableはゴルフにとても便利です!
ジュゼッペ

@giuseppeテーブルは今お気に入りです:)
MickyT




6

C(打ち鳴らす) 175の 117 95バイト

c(*a,*b){return*a-*b;}r(*l,m){qsort(l,m,4,c);return((!m||l[1]-*l)&l[-1]==*l)+(m?r(l+1,m-1):0);}

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

これらのいずれかを提出したのは今回が初めてなので、フォーマットなどに問題がある場合はお知らせください。

コメントからの更新:

  • Jo Kingから-58〜117バイト
  • ASCIIのみから-80〜95バイト

元の提出


5
ようこそ、いいスタートです。私はCの人ではありませんが、C ページをゴルフするためのヒントへのリンクがあります
MickyT

2
117バイト=> d,i;c(*a,*b){return*a-*b;}r(l[],m){qsort(l,m,4,c);for(i=d=0;++i<m;)d+=((l[i+1]-l[i]||i>m-2)&&l[i-1]==l[i]);return d;}。@ASCIIのみが述べたように、includesはプログラムのコンパイルに影響しません
Jo King

2
@JoKing 100:d;c(*a,*b){return*a-*b;}r(*l,m){qsort(l,m,4,c);for(d=0;~m--;)d+=(!m||l[1]-*l)&l[-1]==*l++;return d;}
ASCIIのみ

1
@CollinPhillipsはい。あなたは、私が投稿リンクで見ることができるように、それはまだ含まれずに罰金をコンパイル
ASCIIのみ

2
95:c(*a,*b){return*a-*b;}r(*l,m){qsort(l,m,4,c);return((!m||l[1]-*l)&l[-1]==*l)+(m?r(l+1,m-1):0);}
ASCIIのみ

5

C#(Visual C#Interactive Compiler)、40バイト

n=>n.GroupBy(c=>c).Count(c=>c.Count()>1)

仕様の最初のドラフトは不明確であり、複数回出現するすべての要素を返すことを意味すると考えました。これは更新されたバージョンです。

どういうわけか、私のコードが一度出現した要素の数を返すことに気づかなかった。それをキャッチしてくれたPaul Karamに感謝します!

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


1
出力が間違っています。2回以上出現する要素をカウントする必要があります。あるはずですn=>n.GroupBy(c=>c).Count(c=>c.Count()>=2)。OPは、このリストの答えは2.あなたのコードが戻る5.私はあなたが2を返した変更語る
ポールKaramの

1
または>1、40バイトのカウントを維持するために
Paul Karam

@PaulKaram気づかなかった、ありがとう!
無知の具体化


4

J11 9バイト

-Jonahのおかげで2バイト!

1#.1<1#.=

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

元のソリューション:

1#.(1<#)/.~

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

説明:

        /.~   group the list by itself
   (   )      for each group
    1<#       is the length greater than 1
1#.           sum by base-1 conversion

こんにちは、ガレン。 1#.1<1#.=9バイト+古き良き自己分類の楽しみ。
ジョナ

1
@ジョナありがとう!正直なところ、私はこれを知りませんでした。
ガレンイワノフ

1
@ジョナニース
アダム

@Adámそしてここで私はJがAPLと結び付けられたことを喜んでいた。再びホイル:)
ジョナ






3

Java 8、74 73バイト

L->L.stream().filter(i->L.indexOf(i)<L.lastIndexOf(i)).distinct().count()

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

説明:

L->                      // Method with ArrayList parameter and integer return-type
  L.stream()             //  Create a stream of the input-list
   .filter(i->           //  Filter it by:
     L.indexOf(i)        //   Where the first index of a value
     <L.lastIndexOf(i))  //   is smaller than the last index of a value
   .distinct()           //  Deduplicate this filtered list
   .count()              //  And return the count of the remaining values



3

Haskell、41バイト

f[]=0
f(a:s)=sum[1|filter(==a)s==[a]]+f s

このソリューションでは、基本的に、リスト内の同じ要素がリスト内で一度だけ表示される要素の数をカウントします。


2

Haskell、47バイト

f[]=0
f(a:b)|x<-filter(/=a)b,x/=b=1+f x|1>0=f b

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

これがナイーブアプローチです。これを改善するためにできることはおそらくあります。

f[]=0

我々は返します 0空のリストにます

f(a:b)

次で始まる空でないリストの場合 aおよびで場合b

|x<-filter(/=a)b,x/=b=1+f x

からのフィルタリングaがでbあるb(つまりaであるb)場合、f適用されるよりも1多い値を返しますbしてa濾別sです。

|1>0=f b

フィルタリングする場合 a sが変更されない、残りをb実行fします。

同じ長さの別の同様のアプローチを次に示します。

f[]=0
f(a:b)|elem a b=1+f(filter(/=a)b)|1>0=f b

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



2

Wolfram言語34バイト

 Length@DeleteCases[Gather@#,{x_}]&

Gather同一の整数をリストにグループ化します。 DeleteCases[...{x_}]単一の数字を含むリストを削除します。 Length残りのリストの数を返します(それぞれに2つ以上の同一の整数が含まれます。


1
Count[{_,__}]@*Gather
alephalpha


2

Pyth、6バイト

l{.-Q{

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

説明

l{.-Q{
     {Q   Deduplicate the (implicit) input.
  .-Q     Remove the first instance of each from the input.
l{        Count unique.



1

要素、40バイト

_(#'{"2:0+4:'~1+";~2=[''1+""]$2+'[(#]'}`

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

これには、[234, 2, 1000, 2, 99, 234][]カンマと整数間のスペースで囲まれた)のような正確な形式の入力が必要です。

説明:

_                                        input
 (#                                      delete the [ at start of input
   '{"                               '}  WHILE the string is non-empty
   '{"2:                             '}    duplicate it
   '{"  0+                           '}    add 0 to coerce to integer (gets next number in array)
   '{"    4:                         '}    make 3 additional copies
   '{"      '                        '}    temporarily move 1 copy to control stack
   '{"       ~                       '}    fetch the current map value for given integer
   '{"        1+                     '}    increment map value
   '{"          "                    '}    retrieve temporary copy of integer (the key for the map)
   '{"           ;                   '}    store updated map value
   '{"            ~                  '}    fetch map value again (1 if 1st instance, 2 if 2nd, etc.)
   '{"             2=                '}    test for map value = 2, this is the first duplication
   '{"               [      ]        '}    IF
   '{"               [''    ]        '}      move stuff from main stack to control stack
   '{"               [  1+  ]        '}      increment the counter of duplicate (bottom of stack)
   '{"               [    ""]        '}      move stuff back to main stack
   '{"                       $       '}    take length of current integer
   '{"                        2+     '}    add 2 (for the comma and space)
   '{"                          '[  ]'}    FOR loop with that number
   '{"                          '[(#]'}      trim those many characters from front of input string
                                       ` output result



1

さび、126バイト

let f=|v:Vec<i32>|{let mut u=v.clone();u.sort();u.dedup();u.iter().filter(|i|v.iter().filter(|n|**n==**i).count()>1).count()};

あきらめる。これは基本的にRubyと同じです。「別の方法」で配列を作成し、入力ベクトル+100000の値を使用して配列にインデックスを付けますが、型変換(usize / i32として)が大量のスペースを占有します。



1

k、8バイト

+/1<#:'=

読み取り:合計(各グループの長さ)> 1

+/ is sum (plus over)

#:' is length each

= is group (ex. =1 2 1 6 7 2 generates 1 2 6 7!(0 2;1 5;,3;,4) (dictionary of unique value and its positions)

使用例(最初のテストケース)

+/1<#:'=1 10 16 4 8 10 9 19 2 15 18 19 10 9 17 15 19 5 13 20

書き込み4

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