당신과 몇몇 친구들이 볼링을하고 있습니다. 총 N 개의 볼러가 있습니다. 그러나 N -1 의자 만 앉을 수 있습니다. 해결책은 간단합니다. 그런 다음 차례가 끝나면 다음 사람의 의자에 앉습니다.
예를 들어 봅시다. 이름이 A 이고 네 친구의 이름이 B , C , D 및 E라고 가정하십시오 . 모든 플레이어는 알파벳 순서로 움직이므로 먼저 가십시오. 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로 인덱스를 사용하고 IndexError
s를 피한다는 것 입니다.
이것은 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>