Новый корабль Тесея

9

Корабль Тесея старый вопрос , который звучит примерно так:

Если на судне были заменены все его оригинальные детали, это все тот же корабль?

Для этого гольфа мы будем медленно заменять «части» на «корабле» и посмотрим, сколько времени потребуется, чтобы получить совершенно новый корабль.

задача

Корабль состоит как минимум из двух частей. Части даны как массив положительных (ненулевых) целых чисел, представляющих состояние детали.

В каждом цикле случайным образом выбирайте одну часть из списка. Состояние этой части будет уменьшено на единицу. Когда состояние детали достигает нуля, оно заменяется новой деталью. Новая деталь начинается с того же значения условия, что и оригинал.

На первом цикле, где все детали были заменены (как минимум) один раз, остановите и выведите количество циклов, которое потребовалось.

Например (предположим, что здесь я выбираю детали случайным образом):

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, поскольку для замены всех частей потребовалось восемь циклов. Точный вывод должен отличаться для каждого прогона.

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
Geobits
источник
1
Я что-то упустил или не имеет значения, что когда деталь достигает 0, она заменяется новой?
xnor
@xnor Ну, не имеет значения, чтобы получить ответ, нет (и кажется, что нужно его пропустить). Но тематически , части корабля нуждаются в замене: P
Geobits

Ответы:

4

Pyth, 12 байт

f!eSXOUQQtZ1

Демонстрация.

Как это работает:

Это основано на бесконечном фильтре Пита, который проверяет выражение с увеличивающимися входными данными, пока он не возвращает что-то правдивое, а затем возвращает входные данные, которые вызвали это. Однако выражение, которое будет проверено, не будет использовать входное значение.

Вместо этого выражение изменит входной список, уменьшив случайную запись. Это достигается с помощью выражения XOUQQtZ. Это означает увеличение индекса OUQв списке Qна tZ. OUQслучайный индекс длины Qи tZравен -1. Qинициализируется в список ввода.

После Qтакого изменения мы берем его текущее значение, которое Xвозвращается, принимаем максимальное значение с eSи принимаем логическое значение не с этим значением !. Это возвращает истинное значение в первый раз, когда каждый элемент Qбыл уменьшен до 0или ниже в первый раз.

Чтобы гарантировать, что возвращаемое число будет ровно столько раз, сколько Qбыло изменено, мы начнем отсчет с того 1, что при первом вызове этого процесса произошла 1 модификация. Чтобы увидеть, как Qвыглядит каждая итерация кода, ознакомьтесь с версией здесь .

isaacg
источник
5

GolfScript ( 26 24 байта) / CJam ( 20 18 байтов)

GolfScript:

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

Онлайн демо

CJam (та же идея, но немного другая реализация):

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

Онлайн демо

Ввод на стандартный ввод в форме [2 2 3].

Это один из тех редких случаев, когда GolfScript оператор развертывания . Это позволяет нам накапливать состояния, через которые проходит корабль, а затем подсчитывать их в конце. Обратите внимание, что подсчитываемый массив включает в себя начальное (входное) состояние, но не конечное состояние, в котором последний элемент был уменьшен до 0.

Тем не менее, хотя CJam не раскрывает свою способность равномерно перетасовывать массив всего за 2 символа, он рассчитывает на многое и позволяет ему выйти на первое место.

Питер Тейлор
источник
3

Python 3, 91 71 байт

20 (!) Байтов сохранено благодаря @xnor.

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

Рекурсивная функция вызывает себя с меньшими кусочными значениями до тех пор, пока все кусочные значения не станут равны 0 или будут отрицательными, и каждая функция возвращает возвращаемое значение своего дочернего элемента + 1, а последний вызванный возвращает 1.

randomra
источник
Вы можете проверить наличие положительного числа с помощью max(p)>0.
xnor
И отрицание условия, поскольку max(p)<1or-~f(p)позволяет избежать or 1, так как True==1.
xnor
Вы можете эффективно уменьшить случайный элемент pс shuffle(p);p[0]-=1.
xnor
@xnor Вау, спасибо! Это все здорово!
Рандомра
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)

Не особенно хорошо играли в гольф .

Попробуйте онлайн здесь

Тим
источник
Самоуничтожение комментарий
Тим