Um número de Friedman é um número que pode ser expresso aplicando operações matemáticas básicas (^, /, *, +, -) a todos os seus dígitos. As operações não precisam ser aplicadas a cada dígito individual, mas todos os dígitos devem estar envolvidos. Ou seja, 121 = 11 ^ 2 -> todos os dígitos estão envolvidos, mas 1 e 1 foram agrupados para formar 11.
O uso de parênteses é permitido, mas a solução trivial x= (x)
não é uma solução válida. Também não é válido x= +x
,.
- 25 = 5 ^ 2
- 121 = 11 ^ 2
- 343 = (3 + 4) ^ 3
- 2048 = (8 ^ 4) / 2 + 0
Escreva um programa que receba dois números inteiros positivos e imprima o número de números de Friedman nesse intervalo (inclusive) e os números com as expressões nas linhas subseqüentes.
Entrada -
n m | n, m integers, n>=0, m>n
Resultado -
count | number of Friedman numbers in the given range
fn1 exp1 | Friedman number, expression
fn2 exp2
fn3 exp3
.
.
.
O código mais curto publicado no domingo, 29 de julho, 00:00 Hrs GMT, será o vencedor.
/
funciona? Por exemplo, o que é1/3
?-5
?Respostas:
Ruby,
456 438 408 390 370 349 344334 [fixo]Resultado:
Também funciona relativamente rápido para números maiores:
fonte
5 40
e conseguimos o resultado:[11, "11**1", 21, "21**1", 31, "31**1", 41, "41**1"]
. Nenhum sinal de25
lá e eu acho que a solução correta (por exemplo, para21
) é2*1
, não21**1
'+-*/'.chars.to_a+['','**']
com["+","-","*","/","","**"]
Python 2.7 -
380 378 372 371 367 363 357 354 352 348336 caracteresApenas uma simples pesquisa de força bruta.
Exemplo de execução:
Explicação:
s(x)
é uma função que pega uma sequência que contém uma sequência de dígitos e retorna todas as expressões usando esses dígitos nessa ordem.[x]['1'>x>'0':]
avalia para uma lista que contém x se x é '0' ou uma sequência de dígitos que não começa com '0'; caso contrário, ele será avaliado como uma lista vazia. Basicamente, isso lida com o caso em que uno todos os dígitos.['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
basicamente divide as partições x em duas partes (ambas com comprimento diferente de zero), chama s () em cada parte e junta todos os resultados com algum operador entre elas, usando product ().E(e)
é basicamente uma avaliação segura. Retorna o valor de e se e for válido e None caso contrário.Basicamente, esse código tenta todos os números no intervalo, permite seus dígitos e testa cada expressão que s () gera para essa permutação, ignorando a primeira expressão se x não começar com '0', porque se x não começar com ' 0 ', então a primeira expressão será apenas x.
Versão alternativa - 397 caracteres
Aqui está o meu código se você precisar usar frações:
fonte
if len(x)<2
que nunca será verdade em funçãos
. Além disso, você pode substituir o seuformat
com"a[Fraction(%s)%s%s]='(%s%s%s)'"%(x[:i],o,v,x[:i],o,A)
para salvar 4 caracteres.except:0
inteligente .. muito inteligente. Vou lembrarPython3
(436)(434)(443)Foi difícil. Posso poupar alguns caracteres se tornar a saída mais nativa.
Resultado
fonte
"("+i+c+j+")"
e substituindolen(n)>1
por1<len(n)
após o qual você pode remover o espaço após essa expressão.for j in r:print(r[j],j)
para salvar 7 caracteres.Mathematica
456416402404400396 caracteresExemplo :
Saída :
fonte