Theseus'un Yeni Gemisi


9

Theseus Gemi gibi bir şey gider eski soru:

Bir gemi tüm orijinal parçalarını değiştirdiyse, hala aynı gemi midir?

Bu golf için, yavaş yavaş bir "gemide" "parçaları" değiştireceğiz ve yepyeni bir gemi almanın ne kadar süreceğini göreceğiz.

Görev

Bir gemi en az iki parçadan oluşur. Parçalar, parçanın durumunu temsil eden bir pozitif (sıfır olmayan) tamsayı dizisi olarak verilir.

Her döngüde, listeden bir parçayı düzgün bir şekilde rastgele seçin . Bu parçanın durumu bir azaltılacak. Bir parçanın durumu sıfıra ulaştığında, yerine yeni bir parça konur. Yeni parça, orijinal ile aynı koşul değeriyle başlar.

Tüm parçaların (en azından) bir kez değiştirildiği ilk döngüde durun ve aldığı döngü sayısını çıkartın.

Örneğin (burada rastgele parçaları seçtiğimi varsayın):

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

Bu örneğin çıktısı 8, değiştirilecek tüm parçaların sekiz döngüsünü alması nedeniyle olacaktır. Kesin çıktı her çalışma için farklı olmalıdır.

I / O

Tek girdi, parça koşulu için tamsayıların listesi / dizisidir. Tek çıkış bir dizi döngüdür. Bu değerleri alışılmış yollardan biriyle alabilir / verebilirsiniz: STDIO, işlev bağımsız değişkenleri / iadeler, vb.

Test Durumları

Çıktı sabit olmadığından, test etmek istediğiniz her şeyi kullanabilirsiniz, ancak standartlaştırma amacıyla bir çift:

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
Bir şey eksik mi, yoksa bir parça 0'a ulaştığında yeni bir parça ile değiştirilmesinin bir önemi yok mu?
xnor

@xnor Cevabı almak önemli değil, hayır (ve atlamak için yapılması gereken bir şey gibi görünüyor). Ancak tematik olarak , geminin parçalarının değiştirilmesi gerekiyor: P
Geobits

Yanıtlar:


4

Pyth, 12 bayt

f!eSXOUQQtZ1

Gösteri.

Nasıl çalışır:

Bu, Pyth'in bir ifadeyi doğru bir şey döndürene kadar artan girdilerle test eden ve daha sonra bunun olmasına neden olan girdiyi döndüren sonsuz filtresine dayanır. Ancak, test edilecek ifade giriş değerini kullanmayacaktır.

Bunun yerine, ifade rastgele bir girdiyi azaltarak giriş listesini değiştirir. Bu ifade yoluyla gerçekleştirilir XOUQQtZ. Bu araçlar endeksi artış OUQlistede Qtarafından tZ. OUQuzunluğunda rastgele bir indekstir Qve tZ-1'dir. Qgiriş listesine sıfırlanır.

QBu şekilde değiştirdikten sonra , dönen değerini Xalır, maksimum girişini eSalır ve bu değerin mantıksal değerini almayız !. Bu, öğesinin her öğesi ilk kez Qazaltıldığında ilk kez gerçek bir değer döndürür 0.

Döndürülen sayının tam olarak kaç kez Qdeğiştirildiğinden emin olmak için 1, ilk kez çağrıldığını belirten sayımı başlatacağız, 1 değişiklik yapıldı. Görmek için Qversiyonuna bakın kodunun her yineleme sonra benziyor burada .


5

GolfScript ( 26 24 bayt) / CJam ( 20 18 bayt)

GolfScript:

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

Çevrimiçi demo

CJam (aynı fikir ama biraz farklı uygulama):

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

Çevrimiçi demo

Girdi stdin biçimindedir [2 2 3].

Bu, GolfScript'in açılma operatörünün yararlı olduğu nadir durumlardan biridir . Geminin geçtiği devletleri biriktirmemize ve sonunda onları saymamıza izin veriyor. Sayılan dizinin başlangıç ​​(giriş) durumunu içerdiğini, ancak son öğenin 0'a indirildiği son durumu içermediğini unutmayın.

Bununla birlikte, CJam, bir diziyi sadece 2 karakter için eşit olarak karıştırma yeteneğini ortaya çıkarmasa da, çok fazla sayılır ve üste çıkmasına izin verir.


3

Python 3, 91 71 bayt

@Xnor sayesinde 20 (!) Bayt kaydedildi.

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

Tüm parça değerleri 0 veya negatif olana ve her fonksiyon kendi alt öğesi + 1 ve son olarak adlandırılan bir değer 1 döndürene kadar kendini daha küçük parça değerleriyle çağıran özyinelemeli işlev.


İle pozitif bir sayı olup olmadığını kontrol edebilirsiniz max(p)>0.
xnor

Ve durumdan max(p)<1or-~f(p)kaçınmanıza izin verdiği için or 1, çünkü True==1.
xnor

Etkili rastgele eleman azaltma yapabilirsiniz pile shuffle(p);p[0]-=1.
xnor

@xnor Vay canına, teşekkürler! Bunların hepsi harika!
randomra

1

Python 3, 175 bayt

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)

Özellikle iyi golf değil .

Burada çevrimiçi deneyin


Kendini yok etme yorumu
Tim
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.