Nowy statek Tezeusza

9

Statku Tezeusza jest stare pytanie, które brzmi mniej więcej tak:

Jeśli na statku wymieniono wszystkie oryginalne części, czy nadal jest to ten sam statek?

W tym golfie będziemy powoli wymieniać „części” na „statku” i sprawdzać, ile czasu zajmuje uzyskanie nowego statku.

Zadanie

Statek składa się z co najmniej dwóch części. Części są podane jako tablica dodatnich (niezerowych) liczb całkowitych, reprezentujących stan części.

W każdym cyklu losowo wybierz jedną część z listy w jednolity sposób. Stan tej części zostanie zmniejszony o jeden. Kiedy stan części osiągnie zero, zostanie ona zastąpiona nową częścią. Nowa część zaczyna się od tej samej wartości warunku, co oryginał.

W pierwszym cyklu, w którym wszystkie części zostały wymienione (przynajmniej) jeden raz, zatrzymaj i wyślij liczbę wykonanych cykli.

Na przykład (zakładam, że wybieram tutaj części losowo):

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

Wynik dla tego przykładu byłby 8, ponieważ zajęło osiem cykli dla wszystkich części do wymiany. Dokładne dane wyjściowe powinny się różnić dla każdego przebiegu.

I / O

Jedynym wejściem jest lista / tablica liczb całkowitych dla stanu części. Jedynym wyjściem jest liczba cykli. Możesz przyjmować / podawać te wartości na dowolny ze zwykłych sposobów: STDIO, argumenty / zwroty funkcji itp.

Przypadki testowe

Ponieważ dane wyjściowe nie są stałe, możesz użyć wszystkiego, co chcesz przetestować, ale oto kilka do celów standaryzacji:

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
Geobity
źródło
1
Czy coś mi brakuje, czy nie ma znaczenia, że ​​gdy część osiągnie wartość 0, zostanie zastąpiona nową częścią?
xnor
@ xnor Cóż, nie ma znaczenia, aby uzyskać odpowiedź, nie (i wydaje się, że należy to pominąć). Ale tematycznie części statku wymagają wymiany: P
Geobity

Odpowiedzi:

4

Pyth, 12 bajtów

f!eSXOUQQtZ1

Demonstracja.

Jak to działa:

Opiera się to na nieskończonym filtrze Pytha, który testuje wyrażenie z rosnącymi danymi wejściowymi, dopóki nie zwróci czegoś prawdziwego, a następnie zwraca dane wejściowe, które to spowodowały. Jednak wyrażenie, które zostanie przetestowane, nie użyje wartości wejściowej.

Zamiast tego wyrażenie zmodyfikuje listę wejściową, zmniejszając losowy wpis. Dokonuje się tego poprzez wyrażenie XOUQQtZ. Oznacza to zwiększenie indeksu OUQna liście Qo tZ. OUQjest losowym indeksem o długości Qi tZwynosi -1. Qjest inicjowany na liście wejść.

Po zmodyfikowaniu Qw ten sposób bierzemy jego bieżącą wartość, która Xzwraca, przyjmujemy jej maksymalną wartość za pomocą eSi logiczne nie tej wartości za pomocą !. Zwraca to prawdziwą wartość po raz pierwszy, gdy po raz pierwszy każdy element Qzostał zredukowany do 0lub poniżej.

Aby upewnić się, że zwracana liczba będzie dokładnie tyle razy, ile razy Qzmodyfikowano, zaczniemy liczenie od 1, wskazując, że przy pierwszym wywołaniu została wprowadzona 1 modyfikacja. Aby zobaczyć, jak Qwygląda po każdej iteracji kodu, sprawdź wersję tutaj .

isaacg
źródło
5

GolfScript ( 26 24 bajtów) / CJam ( 20 18 bajtów)

GolfScript:

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

Demo online

CJam (ten sam pomysł, ale nieco inna implementacja):

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

Demo online

Dane wejściowe są na standardowym formularzu [2 2 3].

Jest to jedna z tych nielicznych przypadkach GolfScript w rozwinięć operatora jest przydatne. Pozwala nam kumulować stany, przez które przechodzi statek, a następnie liczyć je na końcu. Należy zauważyć, że liczona tablica zawiera stan początkowy (wejściowy), ale nie stan końcowy, w którym ostatni element został zredukowany do 0.

Jednak chociaż CJam nie ma możliwości rozwinięcia zdolności równomiernego tasowania tablicy dla zaledwie 2 znaków, wiele się liczy i pozwala mu wyjść na wierzch.

Peter Taylor
źródło
3

Python 3, 91 71 bajtów

20 (!) Bajtów zapisanych dzięki @xnor.

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

Funkcja rekurencyjna wywołująca się z mniejszymi wartościami sztuk, dopóki wszystkie wartości sztuk nie będą równe 0 lub ujemne, a każda funkcja zwróci wartość zwracaną przez jej dziecko + 1, a ostatnio wywoływana zwróci 1.

randomra
źródło
Możesz sprawdzić obecność liczby dodatniej za pomocą max(p)>0.
xnor
Negowanie tego warunku, ponieważ max(p)<1or-~f(p)pozwala uniknąć or 1, ponieważ True==1.
xnor
Możesz skutecznie zmniejszyć losowy element za ppomocą shuffle(p);p[0]-=1.
xn 30.04.15
@xnor Wow, dzięki! Wszystkie są świetne!
randomra
1

Python 3, 175 bajtów

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)

Niezbyt dobrze gra w golfa .

Wypróbuj online tutaj

Tim
źródło
Komentarz do samozniszczenia
Tim