Vous obtenez 6 numéros: 5 chiffres [0-9] et un numéro cible. Votre objectif est de répartir les opérateurs entre les chiffres pour vous rapprocher le plus possible de la cible. Vous devez utiliser chaque chiffre exactement une fois, et peut utiliser les opérateurs suivants autant de fois que vous le souhaitez: + - * / () ^ sqrt sin cos tan
. Par exemple, si on me donne, 8 2 4 7 2 65
je peux sortir 82-(2*7)-4
. Cela équivaut à 64, ce qui me donne un score de 1 puisque j'étais à 1 de la cible. Remarque: vous ne pouvez pas mettre de virgule décimale entre les chiffres.
J'utilise le code de cette réponse StackOverflow pour évaluer les expressions mathématiques. Au bas de cette question, il existe des programmes que vous pouvez utiliser pour le tester.
Fonctions de chaînage (mise à jour!)
@mdahmoune a révélé un nouveau niveau de complexité à ce défi. En tant que tel, j'ajoute une nouvelle fonctionnalité: chaîner des fonctions unaires. Cela fonctionne sur sin, cos, tan et sqrt. Maintenant, au lieu d'écrire sin(sin(sin(sin(10))))
, vous pouvez écrire sin_4(10)
. Essayez-le dans l'évaluateur!
Contribution
200 cas de test séparés par des lignes de 5 chiffres et un nombre cible séparés par des espaces. Vous pouvez utiliser le programme au bas de la question pour créer des exemples de cas de test, mais j'aurai mes propres cas de test pour la notation officielle. Les cas de test sont divisés en 5 sections de 40 tests avec les plages suivantes pour le nombre cible:
- Section 1: [0,1] (à 5 décimales)
- Section 2: [0,10] (à 4 décimales)
- Section 3: [0,1000] (à 3 décimales)
- Section 4: [0,10 6 ] (à 1 point décimal)
- Section 5: [0,10 9 ] (à 0 décimale)
Production
200 expressions mathématiques séparées par des lignes. Par exemple, si le cas de test est 5 6 7 8 9 25.807
, une sortie possible pourrait être78-59+6
Notation
L'objectif à chaque tour est de se rapprocher du nombre cible que les autres programmes concurrents. Je vais utiliser la notation Mario Kart 8 , qui est: . Si plusieurs réponses obtiennent le même score exact, les points sont répartis également, arrondis à l'int. Le plus proche. Par exemple, si les programmes en 5e-8e place sont à égalité, ils obtiennent chacun (8 + 7 + 6 + 5) / 4 = 6,5 => 7 points ce tour. À la fin des 200 tours, le programme qui a obtenu le plus de points gagne. Si deux programmes ont le même nombre de points à la fin, le bris d'égalité est le programme qui a fini de s'exécuter plus rapidement.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
Règles
- Vous ne pouvez utiliser que l'un des langages couramment préinstallés sur Mac comme C, C ++, Java, PhP, Perl, Python (2 ou 3), Ruby et Swift. Si vous avez une langue que vous souhaitez utiliser avec un compilateur / interprète qui est un téléchargement relativement petit, je peux l'ajouter. Vous pouvez également utiliser une langue avec un interprète en ligne, mais cela ne fonctionnera pas aussi vite.
- Spécifiez dans votre réponse si vous souhaitez que les fonctions trigonométriques soient calculées en degrés ou en radians .
- Votre programme doit produire ses solutions dans les 200 cas de test (dans un fichier ou STDOUT) dans les 60 secondes sur mon Mac.
- L'aléatoire doit être semé.
- Votre production totale pour tous les cas de test ne peut pas être plus de 1 MB .
- Si vous avez amélioré votre solution et souhaitez être recalculé, ajoutez Re-Score en haut de votre réponse en gras.
Programmes
(changez l'argument "deg" en "rad" si vous voulez des radians)
- Tester l'évaluateur
- Score de la sortie de votre programme pour les cas de test
- Générez des cas de 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>
Classement
Scores de section (nombre de victoires):
- [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
Connexe: Générez une équation valide en utilisant des nombres spécifiés par l'utilisateur
cos(0)/sin(0^0)/sin(0^0)
.