Jump to content

Rēķinam koalīciju


NewAge
 Share

Recommended Posts

Laba diena!

 

Kamēr lielie onkuļi Saeimā vēl pagaidām nevar saprast kā un ar ko izveidot koalīciju, es izdomāju, ka mēs varētu palīdzēt viņiem to izdarīt vismaz tīri matemātiski. Un pie reizes paši patrenēties. Tātad uzdevums: savā mīļākajā programmēšanas valodā uzprogrammēt programmu, kas aprēķina un izvada visus iespējamos koalīcijas variantus un kopējo deputātu skaitu katras koalīcijas variantā.

 

Jāņem vērā, ka:

 

- koalīcijai nepieciešams vismaz 51 deputāts;

- ZZS nevar būt vienā koalīcijā ar ZRP;

- NA nevar būt vienā koalīcijā ar SC.

 

 

Pārējie var vērtēt katra kodu un likt plusus un mīnusus pēc sev vien zināmiem kritērijiem :D

 

Mans variants iekš Python:

 

#!/usr/bin/python
from itertools import combinations
Saeima={'SC':31,'ZRP':22,'V':20,'NA':14,'ZZS':13}
for i in xrange(len(Saeima)):
   for j in combinations(Saeima.keys(),i):
    if ('ZRP' in j and 'ZZS' in j) or ('NA' in j and 'SC' in j) or (len(j)==0):
	    del(j)
    else:
	    balsis=sum(Saeima.get(j) for j in j)
	    if balsis<51:
		    del(j)
	    else:
		    for k in j:
			    print k,
		    print balsis

 

Un rezultāts:

 

SC ZRP 53
SC V 51
SC ZRP V 73
SC ZZS V 64
ZRP NA V 56

Labots - NewAge
  • Patīk 4
Link to comment
Share on other sites

Politikas vai IT? :D

 

Bet, jā, man ar interesantāk risināt uzdevumus iz dzīves nevis kaut kādus pirmskaitļus meklēt, kuri dalās ar hvz ko. Lai gan sen jau neesmu students ;)

Labots - NewAge
Link to comment
Share on other sites

Python izskatās tīri sakarīga valoda, smuks kods. :D

 

Te ir mans darinājums iekš R (http://www.r-project.org/) (vajadzēja kādas 20 minūtes lai izdomātu :D ).

 

Saeima <- c(31,22,20,14,13)
Partijas <- c("SC","ZRF","V","NA","ZZS")
nesadarbojas <- list(c(31,14),c(22,13))

for (j in c(4,3,2))
{
summas <- combn (Saeima,j)
for (a in 1:ncol(summas))
{
 if (all(nesadarbojas[[1]] %in% summas[,a])==FALSE & all(nesadarbojas[[2]] %in% summas[,a])==FALSE)
 {
  balsiskopaa <- sum(summas[,a])
  {
if (balsiskopaa>=51)
{
 cat(c(Partijas[saeima%in%summas[,a]],balsiskopaa),"\n")
}
  }
 }
}
}

 

Un rezultāts:

 

SC ZRF V 73
SC V ZZS 64
ZRF V NA 56
SC ZRF 53
SC V 51

Labots - andza
Link to comment
Share on other sites

nepietiek ar vienu tofiku, jābāž visur caur caurēm tā politika? Skatos ziņas tur politika, skatos te politika, zb jau teikšu kā ir...

Link to comment
Share on other sites

Šis topiks nav par politiku, ja kādam tas nav skaidrs.

 

Andza, jā Python ir labs :D ... gaidam vēl variantus ;)

Link to comment
Share on other sites

  • 2 weeks later...

Re kur mans variants iekš Bash Shell.. quick and dirty ;)

 

#!/bin/bash
saeima=(SC ZRP V NA ZZS)
SC=31;ZRP=22;V=20;NA=14;ZZS=13
bin=""
ones="1"
for ((j=1;j<=${#saeima[@]};j++))
do
 bin="$bin$ones"
done
cntr="$(( 2#$bin ))"
for ((i=1;i<=$cntr;i++))
do
 revbin=$(echo "ibase=10;obase=2;$i"|bc|rev)
 r=0
 while (($r<${#revbin}))
 do
   tmparr[$r]=${revbin:$r:1}
   let r=$r+1
 done
 for t in ${!tmparr[@]}
 do
   if [ "${tmparr[$t]}" == "1" ]
   then
  koalicija[$t]=${saeima[$t]}
  echo -n "${koalicija[$t]} " >> tmpf
   fi
 done
 echo >> tmpf
done
while read line
do
 koalicija=($line)
 if [[ ${koalicija[@]} =~ ZRP && ${koalicija[@]} =~ ZZS ]]
 then
   unset koalicija
 elif [[ ${koalicija[@]} =~ SC && ${koalicija[@]} =~ NA ]]
 then
   unset koalicija
 else
   sum=0
   for v in ${!koalicija[@]}
   do
  let sum=$sum+$((${koalicija[$v]}))
   done
   if [ $sum -lt 51 ]
   then
  unset koalicija
   else
  echo ${koalicija[@]} $sum
   fi
 fi
done < tmpf
rm tmpf

 

Un rezultāts:

 

SC ZRP 53
SC V 51
SC ZRP V 73
ZRP V NA 56
SC V ZZS 64

Link to comment
Share on other sites

Versija iekš PHP

pietrūkst tādu lietu kā utilītfunkciju kombinācijām kā iekš R vai Python, tāpēc paņēmu kādu lietojamu.

liekas foršs kods ar dinamiski maināmiem nosacījumiem, tāpēc viss svarīgais iznests sākumā + funkcija validācijai ņem arī 3 un 4 un 5 nesaderīgās partijas.

 

~20min.

 

<?php
// init vars
$persons_required = 51;
$partijas = array('SC'=>31,'ZRP'=>22,'V'=>20,'NA'=>14,'ZZS'=>13);
$incompatible = array(array('ZZS','ZRP'), array('SC','NA'));

// walk combinations, echo valid;
foreach(pc_array_power_set(array_keys($partijas)) as $comb){
	$sum = calc_sum($comb, $partijas); // get sum
	if($sum < 51){ continue; } // sum validation
	if(validate($comb, $incompatible)){ // perform compatibility test
			echo implode(' ',array_values($comb)).' '.$sum.'.'; // output
	}
}
################################################
// app-specific code

function calc_sum($comb, $partijas){
	$sum = 0; foreach($comb as $party){ /*pārty pīpl!*/ $sum += $partijas[$party]; }
	return $sum;
}
function validate($comb, $incompatible){
	foreach($incompatible as $inc){
			$all_dangerous_found = true;
			foreach($inc as $one){
					if(!in_array($one, $comb)){$all_dangerous_found = false;}
			}
			if($all_dangerous_found){ return false; }
	}
	return true;
}

// utility functions
function pc_array_power_set($array) {
	$results = array(array( ));
	foreach ($array as $element)
			foreach ($results as $combination)
					array_push($results, array_merge(array($element), $combination));
	return $results;
}
?>

 

Rezultāts:



ZRP SC 53
V SC 51
V ZRP SC 73
NA V ZRP 56
ZZS V SC 64

Link to comment
Share on other sites

Bashā arī nav funkcijas, kas izvada kombinācijas, tāpēc nācās domāt algoritmu un rakstīt pašam. Pa lielam tā jau ir šī uzdevuma grūtākā daļa.

Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...