Liczba Friedmana to liczba, którą można wyrazić, stosując podstawowe operacje matematyczne (^, /, *, +, -) do wszystkich jej cyfr. Operacje nie muszą być stosowane do poszczególnych cyfr, ale wszystkie cyfry muszą być zaangażowane. Oznacza to, że 121 = 11 ^ 2 -> wszystkie cyfry są zaangażowane, ale 1 i 1 zostały połączone razem, aby uzyskać 11.
Użycie nawiasów jest dozwolone, ale trywialne rozwiązanie x= (x)
nie jest prawidłowym rozwiązaniem. Również nie jest ważny x= +x
.
- 25 = 5 ^ 2
- 121 = 11 ^ 2
- 343 = (3 + 4) ^ 3
- 2048 = (8 ^ 4) / 2 + 0
Napisz program, który pobierze dodatnie dwie liczby całkowite i wydrukuje liczbę liczb Friedmana w tym zakresie (włącznie) oraz liczby z wyrażeniami w kolejnych wierszach.
Wejście -
n m | n, m integers, n>=0, m>n
Wynik -
count | number of Friedman numbers in the given range
fn1 exp1 | Friedman number, expression
fn2 exp2
fn3 exp3
.
.
.
Najkrótszy kod opublikowany do niedzieli 29 lipca 00:00 GMT zostanie zwycięzcą.
/
działa? Na przykład co to jest1/3
?-5
?Odpowiedzi:
Rubinowy,
456438408 390 370 349 344334 [ustalony]Wynik:
Działa również stosunkowo szybko dla większych liczb:
źródło
5 40
i otrzymał wynik:[11, "11**1", 21, "21**1", 31, "31**1", 41, "41**1"]
. Nie ma tam śladu25
i myślę, że właściwym rozwiązaniem (na przykład dla21
)2*1
nie jest21**1
'+-*/'.chars.to_a+['','**']
z["+","-","*","/","","**"]
Python 2,7 -
380 378 372 371 367 363 357 354 352 348336 znakówPo prostu proste wyszukiwanie brutalnej siły.
Przykładowy przebieg:
Wyjaśnienie:
s(x)
to funkcja, która pobiera ciąg zawierający sekwencję cyfr i zwraca wszystkie wyrażenia korzystające z tych cyfr w tej kolejności.[x]['1'>x>'0':]
ewaluuje do listy zawierającej x, jeśli x jest równe „0” lub ciąg cyfr nie rozpoczynający się od „0”; w przeciwnym razie przejdzie do pustej listy. Zasadniczo dotyczy to przypadku, w którym łączę wszystkie cyfry razem.['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
w zasadzie dzieli x na dwie części (obie o niezerowej długości), wywołuje s () na każdej części i łączy wszystkie wyniki wraz z pewnym operatorem między nimi za pomocą product ().E(e)
jest w zasadzie bezpieczną ewaluacją. Zwraca wartość e, jeśli e jest poprawny, a Brak w przeciwnym razie.Zasadniczo ten kod wypróbowuje wszystkie liczby z zakresu, permutuje ich cyfry i testuje każde wyrażenie s () generuje dla tej permutacji, ignorując pierwsze wyrażenie, jeśli x nie zaczyna się od „0”, ponieważ jeśli x nie zaczyna się od „ 0 ', wówczas pierwszym wyrażeniem będzie po prostu x.
Wersja alternatywna - 397 znaków
Oto mój kod, jeśli musisz używać ułamków:
źródło
if len(x)<2
aby kiedykolwiek działał poprawnies
. Ponadto, można wymienićformat
z"a[Fraction(%s)%s%s]='(%s%s%s)'"%(x[:i],o,v,x[:i],o,A)
aby zaoszczędzić 4 znaków.except:0
mądry ... bardzo mądry. ZapamiętamPython3
(436)(434)(443)To było trudne. Mogę oszczędzić kilka znaków, jeśli sprawię, że wydruk będzie bardziej natywny.
Wynik
źródło
"("+i+c+j+")"
i zastępująclen(n)>1
ją,1<len(n)
po czym możesz usunąć spację po tym wyrażeniu.for j in r:print(r[j],j)
aby zapisać 7 znaków.Mathematica
456416402404400396 znakówPrzykład :
Wyjście :
źródło