BINGO에서 최적의 부정 행위


12

당신은 다른 플레이어들이 "BINGO"를 모호하게 발표하고 승리를 거머 쥐고 그들의 상을 요구하기 위해 걸어 다니고 있습니다. 이번에는 달라집니다. 발신자에게 뇌물을주기 위해 BINGO 통화를 미리 제공 할 수 있습니다. 이제 BINGO 보드를 만들어 그 전화에 대해 가능한 빨리 이기고 승리를 보장 할 것입니다.

전형적인 빙고 형식으로 순서대로 호출 구분 된 문자열이나 목록을 감안할 때 (문자 포함, 예를 들어, B9또는 G68추가 정보를 원하시면 규칙을 참조), 출력 매트릭스 또는 그 통화에 대한 최적의 빙고 보드를 나타내는 2 차원 목록입니다. 입력이 항상 유효하다고 가정하십시오.

빙고 규칙 :

  • 5x5 보드
  • "BINGO"는 카드에 지금까지 전화 한 번호와 5 개의 번호가있는 경우를 말합니다.
  • 중앙 정사각형은 비어 있으며 (BINGO에 자동으로 계산 됨) 공백, 빈 목록 -1또는 로 표시 될 수 있습니다 0.
  • 5 열이 문자로 표현된다 B, I, N, G, O, 각각.
  • 첫 번째 열에는 숫자 1-15, 두 번째 16-30, ... 및 다섯 번째 61-75가 포함될 수 있습니다.
  • 입력을 위해 취한 문자와 숫자는 선택적으로 ( ,또는 공백 과 같은 의미있는 것으로 구분 ) 또는 문자와 숫자의 튜플로 취할 수 있습니다.
  • 출력은 행렬의 각 위치에 숫자 만 필요합니다.
  • 초기 BINGO에 기여하지 않는 사각형은 유효해야하지만 최적 일 필요는 없습니다.
  • 이것은 코드 골프, 최단 코드 승리입니다

예 :

이 입력 형식은 더 짧기 때문에 예제에 사용하고 있습니다. 허용되는 입 / 출력 형식은 위 섹션을 참조하십시오.

O61 B2 N36 G47 I16 N35 I21 O64 G48 O73 I30 N33 I17 N43 G46 O72 I19 O71 B14 B7 G50 B1 I22 B8 N40 B13 B6 N37 O70 G55 G58 G52 B3 B4 N34 I28 I29 O65 B11 G51 I23 G56 G59 I27 I25 G54 O66 N45 O67 O75 N42 O62 N31 N38 N41 G57 N39 B9 G60 I20 N32 B15 O63 N44 B10 I26 O68 G53 I18 B12 O69 G49 B5 O74 I24

Possible Output (this has a horizontal BINGO in 3rd row. A diagonal is also possible.): 
[[11,25,42,53,68], 
 [ 6,22,32,57,62],
 [ 2,16, 0,47,61],
 [ 3,17,37,59,75],
 [ 9,19,41,46,70]]

N42 N34 O66 N40 B6 O65 O63 N41 B3 G54 N45 I16 O67 N31 I28 B2 B14 G51 N36 N33 I23 B11 I17 I27 N44 I24 O75 N38 G50 G58 B12 O62 I18 B5 O74 G60 I26 B8 I22 N35 B1 B4 G53 O73 G52 O68 B10 O70 I30 G59 N43 N39 B9 G46 G55 O64 O61 I29 G56 G48 G49 I19 G57 N37 O72 I25 N32 B13 B7 B15 O71 I21 I20 O69 G47

Must be a vertical BINGO in 3rd (N) column (because 4 N's came before one of each B,I,G,O):
[[11,25,42,53,63], 
 [ 2,22,34,57,65],
 [ 6,16, 0,47,66],
 [ 3,17,41,54,75],
 [ 9,19,40,46,70]]

당신은 편지가 포함되어 있다고 말합니다. 그들은 무엇을 의미합니까?
Blue

1
@muddyfish BINGO 규칙에서 :The 5 columns are represented by the letters B,I,N,G,O, respectively.
JungHwan Min

답변:


4

수학, 302 바이트

(b=Prepend;i=1;n=15#&@@#-15+Range@5&;g=#~b~{N,0};o={#2,#3,#,##4}&@@#&;While[(l=Length@Union[t=(k=Take)[#&@@@g,i]])<5&&Max[#2&@@@Tally@t]<5,i++];If[l<5,m=#&@@Commonest@t;If[m===#,o[g~k~i/.{m,x_}->x/.{_,_}->Nothing],n@#2]&,o@DeleteDuplicates@b[n@#2,<|#->#2&@@@Reverse@g|>@#]~k~5&]~MapIndexed~{B,I,N,G,O})&

명명되지 않은 함수는 인수로 정렬 된 쌍의 목록 {{N,42},{N,34},{O,66},{N,40},...}( 예 : 각 정렬 된 쌍의 첫 번째 요소는 문자열이 아니라 벌거 벗은 기호 임)을 취하고 하위 목록이 열을 나타내는 정수의 2D 목록을 반환합니다. 빙고 보드).

첫 번째 테스트 케이스의 출력 :

{{1,3,2,4,5},{17,18,16,19,20},{31,32,0,33,34},{46,48,47,49,50},{62,63,61,64,65}}

일반적으로 각 B / I / G / O 행에서 호출 된 숫자로 인해 가능한 가장 빠른 빙고가 발생하면 해당 숫자는 중앙 행에 있습니다. 그렇지 않으면 각 열에는 가능한 가장 작은 4 개의 숫자가 포함됩니다 (이미 사용 된 숫자를 고려). 예를 들어, 첫 번째 테스트 케이스가 호출 된 두 번째 숫자가 B12아닌 로 변경 B2되면 출력 보드의 첫 번째 열은입니다 {1,2,12,3,4}.

두 번째 테스트 케이스의 출력 :

{{1,2,3,4,5},{16,17,18,19,20},{42,34,0,40,41},{46,47,48,49,50},{61,62,63,64,65}}

일반적으로 단일 열에서 5 개의 숫자 (또는 N 열에서 4 개의 숫자)로 인해 가장 빠른 빙고가 발생하면 나머지 4 개의 열에는 5 개의 가능한 가장 작은 숫자가 순서대로 포함됩니다.

제 2 테스트 케이스가 변경되는 경우 {{N,42},{N,34},{O,66},{N,40},...}{{O,72},{O,74},{O,66},{N,40},...}(첫 번째 두 개의 항목이 변경), 출력은 :

{{1,2,3,4,5},{16,17,18,19,20},{31,32,33,34,35},{46,47,48,49,50},{74,66,72,65,63}}

언 골프 버전 :

(b=Prepend;i=1;n=15First[#]-15+Range[5]&;g=b[#,{N,0}];o={#2,#3,#,##4}&@@#&;
While[
    (l=Length[Union[t=(k=Take)[Apply[#&,g,{1}],i]]])<5
  &&
    Max[Apply[#2&,Tally[t],{1}]]<5,
  i++];
MapIndexed[
  If[l<5,
    m=First[Commonest[t]];If[m===#,o[k[g,i]/.{m,x_}->x/.{_,_}->Nothing],n[#2]]&,
    k[
      o[DeleteDuplicates[b[n[#2],Association[Apply[#->#2&,Reverse[g],{1}]][#]]]]
    ,5]&
  ],{B,I,N,G,O}
])&

빙고 찾기를 단순화하기 위해 g중앙 정사각형 {N,0}을 입력 앞에 추가 하지만 첫 번째 줄은 대부분 코드를 단축하기위한 정의 입니다. (이 n함수는 #1 번째 열 에서 가장 작은 5 개의 유효한 빙고 번호를 제공합니다 .이 o함수는 5 개의 튜플을 사용하고 첫 번째 요소를 세 번째로 이동합니다.)

While2-6 행 의 루프는 빙고를 포함하는 입력의 가장 작은 초기 세그먼트를 찾습니다. (세 번째 줄은 열이 하나 인 빙고를 테스트하는 반면, 다섯 번째 줄은 하나의 열을 가진 빙고를 테스트합니다).

모든 함수 F에 대해 연산자 MapIndexed[F,{B,I,N,G,O}](7 행에서 시작)는 5 개의 튜플을 생성합니다 {F{B,1},F{I,2},F{N,3},F{G,4},F{O,5}}(기술적 으로는 그렇습니다 {F{B,{1}},...}). 우리 F는 두 개의 인수 중 빙고 보드 열을 만드는 함수 를 적용합니다 . 그러나이 함수는 발견 된 빙고의 유형에 따라 다릅니다. 8 열은 단일 열 빙고가있는 경우에 해당합니다.이 경우 함수 (라인 9)는 빙고 열의 관련 입력 번호와 다른 열. 다른 경우, 기능 (10-12 행)은 각 열의 중앙에있는 관련 입력 번호와 다른 곳의 기본 번호를 사용합니다.


2
내장 Bingo함수가 없습니까?
mbomb007

— 대기, 내장 Bingo이 허용되지 않습니까? <답변
Greg Martin

3

자바 스크립트 (ES6) 372 바이트

아마 여전히 골프를 칠 수는 있지만 어떻게 보지 못합니다. 제안은 대단히 감사합니다;)

A=a=>[1,2,3,4,5].map(x=>x+15*a),F=a=>{b=[[],[],[i=0],[],[]],a.replace(/[^0-9 ]/g,"").split` `.some(x=>{b[--x/15|(c=0)].push(++x);return b.some((x,i)=>(d=x.length)>4||d==1&i-2&&++c>3)});for(e=[A(0),A(1),A(2),A(3),A(4)];i<5;a=b[i][0],b[i][0]=b[i][2],b[i++][2]=a)for(j=0;j<5&b[i].length<5;j++)b[i][j]<i*15+5?e[i].splice(e[i].indexOf(b[i][j]),1):b[i][j]=e[i].shift();return b}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.