除去ゲームをプレイする


12

前書き

この課題では、タスクは特定の種類の消去ゲームをシミュレートすることです。ゲームでは、参加者は輪になっており、全員が整数を保持しています。ゲームの各ラウンドで、すべての参加者は、保持している数nである場合nは、その人が離れる方向を指しています。n正の場合は右nに数え、負の場合は左に数え、nゼロの場合は自分自身を指します。誰かが彼らを指しているすべての参加者は排除され、円を離れます。これでラウンドが終了します。ラウンドは、参加者がなくなるまで続けられます。

入力

入力は、適切な形式の整数の空でないリストです。ゲームの参加者が保持している数字を表します。

出力

出力は、ゲームが終了するまでにかかるラウンドの数です。

入力リストを検討してください[3,1,-2,0,8]。最初のラウンドでは、次のことが起こります。

  • 保持者は保持3者を指さし0ます。
  • 保持者は保持1者を指さし-2ます。
  • 持っている人-2のポイントは、人物保持のまま3
  • 0自分自身でポイントを保持している人。
  • 保持8している人は、保持している人のすぐ-2近くにポイントを置きます(リストは円を表しているため、端で折り返します)。

これは0-23が削除されることを意味するため、listで2回目のラウンドが実行されます[1,8]。ここでは、を1指して8おり、8自分自身を指してい8ます。3番目のラウンドはlistを使用して行われ[1]1単純に自分自身を指して排除されます。すべての参加者を排除するのに3ラウンドかかったため、正しい出力は3です。

ルールとスコアリング

完全なプログラムまたは関数を作成できます。最小のバイトカウントが優先され、標準の抜け穴は許可されません。

テストケース

[3] -> 1
[0,0,0] -> 1
[-2,-1,0,1,2,3,4,5,6,7] -> 2
[5,5,5,6,6,6] -> 2
[3,-7,-13,18,-10,8] -> 2
[-7,5,1,-5,-13,-10,9] -> 2
[4,20,19,16,8,-9,-14,-2,17,7,2,-2,10,0,18,-5,-5,20] -> 3
[11,2,7,-6,-15,-8,15,-12,-2,-8,-17,6,-6,-5,0,-20,-2,11,1] -> 4
[2,-12,-11,7,-16,9,15,-10,7,3,-17,18,6,6,13,0,18,10,-7,-1] -> 3
[18,-18,-16,-2,-19,1,-9,-18,2,1,6,-15,12,3,-10,8,-3,7,-4,-11,5,-15,17,17,-20,11,-13,9,15] -> 6

最後のテストケースについて確かですか、5を取得しますか?
flawr

@flawr約1時間でリファレンス実装を確認できます(コンピューターを離れる必要がありました)が、正しいはずです。
-Zgarb

ただ明確にするために:n人が保持している番号ですか?
ピーターテイラー

@PeterTaylorはい、そうです。チャレンジの後半でそれを明確にします。
ズガルブ

回答:



5

Matlab、91 77バイト

function k=f(a);k=0;while a*0+1;l=numel(a);a(mod((1:l)+a-1,l)+1)=[];k=k+1;end

古いバージョン:

function k=f(a);for k=1:numel(a);a(mod((1:l)+a-1,l)+1)=[];l=numel(a);if l==0;break;end;end

これは、matlabが輝いている課題であり、このコードの中心は配列エントリの削除です。a(mod((1:l)+a-1,l)+1)=[]これは非常にエレガントだと思います。


4

CJam、21バイト

q~{__ee{~+0t}/0-}h],(

テストスイート。

入力をCJamスタイルリストとして受け取りますが、テストスイートはチャレンジ内の形式からの変換を処理します。

説明

q~     e# Read and evaluate the input.
{      e# While the array is non-empty...
  _    e#   Copy the array. The original is left on the stack so that we can use the
       e#   stack depth to count the number of iterations later.
  _ee  e#   Make another copy and enumerate it, which means that each element is replaced
       e#   by a pair containing the element and its index in the array.
  {    e#   For each such pair...
    ~+ e#     Add the value to the index, giving the index it points at.
    0t e#     Set the value in the original array at the pointed-at index to 0.
       e#     This works without giving false positives because all 0s point to themselves.
  }/
  0-   e#   Remove all 0s from the array.
}h
],(    e# Wrap the stack in an array, get its length and decrement it to determine how
       e# many iterations this process took.

ありがとう:ee昨日は別の質問で探していたものとほぼ同じです。
ピーターテイラー

3

C位、251の 219 211 197 193バイト

最も難解な非難解な言語が再び登場します。

using System.Linq;class X{static void Main(string[]a){int i=0,c;for(;(c=a.Length)>0;i++)a=a.Where((e,x)=>!a.Where((f,y)=>((int.Parse(f)+y)%c+c)%c==x).Any()).ToArray();System.Console.Write(i);}}

このプログラムは、入力シーケンスをコマンドライン引数として想定しています。たとえば、リストを入力する[5,5,5,6,6,6]には、コマンドライン引数でリストを呼び出します5 5 5 6 6 6

ヒントを提供してくれたMartinBüttnerに感謝します。

文字列の配列であるにもかかわらず、配列を再利用できることに気付いて197にゴルフしましたargs。1か所で整数に解析するだけです。

それがより短いことを実現することにより193までゴルフをしました。.Where(...==x).Any().Select(...).Contains(x)

非ゴルフ

using System.Linq;
class X
{
    static void Main(string[] args)
    {
        var iterations = 0, count;

        // In the golfed version, this is a `for` loop instead.
        while ((count = args.Length) > 0)
        {
            // Create a new args array containing the items to be kept.
            args = args.Where((item, index) =>
            {
                // Should the item at index `index` be deleted?
                var deleteThisIndex = args.Where((item2, index2) =>
                    // Modulo that works with negative numbers...
                    ((int.Parse(item2) + index2) % count + count) % count
                        == index);

                return !deleteThisIndex.Any();

            }).ToArray();

            iterations++;
        }

        System.Console.Write(iterations);
    }
}

5
C#は最も使いにくいですか?きっとあなたは間違っているに違いありません。誰もがJavaであることを知っています。:P
アレックスA.

@AlexA。Pfft、私はこれについてTimwiと一緒にいます。私はJavaでC#を何度も倒しました:P
Geobits

3
あなたは間違っています、PythまたはCJamが最も手に負えない、C#が最も勝てない言語です!
ベータ崩壊


2

R、105バイト

コード

l=scan();o=c();z=0;while((n=length(l))>0){for(i in 1:n)o=c(o,(i+l[i]-1)%%n+1);l=l[-o];o=c();z=z+1};cat(z)

食べない

l <- scan()                  # get input as a 'l' vector from user
o <- c()                     # create a empty vector
z=0                          # create a counter starting at 0   
while((n=length(l))>0){      # while the length of the input is more than 0
  for(i in 1:n){             # iterate through the vector
    o=c(o,(i+l[i]-1)%%n+1)   # add the index that will be deleted to the 'o' vector
  }
  l=l[-o]                    # remove the 'o' vector indexes from 'l'
  o=c()                      # empty 'o'
  z=z+1                      # add 1 to counter
}
cat(z)                       # print the counter

2

Pyth、17バイト

tl.u.DN.e%+kblNNQ

偶然にもカービファンの答えに非常に似ています。



1

STATA、146バイト

inf a using a.
gl b=0
qui while _N>0{
g q$b=0
g c$b=mod(_n+a-1,_N)+1
forv y=1/`=_N'{
replace q$b=1 if _n==c$b[`y']
}
drop if q$b
gl b=$b+1
}
di $b

STATAの有料版を使用します。入力がと呼ばれる改行で区切られたファイルにあると仮定しますa.。許可される変数の最大数により1023ラウンド以下が必要な状況に限定されます(10バイトのコストで修正可能)。データを読み取り、観測がなくなるまでループを実行します。各反復で、それが指すインデックスの値で変数を作成します。観測ごとに、別の観測がそれを指している場合、変数をドロップするインジケーターを設定します。次に、そのインジケーターを持つすべての観測値をドロップし、カウンターをインクリメントします。ループの後、カウンターを印刷します。



1

awk、66バイト

{for(;n=split($0=$0,a);++r)for(i in a)$((i+a[i]%n+n-1)%n+1)=X}$0=r

単にmod length array配列内に保持するために使用します。入力では、数字をスペースで区切る必要があります。

使用例

echo "-2 -1 0 1 2 3 4 5 6 7" | awk '{for(;n=split($0=$0,a);++r)for(i in a)$((i+a[i]%n+n-1)%n+1)=X}$0=r'

適切な形式のすべての入力例を次に示します

3
0 0 0
-2-1 0 1 2 3 4 5 6 7
5 5 5 6 6 6
3-7-13 18-10 8
-7 5 1 -5-13-10 9
4 20 19 16 8-9-14 -2 17 7 2-2 10 0 18 -5 -5 20
11 2 7 -6 -15-8 15 -12 -2 -8 -17 6 -6 -5 0 -20 -2 11 1
2-12-11 7-16 9 15-10 7 3-17 18 6 6 13 0 18 10-7-1
18-18-16 -2-19 1-9-18 2 1 6-15 12 3-10 8-3 7-4-11 5-15 17 17-20 11-13 9 15

0

Python 2、122バイト

def f(l):
 if not l:return 0
 L=len(l);x=[1]*L
 for i in range(L):x[(i+l[i])%L]=0
 return 1+e([v for i,v in zip(x,l)if i])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.