Eine Friedman-Zahl ist eine Zahl, die durch Anwenden grundlegender mathematischer Operationen (^, /, *, +, -) auf alle Ziffern ausgedrückt werden kann. Die Operationen müssen nicht auf jede einzelne Ziffer angewendet werden, sondern alle Ziffern müssen beteiligt sein. Das heißt, 121 = 11 ^ 2 -> alle Ziffern sind beteiligt, aber 1 & 1 wurden zu 11 zusammengeschlagen.
Die Verwendung von Klammern ist zulässig, die triviale Lösung x= (x)
ist jedoch keine gültige Lösung. Auch nicht gültig , x= +x
.
- 25 = 5 ^ 2
- 121 = 11 ^ 2
- 343 = (3 + 4) ^ 3
- 2048 = (8 ^ 4) / 2 + 0
Schreiben Sie ein Programm, das zwei positive Ganzzahlen akzeptiert und die Anzahl der Friedman-Zahlen in diesem Bereich (einschließlich) sowie die Zahlen mit den Ausdrücken in den folgenden Zeilen druckt.
Eingabe -
n m | n, m integers, n>=0, m>n
Ausgabe -
count | number of Friedman numbers in the given range
fn1 exp1 | Friedman number, expression
fn2 exp2
fn3 exp3
.
.
.
Der kürzeste Code, der bis Sonntag, den 29. Juli um 00:00 Uhr (GMT) veröffentlicht wurde, ist der Gewinner.
/
funktioniert? Was ist zum Beispiel1/3
?-5
?Antworten:
Ruby,
456 438 408 390 370 349 344334 [behoben]Ausgabe:
Auch bei größeren Stückzahlen funktioniert es relativ schnell:
quelle
5 40
und das Ergebnis erhalten :[11, "11**1", 21, "21**1", 31, "31**1", 41, "41**1"]
. Keine Spur von25
dort und ich denke, die richtige Lösung (zum Beispiel für21
) ist2*1
nicht21**1
'+-*/'.chars.to_a+['','**']
mit["+","-","*","/","","**"]
Python 2.7 -
380 378 372 371 367 363 357 354 352 348336 ZeichenNur eine einfache Brute-Force-Suche.
Beispiellauf:
Erläuterung:
s(x)
ist eine Funktion, die eine Zeichenfolge mit einer Folge von Ziffern verwendet und alle Ausdrücke mit diesen Ziffern in dieser Reihenfolge zurückgibt.[x]['1'>x>'0':]
ergibt eine Liste mit x, wenn x '0' ist oder eine Folge von Ziffern, die nicht mit '0' beginnen; Andernfalls wird eine leere Liste ausgewertet. Grundsätzlich behandelt dies den Fall, in dem ich alle Ziffern zusammenfüge.['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
Grundsätzlich wird x in zwei Teile aufgeteilt (beide haben eine Länge ungleich Null), es wird s () für jeden Teil aufgerufen und alle Ergebnisse zusammen mit einem Operator zwischen ihnen zusammengefügt, indem product () verwendet wird.E(e)
ist im Grunde eine sichere Bewertung. Es gibt den Wert von e zurück, wenn e gültig ist, und andernfalls None.Grundsätzlich versucht dieser Code alle Zahlen im Bereich, permutiert ihre Ziffern und testet jeden Ausdruck, den s () für diese Permutation generiert, wobei der erste Ausdruck ignoriert wird, wenn x nicht mit '0' beginnt, denn wenn x nicht mit 'beginnt' 0 'dann ist der erste Ausdruck nur x.
Alternative Version - 397 Zeichen
Hier ist mein Code, wenn Sie Brüche verwenden müssen:
quelle
if len(x)<2
jemals in der Funktion wahr sein wirds
. Sie können Ihre auchformat
durch ersetzen"a[Fraction(%s)%s%s]='(%s%s%s)'"%(x[:i],o,v,x[:i],o,A)
, um 4 Zeichen zu speichern.except:0
klug ... sehr klug. Ich werde mich erinnernPython3
(436)(434)(443)Es war schwer. Ich kann einige Zeichen sparen, wenn ich die Ausgabe nativer mache.
Ausgabe
quelle
"("+i+c+j+")"
und Ersetzenlen(n)>1
durch ,1<len(n)
nach dem Sie den Raum nach dem Ausdruck entfernen.for j in r:print(r[j],j)
, um 7 Zeichen zu speichern.Mathematica
456416402404400396 ZeichenBeispiel :
Ausgabe :
quelle