Arkadaşların nerede oturacak?


25

Sen ve bazı arkadaşlar bovlinge gidiyorsunuz. Toplam N bowling oyuncusu var. Ancak, oturmak için sadece N -1 sandalye var. Çözüm basit: şu anda kim olursa olsun sandalye alamıyor. Sonra sıraları bittiğinde, sıradaki kişinin sandalyesine otururlar.

Bir örnek verelim. Diyelim ki siz A isminiz ve dört arkadaşınız B , C , D ve E olarak adlandırılmış . Her oyuncu alfabetik sıraya göre hareket eder, bu yüzden ilk önce sen olursun. 5 oyuncu olduğundan, sadece 4 sandalye var. Arkadaşlarınız bu sırada dört koltukta oturuyorlar:

CEBD

Sen git ve yayı vur! Sırada B var , yani sandalyesinde otur. Şimdi şuna benziyor:

CEAD

B gider. Oluk topu! Sonra C'nin yerinde oturur ve C bir sonraki sırada gider.

BONCUK

sonra C , D 'sandalyesinde oturuyor .

BEAC

ve D E'nin sandalyesinde oturuyor

BDAC

ve son olarak, E sandalyenize oturur.

BDec

Şimdi herkesin koltuğunun (sözde) karıştırıldığını fark edeceksiniz. Bilmelisin, X döndükten sonra , kim nerede oturuyor?

Giriş

Programınız kullanıcıdan iki girdi almalıdır, bir dize ve bir sayı. Bilgi istemine gerek yok. Dize, tekrarı olmayan 1-51 alfabetik karakterlerden (BZ ve az) oluşacaktır. Bu, arkadaşlarınızın oturmayı seçtiği sırayı temsil eder. Büyük A harfi olmayacak çünkü o sensin, ve her zaman önce sen. Sayı, sizin ve arkadaşlarınızın oynadığı toplam tur sayısıdır (oyun değil). Bu sayı pozitif ve makul büyüklükte olacaktır (1000'den az).

Çıktı

Programınız, arkadaşlarınızın X dönüşten sonra oturdukları sırayı ve kimin sırası olduğunu yazdırmalıdır. Örneğin, eğer X döndükten sonra sipariş BEDGCAHF ve Z dönüşüyse , programınız tam olarak şunu yazdırmalıdır:

BEDGCAHF
It is Z's turn.

İşte birkaç örnek giriş ve çıkış.

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.

kurallar

  • Herkes alfabetik olarak düzenlenir, büyük harfler küçük harflerden önceliklidir.

  • Bu kod-golf'dür, bu nedenle standart boşluklar uygulanır ve gönderimler bayt cinsinden puanlanır .


1
Brainflak için bunun üzerinde çalışarak saatler geçirdim. Yanlış yaptığımı farkettim.
Christopher,

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

Karıştırır ve yığındaki ilk öğe cevaptır.
Christopher,

Bu benim için sürpriz oldu: P
Christopher,

Yanıtlar:


3

Pyth, 37 bayt

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

Çevrimiçi Gösteri: Pyth Compiler / Executor

Algoritma @ isaacg'ın çözümüne dayanıyor. Onun gibi ilk koltuk sırasına başlıyorum Xve bir sonraki oyuncuyu mevcut oyuncu ile değiştirmek için art arda değiştirme işlevini kullanıyorum .

Ancak mevcut oyuncunun sıradaki oyuncunun yerine oturma sırasındaki yerini alan uygulamasından farklı olarak daha geniş bir şekilde kullanıyorum. Geçerli oyuncunun her karakterini bir sonraki oyuncuyla, sonraki oyuncunun her karakterini o oyuncuyla değiştiririm. Bu, her iki oyuncuyu da ikinci argüman olarak geçerek ve üçüncü argümanı atlayarak gerçekleştirilir (XG"ab") yerine XG"a""b") . Mevcut oyuncu dizenin bir parçası olmadığından (çalıyor), ilk oyuncu değişikliği hiçbir şekilde etkilenmedi. Ama aynı anda her iki oyuncuyu da yaratmamı sağlıyor, oysa @isaacg onları bireysel olarak yaratmalı.

Kullandığım bir başka çılgın yeni özellik de atama operatörü. Yakın zamana kadar Python ile idam edilen =N1tercüme edildi N = 1. Ancak günümüzde bunu derler assign('N',1). Bu işlev atarN 1 ile ve değeri döndürür (ancak yazdırmaz). Bu, örneğin bir azaltma işleminde ortaya çıkan ara sonuçların kaydedilmesini sağlar. Bunu kullanarak, son pozisyonlarını değiştiren oyuncu çiftini saklayabildim ve ikinci oyuncuyu basabildim.

Detaylı açıklama

                      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 bayt

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

Bu, bulma ve değiştirme işleminin tekrarlanan uygulamalarına dayanır X. İlk bit bir arama işlevi tanımlar ybulur, boyuncu için inci çalar. Ardından, son oturma sırasını bulmak için art arda yerine geçenleri yaparız ve sonunda kimin sırasını çıkardığımızı yazdırırız.

Eğlenceli bir şekilde, son oturma sırasını bulma kodu, sırasını (21 bayt) basacak olan koddan daha kısa (18 bayt).

Kod, STDIN'in ilk satırındaki oturma ipini ve ikincinin dönüş sayısını alır.

Gösteri.

Açıklama:

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 Yakaladığınız için teşekkürler.
isaacg

Asla %, sadece bir şey eklerseniz kullanmayın . ++Bir bayt bile kurtaracaktı, ama en iyi yol (2 byte) kullanıyor p:pyQ"It is ""'s turn
Jakube

Hata. Sonunda noktayı kaçırdım. Böylece ++aynı bayt sayımı vardır %ve pyalnızca 1 bayt kaydeder.
Jakube

7

CJam, 49 45 43 bayt

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

Bence bu işe yarıyor. Sadece algoritmayı olduğu gibi çalıştırır.

Çevrimiçi deneyin.

açıklama

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)

Sp3000'ün çözümününreplace optimize edilmiş bir versiyonunu kullanarak . Liste S, sırayla harflerin mevcut olmasına rağmen döner. Bir Sönceki karakterin her bir karakterinin verilen dizgisinde tekrarlanan değişiklikler yapıyoruz .


Her zaman iyi oynadı :)
Sp3000

@ Sp3000 Yine de çözümünüzü kullandım.
xnor

3

Klip 10 , 59 56 bayt

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

Örnek

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

açıklama

İlk giriş, değişkene atanan oyuncuların listesidir x.

İkinci giriş, programın elde ettiği dönüş sayısıdır 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           -.

"Değiştir" kullanma fikri için Sp3000'e teşekkürler.


3

Python 3, 128 bayt

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 üzerinden iki satırlık girdi alır - ilk oturma sırası ve ardından tur sayısı.

Bu temelde CJam çözümümle aynı ara ve değiştir fikri . Tek zor kısım bowling sırasının arkasına yapışmamız Ave indeksimizi bir sonraki bowlingin indeksi yapmamızdır , böylelikle -1 indekslemeden faydalanır ve s'den kaçınırız .iIndexError

Bu Python 2'de bir kaç bayt daha kısa, ancak OP'nin çözümüyle karşılaştırmak için Python 3'ü gönderiyorum.


Python 2'nin geliştirmeleri nelerdir? 1. satırdaki girişin raw_input (+4) ve int(input())4. satırdaki girişin (-4) olur, böylece iptal eder. Ardından parantezleri baskıdan çıkarın ve toplam 127 için bir boşluk ekleyin. Bir şey mi eksik?
DJMcMayhem

@DJMcMayhem Parantezleri unuttunexec
Sp3000

2

JavaScript (ES6) 116

Açılır pencereden I / O ile program olarak 116 bayt. Test edilebilir bir fonksiyon olarak 114.

Test etmek için kod parçacığını Firefox'ta çalıştırın.

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

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

Bu sitedeki tüm cevaplarımın PowerShell'de olmasına karar verdim. Bir gün rekabet edebilecek bir cevabım olacak.

fonksiyonu şu şekilde çağır: x Bb 2


1

Bu cevap kazanamayacak, ama yine de dışarıya atacağım.

Python 3, 167 bayt

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

bip , 54 bayt

Çok rekabetçi değil, ama en azından Pip'in değişken karakterlerini ve Swap komutunu göstereceğim. Oturma sırasını ve tur sayısını komut satırı argümanları ( sırasıyla ave buna atanan b) olarak alır.

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

Açıklama:

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)

Aynı zamanda uygularsam SS(dizeleri sırala) zahmet etsem de 49 olur ( SNgelişim sırasına göre).


1

Python 2 , 105 bayt

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

Çevrimiçi deneyin!

Golf:

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 bayt

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

Çevrimiçi deneyin!

Giriş

Oturma sırası, ardından boşluksuz dönüş sayısı:

SEatingOrder###
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.