Desafio do Advento 2: A invasão atual do cofre!


9

<< Anterior Próximo >>

Desafio

Agora que Papai Noel finalmente descobriu como entrar em seu cofre atual, ele percebe que de alguma forma os elfos chegaram lá antes dele e roubaram alguns de seus presentes! Eles ainda não descobriram como deixar o cofre, então o Papai Noel precisa tentar pegá-los todos. Papai Noel e os elfos têm energia infinita para percorrer, mas infelizmente os elfos têm uma infinidade de energia mais alta; portanto, se eles acabarem rodando em loops em todos os lugares, os elfos se libertarão.

Dado um gráfico de nnós e earestas com uma caminhada existente entre dois nós e as posições dos elfos e do Papai Noel, determine quantos elfos o Papai Noel pode pegar antes que ele se canse.

A perseguição é baseada em turnos. A cada ciclo, os elfos primeiro se movem simultaneamente (eles podem se mover entre si e no mesmo nó) e, em seguida, o Papai Noel se move. Se o Papai Noel se mover para o mesmo nó que um elfo, ele o pegou. Cada elfo pode mover-se apenas de um nó para seu vizinho em uma etapa. O mesmo vale para o Papai Noel no começo, mas para cada elfo que ele pegou, o Papai Noel pode dar um passo extra. Portanto, se o Papai Noel pegou um elfo, ele pode passar de um nó para o vizinho do vizinho. Isso significa que ele poderia passar para um nó e depois voltar. No entanto, como o Papai Noel está correndo rápido demais durante esse período, ele não pegará nenhum elfo que passe nas etapas intermediárias (portanto, se ele estiver em A, A estiver conectado a B, B estiver conectado a C, haverá um elfo B, e Santa se move de A -> B -> C, o elfo ainda não foi pego). No entanto, o Papai Noel não precisa dar muitos passos ao mesmo tempo; ele se move até 1 + (número de elfos capturados) a cada turno.

Observe que todos os elfos devem se mover a cada turno e, se um elfo se mover para o nó do Papai Noel, eles serão pegos.

Todas as entidades (elfos, Papai Noel) estarão em nós distintos no começo.

Especificações e Regras

Teoricamente, seu programa deve funcionar com entradas de qualquer tamanho. A entrada será dada como um gráfico, as posições dos elfos e a posição do Papai Noel. Você pode tomar o gráfico em qualquer formato razoável (lista de nós + lista de arestas, lista de arestas, matriz de adjacência, notação de ciclo, etc.) e pode assumir as posições em qualquer formato razoável que funcione com o formato de entrada do gráfico (índice na lista de nós, etc.). A saída deve ser um número inteiro positivo único, indicando o número máximo de duendes que o Papai Noel pode pegar.

Casos de teste

Eles são fornecidos como listas de arestas e números de nós para posições.

Input -> Output
[(0, 1), (1, 2)], [0, 2], 1 -> 2 # Easy win for Santa, the elves get themselves caught :P
[(0, 1), (1, 2), (2, 3), (3, 0)], [0, 1], 2 -> 2 # The elf opposite of Santa cannot escape but the other one can always just run away each turn, until Santa catches the first elf. Then he can easily just catch the rest.
[(0, 1), (1, 2), (2, 3), (3, 0)], [1], 0 -> 0 # Santa will never catch up
[(0, 1), (1, 2), (2, 3), (3, 0), (1, 4), (4, 5), ..., (10, 11), (11, 3)], [2, 6], 0 -> 2 # The first elf moves to either 1 or 3 and then gets caught. Then, Santa can use his 2-step move to catch up to the second elf no matter what.

Eu acho que o Papai Noel pode pegar tanto há elfos ou todos os elfos, por isso, este desafio pode ser apenas "ele pode pegar um elfo" dica dica

Regras

  • As brechas padrão se aplicam
  • Esse é um desafio do , portanto, a resposta mais curta em bytes vence
  • Nenhuma resposta será aceita

Golfe feliz!

Nota: Eu me inspirei para esta série de desafios da Advent Of Code . Não tenho afiliação com este site

Você pode ver uma lista de todos os desafios da série consultando a seção 'Vinculado' do primeiro desafio aqui .


11
Eu gostaria de saber que os elfos do Papai Noel eram tão maus antes ...
Sr. Xcoder 02/12/19

A abordagem para resolver isso provavelmente seria: 1Prove algumas afirmações matemáticas. 2Poste uma resposta de geléia (/ ...) em menos de 10 bytes.
user202729

Bem, é possível que o Papai Noel consiga pegar alguns, mas não todos os duendes (é possível que alguns duendes iniciem na posição do Papai Noel; e é possível que os elfos deixem voluntariamente o Papai Noel pegá-los?)
user202729

Edit: Não para a primeira pergunta, mas provavelmente para a segunda pergunta.
precisa saber é o seguinte

3
@ user202729 Observe que o Papai Noel não precisa mover três espaços; ele pode se mover de 1 a 3 espaços. Essa pode ser a fonte de confusão aqui.
HyperNeutrino

Respostas:


1

Wolfram Language (Mathematica) , 129 bytes

Block[{a=#},Clear@f;s_~f~e_:=If[s==e,1,s~f~e=0;s~f~e=Min[(hMax[#~f~h&/@a@s,Boole[h==s]])/@a@e]];Tr[Max[(e#3~f~e)/@#2]^#2]]&

Experimente online!

Abordagem semelhante à minha resposta a esta pergunta .

A função recebe 3 argumentos como entrada: lista de adjacências representada como uma associação ( ferramenta para gerar lista de adjacências a partir da lista de arestas ), posição dos elfos e posição de santa.

Observe que Clear[f]é necessário, porque os envios de funções devem ser reutilizáveis.

O código abaixo é um código não destruído com explicação parcial. Mais explicações depois.

reverseBoole = # != 0 &

(* Or@@{a, b} === reverseBoole[booleOr[Boole[{a, b}]]] *)
booleOr = Max

booleAnd = Min

(* Boole@f[s, e] = Santa can catch Elf ? *)

mainfunc = Block[{adjlist = #},
  Clear[f];
  f[s_, e_] := If[ s == e, f[s, e] = 1,
    f[s, e] = Boole[False];
    f[s, e] = booleAnd[
      (e1  booleOr[
        ( s1  f[s1, e1] ) /@ adjlist[s],
        Boole[e1 == s]
      ]) /@ adjlist[e]
    ]
  ];
  If [ 0 == booleOr[ ( e  f[#3, e] ) /@ #2 ] , 0, Length[#2] ]
]&

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.