Sim ou Não, resposta aleatória de Node.js

Às vezes preciso decidir algo com um simples yesou, nomas não sei o que fazer. Meu jeito é uma simples chamada de JavaScript:

Array.apply(null, new Array(1000)).map(Number.prototype.valueOf,0).map(function() { return Math.round(Math.random()*100000) % 2; }).reduce(function(carry, i) { if (i) { carry.yes++; } else { carry.no++; } return carry; }, {yes: 0, no: 0});

ok está um pouco sujo, então aqui está:

// Build an array with 1000 zeros
Array.apply(null, new Array(1000))
.map(Number.prototype.valueOf,0)
.map(function() {
// Fill up with zeros and ones
// based on random numbers (odd or even)
return Math.round(Math.random()*100000) % 2;
})
.reduce(
function(carry, i) {
// If one then it's a Yes
// If zero then it's a No
if (i) { carry.yes++; }
else { carry.no++; }
return carry;
},
{yes: 0, no: 0}
);

Agora eu tenho a resposta:

{ "yes": 506, "no": 494 }

Decisão tomada!

Ok, é um simples “Coin Flipper”, então melhore-o para lidar com mais respostas. Em primeiro lugar, transformar-se em uma função com parâmetros “infinitos”. Cada parâmetro será uma resposta, exceto o primeiro. O primeiro será uma série de amostras.

function iNeedAnswers() {
var args = Array.prototype.slice.call(arguments),
answerCount
= 0,
answers
;
if (args.length < 1) { sampleRate = 1000; }
else if (parseInt(args[0], 10) != args[0]) { sampleRate = 1000; }
else { sampleRate = parseInt(args.shift(), 10); }

if (args.length < 2) {
args
= ["Yes", "No"];
}

answers
= args.reduce(function(carry, answer) {
carry
[answer] = 0;
return carry;
}, {});

answerCount
= args.length;

// Build an array with 1000 zeros
return Array.apply(null, new Array(sampleRate))
.map(Number.prototype.valueOf, 0)
.map(function() {
// Fill up with zeros and ones
// based on random numbers (odd or even)
return Math.round(Math.random()*100000) % answerCount;
})
.reduce(
function(carry, i) {
carry
[args[i]]++;
return carry;
},
answers

);
}

Como ligar?

console.log(iNeedAnswers());
console
.log(iNeedAnswers(500));
console
.log(iNeedAnswers(500, "Yes"));
console
.log(iNeedAnswers(500, "Yes", "No"));
console
.log(iNeedAnswers(500, "Yes", "No", "Maybe"));
console
.log(iNeedAnswers("Yes", "No", "Maybe"));

Resultado?

{ "Yes": 515, "No": 485 }
{ "Yes": 252, "No": 248 }
{ "Yes": 240, "No": 260 }
{ "Yes": 242, "No": 258 }
{ "Yes": 155, "No": 170, "Maybe": 175 }
{ "Yes": 332, "No": 333, "Maybe": 335 }

Ok, não precisamos digitar isso sempre que precisarmos decidir algo. Adicione esta linha ao final do arquivo:

console.log(iNeedAnswers.apply(this, process.argv.slice(2)));

E isso no topo do arquivo (será a primeira linha) :

#!/usr/bin/env node

Agora temos um script incrível que podemos usar como qualquer outro programa em nosso sistema.

 chmod +x flip.js
mv flip.js /usr/local/bin/myflip
myflip
{ Yes: 468, No: 532 }
myflip 5000 Yes No Maybe
{ Yes: 1679, No: 1640, Maybe: 1681 }
myflip 5000 Yes No Maybe Tomorrow
{ Yes: 1225, No: 1259, Maybe: 1286, Tomorrow: 1230 }

Por isso diz: Não, não faça isso, ou se você realmente não sabe, talvez.

O código-fonte completo está disponível como uma essência: https://gist.github.com/Yitsushi/1ad9fe8638e0a0010906