Descrição do Problema
Todos nós amamos um Twix (porque é o melhor doce), mas este é o primeiro Halloween das crianças - precisamos pegar pelo menos um de cada tipo de doce para eles. Todo Dia das Bruxas, todos os moradores da avenida Numberline enviam um e-mail dizendo que tipos de doces eles distribuirão este ano.
Oh! E nós vivemos em um mundo 1D.
Sendo excepcionalmente preguiçosos em alguns aspectos e não em outros, fizemos um mapa das casas dando suas posições ao longo da rua. Também observamos os tipos de doces que eles têm. Aqui está o mapa que fizemos para este ano:
[(-2, {"Kisses", "KitKats"}),
(1, {"KitKats", "Peanut Butter Cups"}),
(6, {"Kisses", "Twix"}),
(9, {"Skittles"}),
(10, {"Twix"})]
Para o bem das perninhas das crianças, precisamos encontrar a caminhada mais curta, começando em qualquer casa do bairro, para reunir pelo menos um de cada tipo de doce.
Exemplos
A pedido de alguns usuários (incluindo Shaggy), apresentarei alguns exemplos trabalhados. Espero que isso esclareça as coisas. :) Entrada:
[(-2, {"Kisses", "KitKats"}),
(1, {"KitKats", "Peanut Butter Cups"}),
(6, {"Kisses", "Twix"}),
(9, {"Skittles"}),
(10, {"Twix"})]
Resultado:
[1, 2, 3]
Outro mapa e solução ...
Entrada:
[(-3, {"KitKats", "Twix"}),
(-1, {"Hundred Grands"}),
(3, {"Kisses"}),
(12, {"Hundred Grands", "Twix", "KitKats"})]
Saída :
[0, 1, 2]
Poderíamos começar na casa coordenada 9, coletando doces, nas casas 6 e 1. Isso preenche a cota de doces caminhando 8 unidades, mas é a solução mais curta?
Regras
As entradas devem receber um argumento único estruturado da mesma forma que o exemplo e gerar os índices das casas a serem visitadas na solução mais curta.
Aplicam-se regras típicas de golfe com código: a solução correta mais curta em bytes vence!
PS Esta foi uma pergunta de entrevista que me foi dada por uma das maiores empresas de tecnologia do mundo. Se você não gosta de golfe, tente encontrar uma solução de tempo O (k * n) em que k é o número de tipos de doces e n é o número de casas.
Editar
Como Jonathon Allan apontou, existe alguma confusão em torno do que "índices" significa neste caso. Queremos exibir as posições das casas na lista de argumentos e não suas coordenadas na pista.
Respostas:
Gelatina , 16 bytes
Um link monádico que aceita a entrada conforme descrito em uma lista classificada das casas mais baixas para as mais altas da Numberline Avenue (se precisarmos aceitar qualquer pedido, podemos acrescentar um
Ṣ
) que produz o caminho mais curto começando na casa com o menor número e subindo a Avenue.Experimente online!
Se quisermos encontrar todos os caminhos mais curtos, substitua os bytes à direita,,
ÞḢ
comÐṂ
; isso também é 16 bytes.Como?
fonte
Python 2 ,
133130127 bytesExperimente online!
fonte
05AB1E , 22 bytes
Supõe que os números na lista de entrada sejam classificados do menor para o maior.
Se mais de uma solução for encontrada, ela produzirá todas elas.
Experimente online.
Explicação:
fonte
Perl 6 , 70 bytes
Experimente online!
fonte
Haskell ,
343372 bytesGraças a @ ASCII-only para melhorias, há também uma variante de 271 bytes que ele propôs nos comentários :)
Experimente online!
Ungolfed
Primeira tentativa
fonte
Solução de tempo O (k * n), com espaço O (k * n)
Seja a posição da ésima casa (onde e são classificados) e seja a lista de doces oferecidos pela ésima casa.xi i 0≤i<n xi ci i
Observe que, se temos um caminho de casa para que recebe todos os tipos de doces, em seguida, para todos , há um tal caminho de para onde .i1 j1 i0<i1 i0 j0 i0≤j0
Assim, nosso algoritmo é:
A construção de leva tempo para cada elemento, ou tempo (e espaço) total. O loop externo para calcular a melhor distância é executado vezes. O loop interno pode executar até vezes em uma iteração, mas o corpo é executado no máximo vezes; portanto, a condição é verificada vezes; assim, o loop interno é responsável por um tempo total de . O restante do corpo do loop externo também leva tempo . Portanto, nosso algoritmo ocupa tempo e espaço.A O(k) O(nk) n n n O(n) O(nk) O(k) O(nk)
fonte