Você recebe 6 números: 5 dígitos [0-9] e um número de destino. Seu objetivo é intercalar os operadores entre os dígitos para chegar o mais próximo possível do alvo. Você tem que usar cada dígito exatamente uma vez, e pode usar os seguintes operadores como muitas vezes quiser: + - * / () ^ sqrt sin cos tan
. Por exemplo, se eu receber, 8 2 4 7 2 65
eu posso produzir 82-(2*7)-4
. Isso é avaliado em 64, dando-me uma pontuação de 1 desde que eu estava 1 longe do alvo. Nota: Você não pode colocar um ponto decimal entre os dígitos.
Estou usando o código desta resposta StackOverflow para avaliar as expressões matemáticas. Na parte inferior desta pergunta, existem programas que você pode usar para testá-lo.
Funções de encadeamento (atualização!)
O @mdahmoune revelou um novo nível de complexidade para esse desafio. Como tal, estou adicionando um novo recurso: encadeando funções unárias. Isso funciona em sin, cos, tan e sqrt. Agora, em vez de escrever sin(sin(sin(sin(10))))
, você pode escreversin_4(10)
. Experimente no avaliador!
Entrada
200 casos de teste separados por linha de 5 dígitos e um número de destino separados por espaço. Você pode usar o programa na parte inferior da pergunta para criar exemplos de casos de teste, mas terei meus próprios casos de teste para pontuação oficial. Os casos de teste são divididos em 5 seções de 40 testes com os seguintes intervalos para o número de destino:
- Seção 1: [0,1] (com 5 casas decimais)
- Seção 2: [0,10] (com 4 casas decimais)
- Seção 3: [0,1000] (com 3 casas decimais)
- Seção 4: [0,10 6 ] (com 1 ponto decimal)
- Seção 5: [0,10 9 ] (com 0 casas decimais)
Resultado
Expressões matemáticas separadas por 200 linhas. Por exemplo, se o caso de teste for 5 6 7 8 9 25.807
, uma saída possível pode ser78-59+6
Pontuação
O objetivo de cada rodada é chegar mais perto do número alvo do que os outros programas concorrentes. Vou usar Mario Kart 8 de pontuação , que é: . Se várias respostas obtiverem a mesma pontuação exata, os pontos serão divididos igualmente, arredondados para o int mais próximo. Por exemplo, se os programas do 5º ao 8º lugar estão empatados, cada um recebe (8 + 7 + 6 + 5) / 4 = 6,5 => 7 pontos nessa rodada. Ao final de 200 rodadas, o programa que tiver mais pontos ganha. Se dois programas tiverem o mesmo número de pontos no final, o desempate é o programa que terminou a execução mais rapidamente.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
Regras
- Você pode usar apenas um dos idiomas comumente pré-instalados no Mac, como C, C ++, Java, PhP, Perl, Python (2 ou 3), Ruby e Swift. Se você tem um idioma que deseja usar com um compilador / intérprete que é um download relativamente pequeno, posso adicioná-lo. Você também pode usar um idioma com um intérprete online, mas isso não será executado tão rápido.
- Especifique na sua resposta se deseja que as funções trigonométricas sejam calculadas em graus ou radianos .
- Seu programa deve enviar suas soluções para todos os 200 casos de teste (em um arquivo ou STDOUT) dentro de 60 segundos no meu Mac.
- A aleatoriedade deve ser semeada.
- Sua saída total para todos os casos de teste não pode ser superior a 1 MB .
- Se você aprimorou sua solução e gostaria de ser pontuado novamente, adicione Recontar na parte superior da sua resposta em negrito.
Programas
(altere o argumento "deg" para "rad" se desejar radianos)
- Teste o avaliador
- Classifique a saída do seu programa para casos de teste
- Gere casos de teste:
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>
Entre os melhores
Pontuações da seção (número de vitórias):
- [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
Relacionado: Gere uma equação válida usando números especificados pelo usuário
cos(0)/sin(0^0)/sin(0^0)
.