Erläuterung
Befunge ist ein zweidimensionales Programm, das Stapel verwendet .
Das heißt, um 5 + 6 zu tun, schreiben Sie 56+
, was bedeutet:
56+
5 push 5 into stack
6 push 6 into stack
+ pop the first two items in the stack and add them up, and push the result into stack
(to those of you who do not know stacks, "push" just means add and "pop" just means take off)
Wie die Intelligenten von Ihnen bemerkt haben, können wir die Zahl jedoch nicht 56
direkt in den Stapel schieben .
Dazu müssen wir 78*
stattdessen schreiben , was das Produkt multipliziert 7
und 8
in den Stapel schiebt.
Einzelheiten
Die Eingabe kann in einem beliebigen Format erfolgen, dh nach Ermessen des Programmierers kann dies STDIN sein oder nicht.
Die Eingabe ist eine positive Ganzzahl (kein Bonus für Einschluss- 0
oder negative Ganzzahlen).
Der Ausgang wird eine Reihe von nur diese Zeichen aus: 0123456789+-*/
(ich würde nicht verwenden %
. Modulo)
Das Ziel besteht darin, die kürzeste Zeichenfolge zu finden, die die Eingabe darstellen kann, indem das oben beschriebene Format verwendet wird.
Wenn zum Beispiel die Eingabe ist 123
, dann wäre die Ausgabe 67*99*+
. Die Ausgabe sollte von links nach rechts ausgewertet werden.
Wenn es mehr als eine akzeptable Ausgabe gibt (z. B. 99*67*+
auch akzeptabel), kann eine beliebige gedruckt werden (kein Bonus für das Drucken aller).
Weitere Erklärung
Wenn Sie immer noch nicht verstehen, wie Sie 67*99*+
auswerten sollen 123
, finden Sie hier eine ausführliche Erklärung.
stack |operation|explanation
67*99*+
[6] 6 push 6 to stack
[6,7] 7 push 7 to stack
[42] * pop two from stack and multiply, then put result to stack
[42,9] 9 push 9 to stack
[42,9,9] 9 push 9 to stack
[42,81] * pop two from stack and multiply, then put result to stack
[123] + pop two from stack and add, then put result to stack
TL; DR
Das Programm muss die kürzeste Zeichenfolge finden, die die Eingabe (Zahl) darstellen kann, wobei das oben angegebene Format verwendet wird.
Anmerkungen
Dies ist eine Code-Golf- Herausforderung, daher gewinnt der kürzeste Code in Bytes.
Begriffsklärung
Das -
kann entweder x-y
oder y-x
nach Ermessen des Programmierers sein. Die Auswahl muss jedoch innerhalb der Lösung konsistent sein. Ebenso für die /
.
Beispielprogramm
Lua, 1862 Bytes ( online testen )
Da ich der Autor bin, werde ich überhaupt nicht Golf spielen.
Erläuterung:
This uses the depth-first search method.
Mehr zur Tiefensuche: hier .
Das Programm:
local input = (...) or 81
local function div(a,b)
if b == 0 then
return "error"
end
local result = a/b
if result > 0 then
return math.floor(result)
else
return math.ceil(result)
end
end
local function eval(expr)
local stack = {}
for i=1,#expr do
local c = expr:sub(i,i)
if c:match('[0-9]') then
table.insert(stack, tonumber(c))
else
local a = table.remove(stack)
local b = table.remove(stack)
if a and b then
if c == '+' then
table.insert(stack, a+b)
elseif c == '-' then
table.insert(stack, b-a)
elseif c == '*' then
table.insert(stack, a*b)
elseif c == '/' then
local test = div(b,a)
if test == "error" then
return -1
else
table.insert(stack, a+b)
end
end
else
return -1
end
end
end
return table.remove(stack) or -1
end
local samples, temp = {""}, {}
while true do
temp = {}
for i=1,#samples do
local s = samples[i]
table.insert(temp, s..'0')
table.insert(temp, s..'1')
table.insert(temp, s..'2')
table.insert(temp, s..'3')
table.insert(temp, s..'4')
table.insert(temp, s..'5')
table.insert(temp, s..'6')
table.insert(temp, s..'7')
table.insert(temp, s..'8')
table.insert(temp, s..'9')
table.insert(temp, s..'+')
table.insert(temp, s..'-')
table.insert(temp, s..'*')
table.insert(temp, s..'/')
end
for i=1,#temp do
if input == eval(temp[i]) then
print(temp[i])
return
end
end
samples = temp
end
Bonus
Ein Kuchen für Sie, wenn Sie Befunge (oder eine andere Variante davon) verwenden, um den Code zu schreiben.
quelle
Antworten:
Python 2, 278 Bytes
Meine beste Lösung, die jedes Mal die kürzeste Antwort gibt. (aber sehr langsam)
Python 2, 437 Bytes
Diese Lösung ist länger, aber sehr schnell (keine rohe Kraft). Und ich bin mir ziemlich sicher, dass es immer das kürzestmögliche Ergebnis liefert.
quelle
f(6551)
gibt25*8*9*7+9*8+
(13 Zeichen) zurück, während9999***52*-
(11 Zeichen) besser ist. Verifiziert mit meiner eigeneneval
Funktion oben (in der Frage).while c:
;
Zuweisungen zu Variablen (die Bytes in eingerückten Blöcken speichern) trennen, den Tipp des Vens verwenden, Leerzeichen zwischen einem Symbol und allem anderen entfernen undt
loslegen.Perl,
134133132128 BytesBeinhaltet +5 für
-Xlp
(2 extra, weil der Code enthält'
)Führen Sie mit der Zielnummer auf STDIN aus:
befour.pl
:Es hat keine künstlichen Grenzen und ist konzeptionell einigermaßen effizient, hat aber dennoch schreckliche Laufzeiten, obwohl ich ein paar Bytes geopfert habe, um es zu beschleunigen. Das Generieren einer Lösung der Länge 11 (z. B. Zielnummer 6551) dauert auf meinem System ungefähr 5 Stunden.
Das Aufopfern von 7 weiteren Bytes macht die Geschwindigkeit etwas erträglicher.
17 Minuten für eine Lösung der Länge 11, ungefähr 5 Stunden für eine Lösung der Länge 13. Die erste Nummer, die eine Länge von 15 benötigt, ist 16622, was ungefähr 2 Tage dauert. Die erste Nummer, die die Länge 17 benötigt, ist 73319.
Beachten Sie, dass davon ausgegangen wird, dass die Division eine Ganzzahl zurückgibt, indem sie gegen 0 abschneidet (gemäß der Vorgabe von 93).
quelle
$
greift auf den Skalarwert zu. Wo in den meisten Sprachen Sie schreiben würden,a=4
wird Perl verwenden$a=4
. Wird aber auch für einen skalaren Zugriff auf komplexere Variablen verwendet. ZB$a{$b}
holt sich aus dem Hash (Karte, Wörterbuch)%a
den Skalarwert, der am$b
C,
550545 Bytes550545 Bytes nach dem Löschen der unnötigen Zeilenumbrüche (alle Zeilen mit Ausnahme der drei Zeilenumbrüche nach den Vorverarbeitungsrichtlinien).@Kenny Lau - Es kann als Eingabe eine Ganzzahl zwischen 1 und 9998 empfangen, aber ich denke, dass der Eingabebereich, für den eine optimale Lösung berechnet wird, kleiner als 9998 ist. Andererseits können beide Bereiche erweitert werden, wenn der Speicher erweitert wird erlaubt es.
Das Programm kann keine höhere Zahl als 9998 auf den Stapel schreiben. (9998 kann geändert werden.) Ich habe das Programm in einer anderen Version ausgeführt und die äußere Schleife (die mit k) durchlaufen, solange es Verbesserungen für eine beliebige Zahl gibt zwischen 1 und 9998 (wie im Dijkstra-Algorithmus). Nach drei Iterationen gibt es keine Verbesserung. Um Bytes zu sparen, habe ich k = 3 fest codiert.
Um den Bereich zu erweitern, sind zwei Dinge erforderlich: Ändern Sie die Konstanten 9999 und 9998, und führen Sie sie mit einer variablen Anzahl von Iterationen über die Outter-Schleife aus, solange eine Verbesserung vorliegt modifiziere die Konstante k = 3 auf diesen Wert.
quelle
i
,j
undk
vormain()
.Python 2, 284 Bytes
Haftungsausschluss: Dauert bei einigen Werten ewig ... es sollte jedoch garantiert werden, dass immer die kürzeste Zeichenfolge zurückgegeben wird, und es gibt keine künstlich auferlegte Bereichsgrenze ... sogar bei negativen Werten. :)
Algorithmus:
i = 0
i
, und ersetzen Sie sieabcd
durch+-*/
jeweils. Entfernen Sie alle Zeichenfolgenef
i
und erneut versuchen.quelle
f(i)
von0 <= i <= 6551
(erfassen den6551
Wert , der Sie verwenden die ursprüngliche Vorlage ungültig @pbochniak). Im Moment läuft es nur ein paar Minuten und hier ist die letzte Ausgabe des Tests:91 : 49+7* 3.020 s (total 108.174 s, worst 89: 5.827 s)
Update - es wurde gerade mit dem Wert 92 beendet:92 : 149+7*+ 258.761 s (total 366.935 s, worst 92: 258.761 s)
113
vollständige Testausgabe finden Sie hier (Pastebin), wenn Sie interessiert sind.Python 2, 182 Bytes
So unglaublich langsam, dass ich es bei der Eingabe eine Stunde lang laufen lassen habe
221
und es immer noch nicht beendet ist. Ein großer Teil der Langsamkeit ist , weil ich eine Liste als eine Warteschlange für eine Breitensuche verwenden und.pop(0)
istO(n)
für Listen.L
ist nur eine Warteschlange mit(stack, code to reach stack)
Paaren. Bei jedem Schritt werden immer Ziffern hinzugefügt und Operatoren ausgeführt, wenn der Stapel mindestens zwei Elemente enthält. Eine Division wird nur durchgeführt, wenn das letzte Element nicht 0 ist, obwohl ich den starken Verdacht habe, dass eine Division niemals notwendig ist (obwohl ich keine Möglichkeit habe, dies zu beweisen, aber ich habe dies bis zu 500 geprüft).Das Programm bricht
NameError
nach dem Ausdruck des Ergebnisses (evtl.) über a ab.quelle
;E
am Ende?NameError
für die Kündigung, daE
nirgendwo anders definiertCJam, 79
Probieren Sie es online aus
Dies ist schrecklich ineffizient, aber wenn genügend Speicher und Zeit zur Verfügung stehen, funktioniert es schließlich. 123 hat nicht genügend Speicher mit 16 GB, aber 120 und 125 sind in Ordnung.
quelle
Pyth - 35 Bytes
Rohe Gewalt. Eine seltsame Sache ist, dass die neue implizite Eingabe tatsächlich meine Punktzahl verletzt , da sie auch für
.v
pyth_eval zu funktionieren scheint.Probieren Sie es hier online aus .
quelle
Python 3, 183 Bytes
Geschwindigkeit ist nicht völlig unvernünftig (123, 221, 1237, 6551 werden in der Größenordnung von Sekunden oder Minuten beendet). Wenn Sie die
if
Anweisungif j<=i and <k<2*n
ändern, um sie zu beschleunigen, werden 9 weitere Bytes benötigt. Ich habe division (/
) weggelassen, weil ich nicht sehen kann, wie es gebraucht wird.quelle