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


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

1
Я щось пропускаю, чи не має значення, що коли частина досягає 0, її замінюють новою частиною?
xnor

@xnor Добре, що відповідь не має значення, ні (і, здається, це потрібно зробити, щоб пропустити її). Але тематично частини корабля потребують заміни: P
Geobits

Відповіді:


4

Pyth, 12 байт

f!eSXOUQQtZ1

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

Як це працює:

Це ґрунтується на нескінченному фільтрі Pyth, який тестує вираз із збільшенням входів, поки він не поверне щось правдоподібне, а потім повертає вхід, який спричинив це. Однак вираз, який буде перевірений, не використовуватиме вхідне значення.

Натомість, вираз буде змінювати список введення, зменшуючи випадковий запис. Це здійснюється за допомогою виразу XOUQQtZ. Це означає збільшити індекс OUQу списку Qна tZ. OUQє випадковим індексом в довжину Qі tZдорівнює -1. Qініціалізується до списку введення.

Після модифікації Qтаким чином, ми приймаємо його поточне значення, яке Xповертається, приймаємо його максимальний запис eSі приймаємо логічне значення не з цим значенням !. Це вперше повертає значення "truthy", коли кожен елемент елемента 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

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.


Ви можете перевірити наявність додатного числа за допомогою max(p)>0.
xnor

І заперечуючи стан як max(p)<1or-~f(p)дозволяє уникнути or 1, так як True==1.
xnor

Ви можете ефективно зменшувати випадковий елемент pз 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)

Не особливо добре гольф .

Спробуйте його онлайн тут


Коментар саморуйнування
Тім
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.