Solucionar o problema do carrinho

14

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 xpara y, para qualquer xe 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 npessoas ligadas a ela, e o carrinho as atropelar, digamos, 100 vezes, isso ainda resultará em nmortes.

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,0para 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 é , 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 .

PyRulez
fonte
4
Existem homens gordos ?
Beta Decay
2
@BetaDecay sim, mas devido a atualizações no carrinho, elas se comportam da mesma forma que as pessoas comuns para os fins desta pergunta.
PyRulez

Respostas:

6

Geléia , 27 23 bytes

ṗL$µṭ0FIm2ASµÐḟµQ⁴ySµ€Ṃ

Experimente online! (último caso de teste)

Versão Cruel (Mutilate the most people)

Recebe a entrada como números. Para o último exemplo, 1é ae 2é 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

ṗL$µṭ0FIm2ASµÐḟµQ⁴ySµ€Ṃ
ṗL$                       - on the first argument, get the Cartesian power of it to its length.
                            this gives all paths of the length of the input. Cycles are implicit
   µ        µÐḟ           - get valid paths starting with 0 -- filter by:
    ṭ0                      - prepend 0
      F                     - flatten
       I                    - get the difference between elements
        m2                  - every second difference: 0 for each edge that starts at the node the previous edge ended at, nonzero otherwise.
          AS                - 0 iff all elements are 0
               µ    µ€    - on each path:
                Q           - remove repeat edges.
                 ⁴y         - translate according to the mapping in the second program argument
                   S        - Sum
                      Ṃ   - get the minimum of these.
fireflame241
fonte
@ Shagy Umm, não sei o que você quer dizer? Jelly machuca seus olhos ou algo assim?
Erik the Outgolfer
1
@EriktheOutgolfer, ele está se referindo à versão do programa que tenta mutilar a maioria das pessoas.
fireflame241
@ Shaggy Isso seria um desafio interessante.
PyRulez
9

Python 3 , 80 bytes

y=lambda d,s=0,p=[],f=0:f in p and s or min(y(d,s+d[f][t],p+[f],t)for t in d[f])

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: {1: 0}, 1: {2: 5, 3: 1}, 2: {2: 0}, 3: {3: 0}}

0 é o nó inicial, 1 é o nó 'a', 2 é o nó 'b' etc.

RootTwo
fonte