Ti vengono dati 6 numeri: 5 cifre [0-9] e un numero target. Il tuo obiettivo è intercalare gli operatori tra le cifre per avvicinarti il più possibile al bersaglio. Devi usare ogni cifra esattamente una volta, ed è possibile utilizzare i seguenti operatori tante volte che vuoi: + - * / () ^ sqrt sin cos tan
. Ad esempio, se mi viene fornito, 8 2 4 7 2 65
posso eseguire l'output 82-(2*7)-4
. Questo vale 64, quindi mi dà un punteggio di 1 dato che ero 1 lontano dal bersaglio. Nota: non è possibile inserire un punto decimale tra le cifre.
Sto usando il codice di questa risposta StackOverflow per valutare le espressioni matematiche. In fondo a questa domanda ci sono programmi che puoi usare per testarlo.
Funzioni di concatenamento (aggiornamento!)
@mdahmoune ha rivelato un nuovo livello di complessità a questa sfida. Come tale, sto aggiungendo una nuova funzionalità: concatenare funzioni unarie. Funziona su sin, cos, tan e sqrt. Ora invece di scrivere sin(sin(sin(sin(10))))
, puoi scrivere sin_4(10)
. Provalo nel valutatore!
Ingresso
200 casi di test separati da una riga di 5 cifre e un numero target separato da spazi. È possibile utilizzare il programma in fondo alla domanda per creare casi di test di esempio, ma avrò i miei casi di test per il punteggio ufficiale. I casi di test sono suddivisi in 5 sezioni di 40 test con i seguenti intervalli per il numero di destinazione:
- Sezione 1: [0,1] (con 5 punti decimali)
- Sezione 2: [0,10] (con 4 punti decimali)
- Sezione 3: [0,1000] (al terzo decimale)
- Sezione 4: [0,10 6 ] (al punto decimale)
- Sezione 5: [0,10 9 ] (fino a 0 punti decimali)
Produzione
200 espressioni matematiche separate da linee. Ad esempio, se il test case è 5 6 7 8 9 25.807
, un possibile output potrebbe essere78-59+6
punteggio
L'obiettivo di ogni round è avvicinarsi al numero target rispetto agli altri programmi concorrenti. Ho intenzione di utilizzare Mario Kart 8 di punteggio , che è: . Se più risposte ottengono lo stesso punteggio esatto, i punti vengono divisi uniformemente, arrotondati all'int più vicino. Ad esempio, se i programmi dal 5 ° all'8 ° posto sono in parità, ottengono ciascuno (8 + 7 + 6 + 5) / 4 = 6.5 => 7 punti in quel round. Alla fine dei 200 round, vince il programma che ha ottenuto il maggior numero di punti. Se alla fine due programmi hanno lo stesso numero di punti, il tie-breaker è il programma che ha terminato l'esecuzione più veloce.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
Regole
- Puoi utilizzare solo una delle lingue comunemente preinstallate su Mac come C, C ++, Java, PhP, Perl, Python (2 o 3), Ruby e Swift. Se hai una lingua che vuoi usare con un compilatore / interprete che è un download relativamente piccolo, posso aggiungerlo. Puoi anche usare una lingua con un interprete online, ma non funzionerà così velocemente.
- Specificare nella risposta se si desidera che le funzioni di attivazione vengano calcolate in gradi o radianti .
- Il mio programma deve inviare le sue soluzioni a tutti i 200 casi di test (su un file o STDOUT) entro 60 secondi sul mio Mac.
- La casualità deve essere seminata.
- L'output totale per tutti i casi di test non può essere superiore a 1 MB .
- Se hai migliorato la tua soluzione e desideri ricevere un nuovo punteggio, aggiungi il nuovo punteggio nella parte superiore della risposta in grassetto.
programmi
(cambia l'argomento "deg" in "rad" se vuoi i radianti)
- Prova il valutatore
- Punteggio dell'output del tuo programma per i casi di test
- Genera casi di test:
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>
Classifica
Punteggi delle sezioni (numero di vittorie):
- [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
Correlati: genera un'equazione valida utilizzando numeri specificati dall'utente
cos(0)/sin(0^0)/sin(0^0)
.