Eu trabalho em uma padaria que serve pão de trigo, centeio, cevada, grãos e francês, mas o padeiro é um pouco estranho - ele empilha os pães em ordem aleatória e, às vezes, deixa algumas prateleiras vazias no final.
Todos os dias, o mesmo cliente entra e pede um pedaço de pão, mas o mais complicado é que ele é um germofóbico; portanto, quando encho sua bolsa, não posso pegar pães de duas prateleiras adjacentes em seleções consecutivas.
Leva um segundo para caminhar entre as prateleiras adjacentes. É uma loja movimentada; para qualquer configuração aleatória de pães, eu gostaria de minimizar o tempo necessário para obter um de cada pão único. Eu posso começar e terminar em qualquer prateleira.
Se a ordem de hoje for W B W G F R W
, um caminho possível é 0, 3, 5, 1, 4
, por um total de 12 segundos:abs(3-0) + abs(5-3) + abs(1-5) + abs(4-1) = 12
( 1, 2, 3, 4, 5
não funciona, porque o pão é colhido consecutivamente das prateleiras adjacentes.)
Se for B W B G B F B R B W B F
, um caminho possível é 1, 3, 5, 7, 10
, por um total de 9 segundos.
O gerente sempre se assegura de que haja uma solução possível, então não preciso me preocupar em capturar informações incorretas. Ele geralmente me envia o pedido em um arquivo, mas se eu quiser, posso digitá-lo em STDIN ou lê-lo de uma maneira diferente. Eu gostaria que o programa imprimisse os índices do melhor caminho, bem como seu tempo, de acordo com as regras de E / S padrão .
Em resumo:
- 5 tipos de pão.
- Os pedidos de pão aparecem como cadeias de ordem e comprimento aleatórios.
- É necessário selecionar um de cada pão exclusivo.
- Não é possível fazer seleções consecutivas adjacentes.
- Minimize a distância entre os índices de seleção.
- Não precisa se preocupar com entradas inválidas.
- Aplicam- se as regras de E / S padrão .
Isso é código-golfe , a menor contagem de bytes vence.
0+3+5+1+4=13
mas1+3+5+7+10=26
, não9
.'WBWG FRW'
uma entrada válida também?Respostas:
JavaScript (ES6), 114 bytes
Guardado 1 byte graças a @Oliver
Recebe a entrada como uma matriz de caracteres. Gera uma sequência separada por vírgula, em que o primeiro valor é o tempo total e os próximos descrevem o caminho.
Experimente online!
Comentado
fonte
Python 2 ,
212210 bytesExperimente online!
2 bytes thx para Jonathan Frech .
fonte
if len(...)==5and all(...)
pode serif(len(...)==5)&all(...)
para salvar dois bytes.