リスト内のセットの出現回数を数える


15

空でない文字列のセットと文字列のリストが与えられた場合、リスト内でそのセットが何回出現するか、つまり、リストのアイテムでセットを作成できる回数を調べます。リストのすべての要素は一度しか使用できません。

ヒント:セットは、一意のアイテムの順序付けられていないリストです。

デフォルトの入出力ルールが適用されます。

外部ライブラリは許可されていません。コンパイラ/インタープリターの標準ライブラリは問題ありません。これはコードゴルフであるため、最短の解決策が重要です。


テストケース:

["apple", "banana"], ["apple", "pear", "apple", "banana", "banana"] => 2

["apple", "banana"], ["apple", "pear", "apple", "banana", "apple"] => 1

["apple", "banana", "pear"], ["apple", "banana", "kiwi", "apple"] => 0

["coconut"], [] => 0

編集:入力パラメーターがローカルスコープで定義されていることを示す文を削除しました。これは、上記でリンクされているデフォルトのIOルールと矛盾します。


はい、それはそれを明確にします。しかし、私は3番目の文に少しハングアップしています。「オブジェクトを処理しない」とはどういう意味ですか?
ポストロックガーフハンター

@WheatWizard一部の言語はオブジェクト指向ではなく、任意のオブジェクトを比較する概念を知りません。
ヒューバート・グルジェスコウィアック

1
オブジェクトがクローズドクラスであっても、私が知っているすべての言語が何らかのタイプのオブジェクトを処理するため、おそらくオブジェクト指向に変更する必要があります。また、文字列をまったく処理できない多くの言語があることも指摘する必要があります。
ポストロックガーフハンター

@WheatWizardわかりました、説明を更新しました。その段落は、C、アセンブラー、メープルなどの言語向けでした。
ヒューバートグルジェスコヴィアック

オブジェクト指向とはどの言語ですか?文字列でない場合、彼らは何を使うべきですか?最も簡単なことは、文字列だけに制限することだと思います。または、代わりに、整数のみ。十分な最も単純なタイプの使用に関するこのアドバイスを参照してください。
XNOR

回答:


12

Python、30バイト

lambda s,l:min(map(l.count,s))

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


良いですね。マップの使用を考えていませんでした。ラムダBTWを定義する代わりにprintを使用すると、少し節約できます。
ヒューバート・グルジェスコウィアク

1
@HubertGrzeskowiakをに変更するlambdaprint、2 input()が必要なため、バイトカウントが最大37になります。
ポストロックガーフハンター

チャレンジで述べた@WheatWizardは、ローカルスコープで定義された入力を考慮します。関数パラメーターやユーザー入力など、入力を明示的に定義する必要はありません。
ヒューバート・グルジェスコヴィアック

@HubertGrzeskowiakそれのための正当な理由がない場合は、あなたが私たちの上書きはならない入力および出力取るためのデフォルトを、私たちのcodegolfの提出のためのデフォルトを
OVS

@ovsああ、私はその投稿を知りませんでした。ありがとう。
ヒューバート・グルジェスコヴィアック


6

ゼリー6 5 4バイト

ċ@€Ṃ

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

プログラムの最初の引数はセットであり、2番目の引数はリストです。

説明

ċ@€Ṃ
ċ@   -- Create a link which finds the number of occurrences of 
          its left argument in its right argument (the list)
  €  -- Map this link over each element in the first argument
          of the program (the set)
   Ṃ -- Minimum value of this.

@ETHproductionsのおかげで-1バイト

@ETHproductionsのおかげで再び-1バイト


非常に素晴らしい!あなたは、1行にリンクを組み合わせることで、バイトを保存することができます:⁹ċ$€Ṃ私の代わりに暗黙の右引数を使用することによって短くすることができる感覚を持っている...
ETHproductions

私は考える ċ@€Ṃ(...作品は別のバイトを保存するため@に引数を反転ċ
ETHproductions

@ETHproductionsは、私がテストした限りでは正しく動作します。
fireflame241

昨年の5月12日まで存在しませんでしたが、代わりに@€(プログラムに対する引数を逆にして)さらに1バイト節約でき
関連のない文字列


5

JavaScript(ES6)、64バイト

(s,l)=>l.map(e=>m[s.indexOf(e)]++,m=s.map(e=>0))&&Math.min(...m)

両方sを想定しl、オブジェクトの配列です。比較にJavaScriptの厳密な等価性を使用するため、たとえば[] === []falseです。


非常に興味深いソリューション。結果を返すか印刷してください。知る限り、これは匿名関数を返します。
ヒューバート・グルジェスコウィアク

2
@HubertGrzeskowiak示されているコードは、匿名関数に評価されます。呼び出されると、関数は必要に応じてカウントを返します。
ニール

4

Haskell37 34バイト

@Laikoniに3バイトを削ってくれてありがとう。

s#l=minimum[sum[1|y<-l,y==x]|x<-s]

タイプが派生している(set::[a]) # (list::[a])場所で呼び出してください。aEq


代わりに length[y|y<-l,y==x]を使用できますsum[1|y<-l,y==x]
ライコニ

@ライコニ、あなたはそれについて確かですか?のようなものを使用する必要があると思いますがsum[1|y<-l,y==x,_<-y]、これは2バイト長くなります
Wolf

気にしないで、あなたは間違いなく正しい。良い電話。
ジュリアンウルフ


3

Mathematica、24バイト

Min[#/.Rule@@@Tally@#2]&

推奨される順序で2つのリストを引数として使用し、非負の整数を返す純粋な関数。Tally入力リストに出現するすべてのシンボルの出現回数をカウントし#/.Rule@@@、入力セットの各要素を対応する出現回数に変換します。


3

T-SQL、62 59バイト

前のバージョンは、一致しないセットでは機能しませんでした

select top 1(select count(*)from l where l=s)from s order by 1

テーブルと同じ名前のテーブルおよび列としてsおよびlを使用

select top 1         -- return only the first result
    (select count(*) -- count of rows
     from l          -- from table l
     where l=s)      -- for each l equal
from s               -- to each from s
order by 1           -- sort by count ascending

3

Swift、39バイト

s.map{w in l.filter{$0==w}.count}.min()

説明:

s.map{} sの各単語を調べて、カウントの配列を生成します

w in 次のフィルターで使用するマップされた単語に名前を付けます

l.filter{} フィルターをl配列に適用します

$0==w 単語wに一致するフィルター条件です

.count 条件を満たすlの要素の数を与える

.min() マッピングされた結果の最低カウントを返します


1
PPCGへようこそ!ソリューションにコードのフォーマットを追加しました。これを行うには、コードを含む行に4つのスペースを追加します。
Mego


2

Perl 6の 37の  18バイト

37

{+(($_=@^a⊍@^b)≽@a)&&.values.min}

それを試してみてください

拡張:

{
  +( # turn into a 0 if False

    (
      $_ =        # store into $_ the result of
        @^a  @^b # use the baggy multiplication operator
    )  @a        # is that the baggy superset of the set
  )

  &&          # if that is True

  .values.min # get the minimum value from the Bag in $_
}

参照セット、バッグ、およびミックスををしてください。


18

{@^b.Bag{@^a}.min}

それを試してみてください

説明:

@^b.Bag値キーからそのBagにBagを作成し
{@^a}(カウントのリストを返します)
.min、結果リストの最小値を取得します



きちんと答え、どちらも機能/完全なプログラムのように、これらの表情の
ジュリアンウルフ

@JulianWolf「現在のスコープで両方の入力がsとlとして定義されていることを考慮してください」と「関数を定義する必要はありません」というステートメントに基づいてスニペットが許可されるという印象を受けました。 。
ブラッドギルバートb2gills

ああ、あなたは完全に正しい。それは私が読んだ後に編集された質問に違いない。いずれにせよ、私はこのバージョンの美学が最後よりも気に入っています。Perlの構文は常に謎です。
ジュリアンウルフ

@JulianWolfこれは実際にはPerl 6コードの良い例ではありません。Ovidの1時間の講演「Perl 6 —人々が興奮している理由」を参照するかPerl6.orgのリソース」タブを参照することをお勧めします。
ブラッドギルバートb2gills

うん、混乱してごめんなさい。これは私の最初の挑戦であり、入力と出力のルールが既にあることを知りませんでした。ほとんどの回答は必要ではないにもかかわらずこれらのルールを使用していたため、変更しました。
ヒューバート・グジェスコヴィアック

2

公理、42バイト

f(a,b)==reduce(min,[count(x,b)for x in a])

テストコードと結果

(28) -> f(["1","2"], ["1", "2", "1", "1", "7"])
   (28)  1
                                                    Type: PositiveInteger
(29) -> f(["apple","banana"],["apple","pear","apple","banana","banana"])
   (29)  2
                                                    Type: PositiveInteger
(30) -> f(["apple","banana"],["apple","pear","apple","banana","apple"])
   (30)  1
                                                    Type: PositiveInteger
(31) -> f(["apple","banana","pear"],["apple","banana","kiwi","apple"])
   (31)  0

2

C++, 203 201 bytes

Thanks to @Quentin for saving two bytes!

#import<vector>
#import<string>
using T=std::vector<std::string>;
int f(T S,T L){for(int j,b,i=0;;++i)for(auto s:S){for(b=j=0;j<L.size();++j)if(L[j]==s){b=1;L.erase(begin(L)+j);break;}if(!b)return i;}}

Try it online!


L.begin() -> begin(L) saves one byte :)
Quentin

Also, using T=std::vector<std::string>; saves another! Who knew modern pretty syntax could also help golfing.
Quentin

@Quentin I tried that at first. Probably there was some simple typo I didn't notice.
Steadybox

1

PHP, 74 Bytes

<?foreach($_GET[0]as$v)$t[]=array_count_values($_GET[1])[$v];echo+min($t);

Testcases

PHP, 108 Bytes

<?[$x,$y]=$_GET;echo($a=array_intersect)($x,$y)==$x?min(($a._key)(array_count_values($y),array_flip($x))):0;

Testcases


1

Pyth, 5 bytes

hS/LF

Takes the list first and the set second. Test suite.

Explanation:

    F  Expand the input into l and s (not literally, 
                  since those are function names in Pyth, but...)
   L   for d in s:
  /        Count instances of d in l
   L   Package all the results as a list
 S     Sort the results smallest-first
h      grab the smallest element


1

Java, 135 bytes

int f(List<String> s,List<String> l){int n=0,i=0;while(i<s.size()){if(!l.remove(s.get(i++)))break;if(i==s.size()){n++;i=0;}};return n;}

This is my first code golf challenge and answer, so not sure about the format. Does it need to be a full compiling program? Do I need to define the parameters? Suggestions appreciated.

EDIT: wrapped code in a function. Thanks @Steadybox


An answer can be a full program, a function or some other function-like construct. You can take the parameters for example as arguments to a function or from standard input.
Steadybox


1

Java, 114 Bytes

<T>int a(Set<T>b,List<T>c){int m=2e32;b.stream().map(i->{int j=java.util.Collections.frequency(c,i);m=j<m?j:m;});return m;}

Tio coming soon

Explanation

  • creates local variable m.

  • maps the set to a stream.

  • for each element, if the number of occurances of the element in the list is less than m, m is set to that value.

  • returns m, which is the number of complete versions of the set


0

R 54 Bytes

f<-function(s,l) min(table(factor(l[l%in%s],levels=s)))

Explanation: creating a table of the counts of only the values in the list that also appear in the sublist.

I then turn the variable into a factor in order to generate zeros if a value that appears in the sublist does not appear in the list. Finally, I take the minimum of the counts.


0

R, 61 57 44 bytes

print(min(sapply(s,function(x)sum(l%in%x))))

Anonymous function. Apparently you don't have to define a function for this challenge. Saved 13 bytes thanks to count.

Explanation:

sum(l%in%x)) returns the number of times a string in s is found in l.

lapply(s,function(x)) applies that to each string in s separately and returns a list of sums.

min() returns the smallest from that list.


Could be brought down to 40 Bytes with a for-loop: z=c();for(i in s)z[i]=sum(l%in%i);min(z)
count

Or even further to 37 bytes with sapply: min(sapply(s,function(x)sum(l%in%x)))
count

Brilliant, I always forget you can sum booleans. I'll edit that in later. I've been told I need that print() if it's not a function.
BLT

0

JavaScript (ES6), 59 bytes

a=>b=>a.reduce((x,y)=>(l=b.filter(s=>s==y).length)>x?x:l)|0

Try it

f=

a=>b=>a.reduce((x,y)=>(l=b.filter(s=>s==y).length)>x?x:l)|0

console.log(f(["apple","banana"])(["apple","pear","apple","banana","banana"]))
console.log(f(["apple","banana"])(["apple", "pear", "apple", "banana", "apple"]))
console.log(f(["apple","banana","pear"])(["apple","banana","kiwi","apple"]))
console.log(f(["coconut"])([]))

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