Eine Friedman-Zahl ist eine positive Ganzzahl, die einem nicht trivialen Ausdruck entspricht, der seine eigenen Ziffern in Kombination mit den Operationen +, -, *, /, ^, Klammern und Verkettung verwendet.
Eine Nice Friedman-Zahl ist eine positive Ganzzahl, die einem nicht trivialen Ausdruck entspricht, der seine eigenen Ziffern in Kombination mit denselben Operationen verwendet, wobei die Ziffern in ihrer ursprünglichen Reihenfolge vorliegen.
Eine Very Nice Friedman Number (VNFN), die ich hier erfinde, ist eine Nice Friedman Number, die ohne die (meiner Meinung nach) weniger hübschen Teile eines solchen Ausdrucks geschrieben werden kann. Klammern, Verkettung und unäre Verneinung sind nicht zulässig.
Für diese Herausforderung gibt es drei Möglichkeiten, einen Ausdruck ohne Klammern zu schreiben.
Präfix: Dies entspricht der Linksassoziativität . Diese Art von Ausdruck wird mit allen Operatoren links von den Ziffern geschrieben. Jeder Operator gilt für die folgenden zwei Ausdrücke. Zum Beispiel:
*+*1234 = *(+(*(1,2),3),4) = (((1*2)+3)*4) = 20
Eine VNFN, die auf diese Weise geschrieben werden kann, ist 343:
^+343 = ^(+(3,4),3) = ((3+4)^3) = 343
Postfix: Dies entspricht der Rechtsassoziativität. Es ist wie bei der Präfixnotation, nur dass die Operation rechts von den Ziffern steht. Jeder Operator gilt für die beiden vorherigen Ausdrücke. Zum Beispiel:
1234*+* = (1,(2,(3,4)*)+)* = (1*(2+(3*4))) = 14
Eine VNFN, die auf diese Weise geschrieben werden kann, ist 15655:
15655^+** = (1,(5,(6,(5,5)^)+)*)* = (1*(5*(6+(5^5)))) = 15655
Infix: Die Infix-Notation verwendet die Standardreihenfolge für die fünf Operationen. Für die Zwecke der Herausforderung wird diese Operationsreihenfolge wie folgt definiert: Klammern Sie ^
zuerst rechts assoziativ ein. Dann in Klammern *
und /
gleichzeitig assoziativ verlassen. Schließlich in Klammern +
und -
gleichzeitig assoziativ verlassen.
1-2-3 = (1-2)-3 = -4
2/3*2 = (2/3)*2 = 4/3
2^2^3 = 2^(2^3) = 256
1^2*3+4 = (1^2)*3+4 = 7
Eine VNFN, die auf diese Weise geschrieben werden kann, ist 11664:
1*1*6^6/4 = (((1*1)*(6^6))/4) = 11664
Herausforderung: Wenn eine positive Ganzzahl als nicht-trivialer Ausdruck der eigenen Ziffern in Präfix-, Infix- oder Postfix-Notation angegeben werden kann, geben Sie diesen Ausdruck aus. Wenn nicht, nichts ausgeben.
Erläuterungen: Wenn mehrere Darstellungen möglich sind, können Sie eine beliebige nicht leere Teilmenge davon ausgeben. Zum Beispiel ist 736 eine VNFN:
+^736 = 736
7+3^6 = 736
+^736
, 7+3^6
oder beides wären alles akzeptable Ausgaben.
Ein "Trivial" -Ausdruck bedeutet einen Ausdruck, der keine Operatoren verwendet. Dies ist nur für einstellige Nummern relevant und bedeutet, dass einstellige Nummern keine VNFNs sein können. Dies geht aus der Definition einer Friedman-Zahl hervor.
Bei Eingaben unter einer Million sollten die Antworten in Sekunden oder Minuten ausgeführt werden.
IO: Standard IO-Regeln. Volles Programm, Funktion, Verb oder ähnliches. STDIN, Kommandozeile, Funktionsargument oder ähnliches. Für die Ausgabe von "Nothing" sind die leere Zeichenfolge, eine leere Zeile null
oder ähnliches und eine leere Auflistung in Ordnung. Die Ausgabe kann eine Zeichenfolge sein, die durch ein Zeichen begrenzt ist, das sich nicht in einer Darstellung befindet, oder es kann sich um eine Sammlung von Zeichenfolgen handeln.
Beispiele:
127
None
343
^+343
736
736^+
7+3^6
2502
None
15655
15655^+**
11664
1*1*6^6/4
1^1*6^6/4
5
None
Wertung: Dies ist Codegolf. Wenigste Bytes gewinnt.
Wenn Sie eine finden, geben Sie in Ihrer Antwort bitte eine neue Very Nice Friedman-Nummer an.
quelle
*(+(*(1,2),3,4)
fehlt eine enge paren, nach,3
Parentheses, concatenation and unary negation are disallowed.
Antworten:
Perl,
345334318293263245BMit anrufen
perl -M5.10.0 scratch.pl 736
Ergebnisse
Die ersten Ergebnisse, die ich gefunden habe, sind:
Erläuterung
Völlig ungolfed
Ich habe versucht, mich so oft wie möglich zu wiederholen, um das spätere Golfen zu erleichtern.
Wie es Golf spielt
$_=q! ... !;eval
Dies ergibt so etwas, von dem Sie die Zeilenumbrüche für das Ergebnis entfernen können:
quelle
}glob
und einige Bytes zu speichern.s!B!}glob!g;BBB
-> 15B;}glob}glob}glob
-> 15B :)Nur Ruby 2.1.5 -
213220238 + 9 = 247Ich bin nicht sicher, wie Ruby Perl schlägt, aber los geht's ...
Führen Sie dies mit einem -rtimeout-Flag aus (und entweder -W0 oder senden Sie Ihr stderr an eine andere Stelle).
Um dies etwas robuster zu machen, ersetzen Sie es
send([].methods[81],z-1)
durchrepeated_permutation(z-1)
ein zusätzliches Zeichen und erhalten Sie einen Punkt (also 248 ).Grundsätzlich sollten Sie alle Permutationen von Operatoren durchgehen und Infix, Postfix und Präfix in dieser Reihenfolge ausprobieren. Die
d
Methode verwendeteval
den zweiten Parameter, um die Berechnungen durchzuführen, wobei alle DivideByZero- oder Überlaufausnahmen abgefangen werden.Sie müssen jedoch stderr an / dev / null senden, andernfalls
eval
werden manchmal Warnungen wie gedruckt(eval):1: warning: in a**b, b may be too big
.Während ich mir dieses Ungolfing ausgedacht habe, habe ich einen Weg gefunden, drei Zeichen zu sparen!
Ungolfed (veraltete, aber ähnliche Prinzipien):
Änderungsprotokoll
247 machte diese Arbeit für größere Zahlen, anstatt Zeitüberschreitung.
220 reduzierte drei Zeichen durch Deklarieren von Paren-Arrays und behebte einen Fehler, bei dem einstellige Zahlen als VNFNs angesehen wurden
213 Initial Commit
quelle
a.zip(b,c)
Gibt ein Array von Arrays zurück[ [a[0],b[0],c[0]],[a[1],b[1],c[1]], etc.]
und['hi', 'there']*''
verkettet nur die String-Darstellung der Array-Werte.[a,b]*3
ergibt[a,b,a,b,a,b]
MATLAB (435 b)
versuche es hier
http://octave-online.net/
quelle
Python 2, 303 Bytes
Probieren Sie es online aus
Die Infix-Ausgabe enthält
**
statt^
. Wenn dies nicht zulässig ist,.replace('**','^')
werden weitere 18 Byte hinzugefügtErläuterung:
quelle