Dobble / SpotIt 카드 생성기


15

소개

Dobble / Spot 사람들이 가장 짧은 시간에 한 쌍의 카드에서 동일한 기호를 찾아서 표시하고 다음 쌍으로 이동해야하는 카드 게임입니다. 각 카드에는 여러 개의 기호 (일반 버전에서는 8)가 있지만 각 카드 쌍마다 정확히 하나의 기호가 있습니다.

실제 게임 사본의 예 : 쌍의 예가있는 카드

도전

하나의 카드에 주어진 기호 세트 (단일 ASCII 문자)와 기호 수를 가진 프로그램을 작성하면 각 카드에 대한 기호가있는 출력 목록 카드가 생성됩니다. 분명히 동등한 조합이 많이 있으며, 프로그램은 주어진 입력에 대해 가장 많은 양의 카드를 생성하는 조합을 작성해야합니다.

코드 골프이므로 코드가 짧을수록 좋습니다.

가장 복잡한 경우에 우주의 열사병이 발생하기 전에 계산이 완료되면 좋을 것이다.

입력

기능 / stdin에 대한 두 가지 주장 (선택)

  • 먼저 'ABCDE'또는 [ 'A', 'B', 'C', 'D', 'E']와 같은 기호 모음입니다. 형식, 문자열, 세트, ​​목록, 스트림 등 원하는 형식을 선택하십시오. , 또는 선택한 언어에 대한 관용적 표현. 문자는 [A-Za-z0-9] 세트에서 제공되며, 중복되지 않습니다 (따라서 입력 심볼 세트의 최대 크기는 62 임). 따라서 6- 심볼 케이스에 대해서도 "yX4i9A"를 얻을 수 있습니다.

  • 두 번째 인수는 정수이며 단일 카드의 기호 양을 나타냅니다. 심볼 세트의 크기보다 <=입니다.

산출

줄 바꿈으로 구분 된 여러 줄을 인쇄하십시오. 각 줄에는 단일 카드의 기호가 들어 있습니다.

ABC
2
>>>>
AB
BC
AC

또는

ABCDEFG
3
>>>>
ABC
BDE
CEF
BFG
AEG
CDG
ADF

또는

ABCDE
4
>>>>
ABCD

힌트

  • 생성 된 카드 수는 고유 기호 수보다 클 수 없으며 여러 조합에서 상당히 작습니다.
  • 문제의 수학 측면에서 도움이 필요한 경우 일부 수학 배경 을 읽을 수 있습니다.

이것은 첫 번째 코드 골프 도전이므로 서식 / 스타일과 관련하여 가능한 문제를 용서하십시오-의견을 지적하면 오류를 수정하려고합니다.



제안 된 테스트 사례 ('abcdefghijklmnopqrstu', 5)-> ['abcde', 'afghi', 'ajklm', 'anopq', 'arstu', 'bfjnr', 'bgkpt', 'bhlou', 'bimqs', 'cfkqu', 'cgjos', 'chmpr', 'cilnt', 'dfmot', 'dglqr', 'dhkns', 'dijpu', 'eflps', 'egmnu', 'ehjqt', 'eikor']또는 다른 21 카드 작업 솔루션. (이것은 순서 4의 투영 유한 평면입니다.)
Jonathan Allan

답변:


5

파이썬 2 , 192162 바이트

나는 이것이 모든 시나리오에서 최대 카드 세트를 생성하고 3 가지 테스트 사례를 처리한다고 주장합니다.

from itertools import*
def m(a,s):
    C=["".join(x)for x in combinations(a,s)]
    while len(C):
        print C[0]
        C=list(set(A for A in C if len(set(A)&set(C[0]))==1<s))

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

연산

알파벳 a과 카드 크기가 주어지면 s모든 s요소 조합을 가져 와서 a호출하십시오 C.

  • 의 첫 번째 요소를 가져 C와서C0
  • 저장 C0
  • 동일하지 않은 C공용체가있는 모든 요소를 ​​제거하십시오.C01
  • 의 두 번째 요소로 반복 C
  • C비어 있을 때까지 계속

그런 다음 저장된 요소를 인쇄하십시오.

논의

비어 있지 않은 일부 C는 Google의 최대 솔루션 K입니다. 이 적어도 하나 개의 원소를 포함하고, 임의의 두 요소가 구별 할 수 있기 때문에, 임의의 요소를 선택할 수 C0의, C판정 K. 의 모든 요소 e에 대해 조합 K의 카디널리티는 in에 대해 1입니다 . 따라서 합집합에 카디널리티 1이없는 모든 요소를 ​​제거 하십시오. 동일한 추론으로에서에서 임의의 새 요소를 선택하고 에 추가 한 후를 줄이십시오 . 결국 빈 세트이며 다른 요소와 구별되는 요소를 선택하지 않았기 때문에 최대 솔루션이 될 것입니다.exx != eKCC0CKCCK


테스트 사례

이 테스트 사례는 인쇄가 요구 사항임을 깨닫기 전에 작성되었습니다.

a=["a","b","c"]
b=2
c=3
d=m(a,b)
print d,len(d)==c
>> ['bc', 'ab', 'ac'] True

a=["a","b","c","d","e","f","g"]
b=3
c=7
d=m(a,b)
print d,len(d)==c
>> ['aef', 'abc', 'bde', 'ceg', 'adg', 'cdf', 'bfg'] True

a=["a","b","c","d","e"]
b=4
c=1
d=m(a,b)
print d,len(d)==c
>> ['abcd'] True

최신 정보

  • +9 [16-12-07] 인쇄 요건에 맞게
  • -11 [16-12-07] R변수를 골라 냈습니다
  • -30 [16-12-09] @Leo K덕분에 변수를 골라 냈습니다 !

1
모든 단계에서 세트 K를 C에서 빼야합니까? A for A in C if len(set(A)&set(C[0]))==1s == 1 (이 경우 len (set (C [0]) & set (C [0]))이 1이 아닌 한 필터링 ( ) 필터링 은 선택한 요소를 이미 제거 했다고 생각합니다 . 마지막 라인부터 두 번째 라인까지 골프를 C=[A for A in C if len(set(A)&set(C[0]))==1<s]
Leo

나는 샌드 박스에서 Dobble 도전을 작성 하고 있었고 Dom Hastings는이 질문을 가능한 속임수로 지적했지만, N * N의 전체 Dobble 갑판을 만드는 것이 훨씬 어렵다는 것을 알았습니다. + N + 1 카드 (및 기호)는 카드 당 N + 1 기호이며 N은 기본 프라이밍이 아닙니다. N = 4 = 2 ^ 2의 경우 이것은 4 * 4 + 4 + 1 = 21 기호와 같은 수의 카드를 사용하는 데크입니다. 그러나이 솔루션은 단 13 장의 카드를 생산 하지만 21 개는 가능합니다 .
Jonathan Allan

@JonathanAllan 방금 TIO 링크를 추가했습니다. 알파벳 21 자, 카드 당 5 자로 기능을 실행했습니다. 21 장의 카드를 출력합니다. 내가 오해하지 않는 한 이것이 맞다고 생각합니다.
NonlinearFruit

흠, 죄송합니다. 현지에서 실행하는 데 실수가 있었을 것입니다! ( 4의 풀 던전 데크입니다. :) )
Jonathan Allan

2

하스켈 175 156 바이트

골프를 처음 시작했을 때 무언가를 엉망으로했는지 알려주세요.

import Data.List
f 0_=[[]]
f n a=g$c n a
c n a=[a!!i:x|i<-[0..(length a)-1],x<-f(n-1)(drop(i+1)a)]
g[]=[]
g(x:t)=x:g(filter(\z->length(z`intersect`x)<= 1)t)

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

개선과 -19 바이트에 대한 @Paul Mutser 에게 감사 합니다


원본 버전


1
PPCG에 오신 것을 환영합니다! 수입은 점수로 계산됩니다. 가능한 개선 : 가져 오기를 포함한 156 바이트
Paul Mutser

머리를 주셔서 감사합니다, 나는 그들이했는지 확실하지 않았다!
bugs

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.