Problema
Imagine 7 baldes alinhados em uma fileira. Cada balde pode conter no máximo 2 maçãs. Existem 13 maçãs rotuladas de 1 a 13. Elas são distribuídas entre os 7 baldes. Por exemplo,
{5,4}, {8,10}, {2,9}, {13,3}, {11,7}, {6,0}, {12,1}
Onde 0 representa o espaço vazio. A ordem em que as maçãs aparecem em cada balde não é relevante (por exemplo, {5,4} é equivalente a {4,5}).
Você pode mover qualquer maçã de um balde para um balde adjacente, desde que haja espaço no balde de destino para outra maçã. Cada movimento é descrito pelo número da maçã que você deseja mover (o que não é ambíguo porque existe apenas um espaço vazio). Por exemplo, aplicando a movimentação
7
acordo acima resultaria em
{5,4}, {8,10}, {2,9}, {13,3}, {11,0}, {6,7}, {12,1}
Objetivo
Escreva um programa que leia um arranjo do STDIN e o classifique no seguinte arranjo
{1,2}, {3,4}, {5,6}, {7,8}, {9,10}, {11,12}, {13,0}
usando o mínimo de movimentos possível. Novamente, a ordem em que as maçãs aparecem em cada balde não é relevante. A ordem dos baldes é importante. Ele deve gerar os movimentos usados para classificar cada arranjo separado por vírgulas. Por exemplo,
13, 7, 6, ...
Sua pontuação é igual à soma do número de movimentos necessários para resolver os seguintes arranjos:
{8, 2}, {11, 13}, {3, 12}, {6, 10}, {4, 0}, {1, 7}, {9, 5}
{3, 1}, {6, 9}, {7, 8}, {2, 11}, {10, 5}, {13, 4}, {12, 0}
{0, 2}, {4, 13}, {1, 10}, {11, 6}, {7, 12}, {8, 5}, {9, 3}
{6, 9}, {2, 10}, {7, 4}, {1, 8}, {12, 0}, {5, 11}, {3, 13}
{4, 5}, {10, 3}, {6, 9}, {8, 13}, {0, 2}, {1, 7}, {12, 11}
{4, 2}, {10, 5}, {0, 7}, {9, 8}, {3, 13}, {1, 11}, {6, 12}
{9, 3}, {5, 4}, {0, 6}, {1, 7}, {12, 11}, {10, 2}, {8, 13}
{3, 4}, {10, 9}, {8, 12}, {2, 6}, {5, 1}, {11, 13}, {7, 0}
{10, 0}, {12, 2}, {3, 5}, {9, 11}, {1, 13}, {4, 8}, {7, 6}
{6, 1}, {3, 5}, {11, 12}, {2, 10}, {7, 4}, {13, 8}, {0, 9}
Sim, cada um desses arranjos tem uma solução.
Regras
- Sua solução deve ser executada em tempo polinomial no número de buckets por movimentação. O objetivo é usar heurísticas inteligentes.
- Todos os algoritmos devem ser determinísticos.
- Em caso de empate, a menor contagem de bytes vence.
fonte
Respostas:
Pontuação: 448
Minha idéia é classificá-los consecutivamente, começando com 1. Isso nos dá a propriedade agradável de que, quando queremos mover o espaço para a cesta anterior / seguinte, sabemos exatamente qual das duas maçãs que temos para mover - o valor máximo / min um, respectivamente. Aqui está o detalhamento do teste:
O código pode ser jogado muito mais, mas uma melhor qualidade do código motivará respostas adicionais.
C ++ (501 bytes)
Melhorias adicionais podem estar mudando para C e tentando diminuir a pontuação, começando dos grandes valores para baixo (e eventualmente combinando as duas soluções).
fonte
C,
426448Isso classifica as maçãs uma de cada vez, de 1 a 13, semelhante ao método yasen , exceto quando houver a oportunidade de mover um número maior para cima ou para um número menor, será necessário.
Infelizmente, isso apenas melhora o desempenho no primeiro problema de teste, mas é uma pequena melhoria.Cometi um erro ao executar os problemas de teste. Parece que simplesmente reimplementei o método yasen.É necessário entrada sem chaves ou vírgulas, por exemplo
Aqui está o código do golfe entrando em 423 bytes, contando algumas linhas desnecessárias (provavelmente poderia ser mais jogado, mas espero que essa pontuação seja superada):
E o código não jogado, que também imprime a pontuação:
fonte
Python 3-121
Isso implementa uma pesquisa profunda com profundidade crescente até encontrar uma solução. Ele usa um dicionário para armazenar estados visitados, para que não os visite novamente, a menos que com uma janela de maior profundidade. Ao decidir quais estados verificar, ele usa o número de elementos extraviados como uma heurística e visita apenas os melhores estados possíveis. Observe que, como a ordem dos elementos em seu bucket não importa, ele sempre mantém uma ordem dentro dos buckets. Isso facilita verificar se um elemento está extraviado.
A entrada é uma matriz de entradas, com o primeiro int sendo o número de buckets.
Por exemplo, para o número 8 (este demora muito tempo para ser executado na minha máquina, os outros terminam em segundos):
Aqui estão os resultados do conjunto de testes: # 1: 12, # 2: 12, # 3: 12, # 4: 12, # 5: 11, # 6: 11, # 7: 10, # 8: 14, # 9: 13, # 10: 14
Aqui está o código:
fonte