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


25

Ви з деякими приятелями ходите на боулінг. Загалом N казанок. Однак у них є тільки N -1 стільці. Рішення просте: хто зараз не звернеться, той не отримає крісло. Потім, коли їхня черга закінчилася, вони сідають у крісло людини, що йде далі.

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

CEBD

Ти ідеш, і тобі страйк! Це B «s переходить, так що ви сидите в своєму кріслі. Тепер це виглядає так:

CEAD

Б іде. Гуттербол! Потім він сідає на місце С , і С іде наступним кроком.

БОРОТА

потім C сидить у кріслі D.

BEAC

і D сидить у кріслі E

BDAC

і нарешті, Е сидить у вашому кріслі.

BDEC

Ви помітите, що зараз сидіння всіх (псевдо) змінено. Ви повинні дізнатися, після Х обертів, хто буде сидіти де?

Вхідні дані

Ваша програма повинна взяти два входи від користувача, рядок і число. Підказки не потрібні. Рядок буде 1-51 алфавітним символом (BZ та az) без повторів. Це означає, що ваші друзі вирішили сидіти. У верхньому регістрі А не буде, тому що це ти, і ти завжди йдеш першим. Кількість буде загальною кількістю раундів (а не ігор), які ви та ваші друзі граєте. Це число буде позитивним і розумним розміром (менше 1000).

Вихідні дані

Ваша програма повинна роздрукувати порядок, за яким сидять ваші друзі після Х поворотів, і чия це черга. Так, наприклад, якщо після обертання 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
{({}[()])({}<({}<(([])<{{}({}<>)<>([])}{}<>>)<>>)<>{({}[()]<({}<>)<>>)}{}<>>)}
Крістофер

Він перетасовує його, і перший пункт у стеці - це відповідь.
Крістофер

Це було для мене моїм сюрпризом: П
Крістофер

Відповіді:


3

Pyth, 37 байт

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

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

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

Але на відміну від його реалізації, яка замінює чару наступного гравця поточним гравцем у порядку сидіння, я використовую його більш широким способом. Я замінюю кожне char поточного гравця наступним гравцем і кожне char наступного гравця поточним гравцем. Це відбувається шляхом передачі обох гравців у якості другого аргументу та опускання третього аргументу ( XG"ab")замість XG"a""b"). Оскільки поточний програвач не є частиною струни (він грає), перша заміна взагалі не має ефекту. Але це дозволяє мені генерувати обох гравців одночасно, тоді як @isaacg повинен генерувати їх окремо.

Ще одна божевільна нова функція, яку я використовую, - це оператор присвоєння. До недавнього часу =N1його перекладали N = 1, що було виконано разом із Python. Але в наш час вона складається 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 Дякую за улов.
isaacg

Ніколи не використовуйте %, якщо ви вставляєте лише одне. Навіть ++врятував би один байт, але найкращим способом (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

Ця відповідь не виграє, але я все одно викину її туди.

Пітон 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.