목록에서 집합의 발생 횟수


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 규칙과 모순됩니다.


그렇습니다. 그러나 나는 세 번째 문장에 조금 끊어졌습니다. "객체를 처리하지 않음"은 무슨 뜻입니까?
— Post Rock Garf Hunter

@WheatWizard 일부 언어는 객체 지향적이지 않으며 임의의 객체를 비교하는 개념을 모릅니다.
— 허버트 Grzeskowiak

1
내가 알고있는 모든 언어가 객체가 닫힌 클래스 인 경우에도 특정 유형의 객체를 처리하기 때문에 객체 지향으로 변경해야합니다. 또한 문자열을 전혀 처리 할 수없는 많은 언어가 있음을 지적해야합니다.
— Post Rock Garf Hunter

@WheatWizard 알았어, 업데이트 된 설명. 이 단락은 C, 어셈블러 또는 메이플과 같은 언어를위한 것입니다.
— 허버트 Grzeskowiak

객체 지향 언어는 무엇입니까? 문자열이 아닌 경우 무엇을 사용해야합니까? 가장 쉬운 방법은 문자열로 제한하는 것입니다. 또는 정수만 사용할 수도 있습니다. 가장 간단한 유형을 사용하는 방법에 대한 이 조언 을 참조하십시오 .
— xnor

답변:


12

파이썬, 30 바이트

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

온라인으로 사용해보십시오!


좋은데 지도 사용에 대해서는 생각하지 않았습니다. 람다 BTW를 정의하는 대신 인쇄를 사용하여 조금만 절약 할 수 있습니다.
— 허버트 Grzeskowiak

1
@HubertGrzeskowiak 변화하는 lambdaA를하는 print바이트 때문에 두의 37 카운트 제공 input()에 필요한의.
— Post Rock Garf Hunter

과제에 명시된대로 @WheatWizard는 로컬 범위에 정의 된 입력을 고려하십시오. 함수 매개 변수 또는 사용자 입력과 같이 입력을 명시 적으로 정의 할 필요는 없습니다.
— 허버트 Grzeskowiak

@HubertGrzeskowiak 그럴만한 이유가 없으면 입력 및 출력 에 대한 기본값과 codegolf 제출에 대한
— ovs

@ovs 아, 나는 그 게시물을 몰랐다. 감사.
— 허버트 Grzeskowiak

6

젤리 , 4 바이트

⁼þSṂ

온라인으로 사용해보십시오!

어떻게?

⁼þSṂ - Main link: list theSet, list theList
 þ   - outer product using the dyadic operation:
⁼    -     is equal? (non-vectorising)
  S  - sum (vectorises) (yields the number of times each element of theSet appears in theList)
   Ṃ - minimum (can only make the minimum as a multiple)

6

젤리 , 6 5 4 바이트

ċ@€Ṃ

온라인으로 사용해보십시오!

프로그램의 첫 번째 인수는 세트이고 두 번째 인수는 목록입니다.

설명

ċ@€Ṃ
ċ@   -- 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 바이트


아주 좋아요! 링크를 한 줄로 결합하여 바이트를 절약 ⁹ċ$€Ṃ할 수 있습니다. 대신에 암시적인 올바른 인수를 사용하여 더 짧게 만들 수있는 느낌이 있습니다 ⁹.
— ETHproductions

나는 다른 바이트를 절약하기 위해 작동 한다고 생각 ċ@€Ṃ 합니다 ... ( @인수를 반대로 ċ)
— ETHproductions

@ETHproductions 내가 테스트 한 한 올바르게 작동합니다.
— fireflame241

이는 지난해 월까지 12 존재하지만하지 않았다 Ɱ대신에 @€(프로그램에 반전 인수) 또 다른 바이트를 저장합니다 온라인으로보십시오!
— 관련이없는 문자열


5

자바 스크립트 (ES6), 64 바이트

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

가정 모두 s와 l객체의 배열입니다. 비교에 JavaScript 엄격한 동등성을 사용하므로 예를 들어 [] === []false입니다.


매우 흥미로운 해결책. 결과를 반환하거나 인쇄하십시오. AFAIK 익명 함수를 반환합니다.
— 허버트 Grzeskowiak

2
@HubertGrzeskowiak 표시된 코드는 익명 함수로 평가됩니다. 호출되면 함수는 원하는 수를 반환합니다.
— Neil

4

하스켈 , 37 34 바이트

3 바이트를 줄인 @Laikoni에게 감사드립니다.

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

파생 (set::[a]) # (list::[a])되는 a모든 유형은 어디 에서나 호출하십시오 Eq.


대신을 length[y|y<-l,y==x]사용할 수 있습니다 sum[1|y<-l,y==x].
— Laikoni

@Laikoni, 확실합니까? 나는 sum[1|y<-l,y==x,_<-y]2 바이트 더 길게 나오는 것과 같은 것을 사용해야한다고 생각합니다.하지만 분명히 뭔가를 놓칠 수 있습니다.
— Julian Wolf

걱정 마세요, 당신 말이 옳습니다. 잘 했어
— Julian Wolf


3

Mathematica, 24 바이트

Min[#/.Rule@@@Tally@#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

스위프트, 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

펄 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값 키 에서 해당 백에 백 을 작성하고
{@^a}(카운트 목록을 리턴 함)
.min결과 목록의 최소값을 얻습니다.



깔끔한 답변이지만, 이것들 중 어느 것도 함수 / 완전한 프로그램처럼 보이지 않습니다
— Julian Wolf

@JulianWolf 저는 "현재 범위에서 s와 l로 정의 된 두 입력을 모두 고려하십시오"및 "함수를 정의 할 필요가 없습니다."라는 문구를 기반으로 스 니펫이 허용되었다는 인상을 받았습니다. .
— 브래드 길버트 b2gills

아, 당신 말이 맞아요 내가 읽은 후에 그 질문을 편집해야합니다. 어쨌든, 나는이 버전의 미학을 마지막 것보다 훨씬 더 좋아한다. 펄의 문법은 항상 미스터리 일 것이다.
— Julian Wolf

@JulianWolf 이것은 실제로 Perl 6 코드의 좋은 예가 아닙니다. Ovid의 1 시간 강연 Perl 6 – 사람들이 왜 흥분 하는지 또는 Perl6.org 의 리소스 탭을 보는 것이 좋습니다 .
— 브래드 길버트 b2gills

네, 혼란을 드려 죄송합니다. 이것은 나의 첫 번째 도전이며 이미 입력 및 출력 규칙이 있다는 것을 몰랐습니다. 대부분의 답변이 필요하지 않은 경우 에도이 규칙을 사용했기 때문에 변경했습니다.
— 허버트 Grzeskowiak

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 ++, 203201 바이트

2 바이트를 절약 한 @Quentin에게 감사드립니다!

#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;}}

온라인으로 사용해보십시오!


L.begin()-> begin(L)1 바이트를 저장 :)
— Quentin

또한 using T=std::vector<std::string>;다른 것을 저장합니다! 현대의 예쁜 구문을 알고있는 사람도 골프를 도울 수 있습니다.
— Quentin

@Quentin 나는 처음에 그것을 시도했다. 아마 눈치 채지 못한 간단한 오타가 있었을 것입니다.
— Steadybox


1

Pyth, 5 바이트

hS/LF

목록을 먼저 가져오고 두 번째로 설정합니다. 테스트 스위트.

설명:

    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

자바, 135 바이트

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;}

이것은 내 첫 번째 코드 골프 도전과 답변이므로 형식에 대해 확실하지 않습니다. 전체 컴파일 프로그램이어야합니까? 매개 변수를 정의해야합니까? 제안에 감사드립니다.

편집 : 함수에 코드를 래핑했습니다. 감사합니다 @Steadybox


답은 완전한 프로그램, 함수 또는 다른 함수와 같은 구문 일 수 있습니다. 예를 들어 함수 또는 표준 입력의 인수로 매개 변수 를 사용할 수 있습니다 .
— Steadybox


1

자바, 114 바이트

<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;}

티 오오

설명

  • 지역 변수 m을 만듭니다.

  • 세트를 스트림에 맵합니다.

  • 각 요소에 대해 목록에서 요소의 발생 수가 m보다 작 으면 m이 해당 값으로 설정됩니다.

  • 집합의 전체 버전 수인 m을 반환합니다.


0

R 54 바이트

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

설명 : 서브리스트에도 나타나는 목록의 값 수만있는 테이블을 작성합니다.

그런 다음 하위 목록에 나타나는 값이 목록에 나타나지 않으면 0을 생성하기 위해 변수를 인수로 바꿉니다. 마지막으로, 나는 카운트의 최소값을 취합니다.


0

R, 61 57 44 바이트

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

익명의 기능. 분명히이 도전에 대한 기능을 정의 할 필요는 없습니다. 카운트 덕분에 13 바이트를 절약했습니다.

설명:

sum(l%in%x))에서 문자열 s이 발견 된 횟수를 반환합니다 l.

lapply(s,function(x)) 각 문자열에 적용 s 개별적으로 합계 목록을 반환합니다.

min() 해당 목록에서 가장 작은 값을 반환합니다.


for 루프를 사용하여 40 바이트로 줄일 수 있습니다 :z=c();for(i in s)z[i]=sum(l%in%i);min(z)
— 카운트

또는 sapply를 사용하여 37 바이트까지 확장 할 수 있습니다.min(sapply(s,function(x)sum(l%in%x)))
— 센다

훌륭합니다. 부울을 합칠 수 있다는 것을 항상 잊습니다. 나중에 편집하겠습니다. 함수가 아닌 경우 print ()가 필요하다는 말을 들었습니다.
— BLT

0

자바 스크립트 (ES6), 59 바이트

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

시도 해봐

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.