テセウスの新しい船


9

テセウスは、次のような古い質問です。

船が元の部品をすべて交換した場合、それはまだ同じ船ですか?

このゴルフでは、「船」の「部品」をゆっくりと交換し、まったく新しい船を入手するのにかかる時間を確認します。

仕事

船は少なくとも2つの部分で構成されます。パーツは、パーツの状態を表す正(ゼロ以外)の整数の配列として指定されます。

各サイクルで、リストから1つの部品を均一な方法でランダムに選択します。その部分の状態は1つ減ります。部品の状態がゼロになると、新しい部品に置き換えられます。新しいパーツは、元のパーツと同じ条件値で始まります。

すべての部品が(少なくとも)1回交換された最初のサイクルで、停止して、かかったサイクル数を出力します。

たとえば(ここでランダムにパーツを選択していると仮定します):

2 2 3  <- starting part conditions (input)
2 1 3  <- second part reduced
2 1 2  ...
2 1 1 
2 2 1  <- second part reduced to zero, replaced
1 2 1 
1 2 3  <- third part replaced
1 1 3 
2 1 3  <- first part replaced

この例の出力は8、すべての部品を交換するのに8サイクルかかったので、になります。正確な出力は、実行ごとに異なる必要があります。

I / O

唯一の入力は、部品条件の整数のリスト/配列です。唯一の出力はサイクル数です。これらの値は、STDIO、関数の引数/戻り値などの通常の方法で取得/提供できます。

テストケース

出力は固定されていないため、テストしたいものは何でも使用できますが、標準化のために以下にいくつか示します。

1 2 3 4

617 734 248 546 780 809 917 168 130 418

19384 74801 37917 81706 67361 50163 22708 78574 39406 4051 78099 7260 2241 45333 92463 45166 68932 54318 17365 36432 71329 4258 22026 23615 44939 74894 19257 49875 39764 62550 23750 4731 54121 8386 45639 54604 77456 58661 34476 49875 35689 5311 19954 80976 9299 59229 95748 42368 13721 49790

1
何かが足りないのでしょうか、それともパーツが0に達したときに新しいパーツと交換されることは問題ではありませんか?
XNOR

@xnorええ、それは答えを得ることは重要ではありません(そしてそれはそれをスキップするために行うことのようです)。しかし、主題的には、船の部品を交換する必要があります:P
Geobits

回答:


4

Pyth、12バイト

f!eSXOUQQtZ1

デモンストレーション。

使い方:

これはPythの無限フィルターに基づいています。これは、入力が増加する式をテストして、それが真実を返すまでテストし、次にこれを引き起こした入力を返します。ただし、テストされる式は入力値を使用しません。

代わりに、式はランダムなエントリをデクリメントして入力リストを変更します。これは、式を介して行われますXOUQQtZ。この手段は、インデックスを増やしOUQリストにQすることによってtZOUQ長さのランダムな指標でQあり、tZ-1です。Q入力リストに初期化されます。

Qこの方法で変更した後、現在の値を取得します。これXは、その最大値のエントリを eSで取得し、その値の論理否定をで取得し!ます。これは、のすべての要素が初めて以下にQ減少したときに初めて真の値を返します0

返される数が正確Qに変更された回数になるようにするために、カウントをで開始します。1これは、これが初めて呼び出されたときに、1回の変更があったことを示します。Qコードを繰り返すたびにどのように見えるかを確認するには、こちらのバージョンを確認してください


5

GolfScript(26 24バイト)/ CJam(20 18バイト)

GolfScript:

~{$)*}{.,rand{(+}*((+}/,

オンラインデモ

CJam(同じアイデアですが、少し異なる実装):

q~{_mr((+_$)*}g;],

オンラインデモ

入力はフォームの標準入力です[2 2 3]

これは、GolfScriptのunfoldオペレーターが役立つ稀なケースの1つです。船が通過する州を蓄積し、最後に数えることができます。カウントされる配列には、初期(入力)状態が含まれますが、最後の要素が0に減らされた最終状態は含まれません。

しかし、けれどもCJamはありません展開]たくさんのための唯一の2文字のカウントのために均一に配列をシャッフルする能力を、それが上に出てくることができます。


3

Python 3、91 71バイト

@xnorのおかげで20(!)バイト節約されました。

from random import*
def f(p):shuffle(p);p[0]-=1;return max(p)<1or-~f(p)

すべてのピース値が0または負になり、すべての関数がその子+ 1の戻り値を返し、最後に呼び出されたものが1を返すまで、より小さいピース値で自分自身を呼び出す再帰関数。


で正の数の存在を確認できmax(p)>0ます。
xnor

ASと条件を否定するmax(p)<1or-~f(p)あなたは避けることができますor 1から、True==1
xnor 2015

pwithのランダムな要素を効果的に減らすことができますshuffle(p);p[0]-=1
XNOR

@xnorわあ、ありがとう!これらはすべて素晴らしいです!
randomra

1

Python 3、175バイト

import random
p,t=input().split(),0;f,r=[int(i)for i in p],[0]*len(p)
while 0 in r:
 f[random.randint(0,len(f)-1)]-=1;t+=1
 for x in range(len(f)):
  r[x]=int(f[x]<1)
print(t)

特によくゴルフされていません

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


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