세트 퍼즐 게임


13

81 개의 카드가있는 카드 게임 인 Set (어린이를위한 멋진 게임) 의 게임 을 알고 계실 것입니다 . 각 카드에는 4 가지 속성 (양식, 숫자, 색상 및 채우기)이있는 그림이 있습니다. 각 속성에는 3 가지 값이 있습니다.

form: wave, oval, diamond
colour: red, purple, and green
number: 1, 2, 3
fill: none, dashed, opaque.

12 장의 카드가 테이블에 열리게되었으며 이제 세트를 표시해야합니다. 세트는 모든 속성 값이 0, 1 또는 3 회 발생하는 3 개의 카드로 구성됩니다. 빨간 숫자가 있거나 카드가 불투명하거나 숫자가 1 개인 카드는 좋지 않습니다. 자세한 시각적 설명 은 제공된 링크를 참조하십시오 .

모든 속성이 인코딩 된 카드 코드를 구상합니다.

"WP2N"

~의 약자

2 Purple Waves with No fill

함께 예를 들어와 OR1NDG3N

여기에 이미지 설명을 입력하십시오

세트 (3 가지 형태, 3 가지 색상, 3 가지 숫자, 1 채우기)입니다.

입력은 카드를 나타내는 공백으로 구분 된 고유 코드 (81 개의 가능한 코드 중에서 임의로 선택됨)입니다.

"OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR2D OG3O OR2D"

솔루션은 주어진 모음 내에서 가능한 모든 세트를 표시해야합니다. 그래서

OR1N, WP2N, DG3N

다른 모든 세트와 함께 솔루션의 일부 여야합니다.


5
유망한 것으로 들리지만 어떤 종류의 입력 데이터를 처리해야하는지 (stdin, file, parameter) 그리고 입력 및 출력 데이터의 모양을 더 정확하게 지정하십시오. 또한 샘플 실행의 시각적 표현 (스크린 샷 또는 유사)을 제공하십시오.
manatwork

1
나는 가까운 투표를 철회하고 이것을 찬성했다. 이것은 매우 흥미 롭다! :)
Doorknob

4
"어린이를위한 게임"이란 말입니까?
boothby

2
Waitaminute ... N, D, S, O의 4 가지 글자가 있습니다.
boothby

1
@boothby : 나는 반대라고 말했을 것입니다. 알파벳이 겹치지 않으면 모든 후보 세트에 대해 각 문자 또는 숫자가 몇 번 표시되는지 세어 볼 수 있습니다. 숫자 또는 문자가 두 번 나타나지 않는 경우에만 세트가 유효합니다.
flodel

답변:


4

루비, 104 98 81 80 자

$*.combination(3).map{|c|puts c*?,if(0..3).all?{|i|c.map{|x|x[i]}.uniq.size!=2}}

샘플 실행 (예제 데이터 사용) :

c:\a\ruby>set.rb OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D
OR1N,WP2N,DG3N
WP2N,DR1D,OG3O
WP2N,DR1D,OG3O
DG3N,WG3S,OG3O

샘플 데이터에 WP2N,DR1D,OG3O2가 있으므로 두 번 출력 됩니다 DR1D.

설명:

$*.combination(3).map{|c|-3 장의 카드의 각 조합
puts c*?,if-다음과 같은 경우 세트를 출력합니다.
(0..3).all?{|i|-0에서 3까지의 모든 숫자 (문자열의 속성 수) true가이 블록으로 전달 될 때 평가되는 경우
c.map{|x|x[i]}- i각 문자열의 색인을 가져옵니다
.uniq.size!=2}-고유 한 속성의 양 (형태, 색상 등)이 2가 아닌 경우 (1, 3)


제거가) :이 문제를 가정하면 내가이 개 개선 제안 할 수있다, codegolf 될 것 end플러스 여러 줄 바꿈 : 변환 if ... puts ... endputs ... if ...모든 블록을 취할 수) B를, 따라서 x.map{}.all?동일x.all?{}
하워드

@How 감사합니다, 나는 컴퓨터에 도착할 때 그 개선을 할 것입니다.
Doorknob

@Howard 둘 다 포함하도록 편집되었습니다. 감사!
Doorknob

또한 이후 공간을 제거하십시오 if.
Howard

나는 짧고 간결하며 읽기 쉬운 루비 솔루션을 좋아합니다
dr jerry

5

매스 매 티카 93 92 93 82 76 73

f={}⋃Select[StringSplit@#~Subsets~{3}, FreeQ[Tally/@(Characters@#^T),2]&]&

논리

StringSplit@#~Subsets~{3}3 카드 하위 세트 목록을 생성합니다. 다음과 같은 각 트리플 :

{{ "D", "G", "3", "N"}, { "W", "G", "3", "S"}, { "O", "G", "3", "영형"}}

또는

배열 1

그런 다음

배열 2

그리고 Tally/@(Characters@#^T)각 행의 고유 한 항목의 수를 연산하고.

{3,1,1,3}

3은 "모두 다르다"에 해당하고; 1은 "모두 동일"에 해당합니다.

FreeQ[...,2]같은 유형의 카드 또는 트리플의 카드 2 장을 결정합니다. 2가 타이 키 중 하나가 아닌 경우, Set of Game 규칙에 따라 3 장의 카드가 "세트"입니다.


용법

f["OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D"]

{{ "DG3N", "WG3S", "OG3O"}, { "OR1N", "WP2N", "DG3N"}, { "WP2N", "DR1D", "OG3O"}}


중복이 허용되면 더 짧을 수 있습니다. f=Select[StringSplit@#~Subsets~{3},FreeQ[Tally/@Thread@Characters@#,2]&]&결과는 다음과 같습니다{{"OR1N", "WP2N", "DG3N"}, {"WP2N","DR1D", "OG3O"}, {"WP2N", "DR1D", "OG3O"}, {"DG3N", "WG3S", "OG3O"}}
alephalpha

"모두 동일"또는 "모두"를 확인하는 매우 영리한 방법!
DavidC

4

매스 매 티카 73

f = Select[StringSplit@#~Subsets~{3}, FreeQ[Tally /@ Thread@Characters@#, 2] &] &

용법

f["OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D"]

{{ "OR1N", "WP2N", "DG3N"}, { "WP2N", "DR1D", "OG3O"}, { "WP2N", "DR1D", "OG3O"}, { "DG3N", "WG3S ","OG3O "}}


4

Brachylog , 12 바이트

ṇ₁⊇Ṫz{=|≠}ᵐz

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

입력 변수를 통해 입력을 받아서 출력 변수를 통해 출력을 생성 합니다.

이 솔루션은 실제로 의미하는 바를 실제로 신경 쓰지 않기 때문에 인코딩에서 최근 닫힌 복제본 에서 가져온 두 번째 테스트 사례

                The output variable is
  ⊇             a subsequence
   Ṫ            of length 3
ṇ₁              of the input split on spaces,
    z      z    the columns of which
     {   }ᵐ     are all
       |        either
      =         the same element repeated,
        ≠       or entirely free of duplicates.


3

GolfScript, 53 자

" "/:w,,{:a,{:^,{a^]{w=}%.0\zip{.&,2=|}/!{.p}*;}/}/}/

온라인 예 와 같이 STDIN에 입력해야합니다 .

> OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR2D OG3O OR2D
["OR1N" "DG3N" "WP2N"]
["WP2N" "OG3O" "DR1D"]
["DG3N" "OG3O" "WG3S"]
["WR2D" "OR2D" "DR2D"]

주석이 달린 코드 :

" "/:w          # split the input at spaces and assign it to variable w
,,              # create the array [0..n-1] (n being the length of w)
{:a,{:^,{       # three nested loops: a=0..n-1, ^=0..a-1, _=0..b-1 
                # (third loop has no variable assigned but just pushes on stack)
    a^]         # make an array [a,^,_] of the three loop variables
    {w=}%       # take the corresponding list items, i.e. [w[a],w[^],w[_]]
    .0\         # push zero, add duplicate of the the array
    zip         # zip transposes the array, thus [OR1N WP2N DG3N] -> [OWD RPG 123 NNN]
    {           # loop over those entries
      .&        # unique
      ,2=       # length equals 2?
      |         # "or" with top of stack (two zero pushed before)
    }/          # end of loop, on stack remains the results of the "or"s
    !{.p}*      # if no length of 2 is there, make a copy of the set and print it
    ;           # discard stack item
}/}/}/          # closing the three nested loops

2
나는 코드 골프에 대한 확실한 승자라고 말할 것입니다. Hower 완전히 읽을 수 없습니다.
dr jerry

1
@drjerry 다른 골프 스크립트 코드와 비교하면 꽤 읽을 수 있습니다. 예를 들어 일반 루프 만 포함하고 고급 트릭은 없습니다. 나중에 코드에 대한 설명을 추가하겠습니다.
Howard

0\zip{.&,2=|}/!단축 할 수있다zip{.&,}%2&!
피터 테일러

1

자바 스크립트 (323) (313)

function a(b){d=h=[];c=e=f=0;for(i in b){for(j in b){for(k in b[i]){if(b[i][k]==b[j][k]){if(c+f<4)c++;else if(c==4){h+=b[j];if(h.length=3)return h}}else{for(l in d){for(m in d[l]){g=f;if(d[l][2]==i){if(d[l][3]==k)if(b[j][k]!=d[l][0]&&b[j][k]!=d[l][1])f++;}else{continue}}if(g==f)d[e++]=[b[i][k],b[j][k],j,k]}}}}}}

객체 배열을 가져 와서 객체 배열을 반환하는 함수입니다.

데모 피들 (정리).


변수를 선언 할 필요는 없습니다.
Doorknob

@Doorknob 내가 다시 가져 가라, 당신 말이 맞아. 편집했습니다. 감사!
Math chiller

1

APL (IBM), 76

⍉¨x/⍨{{⍵≡1⌽⍵}⍵=1⌽⍵}¨x←⊃¨(∘.,/3⍴⊂⍪¨(' '≠y)⊂y←⍞)⌷⍨¨z/⍨∧/¨2</¨z←,⍳3⍴12

IBM APL이 없지만 이것이 효과가 있다고 생각합니다.

샘플 실행 (Dyalog APL에서 IBM APL 모방)

OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D
 OR1N  WP2N  WP2N  DG3N 
 WP2N  DR1D  DR1D  WG3S 
 DG3N  OG3O  OG3O  OG3O 

처음으로 apl 코드 감사합니다!
dr jerry

1

세이지, 71

C문자열 인 경우 "OR1N WP2N DG3N DR1D WG3S WG1N WR2D WP3N DR2O DR1D OG3O OR2D"실행

[c for c in Subsets(C.split(),3)if{1,3}>={len(set(x))for x in zip(*c)}]

얻을 [{'DR1D', 'OG3O', 'WP2N'}, {'DR2D', 'WR2D', 'OR2D'}, {'WG3S', 'OG3O', 'DG3N'}, {'DG3N', 'WP2N', 'OR1N'}]

그리고 Set이 프로젝션 라인이라는 해석을 사용하는 매우 다른 접근법이 있습니다 GF(3)^4.

[c for c in Subsets(C.split(),3)if sum(matrix(3,map('WODRPG123N'.find,''.join(c))))%3==0]

나는 그것을 D남용하는 방법을 알아낼 때까지 두 번 사용 된 약간 화가났다 . 그러나 더 좋은 find방법 은 방법을 남용하는 것입니다. str.find문자를 찾을 수 없으면 -1을 반환합니다. 이 (가) 이후 -1 = 2 mod 3에 문자 S가 발생하지 않기 때문에 해당 문자 가 올바르게 처리됩니다 'WODRPG123N'.


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