Os filósofos há muito refletem sobre o problema do carrinho . Infelizmente, nenhum humano resolveu esse problema ainda. Felizmente, como programadores, podemos usar computadores para resolver o problema para nós!
Entrada
Seu programa terá como entrada um gráfico direcionado (finito) (com no máximo uma borda de x
para y
, para qualquer x
e y
), com um nó designado e um número inteiro não negativo anexado a cada borda (representando o número de pessoas vinculadas a essa faixa) . Além disso, cada nó tem pelo menos uma borda de saída.
O carrinho inicia no nó designado. A cada turno, se o carrinho estiver no nó x
, o utilitário selecionará uma aresta (x,y)
. As pessoas nessa borda morrem e o carrinho está agora na borda y
. Esse processo continua para sempre.
Observe que as pessoas só podem morrer uma vez; portanto, se a borda (x,y)
tiver n
pessoas ligadas a ela, e o carrinho as atropelar, digamos, 100 vezes, isso ainda resultará em n
mortes.
Resultado
O utilitarista faz suas escolhas de forma a minimizar o número de pessoas que morrem (o que é garantido que é finito, pois existem apenas pessoas finitas). Seu programa produzirá esse número.
Formato de entrada
Você pode pegar o gráfico de entrada da maneira que desejar. Por exemplo, você pode tomá-lo como uma matriz e contar o nó designado como o denominado 0. Ou você pode usar algo como x1,y1,n1;x2,y2,n2;...
. Por exemplo, 0,a,0;a,b,5;a,c,1;b,b,0;c,c,0
para representar o problema do carrinho padrão (com loops no final).
Casos de teste
0,a,0;a,b,5;a,c,1;b,b,0;c,c,0
-> 1 (Vá de 0 a a, a a c (matando uma pessoa) e continue fazendo o loop do carrinho de c a c).0,0,1;0,a,5;a,a,0
-> 1 (continue de 0 a 0, atropelando uma pessoa por toda a eternidade),0,a,5;0,b,1;a,a,1;b,b,6
-> 6 (0 -> a -> a -> a -> a -> ... (observe que a solução gananciosa de ir para b estaria incorreta))0,a,1;0,b,5;a,b,1;b,a,1
-> 3 (0 -> a -> b -> a -> b -> ...)0,a,1;0,b,1;a,a,0;b,b,0
-> 1 (Observe que existem duas opções diferentes que o utilitarista pode tomar que matam apenas uma pessoa)
Isso é código-golfe , então a resposta mais curta vence! Boa sorte.
Notas: Não haverá loops de loop doentes e o desvio de faixas múltiplas é banido. Além disso, embora eu prefira pensar nesse problema em termos das três leis (s) de Asimov, Peter Taylor observou na caixa de areia que esse problema é matematicamente equivalente ao de encontrar o rho (caminho em que os loops retornam) de menor peso .
fonte
Respostas:
Geléia ,
2723 bytesExperimente online! (último caso de teste)
Versão Cruel (Mutilate the most people)
Recebe a entrada como números. Para o último exemplo,
1
éa
e2
éb
.0
é o nó inicial. O primeiro argumento é a lista de arestas (por exemplo[0,1],[0,2],[1,1],[2,2]
), e o segundo argumento é uma lista das arestas e o número de pessoas nelas (por exemplo[[0,1],[0,2],[1,1],[2,2]],[1,1,0,0]
).Como funciona
fonte
Python 3 , 80 bytes
Experimente online!
Recebe a entrada como um dicionário codificado pelo ID do nó. As entradas são um dicionário de vizinhos e o número de pessoas na trilha entre um nó e o vizinho. Por exemplo, para o primeiro caso de teste:
0 é o nó inicial, 1 é o nó 'a', 2 é o nó 'b' etc.
fonte
Perl 6 ,
9074 bytesAgradecimentos a Jo King por -16 bytes.
Porta da solução Python do RootTwo .
Experimente online!
fonte