당신의 친구는 어디에 앉을 것인가?


25

당신과 몇몇 친구들이 볼링을하고 있습니다. 총 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.

규칙

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

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


1
나는 brainflak를 위해 이것을 연구하는 데 몇 시간을 보냈습니다. 방금 내가 잘못하고 있음을 알았습니다.
Christopher

1
{({}[()])({}<({}<(([])<{{}({}<>)<>([])}{}<>>)<>>)<>{({}[()]<({}<>)<>>)}{}<>>)}
Christopher

그것을 섞고 스택의 첫 번째 항목이 답입니다.
Christopher

답변:


3

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."

8

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.

@ Sp3000 감사합니다.
isaacg

%하나만 삽입하면을 사용하지 마십시오 . ++1 바이트 도 절약 할 수 있지만 가장 좋은 방법 (2 바이트)은 다음을 사용하는 것입니다 p.pyQ"It is ""'s turn
Jakube

죄송합니다. 끝에 요점을 놓쳤다. 따라서 ++와 같은 바이트 수를 %가지며 p1 바이트 만 저장합니다.
Jakube

7

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

4

파이썬 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에서 이전 문자로 반복 교체를 수행 합니다.


매번 잘 연주 :)
Sp3000

@ Sp3000 귀하의 솔루션을 사용했습니다.
xnor

3

클립 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

파이썬 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을 게시하고 있습니다.


파이썬 2는 어떤 개선점을 가지고 있습니까? 1 행의 입력이 raw_input (+4)이되고 int(input())4 행의 입력이 입력 (-4)이되어 취소됩니다. 그런 다음 인쇄에서 괄호를 제거하고 총 127 개의 공백을 추가하십시오.
DJMcMayhem

@DJMcMayhem 다음에 대한 괄호를 잊어 버렸습니다exec
Sp3000

2

자바 스크립트 (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>


2

PowerShell, 168 바이트

function x($s,$t){$p="A"+$s-split''|?{$_}|%{[int][char]$_}|sort|%{[char]$_};$l=$p.count;1..$t|%{$s=$s.replace($p[$_%$l],$p[($_-1)%$l])};$s;"It is $($p[$t%$l])'s turn."}

이 사이트에 대한 모든 답변은 PowerShell로 결정했습니다. 언젠가 나는 경쟁 할 수있는 대답을 할 것이다 ...

다음과 같이 함수를 호출하십시오. x Bb 2


1

이 답변은 이길 수는 없지만 어쨌든 버릴 것입니다.

파이썬 3, 167 바이트

s=input()
n=int(input())
c='A'
t=sorted(set(s+c))
F=len(t)
f=list(s)
for i in range(n):
 I=f.index(t[(i+1)%F]);c,f[I]=f[I],c
print(''.join(f)+'\nIt is '+c+"'s turn.")

1

, 54 바이트

경쟁이 심하지는 않지만 최소한 Pip의 가변 문자열과 Swap 명령을 보여줍니다. 좌석 순서와 라운드 수를 명령 줄 인수 ( 각각 a및에 할당 됨 b)로 사용합니다.

u:'Ao:SN A^u.aLbSu(aa@?C(o++i))Pa"It is ".u."'s turn."

설명:

u:'A                   u = player who's currently up

o:SN A^u.a
      ^u.a             Append "A" to the seating order, split into list of characters
o:SN A                 ASCII value of each char, sort the resulting list, assign to o

LbSu(aa@?C(o++i))
Lb                     Repeat b times:
  Su                   Swap u with:
    (a          )      The character of a at index:
      a@?              Find in a:
         C(o++i)       chr(ASCII value of next player from o)
                       (Subscripts wrap around, as in CJam, so no need for mod)

Pa                     Print the final lineup
"It is ".u."'s turn."  Current player (auto-printed)

내가 SS동시에 SN(숫자 정렬 ) 구현 (문자열 정렬)을 귀찮게했다면 49 였을 것입니다 ... 아, 개발중인 언어를 갖는 위험.



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.