changes
This commit is contained in:
@@ -7,7 +7,13 @@
|
|||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<form id="my-form" action="/plur_vote" method="post">
|
<style>
|
||||||
|
form, table, th, td {
|
||||||
|
border:1px solid black;
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<form id="my-form" style="background-color:#E0E0E0" action="/plur_vote" method="post">
|
||||||
This page is an experiment in voting. Half of the people who visit this site vote using Plurality Voting
|
This page is an experiment in voting. Half of the people who visit this site vote using Plurality Voting
|
||||||
where a voter selects their top candidate, and the winner is the candidate with the most votes. The other
|
where a voter selects their top candidate, and the winner is the candidate with the most votes. The other
|
||||||
half use Range Voting where voters score all familiar candidates based on how happy they would be should
|
half use Range Voting where voters score all familiar candidates based on how happy they would be should
|
||||||
|
|||||||
58
rangevote.js
58
rangevote.js
@@ -5,6 +5,7 @@ var hashindex=require('hash-index')
|
|||||||
|
|
||||||
var app = express()
|
var app = express()
|
||||||
|
|
||||||
|
|
||||||
var Candidates=[
|
var Candidates=[
|
||||||
"Chris Christie",
|
"Chris Christie",
|
||||||
"Donald Trump",
|
"Donald Trump",
|
||||||
@@ -27,27 +28,26 @@ function CanId(c)
|
|||||||
|
|
||||||
|
|
||||||
// Set up data structures for Range Votes and Plur Votes
|
// Set up data structures for Range Votes and Plur Votes
|
||||||
var RangeVotes=new Map();
|
var Experiment={}
|
||||||
var RangePower=new Map();
|
Experiment.RangeVotes=new Map();
|
||||||
var RangeResult=new Map();
|
Experiment.RangePower=new Map();
|
||||||
var PlurVotes=new Map();
|
Experiment.RangeResult=new Map();
|
||||||
var PlurResult=new Map();
|
Experiment.PlurVotes=new Map();
|
||||||
var PlurCount=0;
|
Experiment.PlurResult=new Map();
|
||||||
|
Experiment.PlurCount=0;
|
||||||
for (let c of Candidates)
|
for (let c of Candidates)
|
||||||
{
|
{
|
||||||
let k=CanId(c);
|
let k=CanId(c);
|
||||||
let v=RangePower.get(k);
|
let v=Experiment.RangePower.get(k);
|
||||||
if (typeof(v)!='number' || v==NaN || v==Infinity) RangePower.set(k,0);
|
if (typeof(v)!='number' || v==NaN || v==Infinity) Experiment.RangePower.set(k,0);
|
||||||
v=RangeResult.get(k);
|
v=Experiment.RangeResult.get(k);
|
||||||
if (typeof(v)!='number' || v==NaN || v==Infinity) RangeResult.set(k,0);
|
if (typeof(v)!='number' || v==NaN || v==Infinity) Experiment.RangeResult.set(k,0);
|
||||||
v=PlurResult.get(k);
|
v=Experiment.PlurResult.get(k);
|
||||||
if (typeof(v)!='number' || v==NaN || v==Infinity) PlurResult.set(k,0);
|
if (typeof(v)!='number' || v==NaN || v==Infinity) Experiment.PlurResult.set(k,0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Construct the static page for range voting
|
// Construct the static page for range voting
|
||||||
var RangeHTML="";
|
var RangeHTML="";
|
||||||
for (let c of Candidates)
|
for (let c of Candidates)
|
||||||
@@ -80,7 +80,7 @@ var jsonParser = bodyParser.json()
|
|||||||
var urlencodedParser = bodyParser.urlencoded({ extended: false })
|
var urlencodedParser = bodyParser.urlencoded({ extended: false })
|
||||||
|
|
||||||
app.get('/', (req, res) => {
|
app.get('/', (req, res) => {
|
||||||
let kind=hashindex(req.socket.remoteAddress+"salt",2);
|
let kind=hashindex(req.socket.remoteAddress+"saltA",2);
|
||||||
if (kind==0) res.send(RangeHTML);
|
if (kind==0) res.send(RangeHTML);
|
||||||
else res.send(PlurHTML);
|
else res.send(PlurHTML);
|
||||||
})
|
})
|
||||||
@@ -93,13 +93,16 @@ function lerp(a,b,c,d,e)
|
|||||||
return(rval);
|
return(rval);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function PlurVote(ip,NewChoice)
|
function PlurVote(ip,NewChoice)
|
||||||
{
|
{
|
||||||
let OldChoice=PlurResult.get(ip);
|
let OldChoice=Experiment.PlurVotes.get(ip);
|
||||||
if (typeof(OldChoice)=='string') { PlurResult.set(OldChoice,PlurResult.get(OldChoice)-1); PlurCount=PlurCount-1; }
|
if (typeof(OldChoice)=='string') { Experiment.PlurResult.set(OldChoice,Experiment.PlurResult.get(OldChoice)-1); Experiment.PlurCount-=1; }
|
||||||
if (!NewChoice) return;
|
if (!NewChoice) return;
|
||||||
NewChoice=CanId(NewChoice);
|
NewChoice=CanId(NewChoice);
|
||||||
if (typeof(NewChoice)=='string') { PlurResult.set(NewChoice,PlurResult.get(NewChoice)+1); PlurCount=PlurCount+1; }
|
if (typeof(NewChoice)=='string') { Experiment.PlurResult.set(NewChoice,Experiment.PlurResult.get(NewChoice)+1); Experiment.PlurCount+=1; }
|
||||||
|
Experiment.PlurVotes.set(ip,NewChoice);
|
||||||
|
console.log(Experiment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -107,8 +110,8 @@ function AddToRangeResult(vote,mult=1)
|
|||||||
{
|
{
|
||||||
for (let[key,val] of vote) if (key) if (val>=0)
|
for (let[key,val] of vote) if (key) if (val>=0)
|
||||||
{
|
{
|
||||||
RangeResult.set(key,RangeResult.get(key)+val*mult);
|
Experiment.RangeResult.set(key,Experiment.RangeResult.get(key)+val*mult);
|
||||||
RangePower.set(key,RangePower.get(key)+mult);
|
Experiment.RangePower.set(key,Experiment.RangePower.get(key)+mult);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -131,9 +134,9 @@ function RangeVote(ip,entries)
|
|||||||
let norm=Math.round(lerp(val,r0,r1,0,100));
|
let norm=Math.round(lerp(val,r0,r1,0,100));
|
||||||
if (val>=0) NewVote.set(id,norm);
|
if (val>=0) NewVote.set(id,norm);
|
||||||
}
|
}
|
||||||
let OldVote=RangeVotes.get(ip);
|
let OldVote=Experiment.RangeVotes.get(ip);
|
||||||
// if (OldVote) AddToRangeResult(OldVote,-1);
|
if (OldVote) AddToRangeResult(OldVote,-1);
|
||||||
RangeVotes.set(ip,NewVote);
|
Experiment.RangeVotes.set(ip,NewVote);
|
||||||
AddToRangeResult(NewVote,1);
|
AddToRangeResult(NewVote,1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,22 +144,23 @@ function RangeVote(ip,entries)
|
|||||||
// POST /login gets urlencoded bodies
|
// POST /login gets urlencoded bodies
|
||||||
app.post('/range_vote', urlencodedParser, function (req, res) {
|
app.post('/range_vote', urlencodedParser, function (req, res) {
|
||||||
RangeVote(req.socket.remoteAddress,Object.entries(req.body));
|
RangeVote(req.socket.remoteAddress,Object.entries(req.body));
|
||||||
let str="Results from "+RangeVotes.size+" Voters:<br>";
|
let str="Results from "+Experiment.RangeVotes.size+" Voters:<br>";
|
||||||
for (let c of Candidates)
|
for (let c of Candidates)
|
||||||
{
|
{
|
||||||
let key=CanId(c);
|
let key=CanId(c);
|
||||||
if (RangePower.get(key)>0) str=str+c+': '+Math.round(RangeResult.get(key)/RangePower.get(key))+'%<br>';
|
if (Experiment.RangePower.get(key)>0) str=str+c+': '+Math.round(Experiment.RangeResult.get(key)/Experiment.RangePower.get(key))+'% ('+Experiment.RangePower.get(key)+' Voters)<br>';
|
||||||
}
|
}
|
||||||
|
console.log(JSON.stringify(Experiment));
|
||||||
res.send(str);
|
res.send(str);
|
||||||
})
|
})
|
||||||
|
|
||||||
app.post('/plur_vote', urlencodedParser, function (req, res) {
|
app.post('/plur_vote', urlencodedParser, function (req, res) {
|
||||||
PlurVote(req.socket.remoteAddress,req.body.pick);
|
PlurVote(req.socket.remoteAddress,req.body.pick);
|
||||||
let str="Results:<br>";
|
let str="Results from "+Experiment.PlurVotes.size+" Voters:<br>";
|
||||||
for (let c of Candidates)
|
for (let c of Candidates)
|
||||||
{
|
{
|
||||||
let key=CanId(c);
|
let key=CanId(c);
|
||||||
if (PlurResult.get(key)>0) str=str+c+': '+Math.round(100.0*PlurResult.get(key)/PlurCount)+'%<br>';
|
if (Experiment.PlurResult.get(key)>0) str=str+c+': '+Math.round(100.0*Experiment.PlurResult.get(key)/Experiment.PlurCount)+'%<br>';
|
||||||
}
|
}
|
||||||
res.send(str);
|
res.send(str);
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user