Вам надається 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 скоринг , який: . Якщо декілька відповідей отримують однаковий точний бал, бали діляться рівномірно, округлюючись до найближчого int. Наприклад, якщо програми на 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>
Таблиця лідерів
Оцінки за секцією (кількість перемог):
- [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)
.