Di mana temanmu akan duduk?


25

Anda dan beberapa teman akan bermain bowling. Ada total N bowler. Namun, hanya ada N- 1 kursi untuk duduk. Solusinya sederhana: siapa pun yang gilirannya saat ini tidak mendapatkan kursi. Kemudian ketika giliran mereka berakhir, mereka duduk di kursi orang yang pergi berikutnya.

Mari kita ambil contoh. Katakanlah Anda diberi nama A , dan empat teman bernama B , C , D , dan E . Setiap pemain bergerak dalam urutan abjad, sehingga Anda bisa pergi dulu. Karena ada 5 pemain, hanya ada 4 kursi. Teman-teman Anda duduk di empat kursi dalam urutan ini:

CEBD

Anda pergi, dan yay Anda mendapatkan serangan! Itu B 's giliran berikutnya, sehingga Anda duduk di kursinya. Sekarang terlihat seperti ini:

CEAD

B pergi. Talang! Lalu dia duduk di tempat C , dan C belok berikutnya.

TITISAN

lalu C duduk di kursi D.

BEAC

dan D duduk di kursi E.

BDAC

dan terakhir, E duduk di kursi Anda.

BDEC

Anda akan melihat bahwa sekarang kursi semua orang (semu) dikocok. Anda harus mencari tahu, setelah X berbalik, siapa yang akan duduk di mana?

Memasukkan

Program Anda harus mengambil dua input dari pengguna, string dan angka. Tidak ada konfirmasi yang diperlukan. String akan menjadi 1-51 karakter alfabet (BZ dan az) tanpa pengulangan. Ini mewakili urutan teman yang Anda pilih untuk duduk. Tidak akan ada huruf A besar karena itu adalah Anda, dan Anda selalu pergi dulu. Jumlahnya akan menjadi jumlah total putaran (bukan game) yang Anda dan teman Anda mainkan. Angka ini akan menjadi positif dan berukuran wajar (kurang dari 1000).

Keluaran

Program Anda harus mencetak urutan teman-teman Anda duduk setelah X berubah, dan giliran siapa. Jadi misalnya, jika setelah X ternyata urutannya adalah BEDGCAHF dan giliran Z , program Anda harus mencetak dengan tepat ini:

BEDGCAHF
It is Z's turn.

Berikut adalah beberapa contoh input dan output.

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.

Aturan

  • Semua orang menggunakan urutan abjad, dengan huruf kapital didahulukan dari huruf kecil.

  • Ini adalah kode-golf, jadi celah standar berlaku, dan pengiriman dinilai dalam byte .


1
Saya telah menghabiskan berjam-jam mengerjakan ini untuk brainflak. Saya hanya memperhatikan bahwa saya melakukan kesalahan.
Christopher

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

Itu mengocoknya dan item pertama di tumpukan adalah jawabannya.
Christopher

Itu adalah kejutan bagi Anda: P
Christopher

Jawaban:


3

Pyth, 37 byte

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

Demonstrasi Online: Kompilator / Pelaksana Pyth

Algoritma ini agak berdasarkan pada solusi @ isaacg. Seperti dia, saya mulai dengan urutan kursi awal dan berulang kali menggunakan fungsi Xganti untuk mengganti pemain berikutnya dengan pemain saat ini.

Tetapi tidak seperti implementasinya, yang menggantikan karakter pemain berikutnya dengan pemain saat ini dalam urutan tempat duduk, saya menggunakannya secara lebih luas. Saya mengganti setiap karakter pemain saat ini dengan pemain berikutnya dan setiap karakter pemain berikutnya dengan pemain saat ini. Ini dicapai dengan melewati kedua pemain sebagai arg kedua dan hilangkan arg ketiga ( XG"ab")bukan XG"a""b"). Karena pemain saat ini bukan bagian dari string (dia bermain), penggantian pertama tidak berpengaruh sama sekali. Tapi itu memungkinkan saya untuk menghasilkan kedua pemain secara bersamaan, sementara @isaacg harus membuat mereka secara individual.

Fitur baru gila lain yang saya gunakan adalah operator penugasan. Sampai baru =N1- baru ini diterjemahkan ke dalam N = 1, yang dieksekusi dengan Python. Tetapi sekarang ini dikompilasi untuk assign('N',1). Fungsi ini ditetapkan Ndengan 1 dan mengembalikan nilai (tetapi tidak mencetaknya). Ini memungkinkan penghematan hasil antara, yang terjadi misalnya dalam operasi pengurangan. Dengan menggunakan ini saya dapat menyimpan sepasang pemain, yang mengubah posisi terakhir, dan mencetak pemain kedua.

Penjelasan detail

                      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 byte

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

Ini didasarkan pada aplikasi berulang dari operasi find and replace X,. Bit pertama mendefinisikan fungsi pencarian y,, yang menemukan bpemain th dalam urutan pemain. Kemudian, kami berulang kali melakukan penggantian untuk menemukan urutan tempat duduk terakhir, dan akhirnya mencetak giliran siapa.

Yang mengherankan, kode untuk menemukan urutan tempat duduk terakhir lebih pendek (18 byte) daripada kode untuk mencetak yang gilirannya (21 byte).

Kode mengambil string tempat duduk pada baris pertama STDIN, dan jumlah putaran pada baris kedua.

Demonstrasi.

Penjelasan:

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 Terima kasih atas tangkapannya.
isaacg

Jangan pernah gunakan %, jika Anda hanya memasukkan satu hal. Bahkan ++akan menghemat satu byte, tetapi cara terbaik (2 byte) menggunakan p:pyQ"It is ""'s turn
Jakube

Ups. Ketinggalan di bagian akhir. Jadi ++memiliki jumlah byte yang sama dengan %, dan phanya menghemat 1 byte.
Jakube

7

CJam, 49 45 43 byte

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

Saya pikir ini berhasil. Itu hanya menjalankan algoritma apa adanya.

Cobalah online.

Penjelasan

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

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)

Versi optimal dari solusi Sp3000 menggunakanreplace . Daftar ini Sberputar melalui huruf-huruf yang ada dalam urutan. Kami melakukan penggantian berulang dalam string yang diberikan masing-masing karakter Soleh yang sebelumnya.


Dimainkan dengan baik, setiap kali :)
Sp3000

@ Sp3000 saya menggunakan solusi Anda.
xnor

3

Klip 10 , 59 56 byte

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

Contoh

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

Penjelasan

Input pertama adalah daftar pemain, yang ditugaskan ke variabel x.

Input kedua adalah jumlah belokan, yang diperoleh dengan program 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           -.

Terima kasih kepada Sp3000 untuk gagasan menggunakan "ganti".


3

Python 3, 128 byte

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

Mengambil dua baris input melalui STDIN - urutan tempat duduk awal kemudian jumlah belokan.

Ini pada dasarnya ide pencarian dan ganti yang sama dengan solusi CJam saya . Bagian hanya rumit adalah bahwa kita tetap Adi belakang urutan bowling dan membuat indeks kami iindeks berikutnya bowler, sehingga mengambil keuntungan dari pengindeksan dengan -1 dan menghindari IndexErrors.

Ini beberapa byte lebih pendek di Python 2, tapi saya memposting Python 3 untuk perbandingan dengan solusi OP.


Perbaikan apa yang dimiliki python 2? Saya melihat bahwa input pada baris 1 menjadi raw_input (+4) dan int(input())pada baris 4 menjadi input (-4) sehingga membatalkan. Kemudian hapus tanda kurung dari cetakan dan tambahkan spasi dengan total 127. Apakah saya melewatkan sesuatu?
DJMcMayhem

@DJMcMayhem Anda lupa tanda kurung untukexec
Sp3000

2

JavaScript (ES6) 116

116 byte sebagai program dengan I / O via jendela popup. 114 sebagai fungsi yang dapat diuji.

Jalankan cuplikan kode di Firefox untuk menguji.

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

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

Saya sudah memutuskan semua jawaban saya di situs ini adalah di PowerShell. Suatu hari saya akan memiliki jawaban yang dapat bersaing ...

panggil fungsi seperti ini: x Bb 2


1

Jawaban ini tidak akan menang, tetapi saya tetap akan membuangnya di sana.

Python 3, 167 byte

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

Pip , 54 byte

Tidak terlalu kompetitif, tapi setidaknya aku bisa memamerkan string Pip yang bisa berubah dan perintah Swap. Mengambil urutan tempat duduk dan jumlah putaran sebagai argumen baris perintah (yang ditugaskan untuk adan b, masing-masing).

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

Penjelasan:

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)

Itu akan menjadi 49 jika saya repot-repot mengimplementasikan SS(urutkan sebagai string) pada saat yang sama saya lakukan SN(urutkan numerik) ... Ah well, bahaya memiliki bahasa dalam pengembangan.


1

Python 2 , 105 byte

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

Cobalah online!

Golf dari:

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

0

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

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

Cobalah online!

Memasukkan

Pesanan tempat duduk, diikuti oleh jumlah belokan tanpa spasi:

SEatingOrder###
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.