Küresel Borç, Kod Golf yolu çözmek


32

Dünya liderleri bir araya geldi ve nihayet küresel ekonomik sorunları çözmenin en iyi (ve tek) yolunun birbirlerine ne kadar borçlu olduklarının hisse senedini almak ve birbirlerine büyük çeklerle ödeme yapmak olduğunu kabul ettiler. Bunu yapmanın en iyi yolunu bulmanız için sizi (mümkün olan en düşük sözleşme oranında) ironik olarak kiraladılar.

Çok fazla müzakere sonrasında ve birinden basit bir örnek çizmesini istemek için, aşağıdaki spesifikasyonlarla karşılaştılar.

Her ülke ISO 3166-1 alfa-2 koduyla temsil edilir : USABD AUiçin, Avustralya JPiçin, Japonya CNiçin, Çin için ve diğerleri ...

  1. Bir defter, bir dizi ülke girişi ve her bir ülkeye ait tutarlar olarak düzenlenir.
  2. Her ülkenin girişi, etki alanı kimliği ile bir kolon ve ne kadar fazla / açık (milyarlarca Avro cinsinden), ardından bir noktalı virgül, daha sonra ülkelerin virgülle ayrılmış bir listesi ve ne kadarı (milyarlarca) Euro) borçlular.
  3. Bir ülke başka bir ülkeye hiçbir şey borçlu değilse, bu noktalı virgül ayırıcısından sonra o ülkeden söz edilmez.
  4. Açıklar negatif sayılarla, fazlalık pozitif sayılarla gösterilir.
  5. Değerler ayrıca yüzer olabilir.
  6. Defter STDIN'den alınmalıdır. Defterin sonu, boş bir satırda satır başı ile gösterilir. Tally STDOUT'a teslim edilmelidir.

Bir defter örneği:

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

Sistem daha sonra her ülkenin ne kadar borçlu olduğunu ve borçlu olduğunu hesaplar ve örneğin AU için fazla / açıklarını belirler:

AU = 8 (mevcut artı) -10 (ABD'den) -15 (CN'den) -3 (JP'den) +12 (ABD'den) +8 (CN'den) +6 (JP'den) = 6

Tüm hesaplamalar tamamlandığında, bir taksitli gösterilmelidir:

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

İşiniz bu sistemi oluşturmak, herhangi bir sayıda ülke için herhangi bir sayıda defter girişi alabilen ve her ülkenin her şey ödendiğinde ne kadar açık / fazla alabileceğini belirleyebilmek.

Nihai test, aşağıdaki test durumunda aşağıdaki ülkeler arasında borcunu çözmek için kodunuzu kullanmanız içindir. Bu rakamlar Haziran 2011'den itibaren BBC News'den alınmıştır. ( Http://www.bbc.com/news/business-15748696 )

Alıştırma için, kendi GSYH'lerini mevcut fazlası olarak kullandım ... Lütfen bunun kesinlikle kod kalite güvencesinde bir alıştırma olduğunu aklınızda bulundurun ... Bu soruda burada küresel ekonomik karardan söz edilmeyecek. ... Ekonomi hakkında konuşmak istiyorsanız, SE’de bunu yöneten başka bir alt etki alanı olduğundan eminim.

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

Şimdi, dünyanın ekonomik kurtarıcısı ol!

Kurallar:

  1. En kısa kod kazanır ... sonuçta kod golf budur ...
  2. Lütfen ana sınavın çıktısını kod yanıtınızla birlikte verin ...

1
"Nihai Test" te, sonradan noktalı virgül olmamalı JP:4100mı?
Mathieu Rodic

9
Yardım edemem ama bunun sizin için bir ev ödevinin tamamlanmasının çok akıllıca bir yolu olup olmadığını merak ediyorum. Eğer öyleyse, bunu hak ediyorsun.
mkingston

2
Evet, bunu yaptıysanız gerçek sayılar şaşırtıcı bir çelişki fark edersiniz. Tüm fazla ve açıkların toplamı negatif olacaktır.
Cruncher

3
Aslında, kılık değiştirmiş bir ev ödevi değil ... Arkadaşlarımla yaptığım haftalık poker turnuvamdan ilham
almıştı ...

1
@WallyWest LOL;) btw, OT yorumlarından dolayı özür diler, ancak bu konuda oldukça tutkulu olduğum bir konu. Şimdi kodlamaya geri dönelim ve dünyanın sıkıntılarını unutalım ...
Tobia

Yanıtlar:


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

Bu olaydan inanılmaz derecede etkilendim ... K programlama paradigmasıyla bağlantı kurma şansınız var mı?
WallyWest

@WallyWest code.kx.com provides lots of information on q, which is the syntactic sugar that sits on top of k. q, moreso thank k, is what you'll find in production systems but for golfing k has the edge. Also check out Kona (github.com/kevinlawler/kona) which is an open source implementation of an older version of k
tmartin

10

Perl, 139 137 134 119 112

Here's another working piece of code... I will document it later.

Golfed code

With dictionary (112):

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

Without dictionary (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}

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

See it in action!

http://ideone.com/4iwyEP


4
The definition of "short" should be judged by amount of tokens, not characters. Readability 4 life!
Domi

10
@Domi - you're new here, aren't you ;-)
jimbobmcgee

4
@jimbobmcgee: I also have a feeling this website is not much about readability...
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])`

Output with major test case:

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

(test it here: http://ideone.com/CjWG7v)


4

C - 257 253, satır sonunda CR yoksa

Sizeof'a bağlı olarak (kısa) == 2.

Tampon taşması kontrolü yok.

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

Çıktı:

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   

Daha az golf oynadı:

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

3

PHP - 338, 280

PHP 5'in herhangi bir sürümüyle çalışmalıdır.

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

Golfsüz :

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

Çıktı :

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

Kullanıp kısa bir süre preg_match_all()sonra ilmeklediyseniz daha kısa olmaz mıydı ?
Damir Kasipovic

3

perl (184 karakter)

kod

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

Çıktı

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

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

Çıktı:

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

Güzel! Yaklaşımınızı beğendim :)
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;}

Kodun çok uzun olduğunu biliyorum ama iyi eğlenceler. Bu benim ilk golf kodlarım golf ve C ++ 'ta yeniyim, bu yüzden kodumu geliştirmek için önerileri çok takdir ediyorum.

Final Mücadelesi Sonuçları

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

Ungolfed Kodu

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

2
Merhaba, C ++ 'da bir örnek görmek güzel. Açıklayıcı isimler yerine tek harfli tanımlayıcıları kullanarak karakter sayısını azaltabilirsiniz, örneğin girdiler için i , ülkeler için c ve benzerlerini kullanın.
ahy1

Burada @ ahy1 ile anlaşmıştınız ... Değişkenlerinizi 1 harfe düşürürseniz, bunun biraz daha fazlasını kesebilirsiniz ... Bunu gelecekteki golf zorlukları için de ilginizi çekebilir: codegolf.stackexchange.com/questions/132/tips golf için-in-c
WallyWest

Oh, ve cout << "Output:\n";ikisine de ihtiyacın olmayacak ... Orada 20 baytlık bir tasarruf var ...
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]}}

Ve sonuçlar

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

(burada test edin: http://ideone.com/pxqc07 )


Neden bu başlıkları koydun?
Onlarsız

@WallyWest: Tamam, anlamadım, çünkü ilk Girdi ve Çıktı örneğinizde sergilendiler, örneğin: (..) bir taksit gösterilmelidir: Çıktı: (..) Endişelenmeyin, çıkardım ilk örneğim şuan.
Kıyamet

2

Yakut - 225

İlk önce böyle bir meydan okumaya çalışın, çok daha iyi olacağından emin olun ...

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

Ve sonuçlar

$ 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

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

Şey ... oldukça uzun olduğunu biliyorum ama bu benim ikinci kod golf.

Önerilerinizi bekliyoruz!

BTW, İlginç Javascript hashmaps içindeki öğelerin sırasını korur, bu nedenle, p bir sözlük dizisi içeriyorsa bile, her sözlüğü bir dizi olarak yineleyebilirim ve bir diktenin ilk öğesinin ilk yerleştirilen olduğundan eminim. (mevcut satıra atfedilen ülkenin adı)

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.

Not: Giriş, prompt()tek bir satır olması gereken bir değerdir. Ancak çok satırlı bir metni kopyalayıp yapıştırın (önerilen girdi gibi)prompt() pencereyeJS hepsini okuyun.

Çıktı:

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

1
Kodunuzda dört kez "change" kelimesini kullanıyorsunuz . Nasıl bunu böyle kısaltarak hakkında: 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 bu beni 7 * 4- (3 * 4 + 11) karakterden kurtardı! (Ben de koymak (w!=null)olarak(!w)
Antonio Ragagnin

@AntonioRagagnin Lütfen çıktınızı gösterebilir misiniz?
WallyWest

@WallyWest mesajınız için teşekkür ederiz. Anlaşılması !wgereken iyi bir fikir değildi w!=nullve senaryo artık işe yaramadı: p. Şimdi sonuçları ile güncelleyeceğim
Antonio Ragagnin

Kullanmayı deneyin: 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"))229 bayt için ... Burada yaptığım şey, if(!c)diziyi tek bir üçlü operatöre indirdi ve ayrıca bunu ana fordöngüsüne dahil ettim ... Ayrıca diğer fordöngüye benzer bir şey yaptım ... virgül operatörleri bir döngü içinde birden fazla ifadeye katılmak için harika bir şekilde çalışabilirler ...
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])

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

Çıktı

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

Ungolfed varyantının düzgün çalışacağından emin değilim çünkü golf varyantında tek hat operatörleri kullanıyorum
tt.Kilew

Lütfen çıktınızı gösterebilir misiniz?
WallyWest

1
Değiştirilen R[b] ? R[b] += +v : R[b] = +viçinR[b]=R[b]||0+ +v
tt.Kilew

1
Kaldırılan endeks i=0;i++%2==0?b=viçinb=isNaN(+v)?v:
tt.Kilew

1
isNaN(+v)->!+v
tt.Kilew

1

Harika 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
    }
}

Groovy hakkında daha fazla bilgi bulabileceğim bir bağlantınız var mı?
WallyWest

@WallyWest: Bu kitabım var ve ondan tonlarca öğrendim. Bunun rafta referans almanın iyi olduğu dillerden biri olduğunu hissediyorum. bağlantı , Ayrıca burada bilgi ton: link
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;}

Ungolfed versiyonu:

$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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.