Selesaikan Utang Global, cara Golf Code

32

Para pemimpin dunia telah bertemu dan akhirnya mengakui bahwa cara terbaik (dan satu-satunya) untuk menyelesaikan kesengsaraan ekonomi global adalah dengan menghitung berapa banyak mereka berutang satu sama lain dan hanya membayar satu sama lain dengan cek besar. Mereka telah mempekerjakan Anda (ironisnya, dengan tarif kontrak serendah mungkin) untuk mencari cara terbaik untuk melakukannya.

Setelah banyak pertimbangan, dan meminta seseorang untuk menggambar contoh sederhana, mereka telah datang dengan spesifikasi berikut.

Setiap negara diwakili oleh kode ISO 3166-1 alpha-2 mereka : USuntuk AS, AUuntuk Australia, JPuntuk Jepang, CNuntuk Cina dan seterusnya ...

  1. Buku besar disusun sebagai serangkaian entri negara dan jumlah yang terutang ke masing-masing negara.
  2. Entri masing-masing negara dimulai dengan ID domain mereka titik dua, dan berapa banyak yang mereka miliki dalam surplus / defisit (dalam miliaran Euro), diikuti oleh tanda titik koma, kemudian daftar negara-negara yang dipisahkan koma, dan berapa banyak (dalam miliaran dolar AS) Euro) mereka berutang.
  3. Jika suatu negara tidak berutang apa pun kepada negara lain, tidak disebutkan negara itu dimasukkan setelah pemisah titik koma itu.
  4. Defisit diindikasikan sebagai angka negatif, surplus diindikasikan sebagai angka positif.
  5. Nilai juga bisa mengapung.
  6. Buku besar harus diambil dari STDIN. Ujung buku besar ditandai dengan carriage return pada baris kosong. Penghitungan harus dikirim ke STDOUT.

Contoh buku besar:

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 kemudian menghitung berapa banyak masing-masing negara berutang dan berutang serta menentukan surplus / defisit mereka, misalnya, untuk AU:

AU = 8 (surplus saat ini) -10 (ke AS) -15 (ke CN) -3 (ke JP) +12 (dari AS) +8 (dari CN) +6 (dari JP) = 6

Ketika semua komputasi dilakukan, penghitungan harus ditunjukkan:

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

Tugas Anda adalah menciptakan sistem ini, yang mampu mengambil sejumlah entri buku besar untuk sejumlah negara dan mampu menentukan seberapa banyak masing-masing negara memiliki defisit / surplus ketika semuanya dibayarkan.

Tes akhir adalah bagi Anda untuk menggunakan kode Anda untuk menyelesaikan utang yang terhutang antara negara-negara berikut dalam kasus uji di bawah ini. Angka-angka ini diambil dari BBC News pada Juni 2011. ( http://www.bbc.com/news/business-15748696 )

Untuk keperluan latihan ini, saya telah menggunakan PDB masing-masing sebagai surplus saat ini ... Harap diingat bahwa ini hanyalah latihan dalam penjaminan kualitas kode ... tidak akan ada pembicaraan mengenai resolusi ekonomi global di sini dalam pertanyaan ini ... Jika Anda ingin berbicara ekonomi, saya yakin ada subdomain lain di SE yang menanganinya ...

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

Sekarang, jadilah penyelamat ekonomi dunia!

Aturan:

  1. Kode terpendek menang ... ini golf kode ...
  2. Harap berikan hasil uji kasus utama Anda dengan jawaban kode Anda ...
WallyWest
sumber
1
Dalam "ujian akhir", bukankah harus ada titik koma setelahnya JP:4100?
Mathieu Rodic
9
Mau tidak mau saya bertanya-tanya apakah ini adalah cara yang sangat cerdas untuk menyelesaikan pekerjaan rumah untuk Anda. Jika demikian, Anda layak mendapatkannya.
mkingston
2
Ya, jika Anda melakukan ini akan nomor nyata Anda akan melihat kontradiksi yang menakjubkan. Jumlah semua surplus dan defisit akan negatif.
Cruncher
3
Sebenarnya, ini bukan pekerjaan rumah yang terselubung ... Itu terinspirasi dari turnamen poker mingguan saya dengan teman-teman saya ... Mencoba mencari cara yang lebih cepat untuk menentukan kemenangan untuk setiap pemain;)
WallyWest
1
@WallyWest LOL;) btw, permintaan maaf untuk komentar PL, tapi itu masalah yang saya sukai. Sekarang mari kita kembali ke pengkodean yang menyenangkan dan lupakan kesengsaraan dunia ...
Tobia

Jawaban:

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
sumber
Sangat terkesan dengan yang ini ... ada kemungkinan Anda bisa memberikan tautan ke paradigma pemrograman K?
WallyWest
@WallyWest code.kx.com menyediakan banyak informasi tentang q, yang merupakan gula sintaksis yang berada di atas k. q, lebih lanjut terima kasih k, adalah apa yang akan Anda temukan dalam sistem produksi tetapi untuk golf k memiliki keunggulan. Lihat juga Kona ( github.com/kevinlawler/kona ) yang merupakan implementasi open source dari versi yang lebih lama dari k
tmartin
10

Perl, 139 137 134 119 112

Ini bagian lain dari kode yang berfungsi ... Saya akan mendokumentasikannya nanti.

Kode golf

Dengan kamus (112):

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

Tanpa kamus (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}

Keluaran

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

Lihat itu dalam aksi!

http://ideone.com/4iwyEP

Mathieu Rodic
sumber
4
Definisi "pendek" harus dinilai berdasarkan jumlah token, bukan karakter. Keterbacaan 4 kehidupan!
Domi
10
@Domi - Anda baru di sini, bukan ;-)
jimbobmcgee
4
@jimbobmcgee: Saya juga merasa situs web ini tidak banyak tentang keterbacaan ...
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 dengan uji kasus utama:

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

(uji di sini: http://ideone.com/CjWG7v )

Mathieu Rodic
sumber
4

C - 257 253 jika tidak ada CR di ujung jalur

Tergantung pada sizeof (pendek) == 2.

Tidak ada pemeriksaan untuk buffer overflow.

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

Keluaran:

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   

Kurang bermain 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
sumber
3

PHP - 338, 280

Harus bekerja dengan versi PHP 5 apa pun.

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

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

Keluaran :

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
sumber
Bukankah lebih pendek jika Anda menggunakan preg_match_all()dan kemudian hanya dilingkarkan sekali?
Damir Kasipovic
3

perl (184 karakter)

Kode

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

Keluaran

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
Keinginan Glitch
sumber
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

Keluaran:

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

Tidak Disatukan:

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
sumber
Bagus! Saya suka pendekatan Anda :)
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;}

Saya menyadari kodenya sangat panjang, tetapi menikmati kesenangannya. Ini adalah golf kode waktu pertama saya, dan saya baru mengenal C ++, jadi saran untuk meningkatkan kode saya sangat dihargai.

Hasil Tantangan Akhir

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

Kode Tidak Terkunci

#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
sumber
2
Hai, Senang melihat contoh di C ++. Anda dapat mengurangi jumlah karakter dengan menggunakan pengenal satu huruf sebagai ganti nama deskriptif, yaitu menggunakan i untuk input , c untuk negara dan sebagainya.
ahy1
Setuju dengan @ ahy1 di sini ... Jika Anda mengurangi variabel menjadi 1 huruf, Anda dapat memotong sedikit ini ... Anda juga mungkin menemukan ini menarik untuk tantangan golf masa depan: codegolf.stackexchange.com/questions/132/tips -for-golfing-in-c
WallyWest
Oh, dan Anda juga tidak perlu cout << "Output:\n";... Itu tabungan 20 byte di sana ...
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]}}

Dan hasilnya

$ 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

Tidak disatukan

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

(uji di sini: http://ideone.com/pxqc07 )

Kiamat
sumber
Mengapa bahkan memasukkan header itu? Anda akan menghemat lebih banyak byte tanpa mereka ... mereka bahkan bukan bagian dari spesifikasi yang saya set ...;)
WallyWest
@WallyWest: Ok, jadi saya tidak mengerti itu, karena mereka ditampilkan dalam contoh pertama Anda Input dan Output misalnya: (..) penghitungan harus ditampilkan: Output: (..) Tidak khawatir tentang itu, saya menghapus Contoh pertama saya sekarang.
Hari Kiamat
2

Ruby - 225

Pertama coba dalam tantangan seperti ini, tentu bisa jauh lebih baik ...

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

Dan hasilnya

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

Yah..aku tahu ini cukup lama tapi ini golf kode kedua saya.

Saran dipersilahkan!

BTW, Javascript yang Menarik mempertahankan urutan elemen dalam hashmaps, jadi, bahkan jika p berisi array kamus, saya dapat mengulangi setiap kamus sebagai array dan saya yakin bahwa elemen pertama dari dikt adalah yang pertama kali dimasukkan. (nama negara yang dirujuk ke baris saat ini)

Tidak Disatukan:

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.

Catatan: input adalah prompt()yang harus berupa satu baris. Tetapi jika Anda menyalin / menempelkan teks multi baris (seperti input yang diusulkan) di prompt()jendela, maka JSbacalah semuanya.

Keluaran:

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
sumber
1
Anda menggunakan kata "ganti" empat kali dalam kode Anda. Bagaimana dengan memperpendek seperti ini 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 ini menyelamatkan saya 7 * 4- (3 * 4 + 11) karakter! (Saya juga menempatkan (w!=null)sebagai(!w)
Antonio Ragagnin
@AntonioRagagnin Bisakah Anda menunjukkan output Anda?
WallyWest
Terima kasih atas pesan Anda @WallyWest. Ternyata !wbukan ide yang baik untuk memeriksa w!=nulldan skrip tidak berfungsi lagi: hlm. Sekarang saya akan memperbaruinya dengan hasil
Antonio Ragagnin
Coba gunakan: 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"))untuk 229 byte ... Apa yang saya lakukan di sini adalah mengurangi if(!c)urutan ke operator ternary tunggal, dan saya juga memasukkannya ke dalam forloop induknya ... Saya juga telah melakukan sesuatu yang mirip dengan forloop lainnya ... operator koma dapat bekerja luar biasa untuk bergabung dengan banyak pernyataan dalam satu lingkaran ...
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])

Tidak disatukan

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

Keluaran

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
sumber
Tidak yakin bahwa varian tak berjubah akan berfungsi dengan benar karena dalam varian golf saya menggunakan operator satu baris
tt.Kilew
dapatkah Anda menunjukkan hasil Anda?
WallyWest
1
Diganti R[b] ? R[b] += +v : R[b] = +vkeR[b]=R[b]||0+ +v
tt.Kilew
1
Indeks dihapus i=0;i++%2==0?b=vkeb=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

Tidak Disatukan:

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
sumber
Apakah Anda memiliki tautan ke tempat saya dapat menemukan lebih banyak info tentang Groovy?
WallyWest
@WallyWest: Saya punya buku ini, dan belajar banyak dari itu. Saya merasa bahwa ini adalah salah satu dari bahasa-bahasa itu yang baik untuk memiliki referensi di rak. tautan , Juga banyak info di sini: tautan
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 tidak disatukan:

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