테세우스의 새로운 배


9

테세우스 는 다음과 같은 오래된 질문입니다.

선박이 원래 부품을 모두 교체 한 경우에도 여전히 동일한 선박입니까?

이 골프를 위해 우리는 "선박"에서 "부품"을 천천히 교체하고 완전히 새로운 선박을 얻는 데 걸리는 시간을 볼 것입니다.

직무

배는 적어도 두 부분으로 구성됩니다. 부품은 부품의 조건을 나타내는 양의 (0이 아닌) 정수의 배열로 제공됩니다.

각주기마다 목록에서 하나의 부품을 균일 한 방식으로 무작위로 선택하십시오 . 해당 부품의 상태가 하나씩 줄어 듭니다. 부품 상태가 0에 도달하면 새 부품으로 대체됩니다. 새 부품은 원래 부품과 동일한 조건 값으로 시작합니다.

모든 부품이 (적어도) 한 번 교체 된 첫 번째 사이클에서 중지 된 사이클 수를 출력하십시오.

예를 들어 (여기서 무작위로 부품을 선택한다고 가정) :

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합니다 tZ. OUQ의 길이는 임의의 인덱스이며 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;],

온라인 데모

입력은 stdin 형식으로되어 [2 2 3]있습니다.

이것은 GolfScript의 펼치기 연산자가 유용한 드문 경우 중 하나입니다 . 그것은 우리가 배가 지나가는 상태를 축적 한 다음 끝에 계산할 수있게합니다. 계산 된 배열에는 초기 (입력) 상태가 포함되지만 마지막 요소가 0으로 축소 된 최종 상태는 포함되지 않습니다.

CJam 가지고 있지 않지만 그러나 펼쳐 많은 만 2 문자 카운트에 대해 균일하게 배열 셔플하는 기능을하고 있습니다 그것은 상단에 나올 수 있습니다.


3

파이썬 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

그리고 조건을 부정하는 것은으로 max(p)<1or-~f(p)당신이를 방지 할 수 or 1있기 때문에 True==1.
xnor

pwith 의 임의의 요소를 효과적으로 줄일 수 있습니다 shuffle(p);p[0]-=1.
xnor

@xnor 와우, 고마워! 이것들은 모두 훌륭합니다!
randomra

1

파이썬 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.