Otrzymasz 6 liczb: 5 cyfr [0–9] i numer docelowy. Twoim celem jest przeplatanie operatorów między cyframi, aby zbliżyć się jak najbliżej celu. Musisz użyć każdą cyfrę dokładnie raz, i może korzystać z następujących operatorów tyle razy, ile chcesz: + - * / () ^ sqrt sin cos tan
. Na przykład, jeśli otrzymam 8 2 4 7 2 65
, mogę wyjść 82-(2*7)-4
. Daje to wynik 64, co daje mi wynik 1, ponieważ byłem 1 od celu. Uwaga: Nie można wstawić kropki dziesiętnej między cyframi.
Korzystam z kodu z tej odpowiedzi StackOverflow, aby ocenić wyrażenia matematyczne. Na dole tego pytania znajdują się programy, których można użyć do przetestowania go.
Łączenie funkcji (aktualizacja!)
@mdahmoune ujawniło nowy poziom złożoności tego wyzwania. Jako taki, dodaję nową funkcję: łączenie jednoargumentowych funkcji. Działa to na sin, cos, tan i sqrt. Teraz zamiast pisać sin(sin(sin(sin(10))))
, możesz pisać sin_4(10)
. Wypróbuj w ewaluatorze!
Wejście
200 oddzielnych wierszy przypadków testowych z 5 cyfr i liczby docelowej, które są oddzielone spacją. Możesz użyć programu na dole pytania, aby utworzyć przykładowe przypadki testowe, ale będę mieć własne przypadki testowe do oficjalnej oceny. Przypadki testowe są podzielone na 5 sekcji po 40 testów z następującymi zakresami dla liczby docelowej:
- Sekcja 1: [0,1] (do 5 miejsc po przecinku)
- Sekcja 2: [0,10] (do 4 miejsc po przecinku)
- Sekcja 3: [0,1000] (do 3 miejsc po przecinku)
- Sekcja 4: [0,10 6 ] (do 1 miejsca po przecinku)
- Sekcja 5: [0,10 9 ] (do 0 miejsc po przecinku)
Wynik
Wyrażenia matematyczne rozdzielone 200 wierszami. Na przykład, jeśli przypadek testowy jest 5 6 7 8 9 25.807
, możliwe wyjście może być78-59+6
Punktacja
Celem każdej rundy jest zbliżenie się do liczby docelowej niż w innych konkurencyjnych programach. Zamierzam użyć Mario Kart 8 punktacji , który jest: . Jeśli wiele odpowiedzi uzyska ten sam dokładny wynik, punkty zostaną podzielone równomiernie, zaokrąglone do najbliższej liczby całkowitej. Na przykład, jeśli programy na 5-8 miejscu są powiązane, każdy z nich otrzymuje (8 + 7 + 6 + 5) / 4 = 6,5 => 7 punktów w tej rundzie. Pod koniec 200 rund wygrywa program, który uzyskał najwięcej punktów. Jeśli dwa programy mają na końcu taką samą liczbę punktów, remis to program, który zakończył działanie szybciej.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
Zasady
- Możesz używać tylko jednego z języków wstępnie zainstalowanych na Macu, takich jak C, C ++, Java, PhP, Perl, Python (2 lub 3), Ruby i Swift. Jeśli masz język, którego chcesz używać z kompilatorem / tłumaczem, który jest stosunkowo niewielkim plikiem do pobrania, mogę go dodać. Możesz także użyć języka z tłumaczem online, ale nie będzie on działać tak szybko.
- Podaj w swojej odpowiedzi, czy chcesz, aby funkcje wyzwalania były obliczane w stopniach lub radianach .
- Twój program musi wypisać swoje rozwiązania do wszystkich 200 przypadków testowych (do pliku lub STDOUT) w ciągu 60 sekund na moim komputerze Mac.
- Losowość musi zostać zaszczepiona.
- Łączna moc wyjściowa dla wszystkich przypadków testowych nie może przekraczać 1 MB .
- Jeśli ulepszyłeś swoje rozwiązanie i chciałbyś zostać ponownie oceniony, dodaj Re-Score u góry odpowiedzi pogrubioną czcionką.
Programy
(zmień argument „deg” na „rad”, jeśli chcesz radiany)
- Testuj ewaluatora
- Oceń wyniki swojego programu dla przypadków testowych
- Generuj przypadki testowe:
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>
Tabela liderów
Wyniki sekcji (liczba zwycięstw):
- [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
Powiązane: Wygeneruj prawidłowe równanie przy użyciu liczb określonych przez użytkownika
cos(0)/sin(0^0)/sin(0^0)
.