Size 6 sayı verilir: 5 basamak [0-9] ve bir hedef sayı. Amacınız, hedefe olabildiğince yaklaşabilmek için basamaklar arasında operatörleri dağıtmaktır. Her rakamı kullanmak zorunda tam olarak bir kez ve aşağıdaki operatörleri kullanabilirsiniz birçok olarak istediğiniz kadar kat: + - * / () ^ sqrt sin cos tan
. Örneğin, bana verildiyse 8 2 4 7 2 65
çıktı alabilirim 82-(2*7)-4
. Bu 64 olarak değerlendirilir, böylece hedeften 1 uzakta olduğum için bana 1 puan verir. Not: Basamaklar arasına ondalık nokta koyamazsınız.
Matematiksel ifadeleri değerlendirmek için bu StackOverflow yanıt kodu kullanıyorum . Bu sorunun altında test etmek için kullanabileceğiniz programlar var.
Zincirleme İşlevleri (Güncelleme!)
@mdahmoune, bu zorluğun yeni bir karmaşıklık seviyesini ortaya çıkardı. Bu nedenle, yeni bir özellik ekliyorum: tekli fonksiyonları zincirleme. Bu günah, cos, tan ve sqrt üzerinde çalışır. Şimdi sin(sin(sin(sin(10))))
yazmak yerine , yazabilirsiniz sin_4(10)
. Değerlendiriciden deneyin!
Giriş
5 basamaklı 200 satır ayrılmış test durumu ve boşlukla ayrılmış bir hedef sayı. Programı örnek test senaryoları yapmak için sorunun alt kısmında kullanabilirsiniz, ancak resmi puanlama için kendi test vakalarım olacak. Test senaryoları, hedef test için aşağıdaki aralıklarla 40 testin 5 bölümüne ayrılmıştır:
- Bölüm 1: [0,1] (5 ondalık basamağa kadar)
- Bölüm 2: [0,10] (4 ondalık basamağa kadar)
- Bölüm 3: [0,1000] (3 ondalık basamağa kadar)
- 4. Bölüm: [0,10 6 ] (1 ondalık basamağa kadar)
- Bölüm 5: [0,10 9 ] (0 ondalık basamağa kadar)
Çıktı
200 satır ayrılmış matematiksel ifade. Örneğin, test senaryosu ise 5 6 7 8 9 25.807
, olası bir çıktı78-59+6
puanlama
Her turun amacı, diğer rakip programlardan daha fazla hedef sayıya yaklaşmaktır. Ben kullanacağım Mario Kart 8 puanlama olan: . Birden fazla cevap aynı kesin puanı alırsa, puanlar eşit olarak bölünür ve en yakın int'e yuvarlanır. Örneğin, 5. ila 8. sıradaki programlar bağlıysa, her biri o turda (8 + 7 + 6 + 5) / 4 = 6.5 => 7 puan alır. 200 raundun sonunda en çok puanı alan program kazanır. İki programın sonunda aynı sayıda nokta varsa, bağlantı kesici daha hızlı çalışmayı bitiren programdır.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
kurallar
- Mac'te C, C ++, Java, PhP, Perl, Python (2 veya 3), Ruby ve Swift gibi yaygın olarak önceden yüklenmiş dillerden birini kullanabilirsiniz. Eğer nispeten küçük bir indirme olan bir derleyici / yorumlayıcı ile kullanmak istediğiniz bir diliniz varsa onu ekleyebilirim. Çevrimiçi bir çevirmenle bir dil de kullanabilirsiniz, ancak bu kadar hızlı çalışmaz.
- Trig fonksiyonlarının derece veya radyan cinsinden hesaplanmasını istiyorsanız cevabınızda belirtin .
- Programınız çözümlerini 60 saniye içinde 200 test vakasına (bir dosyaya veya STDOUT'a) çıkarmalıdır. .
- Rasgelelik tohumlanmalıdır.
- Tüm test senaryoları için toplam çıktınız 1 MB'den fazla olamaz .
- Çözümünüzü iyileştirdiyseniz ve tekrar puan almak istiyorsanız, cevabınızın üstüne Yeniden Kalın olarak koyu puan ekleyin .
Programlar
(radyan istiyorsanız "deg" argümanını "rad" olarak değiştirin)
- Test değerlendiricisi
- Test senaryoları için programınızın çıktısını puanlayın
- Test senaryoları oluşturun:
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>
Liderler Sıralaması
Bölüm puanları (galibiyet sayısı):
- [0-1] kullanıcı20729 : 40, mdahmoune: 0
- [0-10] kullanıcı20729 : 40, mdahmoune: 0
- [0-1000] kullanıcı20729 : 39, mdahmoune: 1
- [0-10 6 ] user202729 : 33, mdahmoune: 7
- [0-10 9 ] user202729: 0, mdahmoune : 40
İlgili: Kullanıcı tarafından belirtilen sayıları kullanarak geçerli bir denklem oluşturma
cos(0)/sin(0^0)/sin(0^0)
.