당신의 친구는 어디에 앉을 것인가? 의자 만 앉을 수 있습니다. 해결책은

당신과 몇몇 친구들이 볼링을하고 있습니다. 총 N 개의 볼러가 있습니다. 그러나 N -1 의자 만 앉을 수 있습니다. 해결책은 간단합니다. 그런 다음 차례가 끝나면 다음 사람의 의자에 앉습니다.

예를 들어 봅시다. 이름이 A 이고 네 친구의 이름이 B , C , DE라고 가정하십시오 . 모든 플레이어는 알파벳 순서로 움직이므로 먼저 가십시오. 5 명의 선수가 있기 때문에 단지 4 개의 좌석이 있습니다. 친구들은 다음 순서로 네 자리에 앉습니다.

CEBD

당신은 가고, 당신은 파업을 얻는다! 그것은의 B 는 자신의 의자에 앉아 있도록의 옆십시오. 이제 다음과 같이 보입니다 :

CEAD

B 는 간다. 거 터볼! 그런 다음 그는 앉아 C 의 자리, 그리고 C는 다음 턴 간다.

구슬

다음 C가 에 앉아 D 의 의자.

BEAC

D가 에 앉아 E 의 의자

BDAC

마지막으로 E 는 의자에 앉습니다.

BDEC

이제 모든 사람의 좌석이 (의사) 섞여 있음을 알 수 있습니다. X 가 돌아간 후에 누가 어디에 앉을 지 알아 내야합니다 .

입력

프로그램은 사용자로부터 문자열과 숫자의 두 가지 입력을 가져와야합니다. 프롬프트가 필요하지 않습니다. 문자열은 반복없이 1-51 자의 알파벳 문자 (BZ 및 az)입니다. 이것은 친구들이 앉기로 선택한 순서를 나타냅니다. 대문자 A 는 없습니다 . 왜냐하면 항상 당신입니다. 이 숫자는 귀하와 친구가하는 총 라운드 수 (게임이 아님)입니다. 이 숫자는 양수이고 합당한 크기입니다 (1000 미만).

산출

당신의 프로그램은 X 턴 후에 친구들이 앉아있는 순서와 그 차례를 인쇄해야합니다. 예를 들어, X 회전 후 주문이 BEDGCAHF이고 Z 회전 인 경우 프로그램은 다음을 정확하게 인쇄해야합니다.

BEDGCAHF
It is Z's turn.

다음은 몇 가지 샘플 입력 및 출력입니다.

input: E, 4
E
It is A's turn.

input: E, 5
A
It is E's turn.

input: Bb, 2
AB
It is b's turn.

input: dgOPZXKDQYioHflFhpqzUsSaeILwckVNEtGTCJBvnruRyWMmjxb, 999
JNuvFDqjwEPVnMSlOWXgAZyGKordIRBtkamziphcUYbxfCsTQeH
It is L's turn.

규칙

  • 모두 알파벳 순서로 진행되며 대문자가 소문자보다 우선합니다.

  • 이것은 코드 골프이므로 표준 허점이 적용되고 제출 점수 는 바이트 단위 입니다.



답변

Pyth, 37 바이트

uXGK<.<+\ASzH2)QzpeK"It is ""'s turn.

온라인 데모 : Pyth Compiler / Executor

이 알고리즘은 @isaacg의 솔루션을 기반으로합니다. 그와 같이 나는 초기 좌석 주문으로 시작 X하고 다음 선수를 현재 선수로 교체하기 위해 교체 기능을 반복적으로 사용합니다 .

그러나 다음 플레이어의 캐릭터를 현재 플레이어가 좌석 순서대로 바꾸는 그의 구현과는 달리, 나는 그것을보다 광범위한 방식으로 사용합니다. 현재 플레이어의 각 문자를 다음 플레이어로 바꾸고 다음 플레이어의 각 문자를 현재 플레이어로 바꿉니다. 이것은 두 플레이어를 두 번째 arg로 전달하고 세 번째 arg를 생략하여 수행됩니다 ( XG"ab")대신 XG"a""b"). 현재 플레이어가 현의 일부가 아니기 때문에 (첫번째 교체) 전혀 효과가 없습니다. 그러나 @isaacg는 개별적으로 생성해야하지만 동시에 두 플레이어를 생성 할 수 있습니다.

내가 사용하는 또 다른 미친 새로운 기능은 할당 연산자입니다. 최근까지로 =N1번역되어 N = 1파이썬으로 실행되었습니다. 그러나 요즘에는 컴파일됩니다 assign('N',1). 이 함수 N는 1을 할당 하고 값을 반환하지만 인쇄하지는 않습니다. 이를 통해 예를 들어 축소 작업에서 발생하는 중간 결과를 저장할 수 있습니다. 이것을 사용하여 마지막으로 위치를 바꾼 플레이어 쌍을 저장하고 두 번째 플레이어를 인쇄 할 수있었습니다.

상해

                      implicit: z = input string, Q = input number
u              Qz     reduce for H in range(Q), start with G = z
                        update G with:
       +\ASz              "A" + sorted(z)
     .<     H             cyclic shifted by H
    <        2            get the first 2 elements (current + next player)
   K                      store the result in K
 XG           )           replace next player by current player in G
                      implicit print

peK"It is ""'s turn.  print "It is" + K[-1] (current player) + "'s turn."


답변

Pyth, 39 38 바이트

L@+\ASzbuXGyhHyHQzpyQ"It is ""'s turn.

찾기 및 바꾸기 작업의 반복 된 응용 프로그램을 기반으로합니다 X. 첫 번째 비트는 플레이어 순서에서 th 플레이어 y를 찾는 조회 함수를 정의합니다 b. 그런 다음 최종 좌석 순서를 찾기 위해 대체 작업을 반복하고 마지막으로 자신의 차례를 인쇄합니다.

흥미롭게도, 최종 좌석 순서를 찾는 코드는 인쇄 순서가 21 바이트 인 코드보다 짧습니다 (18 바이트).

이 코드는 STDIN의 첫 번째 줄에서 좌석 문자열을 취하고 두 번째 줄의 턴 수를 사용합니다.

데모.

설명:

L@+\ASzbuXGyhHyHQzpyQ"It is ""'s turn.
                                          Implicit:
                                          z = input()
                                          Q = eval(input())

L                                         def y(b): return
  +\ASz                                    "A" + sorted(z)
 @     b                                  (               )[b]
        u       Qz                        reduce for H in range(len(Q)),
                                          G starts as z.
         XGyhHyH                          replace in G y(H+1) with y(H).
                  pyQ"It is ""'s turn.    Print out whose turn it is.


답변

CJam, 49 45 43 바이트

l_'A+$ri{:L2<(erL(+}*1<"
It is "\"'s turn."

나는 이것이 효과가 있다고 생각한다. 그대로 알고리즘을 실행합니다.

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

설명

l                       Read line (initial seating order)
_'A+$                   Copy, add "A" and sort to give bowling order

ri{          }*         Do <number of turns> times...
   :L                     Save bowling order as L
     2<(                  Get next and current bowlers
        er                Replace next with current in seating
          L(+             Push bowling order again and update (rotate)

1<                      Get current bowler from start of bowling order
"
It is "\"'s turn."      Output message


답변

파이썬 3, 110

s=input()
S=sorted(s+'A')*999
exec("y,*S=S;s=s.replace(S[0],y);"*int(input()))
print(s+"\nIt is %s's turn."%y)

를 사용하는 Sp3000 솔루션replace 의 최적화 된 버전입니다 . S문자가 순서대로 표시되지만 목록이 순환합니다. 우리는 각 문자의 주어진 문자열 S에서 이전 문자로 반복 교체를 수행 합니다.


답변

클립 10 , 59 56 바이트

[t{)k[qa)qglqtg(lqt}wx)nyN"It is "gnyt"'s turn.."`]s,x'A

[t{)k[qa)qglqtg(lqt}wx)nyN"It is "gnyt"'s turn.."`]s,x'A
dgOPZXKDQYioHflFhpqzUsSaeILwckVNEtGTCJBvnruRyWMmjxb
999
JNuvFDqjwEPVnMSlOWXgAZyGKordIRBtkamziphcUYbxfCsTQeH
It is L's turn.

설명

첫 번째 입력은 변수에 지정된 플레이어 목록입니다 x.

두 번째 입력은 프로그램이 얻는 회전 수입니다 ny.

[t                                        ]s,x'A .-t is the sorted list of players including A-.
  {                                      `       .-Print the following:            -.
    k[q            }wx)ny                        .-In each round (q is all the previous rounds)-.
       a)q                                       .-Replace                         -.
          glqt                                   .-the next player                 -.
              g(lqt                              .-with the previous player        -.

                     N                           .-Also print a newline            -.
                      "It is "    "'s turn.."
                              gnyt               .-The ny'th player in t           -.

“바꾸기”사용에 대한 Sp3000 감사합니다.


답변

파이썬 3, 128 바이트

L=input()
S=sorted(L)+["A"]
i=0
exec("L=L.replace(S[i],S[i-1]);i=-~i%len(S);"*int(input()))
print(L+"\nIt is %s's turn."%S[i-1])

STDIN을 통해 두 줄의 입력을받습니다. 초기 좌석 순서와 회전 횟수입니다.

이것은 기본적으로 내 CJam 솔루션 과 동일한 검색 및 교체 아이디어 입니다. 유일한 까다로운 부분은 볼링 순서 A뒷면 에 붙어 i인덱스를 다음 볼러 의 인덱스로 만들고 따라서 -1로 인덱스를 사용하고 IndexErrors를 피한다는 것 입니다.

이것은 Python 2에서 몇 바이트 더 짧지 만 OP의 솔루션과 비교하기 위해 Python 3을 게시하고 있습니다.


답변

자바 스크립트 (ES6) 116

팝업 창을 통한 I / O 프로그램으로 116 바이트. 114는 테스트 가능한 기능입니다.

Firefox에서 코드 스 니펫을 실행하여 테스트하십시오.

// as a program with I/O
for(t=[...s=(P=prompt)()].sort(),x=P(),p='A';x--;p=n)t.push(p),s=s.replace(n=t.shift(),p);P(`${s}
It is ${p}' turn`)

// as a function with 2 parameters, returning output as a 2 lines string
f=(s,x)=>{for(t=[...s].sort(),p='A';x--;p=n)t.push(p),s=s.replace(n=t.shift(),p);return(`${s}
It is ${p}' turn`)}

// Test suite
test=[
['CEBD',5], ['E', 4],['E',5],['Bb', 2],
['dgOPZXKDQYioHflFhpqzUsSaeILwckVNEtGTCJBvnruRyWMmjxb', 999]];

Out=x=>OUT.innerHTML=OUT.innerHTML+x;

test.forEach(([p,x])=>Out(p+' '+x+':\n'+f(p,x)+'\n'))
Test cases from OP:
<pre id=OUT></pre>