Sie erhalten 6 Nummern: 5 Ziffern [0-9] und eine Zielnummer. Ihr Ziel ist es, die Operatoren zwischen den Ziffern zu verteilen, um dem Ziel so nahe wie möglich zu kommen. Sie haben jede Ziffer zu verwenden , genau einmal, und können die folgenden Operatoren verwenden , so viele Male , wie Sie wollen: + - * / () ^ sqrt sin cos tan
. Zum Beispiel, wenn ich gegeben 8 2 4 7 2 65
bin, kann ich ausgeben 82-(2*7)-4
. Dies ergibt 64, was mir eine Punktzahl von 1 gibt, da ich 1 vom Ziel entfernt war. Hinweis: Zwischen den Ziffern kann kein Dezimalzeichen stehen.
Ich benutze den Code aus dieser StackOverflow-Antwort , um die mathematischen Ausdrücke zu bewerten. Am Ende dieser Frage befinden sich Programme, mit denen Sie sie testen können.
Verkettungsfunktionen (Update!)
@mdahmoune hat gezeigt, wie komplex diese Herausforderung ist. Als solches füge ich eine neue Funktion hinzu: Verketten von unären Funktionen. Dies funktioniert bei sin, cos, tan und sqrt. Anstatt jetzt zu schreiben sin(sin(sin(sin(10))))
, können Sie schreiben sin_4(10)
. Probieren Sie es im Evaluator aus!
Eingang
200 durch Zeilen getrennte Testfälle mit 5 Ziffern und einer durch Leerzeichen getrennten Zielnummer. Sie können das Programm am Ende der Frage verwenden, um Beispiel-Testfälle zu erstellen, aber ich werde meine eigenen Testfälle für die offizielle Bewertung haben. Die Testfälle sind in 5 Abschnitte von 40 Tests mit den folgenden Bereichen für die Zielnummer unterteilt:
- Abschnitt 1: [0,1] (bis 5 Dezimalstellen)
- Abschnitt 2: [0,10] (bis 4 Dezimalstellen)
- Abschnitt 3: [0,1000] (bis 3 Dezimalstellen)
- Abschnitt 4: [0,10 6 ] (bis 1 Dezimalstelle)
- Abschnitt 5: [0,10 9 ] (bis 0 Dezimalstellen)
Ausgabe
200 zeilengetrennte mathematische Ausdrücke. Wenn es sich beispielsweise um einen Testfall handelt 5 6 7 8 9 25.807
, könnte dies eine mögliche Ausgabe sein78-59+6
Wertung
Das Ziel jeder Runde ist es, näher an die Zielzahl heranzukommen als die anderen konkurrierenden Programme. Ich werde verwenden Mario Kart 8 Scoring , das ist: . Wenn mehrere Antworten exakt die gleiche Punktzahl erhalten, werden die Punkte gleichmäßig aufgeteilt und auf den nächsten int gerundet. Wenn beispielsweise die Programme auf dem 5. bis 8. Platz unentschieden sind, erhalten sie in dieser Runde jeweils (8 + 7 + 6 + 5) / 4 = 6,5 => 7 Punkte. Nach 200 Runden gewinnt das Programm mit den meisten Punkten. Wenn zwei Programme am Ende die gleiche Anzahl von Punkten haben, ist der Gleichmacher das Programm, das schneller ausgeführt wurde.1st: 15 2nd: 12 3rd: 10 4th: 9 5th: 8 6th: 7 7th: 6 8th: 5 9th: 4 10th: 3 11th: 2 12th: 1 13th+: 0
Regeln
- Sie können nur eine der auf Macs vorinstallierten Sprachen wie C, C ++, Java, PhP, Perl, Python (2 oder 3), Ruby und Swift verwenden. Wenn Sie eine Sprache haben, die Sie mit einem Compiler / Interpreter verwenden möchten, bei dem es sich um einen relativ kleinen Download handelt, kann ich sie hinzufügen. Sie können auch eine Sprache mit einem Online-Dolmetscher verwenden, die jedoch nicht so schnell ausgeführt wird.
- Geben Sie in Ihrer Antwort an, ob die Triggerfunktionen in Grad oder Bogenmaß berechnet werden sollen .
- Ihr Programm muss seine Lösungen innerhalb von 60 Sekunden auf meinem Mac für alle 200 Testfälle (in eine Datei oder STDOUT) ausgeben .
- Zufälligkeit muss ausgesät werden.
- Ihre Gesamtleistung für alle Testfälle darf nicht mehr als 1 MB betragen .
- Wenn Sie Ihre Lösung verbessert haben und erneut bewertet werden möchten, fügen Sie oben in Ihrer Antwort in Fettdruck die Option " Erneut bewerten" hinzu.
Programme
(Ändern Sie das Argument "deg" in "rad", wenn Sie Radiant möchten.)
- Evaluator testen
- Bewerten Sie die Ausgabe Ihres Programms für Testfälle
- Testfälle generieren:
document.getElementById("but").onclick = gen;
var checks = document.getElementById("checks");
for(var i = 1;i<=6;i++) {
var val = i<6 ? i : "All";
var l = document.createElement("label");
l.for = "check" + val;
l.innerText = " "+val+" ";
checks.appendChild(l);
var check = document.createElement("input");
check.type = "checkBox";
check.id = "check"+val;
if(val == "All") {
check.onchange = function() {
if(this.checked == true) {
for(var i = 0;i<5;i++) {
this.parentNode.elements[i].checked = true;
}
}
};
}
else {
check.onchange = function() {
document.getElementById("checkAll").checked = false;
}
}
checks.appendChild(check);
}
function gen() {
var tests = [];
var boxes = checks.elements;
if(boxes[0].checked)genTests(tests,1,5,40);
if(boxes[1].checked)genTests(tests,10,4,40);
if(boxes[2].checked)genTests(tests,1000,3,40);
if(boxes[3].checked)genTests(tests,1e6,1,40);
if(boxes[4].checked)genTests(tests,1e9,0,40);
document.getElementById("box").value = tests.join("\n");
}
function genTests(testArray,tMax,tDec,n) {
for(var i = 0;i<n;i++) {
testArray.push(genNums(tMax,tDec).join(" "));
}
}
function genNums(tMax,tDec) {
var nums = genDigits();
nums.push(genTarget(tMax,tDec));
return nums;
}
function genTarget(tMax,tDec) {
return genRand(tMax,tDec);
}
function genRand(limit,decimals) {
var r = Math.random()*limit;
return r.toFixed(decimals);
}
function genDigits() {
var digits = [];
for(var i = 0;i<5;i++) {
digits.push(Math.floor(Math.random()*10));
}
return digits;
}
textarea {
font-size: 14pt;
font-family: "Courier New", "Lucida Console", monospace;
}
div {
text-align: center;
}
<div>
<label for="checks">Sections: </label><form id="checks"></form>
<input type="button" id="but" value="Generate Test Cases" /><br/><textarea id="box" cols=20 rows=15></textarea>
</div>
Bestenliste
Punktzahl (Anzahl der Siege):
- [0-1] user202729 : 40, mdahmoune: 0
- [0-10] user202729 : 40, mdahmoune: 0
- [0-1000] user202729 : 39, mdahmoune: 1
- [0-10 6 ] user202729 : 33, mdahmoune: 7
- [0-10 9 ] user202729: 0, mdahmoune : 40
Verwandte Themen : Erstellen Sie eine gültige Gleichung mit benutzerdefinierten Zahlen
cos(0)/sin(0^0)/sin(0^0)
.