Se le dan 6 números: 5 dígitos [0-9] y un número objetivo. Su objetivo es intercalar operadores entre los dígitos para acercarse lo más posible al objetivo. Usted tiene que utilizar cada dígito exactamente una vez, y puede utilizar los siguientes operadores tantas veces como desee: + - * / () ^ sqrt sin cos tan
. Por ejemplo, si me dan 8 2 4 7 2 65
puedo dar salida 82-(2*7)-4
. Esto se evalúa a 64, lo que me da una puntuación de 1 ya que estaba 1 lejos del objetivo. Nota: No puede poner un punto decimal entre dígitos.
Estoy usando el código de esta respuesta de StackOverflow para evaluar las expresiones matemáticas. Al final de esta pregunta hay programas que puede usar para probarlo.
Funciones de encadenamiento (¡Actualización!)
@mdahmoune ha revelado un nuevo nivel de complejidad para este desafío. Como tal, estoy agregando una nueva característica: encadenar funciones unarias. Esto funciona en sin, cos, tan y sqrt. Ahora, en lugar de escribir sin(sin(sin(sin(10))))
, puedes escribir sin_4(10)
. ¡Pruébalo en el evaluador!
Entrada
200 casos de prueba separados por líneas de 5 dígitos y un número de destino separados por espacios. Puede usar el programa al final de la pregunta para hacer casos de prueba de muestra, pero tendré mis propios casos de prueba para la calificación oficial. Los casos de prueba se dividen en 5 secciones de 40 pruebas con los siguientes rangos para el número objetivo:
- Sección 1: [0,1] (a 5 puntos decimales)
- Sección 2: [0,10] (a 4 puntos decimales)
- Sección 3: [0,1000] (a 3 puntos decimales)
- Sección 4: [0,10 6 ] (a 1 punto decimal)
- Sección 5: [0,10 9 ] (a 0 puntos decimales)
Salida
200 expresiones matemáticas separadas por líneas. Por ejemplo, si el caso de prueba es 5 6 7 8 9 25.807
, una posible salida podría ser78-59+6
Puntuación
El objetivo de cada ronda es acercarse al número objetivo que los otros programas competidores. Voy a utilizar Mario Kart 8 de puntuación , que es: . Si las respuestas múltiples obtienen el mismo puntaje exacto, los puntos se dividen en partes iguales, redondeados al int más cercano. Por ejemplo, si los programas en quinto a octavo lugar están empatados, cada uno obtiene (8 + 7 + 6 + 5) / 4 = 6.5 => 7 puntos en esa ronda. Al final de las 200 rondas, gana el programa que obtuvo más puntos. Si dos programas tienen el mismo número de puntos al final, el desempate es el programa que terminó de ejecutarse más rápido.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
Reglas
- Solo puede usar uno de los lenguajes preinstalados comúnmente en Mac como C, C ++, Java, PhP, Perl, Python (2 o 3), Ruby y Swift. Si tiene un idioma que desea usar con un compilador / intérprete que es una descarga relativamente pequeña, puedo agregarlo. También puede usar un idioma con un intérprete en línea, pero eso no se ejecutará tan rápido.
- Especifique en su respuesta si desea que las funciones trigonométricas se calculen en grados o radianes .
- Su programa debe enviar sus soluciones a los 200 casos de prueba (a un archivo o STDOUT) en 60 segundos en mi Mac.
- La aleatoriedad debe ser sembrada.
- Su producción total para todos los casos de prueba no puede ser superior a 1 MB .
- Si ha mejorado su solución y desea volver a calificar, agregue Re-Score en negrita en la parte superior de su respuesta.
Programas
(cambie el argumento "deg" a "rad" si quiere radianes)
- Probar evaluador
- Califique la salida de su programa para casos de prueba
- Generar casos de prueba:
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>
Tabla de clasificación
Puntajes de sección (# de victorias):
- [0-1] usuario202729 : 40, mdahmoune: 0
- [0-10] usuario202729 : 40, mdahmoune: 0
- [0-1000] usuario202729 : 39, mdahmoune: 1
- [0-10 6 ] usuario202729 : 33, mdahmoune: 7
- [0-10 9 ] usuario202729: 0, mdahmoune : 40
Relacionado: generar una ecuación válida utilizando números especificados por el usuario
cos(0)/sin(0^0)/sin(0^0)
.