Resolver la deuda global, la forma del código de golf

32

Los líderes del mundo se han reunido y finalmente han admitido que la mejor (y única) forma de resolver los problemas económicos mundiales es hacer un balance de cuánto se deben unos a otros y simplemente pagarse unos a otros con grandes cheques. Lo han contratado (irónicamente, a la tasa de contrato más baja posible) para encontrar la mejor manera de hacerlo.

Después de mucha deliberación y de pedirle a alguien que dibuje un ejemplo simple, se le ocurrió la siguiente especificación.

Cada país está representado por su código ISO 3166-1 alpha-2 : USpara EE. UU., AUAustralia, JPJapón, CNChina, etc.

  1. Un libro mayor se elabora como una serie de entradas de país y los montos adeudados a cada país.
  2. La entrada de cada país comienza con su ID de dominio, dos puntos, y cuánto tienen en superávit / déficit (en miles de millones de euros), seguido de un punto y coma, luego una lista de países separados por comas y cuánto (en miles de millones de Euro) que deben.
  3. Si un país no le debe nada a otro país, no se menciona ese país después de ese separador de punto y coma.
  4. Los déficits se indican como números negativos, el excedente se indica como un número positivo.
  5. Los valores también pueden ser flotantes.
  6. El libro mayor debe tomarse de STDIN. El final del libro mayor se indica mediante un retorno de carro en una línea en blanco. La cuenta debe ser entregada a STDOUT.

Un ejemplo de un libro mayor:

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

Luego, el sistema calcula cuánto debe y debe cada país y determina su superávit / déficit, por ejemplo, para AU:

AU = 8 (excedente actual) -10 (a EE. UU.) -15 (a CN) -3 (a JP) +12 (de EE. UU.) +8 (de CN) +6 (de JP) = 6

Cuando se realiza toda la computación, se debe mostrar una cuenta:

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

Su trabajo es crear este sistema, capaz de tomar cualquier cantidad de entradas en el libro mayor para cualquier número de países y capaz de determinar cuánto tiene déficit / superávit cada país cuando todo se paga.

La prueba definitiva es que use su código para resolver la deuda contraída entre los siguientes países en el siguiente caso de prueba. Estas cifras fueron tomadas de BBC News a partir de junio de 2011. ( http://www.bbc.com/news/business-15748696 )

Para los fines del ejercicio, he usado su PIB respectivo como su excedente actual ... Tenga en cuenta que este es estrictamente un ejercicio de garantía de calidad del código ... no se hablará de resolución económica global aquí en esta pregunta ... Si quieres hablar de economía, estoy seguro de que hay otro subdominio en SE que lo maneja ...

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

¡Ahora, sé el salvador económico del mundo!

Reglas:

  1. El código más corto gana ... este es el código golf después de todo ...
  2. Proporcione su salida del caso de prueba principal con su respuesta de código ...
WallyWest
fuente
1
En la "prueba definitiva", ¿no debería haber un punto y coma después JP:4100?
Mathieu Rodic
99
No puedo evitar preguntarme si esta es una forma muy inteligente de completar una tarea para usted. Si es así, te lo mereces.
mkingston
2
Sí, si hicieras esto con números reales, notarías una asombrosa contradicción. La suma de todos los excedentes y déficits será negativa.
Cruncher
3
En realidad, no es una tarea disfrazada ... Fue inspirado por mi torneo semanal de póker con mis amigos ... Tratando de encontrar una forma más rápida de calcular las ganancias para cada jugador;)
WallyWest
1
@WallyWest LOL;) por cierto, disculpas por los comentarios de OT, pero es un asunto que me apasiona bastante. Ahora volvamos a una codificación divertida y olvidemos los problemas del mundo ...
Tobia

Respuestas:

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
fuente
Increíblemente impresionado con este ... ¿hay alguna posibilidad de que pueda proporcionar un enlace al paradigma de programación K?
WallyWest
@WallyWest code.kx.com proporciona mucha información sobre q, que es el azúcar sintáctico que se encuentra encima de k. q, más gracias k, es lo que encontrarás en los sistemas de producción, pero para jugar al golf k tiene la ventaja. Consulte también Kona ( github.com/kevinlawler/kona ), que es una implementación de código abierto de una versión anterior de k
tmartin el
10

Perl, 139 137 134 119 119 112

Aquí hay otro código de trabajo ... Lo documentaré más tarde.

Código de golf

Con diccionario (112):

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

Sin diccionario (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}

Salida

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

¡Véalo en acción!

http://ideone.com/4iwyEP

Mathieu Rodic
fuente
44
La definición de "corto" debe juzgarse por la cantidad de tokens, no por los caracteres. Legibilidad 4 vida!
Domi
10
@Domi - eres nuevo aquí, ¿no es así ;-)
jimbobmcgee
44
@jimbobmcgee: También tengo la sensación de que este sitio web no tiene mucho que ver con la legibilidad ...
Mathieu Rodic
4

Pitón, 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])`

Salida con caso de prueba principal:

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

(pruébelo aquí: http://ideone.com/CjWG7v )

Mathieu Rodic
fuente
4

C - 257253 si no hay CR al final de la línea

Depende de sizeof (short) == 2.

Sin verificación de desbordamiento de búfer.

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

Salida:

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   

Menos golfizado:

#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
fuente
3

PHP - 338280

Debería funcionar con cualquier versión de PHP 5.

Golfizado :

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";

Sin 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";

Salida :

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
fuente
¿No sería más corto si lo usaras preg_match_all()y luego lo conectaras una vez?
Damir Kasipovic
3

perl (184 caracteres)

Código

%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";}

Salida

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

Salida:

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

Sin golf:

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
fuente
¡Agradable! Me gusta tu enfoque :)
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;}

Me doy cuenta de que el código es muy largo, pero disfruté la buena diversión. Esta es mi primera vez jugando al golf con código, y soy nuevo en C ++, por lo que agradezco mucho las sugerencias para mejorar mi código.

Resultados finales del desafío

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

Código sin 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
fuente
2
Hola, es bueno ver un ejemplo en C ++. Puede reducir el número de caracteres usando identificadores de una letra en lugar de nombres descriptivos, es decir, use i para la entrada , c para los países, etc.
ahy1
De acuerdo con @ ahy1 aquí ... Si reduce sus variables a 1 letra, puede recortar un poco de esto ... También puede encontrar esto de interés para futuros desafíos de golf: codegolf.stackexchange.com/questions/132/tips -para-jugar-en-c
WallyWest
Ah, y tampoco necesitarás cout << "Output:\n";... Eso es un ahorro de 20 bytes allí ...
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]}}

Y los resultados

$ 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

Sin golf

{
    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]
    }
}

(pruébelo aquí: http://ideone.com/pxqc07 )

Día del Juicio Final
fuente
¿Por qué incluso poner esos encabezados? Ahorrará más bytes sin ellos ... ni siquiera eran parte de la especificación que configuré ...;)
WallyWest
@WallyWest: Ok, entonces no entendí eso, porque se muestran en su primer ejemplo de Entrada y Salida, por ejemplo: (..) se debe mostrar una cuenta: Salida: (..) No se preocupe por eso, elimino Mi primer ejemplo ahora mismo.
Doomsday
2

Rubí - 225

Primero intente en un desafío como este, seguro que podría ser mucho mejor ...

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")

Y los resultados

$ 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
fuente
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'))

Bueno ... Sé que es bastante largo, pero este es mi segundo código de golf.

¡Sugerencias son bienvenidas!

Por cierto, Javascript interesante conserva el orden de los elementos en los hashmaps, por lo que, incluso si p contiene una matriz de diccionarios, puedo iterar cada diccionario como una matriz y estoy seguro de que el primer elemento de un dict es el primero insertado. (el nombre del país referido a la línea actual)

Sin golf:

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.

Nota: la entrada es una prompt()que debería ser una sola línea. Pero si copia / pega un texto de varias líneas (como la entrada propuesta) en una prompt()ventana, JSléalo todo.

Salida:

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
fuente
1
Utiliza la palabra "reemplazar" cuatro veces en su código. ¿Qué tal acortarlo así 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 esto me salvó 7 * 4- (3 * 4 + 11) personajes! (También pongo (w!=null)como(!w)
Antonio Ragagnin
@AntonioRagagnin ¿Podrías mostrar tu salida?
WallyWest
Gracias por tu mensaje @WallyWest. Resulta que !wno era una buena idea verificar w!=nully el script ya no funcionaba: p. Ahora lo actualizaré con los resultados
Antonio Ragagnin
Intente usar: 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"))para 229 bytes ... Lo que he hecho aquí es reducir la if(!c)secuencia a un único operador ternario, y también lo he incorporado en su forciclo principal ... También he hecho algo similar con el otro forciclo ... los operadores de coma pueden trabajar maravillosamente para unir múltiples declaraciones dentro de un ciclo ...
WallyWest
2

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

Golfed

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])

Sin golf

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])

Salida

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
fuente
No estoy seguro de que la variante sin golf funcionará correctamente porque en la variante de golf estoy usando operadores de una línea
tt.Kilew
¿puedes mostrar tu salida?
WallyWest
1
Sustituido R[b] ? R[b] += +v : R[b] = +vporR[b]=R[b]||0+ +v
tt.Kilew
1
Se eliminó el índice i=0;i++%2==0?b=vdeb=isNaN(+v)?v:
tt.Kilew el
1
isNaN(+v)->!+v
tt.Kilew
1

Maravilloso 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

Sin golf:

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
fuente
¿Por casualidad tienes un enlace a donde puedo encontrar más información sobre Groovy?
WallyWest
@WallyWest: Tengo este libro y aprendí toneladas de él. Siento que este es uno de esos idiomas que es bueno tener una referencia en el estante. enlace , también toneladas de información aquí: enlace
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;}

Versión sin golf:

$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
fuente