5つの数字[0-9]とターゲット番号の6つの数字が与えられます。あなたの目標は、数字の間に演算子を点在させて、ターゲットにできるだけ近づけることです。あなたは、各桁を使用する必要が正確に一度、そして次の演算子を使用することができ 、多くとしてあなたが好きな回:+ - * / () ^ 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)
。評価者で試してみてください!
入力
スペースで区切られた5桁の200行のテストケースとターゲット番号。質問の下部にあるプログラムを使用してサンプルのテストケースを作成できますが、公式の採点用に独自のテストケースを用意します。テストケースは、40個のテストの5つのセクションに分割され、ターゲット番号の範囲は次のとおりです。
- セクション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
得点
各ラウンドの目標は、他の競合プログラムよりも目標数に近づくことです。私が使用するつもりだマリオカート8得点:あり、。複数の回答が同じ正確なスコアを取得した場合、ポイントは均等に分割され、最も近い整数に丸められます。たとえば、5位から8位のプログラムが同点の場合、各プログラムはそのラウンドで(8 + 7 + 6 + 5)/ 4 = 6.5 => 7ポイントを獲得します。200ラウンドの終了時に、最もポイントを獲得したプログラムが勝ちます。2つのプログラムが最後に同じ数のポイントを持っている場合、タイブレーカーはより速く実行を終了したプログラムです。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
ルール
- C、C ++、Java、PhP、Perl、Python(2または3)、Ruby、Swiftなど、Macに一般的にプリインストールされている言語の1つのみを使用できます。比較的小さなダウンロードであるコンパイラー/インタープリターで使用したい言語がある場合は、追加できます。オンラインインタープリターで言語を使用することもできますが、それは高速では実行されません。
- 三角関数を度またはラジアンで計算する場合は、回答で指定します。
- あなたのプログラムは、私のMac で60秒以内に200のすべてのテストケース(ファイルまたはSTDOUT)にソリューションを出力する必要があります。
- ランダム性をシードする必要があります。
- すべてのテストケースの合計出力は1 MBを超えることはできません。
- ソリューションを改善し、再度スコアを付けたい場合は、回答の上部に太字で再スコアを追加します。
プログラム
(ラジアンが必要な場合は、「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)
。