Sua tarefa é escrever um programa que, na entrada n, produz a expressão mínima de cada número 1 a n em ordem. O programa mais curto em bytes vence.
Uma expressão mínima combina 1's com adição e multiplicação para resultar no número especificado, usando o menor número possível de 1s. Por exemplo, 23
é expresso como 23=((1+1+1)(1+1)+1)(1+1+1)+1+1
onze, o que é mínimo.
Requisitos:
- O programa deve ter como entrada um número natural positivo n.
- A saída deve estar neste formato:
20 = ((1+1+1)(1+1+1)+1)(1+1)
- Sua saída pode não ter parênteses desnecessários, como
8 = ((1+1)(1+1))(1+1)
. - O sinal de multiplicação
*
é opcional. - Os espaços são opcionais.
- Você não precisa emitir todas as equações possíveis para um determinado valor: por exemplo, você tem a opção de emitir
4=1+1+1+1
ou4=(1+1)(1+1)
. Você não precisa produzir os dois. - O programa mais curto (em bytes) em cada idioma vence.
1 = 1 2 = 1 + 1 3 = 1 + 1 + 1 4 = 1 + 1 + 1 + 1 5 = 1 + 1 + 1 + 1 + 1 6 = (1 + 1 + 1) (1 + 1) 7 = (1 + 1 + 1) (1 + 1) +1 8 = (1 + 1 + 1 + 1) (1 + 1) 9 = (1 + 1 + 1) (1 + 1 + 1) 10 = (1 + 1 + 1) (1 + 1 + 1) +1 11 = (1 + 1 + 1) (1 + 1 + 1) + 1 + 1 12 = (1 + 1 + 1) (1 + 1) (1 + 1) 13 = (1 + 1 + 1) (1 + 1) (1 + 1) +1 14 = ((1 + 1 + 1) (1 + 1) +1) (1 + 1) 15 = (1 + 1 + 1 + 1 + 1) (1 + 1 + 1) 16 = (1 + 1 + 1 + 1) (1 + 1) (1 + 1) 17 = (1 + 1 + 1 + 1) (1 + 1) (1 + 1) +1 18 = (1 + 1 + 1) (1 + 1 + 1) (1 + 1) 19 = (1 + 1 + 1) (1 + 1 + 1) (1 + 1) +1 20 = ((1 + 1 + 1) (1 + 1 + 1) +1) (1 + 1)
Aqui estão mais alguns casos de teste: (lembre-se de que outras expressões com o mesmo número de 1s também são permitidas)
157=((1+1+1)(1+1)(1+1)+1)(1+1+1)(1+1)(1+1)+1
444=((1+1+1)(1+1+1)(1+1)(1+1)+1)(1+1+1)(1+1)(1+1)
1223=((1+1+1)(1+1+1)(1+1+1)(1+1+1)(1+1+1)+1)(1+1+1+1+1)+1+1+1
15535=((((1+1+1)(1+1+1)(1+1+1)(1+1+1)+1)((1+1+1)(1+1)+1)+1)(1+1+1)+1)(1+1+1)(1+1+1)+1
45197=((((1+1+1)(1+1)(1+1)(1+1)+1)(1+1+1+1+1)(1+1)+1)(1+1+1)(1+1)(1+1)+1)(1+1+1+1+1)(1+1+1)+1+1
Boa sorte! - A tartaruga 🐢
code-golf
math
arithmetic
A tartaruga
fonte
fonte
n=20
) e 2) você diz no início que a complexidade inteira, que é distinta da equação, deve ser exibida, mas você não inclui isso em qualquer um dos exemplos, exceto o primeiro.Respostas:
Pitão, 60 bytes
Demonstração
O compilador on-line pode chegar a 1223 antes do tempo limite, graças à memorização automática de funções do Pyth.
Em nota abreviada,
Isso usa uma função recursiva
'
, que calcula todos os produtos e somas possíveis que poderiam dar a saída desejada, encontra a menor string com cada operação final, depois as compara por1
contagem e retorna a primeira.Ele usa uma função auxiliar,
y
, que entre parênteses uma expressão apenas se precisar ser entre parênteses.Off-line, estou executando o programa com a entrada
15535
e está quase completo. Os resultados são impressos de forma incremental, facilitando a visualização do progresso.Linhas finais da saída:
Em notação abreviada,
fonte
CJam,
1051029896 bytesExperimente on-line no intérprete CJam .
Execução de teste
O intérprete online é muito lento para os casos de teste maiores. Mesmo com o interpretador Java, os casos de teste maiores levarão muito tempo e exigirão uma quantidade significativa de memória.
Com tempo suficiente, produziria essas soluções para os próximos casos de teste:
fonte
Julia, 229 bytes
Isso é realmente muito rápido. Atribuir
f
e executar a função@time f(15535)
fornece a saída (apenas duas últimas linhas)e para
@time f(45197)
, dáEntão, o que o código está fazendo? Simples -
C
mantém o número atualC
do número,K
é uma matriz de indicadores que controla se a expressão é, fundamentalmente, uma soma ou um produto, com o objetivo de lidar com bracketing, eE
mantém aE
própria expressão. Trabalhando desde o inícios=1
atén
, o código procura a representação mínima do números
em termos de valores mais baixos, procurando uma soma ou um produto. Se for um produto, ele verifica os dois componentes e coloca colchetes em torno deles, se forem somas. Essa verificação é feita na funçãoF
, para salvar bytes (porque deve ser feita duas vezes, para os dois fatores).fonte