Você recebe vários pesos e sua tarefa é construir um pequeno celular balanceado usando esses pesos.
A entrada é uma lista de pesos inteiros no intervalo de 1 a 9, inclusive. Pode haver duplicatas.
A saída é uma imagem ascii de um celular que, quando pendurado, seria equilibrado. Talvez seja melhor mostrado pelo exemplo:
entrada
3 8 9 7 5
saída possível
|
+-----+---------+
| |
+--+-+ +----+------+
| | | |
8 ++--+ 7 5
| |
9 3
Você deve usar os caracteres ascii, como mostrado. Os segmentos horizontais e verticais podem ter qualquer comprimento. Nenhuma parte do celular pode tocar (horizontal ou verticalmente) outra parte não conectada do celular. Todos os pesos devem ser pendurados em um segmento vertical de comprimento pelo menos 1 e deve haver um segmento vertical no qual todo o móvel está pendurado.
O tamanho de um celular é o número total de +
, -
e |
caracteres necessários para construí-lo. Tamanhos mais baixos são melhores.
Você pode colocar quantas conexões desejar em um segmento. Por exemplo:
entrada
2 3 3 5 3 9
saída possível
|
+---+---+-----------+
| | |
+--+-+ 5 9
| | |
2 | 3
|
+++
| |
3 3
O programa vencedor é aquele que pode gerar a menor média de tamanhos de celular para um conjunto de entradas de teste. O teste real é super secreto para impedir a codificação, mas será algo como isto:
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7
1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 7 7
3 4 4 4 4 5 5 5 5 6 6 6 6 7 7 7 7
fonte
total_weight_hung_from_point * distance_of_point_from_pivot
deve ser a mesma nos dois lados do ponto de articulação.Respostas:
Python 2.
Estou trapaceando um
pouco:Construo apenas celulares com uma horizontal.
Tenho a sensação (mas ainda não o provei) de que o celular ideal sob as condições especificadas na verdade sempre tem apenas uma horizontal.Editar: nem sempre é verdade; com o2 2 9 1
Nabb encontrou um contra-exemplo nos comentários abaixo:Eu apenas faço força bruta estúpida:
Meus resultados para suas entradas de amostra; cada um foi executado por 5 segundos (sei que isso é ridículo para os pequenos - apenas passar por todas as permutações possíveis seria mais rápido). Observe que, como existe um elemento aleatório, as execuções subsequentes podem encontrar resultados melhores ou piores.
O código (detalhado, como esse não é um código de golfe):
fonte
1 9 2 8
isso gera1-------8+-9--2
; Do alto da minha cabeça, não consigo pensar em nada melhor (mas não confiaria nisso) - você tem alguma coisa?2 2 9 1
ou seja, (2 + 2) * 3 = 9 + 1 * 3 para 16, em vez de2-9+--2----1
18. Acho que há um limite (talvez 5 ou 6 ) após o qual uma única linha horizontal é sempre ideal.2-2-+9-1
balanças, com uma pontuação de 13(4*2+2*2 = 9*1+1*3)
. Portanto, não acho que esse seja um bom contra-exemplo.Bem, essa é uma pergunta antiga, mas acabei de vê-la na guia de perguntas principais, então aqui está minha solução (ideal):
Ao olhar para as regras, tenho certeza de que não é trapaça, embora pareça que é. Isso produzirá apenas todos os números fornecidos em uma cadeia vertical, por um custo total de 2 * número_de_inputs (que é o mínimo possível porque cada número deve ter uma barra acima dela, independentemente do layout). Aqui está um exemplo:
Produz:
O que obviamente está em perfeito equilíbrio.
Inicialmente, eu tentaria algo mais no espírito desse desafio, mas rapidamente percebi que ele simplesmente otimizava essa estrutura de qualquer maneira
fonte
|
à parte inferior de um peso.Aqui está uma solução que força bruta a menor solução de fileira única. O código itera todas as permutações e calcula o centro de massa de cada uma. Se o centro de massa possui coordenadas inteiras, encontramos uma solução.
Após todas as permutações terem sido tentadas, adicionamos um segmento à mistura (equivalente a um peso de massa 0) em nosso conjunto atual de pesos e tentamos novamente.
Para executar o programa, faça
python balance.py 1 2 2 4
.que produz as melhores soluções:
fonte
Python 3
Isso não é pior que 1 a mais do que o ideal em qualquer um dos casos de teste, acredito, e o faz em 5 segundos.
Basicamente, eu uso uma abordagem de barra única. Ordeno a entrada aleatoriamente e insiro os pesos na barra, um de cada vez. Cada elemento é colocado na posição que minimiza o excesso de peso de ambos os lados, ou a segunda melhor posição dessa perspectiva, usando os primeiros 75% do tempo e os últimos 25% do tempo. Depois, verifico se o celular está equilibrado no final e é melhor que o melhor celular encontrado até agora. Eu guardo o melhor, então paro e imprimo após 5 segundos de pesquisa.
Resultados, em execuções de 5 segundos:
Código:
A única dessas soluções que acredito ser subótima é a mais longa, que possui essa solução, que encontrei após 10 minutos de execução:
fonte