누가 가장 좋은지 알아 내기 위해 가위 바위 보 대회 를 조직하기로 결정했습니다 . 당신은 승자가 결정하기를 원치 않기 때문에 모든 사람이 경쟁 전에 글로 전술을 주어야합니다. 또한 간단한 것을 좋아하므로 경쟁사 (바위, 종이 또는 가위 표시)의 이동은 이전 차례 (RvR, RvP, RvS, PvR, PvP, PvS, SvR, SvP 또는 SvS) 만 기반으로해야합니다. 첫 번째 턴에서 플레이어는 고정 된 사인을 보여야합니다.
챔피언십을 시뮬레이트하기위한 프로그램 (또는 기능)을 작성하기로 결정했습니다.
경쟁의 세부 사항
- 참가자는 2 명 이상입니다.
- 모든 선수는 다른 사람과 정확히 하나의 경기를합니다.
- 한 경기는 7 라운드 지속됩니다.
- 매 라운드마다 승자는 2 점을 얻습니다. 동점 일 경우 두 선수 모두 1 점을 얻습니다.
- 경기에서 득점 한 선수는 경기의 턴 동안 자신의 점수를 합한 것입니다.
- 선수권에서 최종 점수는 모든 경기에서 자신의 점수를 합한 것입니다.
입력 세부 사항 :
- 프로그램이나 함수는
N
10 자 길이의 문자열을 받습니다. 각 문자열은 플레이어 전략에 해당합니다. 모든 캐릭터는 (소문자)r
p
또는s
주어진 상황에서 플레이어가 가위 바위 보를 보여줄 것임을 의미합니다. - 첫 번째 문자는 첫 번째 턴을 코딩합니다 (해당 선수의 모든 경기에서). 두 번째는 마지막 라운드가 락 대 락인 경우 어떻게되는지 보여줍니다. 다음은 RvP, RvS, PvR, PvP, PvS, SvR, SvP 및 SvS입니다. 첫 번째 글자는 플레이어의 표시이고 두 번째 글자는 상대방의 표시입니다. 예를 들어
rrpsrpsrps
플레이어가 락으로 시작한 다음 상대방의 마지막 움직임을 복사합니다. - 문자열 목록을 언어의 목록 / 배열 또는 유사한 데이터 또는 하나의 문자열로 입력 할 수 있습니다. 후자의 경우 어떤 종류의 구분 문자가 필수입니다.
출력 세부 사항 :
- 프로그램 또는 기능은 입력 된 순서대로 각 플레이어의 최종 점수를 출력해야합니다.
- 점수는 공백이나 줄 바꿈으로 구분해야합니다. 후행 공백 또는 개행이 허용됩니다.
예 :
입력:
['rrpsrpsrps', 'rpppsprrpr']
출력 :
5 9
(턴 rvr rvp pvs svp pvr rvp pvs
)
입력:
['rrpsrpsrps', 'rpppsprrpr', 'ssssssssss']
출력 :
13 17 12
(일치 항목은 5-9
(1st vs 2nd), 8-6
(1st vs 3rd) 및 8-6
(2nd vs 3rd))
이것은 코드 골프이므로 가장 짧은 항목이 이깁니다.
답변
파이썬 2 : 201 개 188 문자
def f(Q):c=lambda m:'rps'.index(m);l=len(Q);r=[0]*l;i=0;exec'p,q=i/l,i%l;m,n=c(Q[p][0]),c(Q[q][0]);exec"r[p]+=(p!=q)*(m+1-n)%3;m,n=c(Q[p][m*3+n+1]),c(Q[q][n*3+m+1]);"*7;i+=1;'*l*l;return r
이 프로그램의 논리 : 나는 번호로 문자 변환 ( r=0
, p=1
, s=2
). m
첫 n
번째 사람의 수, 두 번째 사람의 수입니다. 게임은 주기적이므로 (m-n)%3
이미 결과를 결정합니다. 물론 결과를 하나씩 바꿀 수 있습니다 f=(m+1-n)%3
. 이제 f=0
두 번째 플레이어가 q
이기고 f=1
넥타이를 의미하며 f=2
첫 번째 플레이어가 p
이깁니다. 또한 이미 플레이어 1의 점수입니다. 따라서 (p!=q)*(m+1-n)%3
각 플레이어의 모든 값만 추가하면됩니다 .
그것을 테스트 print f(['rrpsrpsrps', 'rpppsprrpr', 'ssssssssss'])