비밀 산타-재 방문


11

크리스마스는 빠르게 다가오고 있으며, 매년 가족 Secret Santa을 준비합니다. 나는 이것을 시작하려고 노력하고 싶지만, 부부가 서로를 위해 사지 않도록하는 것은 문제를 일으키는 원인이되며 몇 년 동안이 일을 했음에도 불구하고 여전히 Bob대부분의 선물을위한 선물을 사는데 꽤 쓰레기 문제가 있습니다 , Erin실망 할 것 같지만, 그는 FrankTalisker 를 좋아 한다는 것을 알고 있으므로 그와 잘 어울립니다. 이로 인해 기존의 간단한 솔루션 중 어느 것도 내 요구에 맞지 않습니다.

내 인생을 더 쉽게하기 위해, 당신의 임무는 배열 배열 (또는 선택한 언어에서 가장 가까운 대안)이 주어질 때 '선물'의 쌍을 반환 (또는 출력)하는 함수 (또는 귀하의 언어에서 가장 가까운 대안)를 작성하는 것입니다 다음 조건이 충족되도록 가능한 가장 짧은 코드로 '선물'을 바이트 단위로 표시하십시오.

  • 각 이름은 입력 데이터에서 무작위로 선택된 다른 이름과 쌍을 이룹니다 (제공된 조건에 따라 항상 출력을 무작위화할 수있는 것은 아닙니다)
  • 이름은 순서가 일관된 인접 행렬 을 나타내는 플래그 목록과 함께 제공 되므로 column n은 row와 같은 사람을 나타냅니다 n.
  • 조건이 충족되지 않으면 모국어로 잘못된 것을 반환하십시오.
  • 여러 솔루션이있는 경우 프로그램은 여러 번 실행되는 경우 솔루션을 모두 생성 할 수 있어야합니다.

당신은 우리가하는 어떤 가족 구성원 말할 수 있어야합니다 당신이 중복 된 이름이 표시되지 않습니다 가정 할 수 있지만 차별화 공백이 포함 된 데이터로 제시 될 수있다 Bob Senior으로부터를 Bob Junior! 소스 데이터에서 100 개의 고유 한 이름과 같이 꽤 큰 제품군의 경우 한 시간 내에 제공된 모든 테스트 사례를 완료해야합니다 (아래의 예제 데이터 세트를 참조하십시오. 할당 된 시간 내에 이들 모두를 구문 분석 할 수 있어야합니다).

입력 예 :

santa([
    ["Alice", 0, 0, 1, 1, 1, 1, 1],
    ["Bob",   0, 0, 0, 0, 0, 1, 0],
    ["Carla", 1, 1, 0, 0, 0, 1, 1],
    ["Dan",   1, 1, 0, 0, 0, 1, 1],
    ["Erin",  1, 1, 0, 0, 0, 1, 1],
    ["Frank", 1, 1, 1, 1, 1, 0, 1],
    ["Gary",  1, 1, 1, 1, 1, 1, 0]
]);
// might return something like:
[
    ["Alice", "Erin"],
    ["Bob", "Frank"],
    ["Carla", "Alice"],
    ["Dan", "Gary"],
    ["Erin", "Bob"],
    ["Frank", "Dan"],
    ["Gary", "Carla"]
]
santa([
    ["Alice", 0, 1, 1, 1, 0, 1],
    ["Bob",   0, 0, 1, 1, 0, 1],
    ["Carla", 0, 1, 0, 1, 0, 1],
    ["Dan",   0, 1, 1, 0, 0, 0],
    ["Erin",  0, 0, 1, 0, 0, 1],
    ["Frank", 1, 1, 1, 1, 1, 0]
]);
false
santa([
    ["Alice", 0, 1, 1],
    ["Bob",   1, 0, 1],
    ["Carla", 1, 1, 0]
]);
[
    ["Alice", "Bob"],
    ["Bob", "Carla"],
    ["Carla", "Alice"]
]

언어에 따라 다른 형식으로 입력 할 수 있습니다. 예를 들어 다음과 같은 세부 정보 가 제공 STDIN 될 수 있습니다.

script <<< 'Alice,0,0,1,1,1,1,1
Bob,0,0,0,0,0,1,0
Carla,1,1,0,0,0,1,1
Dan,1,1,0,0,0,1,1
Erin,1,1,0,0,0,1,1
Frank,1,1,1,1,1,0,1
Gary,1,1,1,1,1,1,0'

언어에 가장 적합한 형식으로 출력 할 수도 있습니다. 허용되는 형식에는 위와 같은 Object배열 배열 또는 해시 // 연관 배열 또는 파싱을 STDOUT다음과 같이 인쇄하는 것만 포함됩니다 .

Alice:Dan
Bob:Erin
Carla:Bob
Dan:Alice
Erin:Frank
Frank:Carla

확실하지 않은 경우, 필요한 입력 형식과 예상 출력 형식의 예를 물어보고 답변하십시오.

JavaScript 구현을 참조하십시오 .

더 큰 데이터 세트 : 100 , 100 , 200 , 200- 많은 솔루션 , 200- 하나의 솔루션 .

참조 구현은 내 컴퓨터의 <4s에서이 모든 것을 완료합니다.

이 스크립트로 생성 된 위 세트 .


1
하위 배열의 요소가 부모 배열의 순서와 동일하다고 가정합니까? 그리고 1k 번째 subarray의 (n + 1) 번째 요소에서 k 번째 사람이 n 번째 사람에게 줄 수 있다는 것을 의미합니까?
msh210

@ msh210 사실, 장황하지 않은 것에 대해 사과드립니다. 확인하기 위해 질문을 업데이트하겠습니다.
돔 헤이스팅스

첫 번째 예에서는 어디에서 ? Bob로의 매핑을 제공 Erin합니까? 난 그냥 하나 볼 ErinBob.
LegionMammal978

@ LegionMammal978 Ahhh, 그것은 훌륭한 질문이며 편집으로 만 대답 할 수있는 질문입니다 ... 사과! 결정된!
Dom Hastings

1
N0! 크리스마스에 일찍가는 길입니다! 이것은 선물을주는 비밀 터키이어야합니다.
그랜트 데이비스

답변:


4

자바 스크립트 ES6, 191

이 솔루션은 가능한 모든 페어링을 페어 목록으로 반환합니다.

f=l=>(h=l=>l.length,n=l.map(i=>i.shift()),o=[],(r=s=>(g=h(s))<h(n)?l[g].map((e,x)=>e&&r([...s,x])):o.push([...s]))([]),o.filter(i=>h([...new Set(i)])==h(n)).map(l=>l.map((t,f)=>[n[f],n[t]])))

예제 실행 :

>> example = f([
    ["Alice", 0, 0, 1, 1, 1, 1, 1],
    ["Bob",   0, 0, 0, 0, 0, 1, 0],
    ["Carla", 1, 1, 0, 0, 0, 1, 1],
    ["Dan",   1, 1, 0, 0, 0, 1, 1],
    ["Erin",  1, 1, 0, 0, 0, 1, 1],
    ["Frank", 1, 1, 1, 1, 1, 0, 1],
    ["Gary",  1, 1, 1, 1, 1, 1, 0]])

<< Array [ Array[7], Array[7], Array[7], Array[7], Array[7], Array[7], Array[7], Array[7], Array[7], Array[7], 26 more… ]

>> example[0]

<< Array [ "Alice:Carla", "Bob:Frank", "Carla:Alice", "Dan:Bob", "Erin:Gary", "Frank:Dan", "Gary:Erin" ]

더 큰 테스트 사례를 기반으로 모든 순열을 생성하기 때문에 실패 할 것이라고 생각합니다 ... 머신의 더 큰 세트에 대해 완료를 검증 할 수 있습니까? 감사! 이 더 큰 세트는 처음에는 없었습니다.
Dom Hastings
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.