あなたの仲間はどこに座りますか?


25

あなたと何人かの仲間はボウリングをしています。合計N個のボウラーがいます。ただし、座れるのはN -1の椅子のみです。解決策は簡単です。その後、順番が終わると、次に行く人の椅子に座ります。

例を見てみましょう。あなたの名前はAで、4人の友人の名前はBCDEであるとします。すべてのプレーヤーはアルファベット順に移動するため、最初に移動します。5人のプレイヤーがいるので、4席のみです。友人は次の順序で4つの席に座っています。

CEBD

あなたが行って、いや、ストライキをする!それはだBあなたが彼の椅子に座っているので、次のターン。これは次のようになります。

CEAD

Bが行く。ガターボール!その後、彼はCのスポットに座り、Cは次のターンに進みます。

ビーズ

その後、Cはに座っているDさんの椅子。

BEAC

そしてDはに座っているEさんの椅子

BDAC

そして最後に、Eはあなたの椅子に座っています。

BDEC

皆さんの席が(擬似)シャッフルされていることに気付くでしょう。Xが回った後、誰がどこに座っているのかを知る必要がありますか?

入力

プログラムは、ユーザーからの2つの入力、文字列と数値を受け取る必要があります。プロンプトは必要ありません。文字列は1〜51文字のアルファベット文字(BZとaz)で、繰り返しはありません。これは、友達が座ることを選んだ順序を表します。大文字のAはありません。大文字であるため、常に最初に移動します。数は、あなたとあなたの友人がプレイするラウンド(ゲームではない)の合計数になります。この数は正で、適切なサイズ(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
Brainflakでこれに取り組むのに何時間も費やしました。私はちょうどそれが間違っていたことに気付いた。
クリストファー

1
{({}[()])({}<({}<(([])<{{}({}<>)<>([])}{}<>>)<>>)<>{({}[()]<({}<>)<>>)}{}<>>)}
クリストファー

それはシャッフルされ、スタックの最初のアイテムが答えです。
クリストファー

それはあなたにとって驚きでした:P-
クリストファー

回答:


3

Pyth、37バイト

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

オンラインデモンストレーション:Pyth Compiler / Executor

アルゴリズムは、@ isaacgのソリューションに基づいています。彼のように、最初の座席順序から始めてX、次のプレーヤーを現在のプレーヤーに置き換えるために、replace-functionalityを繰り返し使用します。

しかし、次のプレーヤーの文字を座席の順番で現在のプレーヤーに置き換える彼の実装とは異なり、私はそれをより広範な方法で使用します。現在のプレイヤーの各文字を次のプレイヤーに置き換え、次のプレイヤーの各文字を現在のプレイヤーに置き換えます。これは、両方のプレーヤーを2番目の引数として渡し、3番目の引数を(XG"ab")ではなくXG"a""b")省略することで実現されます。現在のプレーヤーは弦の一部ではない(演奏している)ため、最初の置換はまったく効果がありません。しかし、@ isaacgが個別に生成する必要がある一方で、両方のプレイヤーを同時に生成することができます。

私が使用する別のクレイジーな新機能は、代入演算子です。最近まで=N1に翻訳されN = 1、Pythonで実行されました。しかし、最近ではにコンパイルされassign('N',1)ます。この関数Nは1を割り当て、値を返します(ただし、出力しません)。これにより、たとえばリデュース操作で発生する中間結果を保存できます。これを使用して、最後に位置を変更したプレーヤーのペアを保存し、2番目のプレーヤーを印刷することができました。

詳細な説明

                      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。最初のビットは、プレーヤーの順序でth番目のプレーヤーyを見つけるルックアップ関数を定義しますb。その後、繰り返し置換を実行して最終的な座席順序を見つけ、最終的に誰の順番かを印刷します。

面白いことに、最終的な座席順序を見つけるためのコードは、順番がどちらであるかを印刷するコード(21バイト)よりも短い(18バイト)。

このコードは、STDINの最初の行に座席の文字列を取り、2番目の行にターン数を取ります。

デモンストレーション。

説明:

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

%1つだけを挿入する場合は、を使用しないでください。++1バイトでも節約できますが、最良の方法(2バイト)は以下を使用することpですpyQ"It is ""'s turn
。–ジャクベ

おっとっと。最後にポイントを逃しました。したがって++、と同じバイトカウントを持ち、1バイトしか保存%pません。
ジャクベ

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

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のソリューション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

2番目の入力は、プログラムがで取得するターン数です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を介して2行の入力を受け取ります。最初の座席順序、次にターン数です。

これは基本的に、私のCJamソリューションと同じ検索と置換のアイデアです。唯一のトリッキーな部分は、ボウリング順序の後ろに固執Aし、インデックスを次のボウラーのインデックスにすることです。したがって、-1によるインデックス付けを利用し、s を避けます。iIndexError

これはPython 2では数バイト短いですが、OPのソリューションと比較するためにPython 3を投稿しています。


python 2にはどのような改善がありますか?行1の入力はraw_input(+4)になりint(input())、行4の入力は入力(-4)になるため、キャンセルされます。次に、印刷から括弧を削除し、合計127個のスペースを追加します。何か不足していますか?
DJMcMayhem

@DJMcMayhem括弧を忘れてしまったexec
Sp3000

2

JavaScript(ES6)116

ポップアップウィンドウを介したI / Oを備えたプログラムとして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バイト

それほど競争力はありませんが、少なくとも、Pipの可変文字列とSwapコマンドを披露することができます。着席順序とラウンド数をコマンドライン引数として受け取ります(それぞれ、abに割り当てられます)。

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、ああも...(ソート数値)開発の言語を持っていることの危険を。


1

Python 2、105バイト

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

オンラインでお試しください!

ゴルフの:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.