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> </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

View File

@@ -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);
}) })