O novo navio de Teseu

9

O navio de Teseu é uma pergunta antiga que é algo como:

Se um navio teve todas as suas peças originais substituídas, ainda é o mesmo navio?

Para esse golfe, vamos substituir lentamente "peças" em um "navio" e ver quanto tempo leva para obter um navio totalmente novo.

Tarefa

Um navio é composto por pelo menos duas partes. As partes são fornecidas como uma matriz de números inteiros positivos (diferentes de zero), representando a condição da parte.

Em cada ciclo, escolha aleatoriamente uma parte da lista de maneira uniforme. A condição dessa parte será reduzida em um. Quando a condição de uma peça chega a zero, ela é substituída por uma nova peça. A nova peça começa com o mesmo valor de condição que o original.

No primeiro ciclo em que todas as peças foram substituídas (pelo menos) uma vez, pare e produza o número de ciclos necessários.

Por exemplo (suponha que eu esteja escolhendo partes aleatoriamente aqui):

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

A saída para este exemplo seria 8, pois foram necessários oito ciclos para que todas as peças fossem substituídas. A saída exata deve diferir para cada execução.

I / O

A única entrada é a lista / matriz de números inteiros para a condição da peça. A única saída é um número de ciclos. Você pode aceitar / fornecer esses valores de qualquer uma das formas usuais: STDIO, argumentos / retornos de funções, etc.

Casos de teste

Como a saída não é fixa, você pode usar o que quiser testar, mas eis alguns para fins de padronização:

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
fonte
11
Estou faltando alguma coisa ou não importa que, quando uma peça chega a 0, ela é substituída por uma nova?
Xnor
@ xnor Bem, não importa obter a resposta, não (e parece ser a coisa a fazer para ignorá-la). Mas , tematicamente , as peças do navio precisam ser substituídas: P
Geobits

Respostas:

4

Pitão, 12 bytes

f!eSXOUQQtZ1

Demonstração.

Como funciona:

Isso se baseia no filtro infinito de Pyth, que testa uma expressão com entradas crescentes até que retorne algo verdadeiro e, em seguida, retorna a entrada que causou isso. No entanto, a expressão que será testada não usará o valor de entrada.

Em vez disso, a expressão modificará a lista de entrada decrementando uma entrada aleatória. Isto é conseguido através da expressão XOUQQtZ. Isso significa aumentar o índice OUQna lista Qem tZ. OUQé um índice aleatório no comprimento de Qe tZé -1. Qé inicializado na lista de entrada.

Depois de modificar Qdesta forma, tomamos seu valor atual, que Xretorna, tome a sua entrada máxima com eS, e tomar a lógica não desse valor com !. Isso retorna um valor verdadeiro pela primeira vez quando todos os elementos de Qforam reduzidos para 0ou abaixo pela primeira vez.

Para garantir que o número retornado seja exatamente o número de vezes que Qfoi modificado, iniciaremos a contagem em 1, indicando a primeira vez que isso é chamado, houve 1 modificação. Para ver como é a Qaparência de cada iteração do código, confira a versão aqui .

isaacg
fonte
5

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

GolfScript:

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

Demonstração online

CJam (mesma ideia, mas implementação ligeiramente diferente):

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

Demonstração online

A entrada está em stdin no formulário [2 2 3].

Essa é uma daquelas raras ocasiões em que o operador de desdobramento do GolfScript é útil. Isso nos permite acumular os estados pelos quais o navio passa e depois contá-los no final. Observe que a matriz contada inclui o estado inicial (entrada), mas não o estado final no qual o último elemento foi reduzido para 0.

No entanto, embora CJam não tem desdobrar sua capacidade de embaralhar um array de maneira uniforme por apenas 2 chars conta muito e lhe permite sair por cima.

Peter Taylor
fonte
3

Python 3, 91 71 bytes

20 (!) Bytes salvos graças ao @xnor.

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

Função recursiva que se chama com valores de peça menores até que todos os valores de peça sejam 0 ou negativos e cada função retorne o valor de retorno de seu filho + 1 e o último chamado retornará 1.

randomra
fonte
Você pode verificar a presença de um número positivo com max(p)>0.
Xnor
E negar a condição como max(p)<1or-~f(p)permite evitar o or 1, desde True==1.
Xnor
Você pode efetivamente diminuir um elemento aleatório de pwith shuffle(p);p[0]-=1.
Xnor
@xnor Uau, obrigado! Tudo isso é ótimo!
randomra
1

Python 3, 175 bytes

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)

Não é especialmente bem jogado .

Experimente online aqui

Tim
fonte
Comentário de Auto-destruição
Tim