Ajout de README.md (FR)

This commit is contained in:
philippe lhardy
2025-06-23 11:05:30 +02:00
parent b7d7fdf8a3
commit 38c4de6838
4 changed files with 75 additions and 2 deletions

View File

@@ -22,5 +22,7 @@ then
json=$json_file
fi
python3 parse_sample.py $json_file
php parse_sample.php $json_file
code_dir=../code/
python3 ${code_dir}parse_sample.py $json_file
php ${code_dir}parse_sample.php $json_file

View File

@@ -1,155 +0,0 @@
#!/bin/env php
<?php
if (count($argv) > 1) {
$poll_file=$argv[1];
}
else {
print('missing file argument');
exit(1);
}
$verbose=False;
# $poll_fd=fopen($poll_file,'r');
$poll_json=file_get_contents($poll_file);
$poll=json_decode($poll_json,True);
if ($verbose) {
print($poll_json);
print('=== json ===');
var_dump($poll);
}
$votants=$poll['votants']['decompte'];
$candidats=$poll['candidats'];
$nombre_candidats=count($candidats);
# l'ordre des mentions est de la meilleure à la pire (reject)
$nom_mentions=$poll['mentions'];
$mentions=count($nom_mentions);
$default_mention=$mentions-1;
$votes=$poll["votation"]["votes"];
if ($verbose) {
print("candidats\n");
var_dump($candidats);
print("votes:\n");
var_dump($votes);
}
$warnings=[];
$default_vote=[];
foreach ($candidats as $candidat => $nom_candidat ) {
$default_vote[$candidat]=$default_mention;
}
$collect=[];
foreach ($votes as $vote) {
# missing candidat in vote is the worts one
foreach ($candidats as $candidat => $nom_candidat ) {
if (! array_key_exists($candidat,$vote)) {
$vote[$candidat]=$default_mention;
}
}
foreach ( $vote as $candidat => $mention ) {
if ($mention > $default_mention or $mention < 0) {
$mention = $default_mention;
array_push($warnings,"index de mention invalide, soit la liste des mentions est erronnée soit la mention dans le vote est erronée");
}
if ( array_key_exists($candidat,$collect)) {
if ( array_key_exists($mention,$collect[$candidat])) {
$collect[$candidat][$mention]=$collect[$candidat][$mention]+1;
}
else {
$collect[$candidat][$mention]=1;
}
}
else {
$collect[$candidat]=[$mention => 1];
}
}
}
if ($verbose) {
print("collect:\n");
print(json_encode($collect));
}
$votant_median_check= ($votants % 2 == 0) ? intdiv($votants,2) : intdiv(($votants-1),2) + 1;
$votant_median=intdiv($votants, 2) + $votants % 2;
if ( $votant_median_check != $votant_median ) {
print('[ERROR] le nombre median de votants (' . $votant_median_check . '/' . $votant_median . ') semble erroné. contactez le developpeur de ce code.');
}
$merite=[];
$mention_mediane=[];
$merite_pourcent=[];
# cumul : du meilleur au pire
# range_mentions = range(count(mentions))
# cumul du pire au meilleur
$range_mentions = $mentions;
foreach ($candidats as $candidat => $nom_candidat) {
$vote=$collect[$candidat];
$cumul=0;
for ($i=0; $i < $range_mentions; $i ++) {
$m[$i]=0;
$pourcent[$i]=0;
}
$mention_m=null;
for ($mention=$range_mentions -1; $mention >=0; $mention --) {
if ( array_key_exists($mention,$vote) ) {
$cumul=$cumul+$vote[$mention];
$pourcent[$mention]= ( 100 * $vote[$mention] ) / $votants;
}
if ($cumul >= $votant_median and $mention_m == null ) {
$mention_m=$mention;
}
$m[$mention]=$cumul;
}
if ($cumul < $votants) {
print("[ERROR] le cumul des votes " . $cumul . " doit correspondre au nombre de votants. contactez le developpeur de ce code.");
}
$mention_mediane[$candidat]=$mention_m;
$merite[$candidat]=$m;
$merite_pourcent[$candidat]=$pourcent;
}
if ($verbose) {
print("\nmerite:\n");
print(json_encode($merite));
print("\nmention_mediane:\n");
print(json_encode($mention_mediane));
}
# les gagnants sont ceux qui ont la mention mediane minimale ( la meilleure )
$found=[];
for ($mention = 0; $mention < $mentions; $mention ++) {
foreach ($mention_mediane as $candidat => $merite_median)
if ($merite_median == $mention) {
$item=[];
$item[$candidat]=$candidats[$candidat];
array_push($found,$item);
}
if (count($found) > 0) {
break;
}
}
if ($verbose) {
print($found);
print($nom_mentions[$mention]);
}
$result = ['resultat'=> ['mention'=>$nom_mentions[$mention],'candidats' => $found],'merite' => $merite,'profil' => $merite_pourcent,"warnings" => $warnings];
print(json_encode($result));
?>

View File

@@ -1,115 +0,0 @@
import json
import sys
if len(sys.argv) > 1:
poll_file=sys.argv[1]
else:
print('missing file argument')
exit(1)
verbose=False
with open(poll_file,'r') as poll_fd:
poll = json.load(poll_fd)
if verbose:
print(poll)
votants=poll['votants']['decompte']
candidats=poll['candidats']
nombre_candidats=len(candidats)
# l'ordre des mentions est de la meilleure à la pire (reject)
nom_mentions=poll['mentions']
mentions=len(nom_mentions)
default_mention=mentions-1
votes=poll["votation"]["votes"]
if verbose:
print('candidats:' + str(candidats))
print(votes)
warnings=[]
default_vote={}
for candidat in candidats:
default_vote[candidat]=default_mention
collect={}
for vote in votes:
# missing candidat in vote is the worts one
for candidat in candidats:
if not candidat in vote:
vote[candidat]=default_mention
for candidat,mention in vote.items():
if mention > default_mention or mention < 0:
mention = default_mention
warnings.append("index de mention invalide, soit la liste des mentions est erronnée soit la mention dans le vote est erronée")
if candidat in collect:
if mention in collect[candidat]:
collect[candidat][mention]=collect[candidat][mention]+1
else:
collect[candidat][mention]=1
else:
collect[candidat]={mention:1}
if verbose:
print(collect)
votant_median_check= votants / 2 if votants % 2 == 0 else ((votants-1) / 2) +1
votant_median=votants // 2 + votants % 2
if votant_median_check != votant_median:
print('[ERROR] le nombre median de votants semble erroné. contactez le developpeur de ce code.' + str(votant_median_check))
merite={}
mention_mediane={}
merite_pourcent={}
# cumul : du meilleur au pire
# range_mentions = range(len(mentions))
# cumul du pire au meilleur
range_mentions = range(mentions-1,-1,-1)
for candidat in candidats:
vote=collect[candidat]
cumul=0
m=[0 for i in range(mentions)]
mention_m=None
pourcent=[0 for i in range(mentions)]
for mention in range_mentions:
if mention in vote:
cumul=cumul+vote[mention]
pourcent[mention]= ( 100 * vote[mention] ) / votants
if cumul >= votant_median and mention_m is None:
mention_m=mention
m[mention]=cumul
if cumul < votants:
print('[ERROR] le cumul des votes doit correspondre au nombre de votants. contactez le developpeur de ce code.')
mention_mediane[candidat]=mention_m
merite[candidat]=m
merite_pourcent[candidat]=pourcent
if verbose:
print(merite)
print(mention_mediane)
# les gagnants sont ceux qui ont la mention mediane minimale ( la meilleure )
found=[]
for mention in range(0,mentions):
for candidat,merite_median in mention_mediane.items():
if merite_median == mention:
found.append({candidat:candidats[candidat]})
if len(found) > 0:
break
if verbose:
print(found)
print(nom_mentions[mention])
result = {'resultat':{'mention':nom_mentions[mention],'candidats':found},'merite':merite,'profil':merite_pourcent,"warnings":warnings}
print(json.dumps(result))