Ihre Aufgabe ist es, ein Programm zu schreiben, das folgende Eingaben übernimmt:
a + b * c + a / 2
und generiert den Quellcode für ein Programm , das Benutzereingaben entgegennimmt und dann den Ausdruck auswertet.
Der Ausdruck kann die Operatoren enthalten +
, -
, *
, /
; Kleinbuchstaben in Kleinbuchstaben; und ganze Zahlen zwischen 0 und 32000. Die standardmäßige arithmetische Priorität muss korrekt befolgt werden. Der Ausdruck ist auf 26 eindeutige Variablen a bis z beschränkt. Eine einzelne Variable kann jedoch mehrmals vorkommen.
Sie können davon ausgehen, dass der Eingabeausdruck gültig ist (folgt diesen Regeln).
Das generierte Programm muss zur Benutzereingabe in diesem Formular auffordern und für jede Variable nur einmal zur Eingabe auffordern:
a =
Benutzereingaben von 0 bis 32000 sollten korrekt behandelt werden. Es wird dann der Ausdruck und das richtige Ergebnis gedruckt. Sie können entweder eine Ganzzahl- oder eine Gleitkomma-Arithmetik verwenden. Die Berechnungen sollten mit einer Genauigkeit von mindestens 32 Bit durchgeführt werden. Darüber hinaus müssen Sie sich keine Gedanken über Überlauf machen oder durch Null teilen.
Beispiel eines nicht Golf-generierten Perl-Programms für den obigen Ausdruck:
print "a = ";
my $a = <>;
print "b = ";
my $b = <>;
print "c = ";
my $c = <>;
print "a + b * c + a / 2 = " . ($a + $b * $c + $a / 2);
Beispiel für die Eingabe und Ausgabe eines Programms, das für den obigen Ausdruck generiert wurde:
a = 1
b = 2
c = 3
a + b * c + a / 2 = 7.5
Die Punktzahl wird berechnet als Länge des Programms + Länge des generierten Programms für diesen Ausdruck:
1 + a * 4 * b + 2 / d * e - a - 3 + g / h * 32000
Die niedrigste Punktzahl gewinnt.
Update: Nur um einige Anforderungen des Problems hervorzuheben, wie oben angegeben:
- Die Ausgabe des Programms muss Quellcode für ein anderes Programm sein , das den Ausdruck auswertet.
- Das Programm muss den ursprünglichen Ausdruck drucken . Vielleicht gibt es eine gewisse Mehrdeutigkeit (man könnte argumentieren, dass dies
a+b
der gleiche Ausdruck ist wiea + b
), aber der Klarheit halber nehmen wir an, dass es der ursprüngliche Ausdruck mit intaktem Leerraum sein muss. Alle bisher gültigen Antworten haben es so gemacht.
\pL
können ersetzen[a-z]
. Keine Notwendigkeit fürdo
Block. Kann nur schreiben:${$&}//=print"$& = "and<>
\pL
, fertig. Kannand
in keinem Programm verwendet werden, da die Priorität zu niedrig ist.and
ist niedriger Vorrang als//=
.Lua, 202 + 166 = 368
Datei "generate_code.lua"
Verwendungszweck:
Code generiert (Reihenfolge der Variablen nicht angegeben):
Generierter Code in Aktion:
quelle
Tcl 198 + 155 = 352
erzeugt
quelle
foreach
=>lmap
;va
=>v
Python 125 + 151 = 276
Jetzt ausführen:
quelle
z=sorted(set(filter(str,isalpha,t)))
durchz=''.join(set(filter(str.isalpha,t)))
.