이 도전에서, 당신은 죄수의 딜레마 인 봇을 쓸 것입니다. 캐치가 있습니다 : 이전 게임의 역사에 접근 할 수 없습니다. 대신, 당신은 상대 자신에 액세스 할 수 있습니다. 이 버전에서는 두 플레이어가 모두 협력하면 +2 점을 받고 결함이 둘 다 있으면 +1 점을 얻습니다. 하나가 협력하지만 하나의 결함 만 있으면 탈북자는 +3이되고 다른 하나는 점수를 얻지 못합니다. 각 제출은 10 회를 포함하여 다른 모든 제출에 대해 재생됩니다. 승자는 가장 많은 포인트를 가진 제출입니다.
컨트롤러 : 자바 스크립트 함수를 다음과 같은 형식으로 작성해야합니다.
function submissionName(them) {
/* Your code here */
}
컨트롤러는 함수의 name
속성을 사용하여 결과를 표시하므로이 형식이 아닌 ( f = x => ...
또는 대신 또는 f = function() { ... }
) 점수를 알아보기가 어려우면 자신의 함수에 액세스 할 수 없습니다.
이 함수는 them
상대의 함수 인 하나의 매개 변수를 받아들 입니다. 그런 다음 해당 기능을 호출하여 상대방의 반응에 특정 기능이 입력으로 제공되는지 확인할 수 있습니다. 해당 데이터에 따라 협력 또는 결함에 대해 각각 'C'또는 'D'를 반환해야합니다.
예 (경쟁 할 것) :
function cooperate(them) {
return 'C';
}
function defect(them) {
return 'D';
}
function nice(them) {
// Do whatever they would do when faced with a cooperator
return them(wrap(_ => 'C'));
}
규칙 :
- 상대방의 코드 자체를 볼 수 없습니다. 모든 함수
toString()
는 호출 될 때 동일하게 보이도록 랩핑됩니다 . 상대방을 검사하는 유일한 방법은 자신을 시험하는 것입니다. - 당신의 기능은 결정론적일 필요는 없습니다. 와 같은 자체 기능에 속성을 설정하여 상태를 저장할 수 있습니다
submissionName.state = {};
. 그러나 경기간에 (동일한 플레이어의 경기에서도) 상태는toString()
및 을 호출하여 지 웁니다eval
. 따라서 이전 일치하는 메모리가 없습니다. - 각 경기에서 가장 먼저 호출되는 함수의 순서는 무작위입니다.
- 코드에 오류가 발생하면 상대방이 결함을 가지고있는 동안 협력 한 것처럼 처리됩니다. 처음으로 달리면 상대방의 코드도 호출되지 않습니다. 전화를 거는 동안 상대방의 코드에서 오류가 발생하더라도이 문제가 발생합니다
them
. 스택 오버플로 오류, 특히 코드가 같은 경우 호출 할 경우주의하십시오them(wrap(submissionName))
. - 변수
self
또는eval
함수를 EXCEPT라고 할 때 범위 내에있는 다른 변수 에는 액세스 할 수 없습니다.wrap
. 이 기능을 사용하면 컨트롤러가 함수를 호출하는 방식과 구별 할 수없는 방식으로 상대를 호출 할 수 있습니다. 당신이 쓸 수Math
,window
등 (당신은 다음과 같은 기능을 사용할 수Math.random()
있지만). - 스택 추적을 생성하여 스택 추적에 액세스 할 수 없습니다
Error
또는 다른 방법으로 .
너무 오래 걸리는 것에 대한 메모 : while
영원히 반복하십시오. 두 선수의 합쳐진 시간은 주어진 라운드에서 1 초를 넘지 않아야합니다. 이를 강제하기 위해 1000ms에서 2000ms 사이의 임의의 시간 초과가 선택되고 (알려진 시간을 의도적으로 기다림으로써 게임을 피하기위한 것입니다) 작업자가 실행 시간보다 오래 걸리면 오류가 발생합니다. 이 경우 오류의 원인은 다음과 같이 결정됩니다. 1000ms 이후 임의의 순간에 실행이 일시 중지되고 해당 시점의 호출 스택이 검사됩니다. 현재 루프 (또는 스택 오버플로 오류를 피하기 위해 설정된 재귀라는 의미에서 루프와 같은 재귀)에있는 가장 최근에 호출 된 경쟁 업체는 책임이 있습니다. 같은 경쟁자가 "너무 오래 복용"오류를 여러 번 초래했다고 비난받는 경우 해당 경쟁 업체는 실격 처리됩니다.
them
이 결정적 / 규칙을 따라야합니까? 예를 들어 function me(them){let log=0;them(x=>{++log;return 'C';})
; return log == 0? 'D': 'C';}
StackOverflow
결코 끝나지 않는 무한 루프가 아니라 오류 를 발생시켜야합니다 . 결과가된다면 StackOverflow
try-catch 문을 추가하십시오. 1 초 내에 stackoverflow 오류에 도달하지 않는 재귀의 예를 보려면 stackoverflow.com/q/12438786/3371119
them(() => 'C')
상대가 호출 할 때하기 때문에 오류가 발생하지 않을 them
, 그것은 호출 () => 'C'
기능. 필요가로 포장하는 것을 유일한 것은 try-catch
당신이 호출하면 될 것입니다 them
몇 가지 함수의 매개 변수가 전화로 them
몇 가지 함수의 매개 변수를 사용하여 해당 전화 them
등 (무한). 예를 들어 them(t => t(() => 'C'))
상대방이 자신이 놀고 있다고 생각하면 상대방이 무엇을 하든지간에 게임을 nice
합니다. stackoverflow
오류 가능성이 없습니다 .