Résoudre la dette mondiale, à la manière du Code Golf

32

Les dirigeants du monde se sont rencontrés et ont finalement admis que le meilleur (et le seul) moyen de résoudre les problèmes économiques mondiaux est de faire le bilan de ce qu'ils se doivent et de se payer les uns les autres avec d'énormes chèques. Ils vous ont engagé (ironiquement, au taux contractuel le plus bas possible) pour trouver les meilleurs moyens de le faire.

Après de longues délibérations et après avoir demandé à quelqu'un de dessiner un exemple simple, il a proposé la spécification suivante.

Chaque pays est représenté par son code ISO 3166-1 alpha-2 : USpour les USA, AUpour l'Australie, JPpour le Japon, CNpour la Chine ...

  1. Un grand livre est constitué d'une série d'écritures par pays et des montants dus à chaque pays.
  2. L'entrée de chaque pays commence par leur identifiant de domaine un colon, et combien ils ont en excédent / déficit (en milliards d'euros), suivi d'un point-virgule, puis d'une liste de pays séparés par des virgules et combien (en milliards de Euro) qu'ils doivent.
  3. Si un pays ne doit rien à un autre pays, aucune mention de ce pays n'est inscrite après ce séparateur point-virgule.
  4. Les déficits sont indiqués comme des nombres négatifs, l'excédent est indiqué comme un nombre positif.
  5. Les valeurs peuvent également être des flottants.
  6. Le grand livre doit être extrait de STDIN. La fin du grand livre est indiquée par un retour chariot sur une ligne vierge. Le décompte doit être remis à STDOUT.

Un exemple de grand livre:

Input:
AU:8;US:10,CN:15,JP:3
US:14;AU:12,CN:27,JP:14
CN:12;AU:8,US:17,JP:4
JP:10;AU:6,US:7,CN:10

Le système détermine ensuite le montant que chaque pays doit et doit et détermine leur excédent / déficit, par exemple pour l'UA:

AU = 8 (excédent courant) -10 (vers US) -15 (vers CN) -3 (vers JP) +12 (depuis US) +8 (depuis CN) +6 (depuis JP) = 6

Lorsque tout le calcul est terminé, un décompte doit être affiché:

Output:
AU:6
US:-5
CN:35
JP:8

Votre travail consiste à créer ce système, capable de prendre n'importe quel nombre d'entrées de grand livre pour n'importe quel nombre de pays et capable de déterminer combien chaque pays a un déficit / excédent lorsque tout est payé.

Le test ultime consiste à utiliser votre code pour résoudre la dette due entre les pays suivants dans le cas de test ci-dessous. Ces chiffres ont été extraits de BBC News en juin 2011. ( http://www.bbc.com/news/business-15748696 )

Aux fins de l'exercice, j'ai utilisé leur PIB respectif comme excédent actuel ... Veuillez garder à l'esprit qu'il s'agit strictement d'un exercice d'assurance de la qualité du code ... il ne sera pas question ici de résolution économique mondiale dans cette question ... Si vous voulez parler d'économie, je suis sûr qu'il y a un autre sous-domaine en SE qui le gère ...

US:10800;FR:440.2,ES:170.5,JP:835.2,DE:414.5,UK:834.5
FR:1800;IT:37.6,JP:79.8,DE:123.5,UK:227,US:202.1
ES:700;PT:19.7,IT:22.3,JP:20,DE:131.7,UK:74.9,US:49.6,FR:112
PT:200;IT:2.9,DE:26.6,UK:18.9,US:3.9,FR:19.1,ES:65.7
IT:1200;JP:32.8,DE:120,UK:54.7,US:34.8,FR:309,ES:29.5
IE:200;JP:15.4,DE:82,UK:104.5,US:39.8,FR:23.8
GR:200;DE:15.9,UK:9.4,US:6.2,FR:41.4,PT:7.5,IT:2.8
JP:4100;DE:42.5,UK:101.8,US:244.8,FR:107.7
DE:2400;UK:141.1,US:174.4,FR:205.8,IT:202.7,JP:108.3
UK:1700;US:578.6,FR:209.9,ES:316.6,IE:113.5,JP:122.7,DE:379.3

Maintenant, soyez le sauveur économique du monde!

Règles:

  1. Le code le plus court gagne ... c'est le code-golf après tout ...
  2. Veuillez fournir votre sortie du cas de test principal avec votre réponse de code ...
WallyWest
la source
1
Dans le "test ultime", ne devrait-il pas y avoir un point-virgule après JP:4100?
Mathieu Rodic
9
Je ne peux pas m'empêcher de me demander si c'est une façon très intelligente d'avoir un devoir à faire pour vous. Si oui, vous le méritez.
mkingston
2
Ouais, si vous faisiez cela, vous obtiendrez de vrais chiffres, vous remarquerez une étonnante contradiction. La somme de tous les excédents et déficits sera négative.
Cruncher
3
En fait, ce ne sont pas des devoirs déguisés ... Il a été inspiré de mon tournoi de poker hebdomadaire avec mes amis ... Essayer de trouver un moyen plus rapide de déterminer les gains de chaque joueur;)
WallyWest
1
@WallyWest LOL;) btw, excuses pour les commentaires de l'OT, mais c'est une question qui me passionne beaucoup. Revenons maintenant à un codage amusant et oublions les malheurs du monde ...
Tobia

Réponses:

11

K, 66

{(((!)."SF"$+":"\:'*+a)-+/'d)+/d:"F"$(!).'"S:,"0:/:last'a:";"\:'x}

.

k)input:0:`:ledg.txt
k){(((!)."SF"$+":"\:'*+a)-+/'d)+/d:"F"$(!).'"S:,"0:/:last'a:";"\:'x} input
US| 9439.3
FR| 2598.9
ES| 852.1
PT| 90.1
IT| 887.5
IE| 48
GR| 116.8
JP| 4817.4
DE| 2903.7
UK| 1546.2
tmartin
la source
Incroyablement impressionné par celui-ci ... avez-vous une chance de fournir un lien vers le paradigme de programmation K?
WallyWest
@WallyWest code.kx.com fournit de nombreuses informations sur q, qui est le sucre syntaxique qui se trouve au-dessus de k. q, moreso merci k, c'est ce que vous trouverez dans les systèmes de production, mais pour le golf, k a l'avantage. Consultez également Kona ( github.com/kevinlawler/kona ) qui est une implémentation open source d'une ancienne version de k
tmartin
10

Perl, 139 137 134 119 119 112

Voici un autre morceau de code de travail ... Je le documenterai plus tard.

Code golf

Avec dictionnaire (112):

for(<>){~/:(.+);/g;$d{$c=$`}+=$1;$l=$';$d{$1}+=$2,$d{$c}-=$2while$l=~/(..):([^,]+)/g}print"$_:$d{$_}
"for keys%d

Sans dictionnaire (137):

for($T=$t.=$_ for<>;$t=~/(..:)(.+);(.+)/g;print"$c$s\n"){$c=$1;$l=$3;$s=$2;$s-=$&while$l=~/[\d.]+/g;$s+=$1while$T=~/$c([\d.]+)(?!;|\d)/g}

Sortie

US:9439.3
FR:2598.9
ES:852.1
PT:90.1
IT:887.5
IE:48
GR:116.8
JP:4817.4
DE:2903.7
UK:1546.2

Voyez-le en action!

http://ideone.com/4iwyEP

Mathieu Rodic
la source
4
La définition de «court» doit être jugée en fonction du nombre de jetons et non de caractères. Lisibilité 4 vie!
Domi
10
@Domi - vous êtes nouveau ici, n'est-ce pas ;-)
jimbobmcgee
4
@jimbobmcgee: J'ai aussi le sentiment que ce site n'est pas beaucoup sur la lisibilité ...
Mathieu Rodic
4

Python, 211 185 183

import sys,re;t,R,F=sys.stdin.read(),re.findall,float;S=lambda e,s:sum(map(F,R(e,s)))
for m in R('(..:)(.+);(.+)',t):print m[0]+`F(m[1])+S(m[0]+'([\d.]+)(?!;|\d)',t)-S('[\d.]+',m[2])`

Sortie avec cas de test majeur:

US:9439.300000000001
FR:2598.9
ES:852.0999999999999
PT:90.09999999999997
IT:887.5
IE:48.0
GR:116.8
JP:4817.4
DE:2903.7
UK:1546.2000000000003

(testez-le ici: http://ideone.com/CjWG7v )

Mathieu Rodic
la source
4

C - 257 253 si aucun CR à la fin de la ligne

Dépend de sizeof (short) == 2.

Aucune vérification du dépassement de tampon.

#define C(c) x[*(short*)c]
main(i){double x[23131]={0},d;char*q,b[99],*(*s)()=strtok;for(;gets(b);)for(s(b,":"),C(b)+=atof(s(0,";"));q=s(0,":");C(b)-=d=(atof(s(0,","))),C(q)+=d);for(i=b[2]=0;i<23131;memcpy(b,&i,2),x[i]?printf("%s:%f\n",b,x[i++]):++i);}

Sortie:

DE:2903.700000  
IE:48.000000    
UK:1546.200000  
JP:4817.400000  
FR:2598.900000  
GR:116.800000   
ES:852.100000   
US:9439.300000  
IT:887.500000   
PT:90.100000   

Moins golfé:

#define C(c) x[*(short*)c]

main(i)
{
    double x[23131]={0}, d;
    char *q, b[99], *(*s)()=strtok;
    for(;gets(b);) 
        for(s(b, ":"),C(b)+=atof(s(0, ";")); 
            q=s(0, ":"); 
            C(b)-=d=(atof(s(0, ","))), C(q)+=d) ;

    for(i=b[2]=0; 
        i<23131; 
        memcpy(b, &i, 2), x[i]?printf("%s:%f\n", b, x[i++]):++i) ;
}
ahy1
la source
3

PHP - 338, 280

Devrait fonctionner avec n'importe quelle version de PHP 5.

Golfé :

while(preg_match("#(..):(.+);(.*)#",fgets(STDIN),$m)){$l[$m[1]][0]=(float)$m[2];foreach(explode(",",$m[3])as$x){$_=explode(":",$x);$l[$m[1]][1][$_[0]]=(float)$_[1];}}foreach($l as$c=>$d)foreach($d[1]as$_=>$o){$l[$_][0]+=$o;$l[$c][0]-=$o;}foreach($l as$c=>$d)echo$c,":",$d[0],"\n";

Non-golfé :

<?php

while( preg_match( "#(..):(\d+);(.*)#", fgets( STDIN ), $m ) )
{
    $l[$m[1]][0] = (float)$m[2];

    foreach( explode( ",", $m[3] ) as $x )
    {
        $_ = explode( ":", $x );
        $l[$m[1]][1][$_[0]] = (float)$_[1];
    }
}

foreach( $l as $c => $d )
    foreach( $d[1] as $_ => $o )
    {
        $l[$_][0] += $o;
        $l[$c][0] -= $o;
    }

foreach( $l as $c => $d )
    echo $c, ":", $d[0], "\n";

Sortie :

US:9439.3
FR:2598.9
ES:852.1
PT:90.1
IT:887.5
IE:48
GR:116.8
JP:4817.4
DE:2903.7
UK:1546.2
Tony Ellis
la source
Ne serait-il pas plus court si vous l'utilisiez preg_match_all()et que vous boucliez une seule fois?
Damir Kasipovic
3

perl (184 caractères)

Code

%c,%d,%e=();while(<>){$_=~/(..):(.+);(.*)/;$n=$1;$c{$1}=$2;for $i(split /,/,$3){$i=~/(..):(.+)/;$d{$1}+=$2;$e{$n}+=$2;}}for $i(keys %c){$c{$i}+=$d{$i}-$e{$i};print $i.":".$c{$i}."\n";}

Sortie

UK:1546.2
DE:2903.7
IT:887.5
FR:2598.9
PT:90.1
US:9439.3
JP:4817.4
ES:852.1
IE:48
GR:116.8
Glitch Desire
la source
3

Perl - 116 114 112

for(<>){($n,$m,@l)=split/[:;,]/;$h{$n}+=$m;$h{$n}-=$p,$h{$o}+=$p while($o,$p,@l)=@l}print"$_:$h{$_}\n"for keys%h

Sortie:

GR:116.8
UK:1546.2
DE:2903.7
IE:48
IT:887.5
US:9439.3
PT:90.1
ES:852.1
FR:2598.9
JP:4817.4

Ungolfed:

for(<>) {
    ($n, $m, @l)=split(/[:;,]/);
    $h{$n}+=$m;

    $h{$n}-=$p, $h{$o}+=$p while ($o,$p,@l)=@l
}
print "$_:$h{$_}\n" for keys%h
ahy1
la source
Agréable! J'aime ton approche :)
Mathieu Rodic
3

C ++ - 1254

#include<iostream>
#include<cstring>
#include<vector>
#include<sstream>
#include<cstdlib>
using namespace std;int main(){vector<string>input,countries,output;vector<double>results;string last_val;int j,k,i=0;cout<<"Input\n";do{getline(cin,last_val);if(last_val!=""){input.push_back(last_val);countries.push_back(last_val.substr(0,2));}}while(last_val!="");for(j=0;j<countries.size();j++){results.push_back(0);for(k=0;k<input.size();k++)input[k].substr(0, 2)==countries[j]?results[j]+=atof(input[k].substr((input[k].find(countries[j])+3),(input[k].find(',',input[k].find(countries[j]))-input[k].find(countries[j]))).c_str()):results[j]+=atof(input[k].substr((input[k].find(countries[j],3)+3),(input[k].find(',',input[k].find(countries[j]))-input[k].find(countries[j]))).c_str());}for(j=0;j<input.size();j++){for(k=0;k<countries.size();k++){if(input[j].substr(0,2)!=countries[k]){results[j]-=atof(input[j].substr((input[j].find(countries[k])+ 3),(input[j].find(',',input[k].find(countries[k]))-input[j].find(countries[j]))).c_str());}}}for(i=0;i<countries.size();i++){stringstream strstream;strstream<<countries[i]<<":"<<results[i];output.push_back(strstream.str().c_str());}cout<<"Output:\n";for(i=0;i<output.size();i++){cout<<output[i]<<'\n';}return 0;}

Je me rends compte que le code est très long, mais j'ai apprécié le bon plaisir. C'est la première fois que je joue au code, et je suis nouveau en C ++, donc les suggestions pour améliorer mon code sont très appréciées.

Résultats du défi final

Output:
US:9439.3
FR:2598.9
ES:852.1
PT:90.1
IT:887.5
IE:48
GR:116.8
JP:4817.4
DE:2903.7
UK:1546.2

Code non golfé

#include<iostream>
#include<cstring>
#include<vector>
#include<sstream>
#include<cstdlib>

using namespace std;

int main() {
  vector<string> input, countries, output;
  vector<double> results;
  string last_val;
  int i, j, k;

  cout << "Input\n";
  do {
    getline(cin, last_val);
    if(last_val != "") {
      input.push_back(last_val);
      countries.push_back(last_val.substr(0, 2));
    }
  } while(last_val != "");

  for(j = 0; j < countries.size(); j++) {
    results.push_back(0);
    for(k = 0; k < input.size(); k++) {
      if(input[k].substr(0, 2) == countries[j]) {
        results[j] += atof(input[k].substr((input[k].find(countries[j]) + 3),
                             (input[k].find(',', input[k].find(countries[j])) -
                              input[k].find(countries[j]))).c_str());
      } else {
        results[j] += atof(input[k].substr((input[k].find(countries[j], 3) + 3),
                             (input[k].find(',', input[k].find(countries[j])) -
                              input[k].find(countries[j]))).c_str());
      }
    }
  }

  for(j = 0; j < input.size(); j++) {
    for(k = 0; k < countries.size(); k++) {
      if(input[j].substr(0, 2) != countries[k]) {
        results[j] -= atof(input[j].substr((input[j].find(countries[k]) + 3),
                             (input[j].find(',', input[k].find(countries[k])) -
                              input[j].find(countries[j]))).c_str());
      }
    }
  }

  for(i = 0; i < countries.size(); i++) {
    stringstream strstream;
    strstream << countries[i] << ":" << results[i];
    output.push_back(strstream.str().c_str());
  }

  cout << "Output:\n";
  for(i = 0; i < output.size(); i++) {
    cout << output[i] << '\n';
  }

  return 0;
}
Dillmo
la source
2
Salut, c'est agréable de voir un exemple en C ++. Vous pouvez réduire le nombre de caractères en utilisant des identifiants à une lettre à la place des noms descriptifs, c'est-à-dire utiliser i pour la saisie , c pour les pays , etc.
ahy1
D'accord avec @ ahy1 ici ... Si vous réduisez vos variables à 1 lettre, vous pouvez en couper une bonne partie ... Vous pouvez également trouver cela intéressant pour les futurs défis de golf: codegolf.stackexchange.com/questions/132/tips -for-golfing-in-c
WallyWest
Oh, et vous n'aurez pas besoin non cout << "Output:\n";plus ... C'est une économie de 20 octets là-bas ...
WallyWest
3

AWK - 138 120

{l=split($0,h,"[:,;]");t[h[1]]+=h[2];for(i=3;i<l;i+=2){t[h[1]]-=h[i+1];t[h[i]]+=h[i+1]}}END{for(v in t){print v":"t[v]}}

Et les résultats

$ cat data.withoutInputHeadline |awk -f codegolf.awk
IT:887.5
UK:1546.2
DE:2903.7
PT:90.1
ES:852.1
FR:2598.9
GR:116.8
Input:0
JP:4817.4
IE:48
US:9439.3

Ungolfed

{
    l=split($0,h,"[:,;]");
    t[h[1]]+=h[2];
    for(i=3;i<l;i+=2){
        t[h[1]]-=h[i+1]
        t[h[i]]+=h[i+1]
    }
}
END{
    for(v in t){
        print v":"t[v]
    }
}

(testez-le ici: http://ideone.com/pxqc07 )

jour du Jugement dernier
la source
Pourquoi même mettre ces en-têtes? Vous économiserez plus d'octets sans eux ... ils ne faisaient même pas partie des spécifications que j'ai définies ...;)
WallyWest
@WallyWest: Ok, donc je n'ai pas compris cela, car ils sont affichés dans votre premier exemple d'entrée et de sortie, par exemple: (..) un décompte doit être affiché: Sortie: (..) Pas de souci, je supprime mon premier exemple en ce moment.
Doomsday
2

Rubis - 225

Essayez d'abord un défi comme celui-ci, bien sûr, cela pourrait être beaucoup mieux ...

R=Hash.new(0)
def pd(s,o=nil);s.split(':').tap{|c,a|R[c]+=a.to_f;o&&R[o]-=a.to_f};end
STDIN.read.split("\n").each{|l|c,d=l.split(';');pd(c);d.split(',').each{|s|pd(s,c.split(':')[0])}}
puts R.map{|k,v|"#{k}: #{v}"}.join("\n")

Et les résultats

$ cat data|ruby codegolf.rb
US: 9439.299999999997
FR: 2598.8999999999996
ES: 852.1
JP: 4817.4
DE: 2903.7
UK: 1546.2000000000003
IT: 887.5
PT: 90.09999999999998
IE: 48.0
GR: 116.8
MrRuru
la source
2

JS, 254 240 245

z='replace';r={};p=eval(('[{'+prompt()+'}]')[z](/\n/g,'},{')[z](/;/g,','));for(i in p){l=p[i];c=0;for(k in l){if(!c){c=k;r[c]=0;}else{r[c]-=l[k];}};for(j in p){w=p[j][c];if(w!=null)r[c]+=w}};alert(JSON.stringify(r)[z](/"|{|}/g,'')[z](/,/g,'\n'))

Eh bien ... je sais que c'est assez long mais c'est mon deuxième golf de code.

Les suggestions sont les bienvenues!

BTW, Javascript intéressant préserve l'ordre des éléments dans les hashmaps, donc, même si p contient un tableau de dictionnaires, je peux itérer chaque dictionnaire en tant que tableau et je suis sûr que le premier élément d'un dict est le premier inséré. (le nom du pays référé à la ligne actuelle)

Ungolfed:

z='replace';
r={};
p=eval(('[{'+prompt()+'}]')[z](/\n/g,'},{')[z](/;/g,',')); // make the string JSONable and then evaluate it in a structure
for(i in p){ 
    l=p[i];
    c=0;
    for(k in l){
            if(!c){ // if c is not still defined, this is the country we are parsing.
                    c=k;
                    r[c]=0;
            }
            else r[c]-=l[k];
    }; 
    for(j in p){
            w=p[j][c];
            if(!w)  r[c]+=w
    }
};
alert(JSON.stringify(r)[z](/"|{|}/g,'')[z](/,/g,'\n')) # Stringify the structure, makes it new-line separated.

Remarque: l'entrée est un prompt()qui devrait être une seule ligne. Mais si vous copiez / collez un texte sur plusieurs lignes (comme l'entrée proposée) dans une prompt()fenêtre, JSlisez tout.

Sortie:

US:9439.3
FR:2598.9
ES:852.1
PT:90.09999999999998
IT:887.5
IE:48
GR:116.8
JP:4817.4
DE:2903.7000000000003
UK:1546.2
Antonio Ragagnin
la source
1
Vous utilisez le mot «remplacer» quatre fois dans votre code. Que diriez-vous de le raccourcir comme ceci z='replace';r={};p=eval(('[{'+prompt()+'}]')[z](/\n/g,'},{')[z](/;/g,','));for(i in p){l=p[i];c=0;for(k in l){if(!c){c=k;r[c]=0;}else{r[c]-=l[k];}};for(j in p){w=p[j][c];if(w!=null)r[c]+=w}};alert(JSON.stringify(r)[z](/"|{|}/g,'')[z](/,/g,'\n')):?
user2428118
Woah cela m'a sauvé 7 * 4- (3 * 4 + 11) caractères! (Je mets (w!=null)aussi(!w)
Antonio Ragagnin
@AntonioRagagnin Pourriez-vous s'il vous plaît montrer votre sortie?
WallyWest
Merci pour votre message @WallyWest. Il s'est avéré que ce !wn'était pas une bonne idée de vérifier w!=nullet le script ne fonctionnait plus: p. Maintenant, je vais le mettre à jour avec les résultats
Antonio Ragagnin
Essayez d'utiliser: z="replace";r={};p=eval(("[{"+prompt()+"}]")[z](/\n/g,"},{")[z](/;/g,","));for(i in p){l=p[i];c=0;for(k in l)c?r[c]-=l[k]:(c=k,r[c]=0);for(j in p)w=p[j][c],null!=w&&(r[c]+=w)}alert(JSON.stringify(r)[z](/"|{|}/g,"")[z](/,/g,"\n"))pour 229 octets ... Ce que j'ai fait ici est de réduire la if(!c)séquence à un seul opérateur ternaire, et je l'ai également incorporé dans sa forboucle parent ... J'ai également fait quelque chose de similaire avec l'autre forboucle ... les opérateurs de virgule peuvent fonctionner à merveille pour joindre plusieurs instructions dans une boucle ...
WallyWest
2

JavaScript (ES6) 175 , 166 , 161 , 156 , 153 147

Golfé

R={};prompt().split(/\s/).map(l=>{a=l.split(/[;,:]/);c=b=a[0];a.map(v=>b=!+v?v:(R[b]=(R[b]||0)+ +v c==b?b:R[c]-=+v))});for(x in R)alert(x+':'+R[x])

Ungolfed

R = {};
prompt().split(/\s/).map(l => {
    a = l.split(/[;,:]/);       // Split them all!! 
                                // Now in a we have big array with Country/Value items
    c = b = a[0];               // c - is first country, b - current country
    a.map(v =>                
         b = !+v ? v                 // If v is country (not a number), simply update b to it's value          
                 : (R[b] = (R[b] ||0) + +v   // Safely Add value to current country
                   c == b ? c : R[c] -= +v)  // If current country is not first one, remove debth 
    )
});
for (x in R) alert(x + ':' + R[x])

Sortie

US:9439.299999999997
FR:2598.8999999999996
ES:852.1
JP:4817.4
DE:2903.7
UK:1546.2000000000003
IT:887.5
PT:90.09999999999998
IE:48
GR:116.8
tt.Kilew
la source
Je ne suis pas sûr que la variante non golfée fonctionnera correctement car dans la variante
golfée
pouvez-vous s'il vous plaît montrer votre sortie?
WallyWest
1
Remplacé R[b] ? R[b] += +v : R[b] = +vàR[b]=R[b]||0+ +v
tt.Kilew
1
Suppression de l'index i=0;i++%2==0?b=vdeb=isNaN(+v)?v:
tt.Kilew
1
isNaN(+v)->!+v
tt.Kilew
1

Groovy 315

def f(i){t=[:];i.eachLine(){l=it.split(/;|,/);s=l[0].split(/:/);if(!z(s[0]))t.put(s[0],0);t.put(s[0],x(z(s[0]))+x(s[1]));(1..<l.size()).each(){n=l[it].split(/:/);t.put(s[0],x(z(s[0]))-x(n[1]));if(!z(n[0]))t.put(n[0],0);t.put(n[0],x(z(n[0]))+x(n[1]))}};t.each(){println it}};def x(j){j.toDouble()};def z(j){t.get(j)}

Output:
US=9439.299999999997
FR=2598.8999999999996
ES=852.1
JP=4817.4
DE=2903.7
UK=1546.2000000000003
IT=887.5
PT=90.09999999999998
IE=48.0
GR=116.8

Ungolfed:

input = """US:10800;FR:440.2,ES:170.5,JP:835.2,DE:414.5,UK:834.5
FR:1800;IT:37.6,JP:79.8,DE:123.5,UK:227,US:202.1
ES:700;PT:19.7,IT:22.3,JP:20,DE:131.7,UK:74.9,US:49.6,FR:112
PT:200;IT:2.9,DE:26.6,UK:18.9,US:3.9,FR:19.1,ES:65.7
IT:1200;JP:32.8,DE:120,UK:54.7,US:34.8,FR:309,ES:29.5
IE:200;JP:15.4,DE:82,UK:104.5,US:39.8,FR:23.8
GR:200;DE:15.9,UK:9.4,US:6.2,FR:41.4,PT:7.5,IT:2.8
JP:4100;DE:42.5,UK:101.8,US:244.8,FR:107.7
DE:2400;UK:141.1,US:174.4,FR:205.8,IT:202.7,JP:108.3
UK:1700;US:578.6,FR:209.9,ES:316.6,IE:113.5,JP:122.7,DE:379.3"""

ungolfed(input)

def ungolfed(i){
    def tallyMap = [:]
    i.eachLine(){ 
        def lineList = it.split(/;|,/)
        def target = lineList[0].split(/:/)

        if(!tallyMap.get(target[0])){tallyMap.put(target[0],0)}
        tallyMap.put(target[0],tallyMap.get(target[0]).toDouble() + target[1].toDouble())
        (1..lineList.size()-1).each(){ e ->
            def nextTarget = lineList[e].split(/:/)
            //subtract the debt
            tallyMap.put(target[0], (tallyMap.get(target[0]).toDouble() - nextTarget[1].toDouble()))
            //add the debt
            if(!tallyMap.get(nextTarget[0])){ tallyMap.put(nextTarget[0], 0) }
            tallyMap.put(nextTarget[0], (tallyMap.get(nextTarget[0]).toDouble() + nextTarget[1].toDouble()))  
        }
    }
    tallyMap.each(){
        println it
    }
}
md_rasler
la source
Avez-vous un lien vers où trouver plus d'informations sur Groovy?
WallyWest
@WallyWest: J'ai ce livre et j'en ai appris des tonnes. Je pense que c'est une de ces langues qu'il est bon d'avoir une référence sur l'étagère. lien , également des tonnes d'informations ici: lien
md_rasler
1

PHP, 333

$a='';while(($l=trim(fgets(STDIN)))!='')$a.=$l.'\n';$a=rtrim($a,'\n');$p=explode('\n',$a);foreach($p as $q){preg_match('/^([A-Z]+)/',$q,$b);preg_match_all('/'.$b[0].':(\d+(?:\.\d+)?)/',$a,$c);$e=ltrim(strstr($q,';'),';');preg_match_all('/([A-Z]+)\:(\d+(?:\.\d+)?)/',$e,$d);echo $b[0].':'.(array_sum($c[1])-array_sum($d[2])).PHP_EOL;}

Version non golfée:

$a='';
while(($l=trim(fgets(STDIN)))!='')
    $a .= $l.'\n';
$a = rtrim($a,'\n');
$p = explode('\n',$a);
foreach($p as $q){
    preg_match('/^([A-Z]+)/',$q,$b);
    preg_match_all('/'.$b[0].':(\d+(?:\.\d+)?)/',$a,$c);
    $e = ltrim(strstr($q,';'),';');
    preg_match_all('/([A-Z]+)\:(\d+(?:\.\d+)?)/', $e, $d);
    echo $b[0].':'.(array_sum($c[1])-array_sum($d[2])).PHP_EOL;
}
kuldeep.kamboj
la source