Gdzie usiądą twoi kumple?

25

Ty i niektórzy kumple idziecie na kręgle. W sumie jest N meloników. Jednak są tylko krzesła N- 1, na których można usiąść. Rozwiązanie jest proste: ktokolwiek przy tej turze nie dostanie krzesła. Następnie, kiedy ich kolej się kończy, siadają na krześle osoby, która idzie dalej.

Weźmy przykład. Załóżmy, że są nazwane i twoi przyjaciele są cztery nazwie B , C , D i E . Każdy gracz porusza się w kolejności alfabetycznej, więc musisz iść pierwszy. Ponieważ jest 5 graczy, są tylko 4 miejsca. Twoi znajomi siedzą na czterech miejscach w tej kolejności:

CEBD

Idź i dostaniesz strajk! Teraz kolej B , więc usiądź na jego krześle. Teraz wygląda to tak:

CEAD

B idzie. Piłka do rynny! Potem siada na miejscu C , a C idzie w następnej turze.

KORALIK

następnie C siada na krześle D.

BEAC

a D siedzi na krześle E.

BDAC

i na koniec E siedzi na twoim krześle.

BDEC

Zauważysz, że teraz każde miejsce jest (pseudo) tasowane. Musisz się dowiedzieć, po X zwrotach, kto będzie siedzieć?

Wkład

Twój program musi pobrać dwa dane wejściowe od użytkownika, ciąg znaków i liczbę. Nie są wymagane żadne monity. Ciąg będzie składał się z 1-51 znaków alfabetycznych (BZ i az) bez powtórzeń. Jest to kolejność, w jakiej usiądą Twoi znajomi. Nie będzie wielkiej litery A, ponieważ to ty, i zawsze idziesz pierwszy. Liczba będzie całkowitą liczbą rund (nie gier), w które Ty i Twoi znajomi gracie. Liczba ta będzie dodatnia i ma rozsądny rozmiar (mniej niż 1000).

Wydajność

Twój program musi wydrukować kolejność, w której siedzą Twoi znajomi po X kolejkach, i czyja to kolej. Tak na przykład, jeśli po X odwraca kolejność była BEDGCAHF i było Z kolej „s, program musi wydrukować dokładnie tak:

BEDGCAHF
It is Z's turn.

Oto kilka przykładowych danych wejściowych i wyjściowych.

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.

Zasady

  • Wszyscy idą w kolejności alfabetycznej, a wielkie litery mają pierwszeństwo przed małymi literami.

  • To jest golf golfowy, więc obowiązują standardowe luki, a zgłoszenia są oceniane w bajtach .

DJMcMayhem
źródło
1
Spędziłem godziny pracując nad tym w celu usprawnienia mózgu. Właśnie zauważyłem, że robię to źle.
Christopher
1
{({}[()])({}<({}<(([])<{{}({}<>)<>([])}{}<>>)<>>)<>{({}[()]<({}<>)<>>)}{}<>>)}
Christopher
Tasuje to i pierwszy element na stosie jest odpowiedzią.
Christopher
To była dla mnie moja niespodzianka: P
Christopher

Odpowiedzi:

3

Pyth, 37 bajtów

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

Demonstracja online: Pyth Compiler / Executor

Algorytm jest trochę oparty na rozwiązaniu @ isaacg. Podobnie jak on, zaczynam od początkowej kolejności miejsc i wielokrotnie korzystam z funkcji Xzamiany, aby zastąpić następnego gracza obecnym graczem.

Ale w przeciwieństwie do jego implementacji, która zastępuje znak następnego gracza aktualnym graczem w kolejności miejsc siedzących, używam go w szerszym zakresie. Zastępuję każdy znak obecnego gracza kolejnym graczem i każdy znak następnego gracza przez bieżącego gracza. Odbywa się to poprzez przekazanie obu graczy jako drugiego argumentu i pominięcie trzeciego argumentu ( XG"ab")zamiast XG"a""b"). Ponieważ obecny gracz nie jest częścią struny (gra), pierwsza wymiana nie ma żadnego efektu. Ale pozwala mi to na generowanie obu graczy jednocześnie, podczas gdy @isaacg musi je generować indywidualnie.

Kolejną szaloną nową funkcją, której używam, jest operator przypisania. Do niedawna =N1został przetłumaczony na N = 1, który był wykonywany za pomocą Pythona. Ale obecnie się kompiluje assign('N',1). Ta funkcja przypisuje N1 i zwraca wartość (ale nie drukuje jej). Umożliwia to zapisywanie wyników pośrednich, które występują na przykład w operacji redukcji. Dzięki temu mogłem zapisać parę graczy, którzy zmienili pozycje na końcu i wydrukować drugiego gracza.

Szczegółowe wyjaśnienie

                      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."
Jakube
źródło
8

Pyth, 39 38 bajtów

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

Opiera się to na całym powtarzane aplikacje na Znajdowanie i zamienianie operacji X. Pierwszy bit definiuje funkcję wyszukiwania y, która znajduje bodtwarzacz w kolejności graczy. Następnie wielokrotnie wykonujemy zamiany, aby znaleźć ostateczną kolejność miejsc, a na końcu drukować, czyja to kolej.

Zabawne jest, że kod do znalezienia ostatecznej kolejności miejsc jest krótszy (18 bajtów) niż kod do wydrukowania, którego kolejność (21 bajtów).

Kod pobiera łańcuch miejsca siedzącego w pierwszym wierszu STDIN, a liczbę zwojów w drugim wierszu.

Demonstracja.

Wyjaśnienie:

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.
isaacg
źródło
@ Sp3000 Dzięki za połów.
isaacg
Nigdy nie używaj %, jeśli wstawisz tylko jedną rzecz. Nawet ++zaoszczędziłby jeden bajt, ale najlepszym sposobem (2 bajty) jest użycie p:pyQ"It is ""'s turn
Jakube
Ups Brakowało mi punktu na końcu. ++Ma więc tę samą liczbę bajtów %i pzapisuje tylko 1 bajt.
Jakube
7

CJam, 49 45 43 bajtów

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

Myślę, że to działa. Po prostu uruchamia algorytm bez zmian.

Wypróbuj online.

Wyjaśnienie

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
Sp3000
źródło
4

Python 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)

Zoptymalizowana wersja rozwiązania Sp3000 wykorzystującareplace . Lista Szmienia się cyklicznie, ale litery są w kolejności. Wykonujemy wielokrotne zamiany w danym ciągu każdego znaku Sna poprzedni.

xnor
źródło
Świetnie się gra, za każdym razem :)
Sp3000
@ Sp3000 Użyłem twojego rozwiązania.
xnor
3

Klip 10 , 59 56 bajtów

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

Przykład

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

Wyjaśnienie

Pierwszym wejściem jest lista graczy przypisana do zmiennej x.

Drugie wejście to liczba zwojów, które program uzyskuje 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           -.

Dziękujemy Sp3000 za pomysł użycia „zamień”.

Ypnypn
źródło
3

Python 3, 128 bajtów

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])

Pobiera dwa wiersze danych wejściowych za pośrednictwem STDIN - początkowa kolejność siedzeń, a następnie liczba zwojów.

Jest to w zasadzie ten sam pomysł wyszukiwania i zamiany jak w moim rozwiązaniu CJam . Jedyną trudną częścią jest to, że trzymamy Asię z tyłu kolejności kręgli i robimy naszemu indeksowi iindeks następnego melonika, wykorzystując w ten sposób indeksowanie przez -1 i unikając IndexErrors.

Jest to kilka bajtów krótszych w Pythonie 2, ale wysyłam Python 3 do porównania z rozwiązaniem OP.

Sp3000
źródło
Jakie ulepszenia ma Python 2? Widzę, że dane wejściowe w wierszu 1 stają się raw_input (+4), a int(input())w wierszu 4 stają się danymi wejściowymi (-4), co powoduje ich anulowanie. Następnie usuń nawiasy z wydruku i dodaj spację w sumie 127. Czy czegoś brakuje?
DJMcMayhem
@DJMcMayhem Zapomniałeś nawiasów dlaexec
Sp3000
2

JavaScript (ES6) 116

116 bajtów jako program z I / O poprzez wyskakujące okienko. 114 jako funkcja do przetestowania.

Uruchom fragment kodu w przeglądarce Firefox, aby go przetestować.

// 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>

edc65
źródło
2

PowerShell, 168 bajtów

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

Zdecydowałem, że wszystkie moje odpowiedzi na tej stronie będą w PowerShell. Pewnego dnia otrzymam odpowiedź, która może konkurować ...

wywołaj funkcję w ten sposób: x Bb 2

Nacht - Przywróć Monikę
źródło
1

Ta odpowiedź nie wygra, ale i tak ją wyrzucę.

Python 3, 167 bajtów

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.")
DJMcMayhem
źródło
1

Pip , 54 bajty

Niezbyt konkurencyjny, ale przynajmniej mogę pochwalić się zmiennymi ciągami Pip i poleceniem Zamień. Bierze porządek miejsc i liczbę rund jako argumenty wiersza poleceń (które są przypisywane odpowiednio do ai b).

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

Wyjaśnienie:

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)

Byłoby 49, gdybym zadał sobie trud zaimplementowania SS(sortowania jako ciągów) w tym samym czasie, co zrobiłem SN(sortowania numerycznego) ... Ach, niebezpieczeństwa związane z rozwojem języka.

DLosc
źródło
1

Python 2 , 105 bajtów

a,s='A',input()
exec"b=a<max(s)and min(e for e in s if e>a)or'A';s=s.replace(b,a);a=b;"*input()
print s,b

Wypróbuj online!

Golf z:

s=input()
n=input()
a='A'
for i in range(n):
 try:
  b=min(e for e in s if e>a)
 except:
  b='A'
 s=s.replace(b,a)
 a=b
print s
print b
mdahmoune
źródło
0

Perl 5 , 102 + 1 (-n) = 103 bajty

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

Wypróbuj online!

Wkład

Kolejność siedzenia, a następnie liczba zwojów bez spacji:

SEatingOrder###
Xcali
źródło