This commit is contained in:
2023-10-02 00:19:45 -04:00
parent 97183497ba
commit f6508ca91a
2 changed files with 38 additions and 28 deletions

View File

@@ -7,7 +7,13 @@
</head>
<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
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

View File

@@ -5,6 +5,7 @@ var hashindex=require('hash-index')
var app = express()
var Candidates=[
"Chris Christie",
"Donald Trump",
@@ -27,27 +28,26 @@ function CanId(c)
// Set up data structures for Range Votes and Plur Votes
var RangeVotes=new Map();
var RangePower=new Map();
var RangeResult=new Map();
var PlurVotes=new Map();
var PlurResult=new Map();
var PlurCount=0;
var Experiment={}
Experiment.RangeVotes=new Map();
Experiment.RangePower=new Map();
Experiment.RangeResult=new Map();
Experiment.PlurVotes=new Map();
Experiment.PlurResult=new Map();
Experiment.PlurCount=0;
for (let c of Candidates)
{
let k=CanId(c);
let v=RangePower.get(k);
if (typeof(v)!='number' || v==NaN || v==Infinity) RangePower.set(k,0);
v=RangeResult.get(k);
if (typeof(v)!='number' || v==NaN || v==Infinity) RangeResult.set(k,0);
v=PlurResult.get(k);
if (typeof(v)!='number' || v==NaN || v==Infinity) PlurResult.set(k,0);
let v=Experiment.RangePower.get(k);
if (typeof(v)!='number' || v==NaN || v==Infinity) Experiment.RangePower.set(k,0);
v=Experiment.RangeResult.get(k);
if (typeof(v)!='number' || v==NaN || v==Infinity) Experiment.RangeResult.set(k,0);
v=Experiment.PlurResult.get(k);
if (typeof(v)!='number' || v==NaN || v==Infinity) Experiment.PlurResult.set(k,0);
}
// Construct the static page for range voting
var RangeHTML="";
for (let c of Candidates)
@@ -80,7 +80,7 @@ var jsonParser = bodyParser.json()
var urlencodedParser = bodyParser.urlencoded({ extended: false })
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);
else res.send(PlurHTML);
})
@@ -93,13 +93,16 @@ function lerp(a,b,c,d,e)
return(rval);
}
function PlurVote(ip,NewChoice)
{
let OldChoice=PlurResult.get(ip);
if (typeof(OldChoice)=='string') { PlurResult.set(OldChoice,PlurResult.get(OldChoice)-1); PlurCount=PlurCount-1; }
let OldChoice=Experiment.PlurVotes.get(ip);
if (typeof(OldChoice)=='string') { Experiment.PlurResult.set(OldChoice,Experiment.PlurResult.get(OldChoice)-1); Experiment.PlurCount-=1; }
if (!NewChoice) return;
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)
{
RangeResult.set(key,RangeResult.get(key)+val*mult);
RangePower.set(key,RangePower.get(key)+mult);
Experiment.RangeResult.set(key,Experiment.RangeResult.get(key)+val*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));
if (val>=0) NewVote.set(id,norm);
}
let OldVote=RangeVotes.get(ip);
// if (OldVote) AddToRangeResult(OldVote,-1);
RangeVotes.set(ip,NewVote);
let OldVote=Experiment.RangeVotes.get(ip);
if (OldVote) AddToRangeResult(OldVote,-1);
Experiment.RangeVotes.set(ip,NewVote);
AddToRangeResult(NewVote,1);
}
@@ -141,22 +144,23 @@ function RangeVote(ip,entries)
// POST /login gets urlencoded bodies
app.post('/range_vote', urlencodedParser, function (req, res) {
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)
{
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);
})
app.post('/plur_vote', urlencodedParser, function (req, res) {
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)
{
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);
})