Вам дается 6 номеров: 5 цифр [0-9] и целевой номер. Ваша цель - распределить операторы между цифрами так, чтобы вы как можно ближе к цели. Вы должны использовать каждую цифру точно один раз, и можете использовать следующие операторы , как много раз , как вы хотите: + - * / () ^ sqrt sin cos tan
. Например, если мне дают, 8 2 4 7 2 65
я могу вывести 82-(2*7)-4
. Это оценивает к 64, таким образом давая мне счет 1, так как я был 1 далеко от цели. Примечание. Нельзя ставить десятичную точку между цифрами.
Я использую код из этого ответа StackOverflow для оценки математических выражений. В нижней части этого вопроса есть программы, которые вы можете использовать, чтобы проверить это.
Функции цепочки (обновление!)
@mdahmoune показал новый уровень сложности этой задачи. Поэтому я добавляю новую функцию: объединение унарных функций. Это работает на sin, cos, tan и sqrt. Теперь вместо того, чтобы писать sin(sin(sin(sin(10))))
, вы можете написать sin_4(10)
. Попробуйте это в оценщике!
вход
200 разделенных на строки тестовых наборов из 5 цифр и целевого числа, разделенных пробелами. Вы можете использовать программу в нижней части вопроса, чтобы сделать примеры тестовых случаев, но у меня будут свои собственные тестовые случаи для официальной оценки. Тестовые случаи разбиты на 5 разделов из 40 тестов со следующими диапазонами для целевого числа:
- Раздел 1: [0,1] (до 5 десятичных знаков)
- Раздел 2: [0,10] (до 4 десятичных знаков)
- Раздел 3: [0,1000] (до 3 десятичных знаков)
- Раздел 4: [0,10 6 ] (до 1 десятичного знака)
- Раздел 5: [0,10 9 ] (до 0 десятичных знаков)
Выход
200 разделенных строкой математических выражений. Например, если контрольный пример есть 5 6 7 8 9 25.807
, возможный вывод может быть78-59+6
счет
Цель каждого раунда - приблизиться к целевому числу, чем другие конкурирующие программы. Я собираюсь использовать Mario Kart 8 скоринг , который: . Если несколько ответов получают одинаковую точную оценку, баллы делятся поровну, округляя до ближайшего целого. Например, если программы на 5-8-м месте связаны, каждая из них получает (8 + 7 + 6 + 5) / 4 = 6,5 => 7 баллов за этот раунд. В конце 200 раундов победила программа, набравшая наибольшее количество очков. Если две программы имеют одинаковое количество точек в конце, прерыватель связей - это программа, которая закончилась быстрее.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
правила
- Вы можете использовать только один из языков, обычно предустановленных на Mac, например C, C ++, Java, PhP, Perl, Python (2 или 3), Ruby и Swift. Если у вас есть язык, который вы хотите использовать с относительно небольшим количеством компилятора / интерпретатора, я могу добавить его. Вы также можете использовать язык с онлайн-переводчиком, но он не будет работать так быстро.
- Укажите в своем ответе, хотите ли вы, чтобы функции триггера были рассчитаны в градусах или радианах .
- Ваша программа должна вывести свои решения на все 200 тестовых случаев (в файл или STDOUT) в течение 60 секунд на моем Mac.
- Случайность должна быть засеяна.
- Общий объем вывода для всех тестовых случаев не может превышать 1 МБ .
- Если вы улучшили свое решение и хотите, чтобы его пересмотрели, добавьте « Пересчет» вверху ответа жирным шрифтом.
программы
(измените аргумент "deg" на "rad", если вы хотите радианы)
- Тестовый оценщик
- Оценка результатов вашей программы для тестовых случаев
- Генерация тестовых случаев:
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>
Leaderboard
Результаты по разделу (количество побед):
- [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
Связанный: Генерация правильного уравнения, используя указанные пользователем числа
cos(0)/sin(0^0)/sin(0^0)
.