Esta questão se origina neste tópico do reddit pelo usuário do reddit taho_teg, mas é expandido para um 'quebra-cabeça' mais geral.
Você tem uma centrífuga com 24 furos para os frascos distribuídos uniformemente em um círculo ao redor do eixo central. Se você já possui vários frascos e deseja iniciar a centrífuga, verifique se eles são colocados de maneira equilibrada. Os únicos números de frascos que você não pode equilibrar são 1 e 23. Você pode, por exemplo, equilibrar 4, obviamente, mas também pode equilibrar 5 criando um 'triângulo' com 3 frascos e colocando os outros dois em dois locais opostos.
Objetivo
Você precisa escrever um programa que aceite o número de furos (que são distribuídos uniformemente em um círculo ao redor do eixo rotativo) da sua centrífuga como entrada e que produz uma lista de números de frascos que não podem ser balanceados na centrífuga.
Você precisa fazer o cálculo e não pode simplesmente codificar as soluções pré-computadas.
A entrada e a saída devem ser implementadas de forma que o código do programa não precise ser alterado para chamar o programa para entradas diferentes. Também é aceitável escrever uma função (ou uma construção semelhante no seu idioma) que possa ser chamada através de um console.
Lembre-se também de que, se você tiver 6 furos na centrífuga, poderá centrifugar 2 e 3 frascos, mas não poderá equilibrar 5, pois o 'triângulo' e os dois opostos se sobrepõem em um ponto. Outro exemplo seria: n = 15, você não pode equilibrar 11 frascos, você pode equilibrar 6 e 5 frascos, mas a combinação dessas soluções se sobreporá (é claro que esse ainda não é o critério de que é impossível fazê-lo).
Atualizar
Parece que algumas pessoas não entenderam o exemplo dado, então fiz um gráfico aqui. POR FAVOR, escreva uma breve descrição de como seu algoritmo funciona, bem como alguns exemplos de saídas para verificação. Inclua os seguintes exemplos:
n = 1, 6, 10, 24, 63, 100 = 10^2, 163 (prime), 40320 = 8!, 65536=2^2^2^2^2, 105953 (prime)
Observe que 40320 e 65536 produzirão listas enormes; talvez seja uma boa idéia indicar apenas o tamanho dessas listas.
Se você conhece alguns números interessantes para adicionar a essa lista, entre em contato! O algoritmo deve funcionar pelo menos até n = 1'000'000.
Exemplo de saídas:
Estes são alguns exemplos de resultados - mas talvez com defeito, porque eu apenas os calculei manualmente.
1: 1
2: 1
3: 1,2
4: 1,3
5: 1,2,3,4
6: 1,5
7: 1,2,3,4,5,6
8: 1,3,5,7
9: 1,2,4,5,7,8
10:1,3,7,9
11:1,2,3,4,5,6,7,8,9,10
12:1,11
13:1,2,3,4,5,6,7,8,9,10,11,12
14:1,3,5,9,11,13
15:1,2,4,7,8,11,13,14
Sugestão
Se você tiver uma centrífuga com n buracos, e você não pode equilibrar por exemplo, 6 frascos, você também não será capaz de blance n-6 frascos - é basicamente a mesma tarefa de equilíbrio m frascos em uma centrífuga vazio ou para equilibrar uma centrífuga preenchido tirando m frascos. Então, se você tiver o número m na sua lista, também precisará incluir nm .
7 spoke wheel
e dê uma olhada.Respostas:
Sábio -
102104/115Por que usar a teoria dos números, quando há força bruta?
Para um determinado número de frascos, isso abrange todas as maneiras de posicionar os frascos e calcula seu centro de massa usando aritmética complexa. Se o centro de massa for zero para nenhuma dessas maneiras, o número será retornado.
Infelizmente, isso não funciona em certos casos (10,14), porque o Sage falha ao simplificar algumas expressões para zero (o que pode estar relacionado a esse bug ). Pode-se considerar isso uma falha do intérprete e não do programa e ainda assim dizer que o algoritmo e o programa estão corretos.
A alternativa de 113 caracteres a seguir depende de flutuadores em vez de símbolos e não sofre desses problemas:
Teste a saída da versão de 113 caracteres (
for n in range(14): print n,v(n)
):Eu não queria esperar o tempo de execução mais alto
n
.Isso se origina da seguinte solução Python. Aritmética exata e não ter que importar alguns módulos é algo bastante.
Python -
173 154156Saída de teste desta variante (
for n in range(24): print n,v(n)
):Eu não queria esperar o tempo de execução mais alto
n
.fonte
Lua - 197
Um método de força não bruta, cria uma lista de fatores e os exclui. Ele também exclui números que podem ser obtidos com a adição desses fatores, desde que o maior fator usado seja menor que a quantidade de furos não preenchidos. Um é sempre impresso e não é usado no algoritmo.
Exemplo de saída: (algumas colocam como intervalos, para não exceder o limite de caracteres)
fonte
Pitão -
3937 bytesUma tradução direta da resposta python do @ Wrzlprmft.
Explicação e provavelmente mais golfe em breve.
Experimente online aqui .
fonte