Где будут сидеть ваши приятели?


25

Вы и некоторые друзья играете в боулинг. Всего N котлов. Тем не менее, есть только N- 1 стульев, в которых можно сидеть. Решение простое: кто бы ни повернулся в данный момент, не получает стул. Затем, когда их очередь заканчивается, они садятся в кресло человека, который идет дальше.

Давайте возьмем пример. Скажем , Вы назвали , и ваши четверо друзей называются B , C , D и E . Каждый игрок движется в алфавитном порядке, поэтому вы должны идти первым. Поскольку здесь 5 игроков, есть только 4 места. Ваши друзья сидят на четырех местах в таком порядке:

CEBD

Вы идете, и вы получите удар! Теперь очередь за Б , так что вы сидите на его стуле. Теперь это выглядит так:

CEAD

Б идет. Gutterball! Затем он сидит в C месте «s и C идет следующий ход.

ШАРИК

то C сидит в D стула «s.

Британская европейская авиатранспортная компания

и D сидит в кресле E

BDAC

и наконец, E сидит в вашем кресле.

BDEC

Вы заметите, что теперь место каждого (псевдо) перетасовано. Вы должны узнать, после X поворотов, кто будет где сидеть?

вход

Ваша программа должна получить от пользователя два ввода: строку и число. Никаких подсказок не требуется. Строка будет состоять из 1-51 буквенных символов (BZ и az) без повторов. Это порядок, в котором ваши друзья решили сесть. Там не будет заглавной буквы А, потому что это вы, и вы всегда идете первым. Количество будет общим количеством раундов (не игр), в которые вы и ваши друзья играете. Это число будет положительным и разумного размера (менее 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
Я часами работал над этим для мозгового штурма. Я только заметил, что я делал это неправильно.
Кристофер

1
{({}[()])({}<({}<(([])<{{}({}<>)<>([])}{}<>>)<>>)<>{({}[()]<({}<>)<>>)}{}<>>)}
Кристофер

Это тасует его, и первым элементом в стеке является ответ.
Кристофер

Это было моим сюрпризом для вас: P
Кристофер

Ответы:


3

Pyth, 37 байт

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

Демонстрация онлайн: компилятор / исполнитель Pyth

Алгоритм основан на решении @ isaacg. Как и он, я начинаю с начального порядка мест и постоянно использую функцию Xзамены, чтобы заменить следующего игрока текущим игроком.

Но в отличие от его реализации, которая заменяет символ следующего игрока текущим игроком в порядке рассадки, я использую его более широко. Я заменяю каждого персонажа текущего игрока следующим игроком, а каждого персонажа следующего игрока текущим игроком. Это достигается передачей обоим игрокам второго аргумента и опусканием третьего аргумента ( XG"ab")вместо XG"a""b"). Поскольку текущий игрок не является частью строки (он играет), первая замена не имеет никакого эффекта вообще. Но это позволяет мне генерировать обоих игроков одновременно, в то время как @isaacg должен генерировать их по отдельности.

Еще одна сумасшедшая новая функция, которую я использую, - оператор присваивания. До недавнего времени =N1переводилась на язык N = 1Python. Но в настоящее время это компилируется в assign('N',1). Эта функция присваивает N1 и возвращает значение (но не печатает его). Это позволяет сохранять промежуточные результаты, которые происходят, например, в операции сокращения. Используя это, я смог сохранить пару игроков, которые меняли позиции последними, и распечатать второго игрока.

Детальное объяснение

                      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. Первый бит определяет функцию поиска y, которая находит bигрока в порядке игрока. Затем мы неоднократно выполняем замены, чтобы найти окончательный порядок рассадки и, наконец, распечатываем, чья это очередь.

Забавно, что код для определения окончательного порядка размещения короче (18 байт), чем код для печати, чей это оборот (21 байт).

Код занимает строку посадки в первой строке 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 Спасибо за улов.
Исаак

Никогда не используйте %, если вы вставляете только одну вещь. Даже ++бы сохранить один байт, но лучший способ (2 байта) использует p:pyQ"It is ""'s turn
Jakube

К сожалению. Пропустил точку в конце. Таким образом , ++имеет тот же байт-счетчик , как %и pсохраняет только 1 байт.
Якуб

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

Python 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, но я публикую Python 3 для сравнения с решением OP.


Какие улучшения имеет Python 2? Я вижу, что ввод в строке 1 становится raw_input (+4), а int(input())в строке 4 становится ввод (-4), так что отменяется. Затем удалите скобки из печати и добавьте пробел в общей сложности 127. Я что-то упустил?
DJMcMayhem

@DJMcMayhem Вы забыли скобки дляexec
Sp3000

2

JavaScript (ES6) 116

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

Этот ответ не победит, но я все равно его выброшу.

Python 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 байта

Не очень конкурентоспособный, но, по крайней мере, я могу показать изменчивые строки Пипа и команду 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)

Было бы 49 лет, если бы я удосужился реализовать SS(сортировать как строки) в то же время, что и я SN(сортировать по числовому признаку) ... Что ж , опасности в разработке языка.



0

Perl 5 , 102 + 1 (-n) = 103 байта

s/\d+//;$t=$&;@p=sort'A',split//;for$i(1..$t){s/$p[$i%@p]/$p[--$i%@p]/}say"$_
It is $p[$t%@p]'s turn."

Попробуйте онлайн!

вход

Порядок рассадки с последующим числом поворотов без пробелов:

SEatingOrder###
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.