Rozwiąż globalny dług, sposób na golfa


32

Przywódcy świata spotkali się i ostatecznie przyznali, że najlepszym (i jedynym) sposobem rozwiązania globalnych problemów gospodarczych jest podsumowanie, ile są sobie winni i po prostu spłacenie się ogromnymi czekami. Zatrudnili cię (jak na ironię, przy najniższej możliwej stawce umownej), aby opracować najlepsze środki.

Po długich rozważaniach i poproszeniu kogoś o narysowanie prostego przykładu wymyślili następującą specyfikację.

Każdy kraj jest reprezentowany przez kod ISO 3166-1 alfa-2 : USdla USA, AUAustralii, JPJaponii, CNChin i tak dalej ...

  1. Księga jest sporządzana jako seria wpisów do kraju i kwot należnych dla każdego kraju.
  2. Wpis każdego kraju zaczyna się od identyfikatora domeny dwukropka i tego, ile mają nadwyżki / deficyty (w miliardach euro), a następnie średnika, a następnie rozdzielonej przecinkami listy krajów i ile (w miliardach Euro) są winni.
  3. Jeśli kraj nic nie jest winien innemu krajowi, po separatorze średników nie jest wprowadzana żadna wzmianka o tym kraju.
  4. Deficyty są wskazywane jako liczby ujemne, nadwyżka jest wskazywana jako liczba dodatnia.
  5. Wartości mogą być również zmiennoprzecinkowe.
  6. Księga musi być pobrana ze STDIN. Koniec księgi jest oznaczony znakiem powrotu karetki w pustej linii. Liczbę należy dostarczyć do STDOUT.

Przykład księgi:

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

Następnie system oblicza, ile każdy kraj jest winien i jest winien, i określa ich nadwyżkę / deficyt, na przykład dla AU:

AU = 8 (bieżąca nadwyżka) -10 (do USA) -15 (do CN) -3 (do JP) +12 (z USA) +8 (z CN) +6 (z JP) = 6

Po zakończeniu wszystkich obliczeń należy wyświetlić podsumowanie:

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

Twoim zadaniem jest stworzenie tego systemu, który będzie mógł przyjmować dowolną liczbę wpisów do księgi rachunkowej dla dowolnej liczby krajów i będzie w stanie określić, ile każdego kraju ma deficyt / nadwyżka, gdy wszystko zostanie wypłacone.

Ostatecznym testem jest skorzystanie z kodu w celu uregulowania długu między następującymi krajami w poniższym przypadku testowym. Dane te pochodzą z BBC News z czerwca 2011 r. ( Http://www.bbc.com/news/business-15748696 )

Do celów tego ćwiczenia wykorzystałem ich odpowiedni PKB jako ich bieżącą nadwyżkę ... Proszę pamiętać, że jest to ściśle ćwiczenie w zapewnianiu jakości kodu ... w tym pytaniu nie będzie mowy o globalnej rozdzielczości gospodarczej ... Jeśli chcesz rozmawiać o ekonomii, jestem pewien, że istnieje inna subdomena w SE, która to obsługuje ...

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

Teraz bądź ekonomicznym wybawcą świata!

Zasady:

  1. Wygrywa najkrótszy kod ... w końcu to jest golf golfowy ...
  2. Proszę podać wyniki głównego przypadku testowego wraz z odpowiedzią na kod ...

1
Czy w „teście ostatecznym” nie powinno być później średnika JP:4100?
Mathieu Rodic

9
Zastanawiam się, czy to bardzo sprytny sposób na wykonanie zadania domowego. Jeśli tak, to zasługujesz na to.
mkingston

2
Tak, jeśli to zrobisz, będą prawdziwe liczby, zauważysz zadziwiającą sprzeczność. Suma wszystkich nadwyżek i deficytów będzie ujemna.
Cruncher

3
Właściwie to nie jest praca domowa w przebraniu ... Została zainspirowana moim cotygodniowym turniejem pokera z przyjaciółmi ... Próbuję znaleźć sposób na szybsze wypracowanie wygranych dla każdego gracza;)
WallyWest

1
@WallyWest LOL;) btw, przepraszam za komentarze OT, ale to kwestia, której jestem pasjonatem. Wróćmy teraz do kodowania i zapomnijmy o nieszczęściach świata ...
Tobia,

Odpowiedzi:


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

Niesamowicie pod wrażeniem tego ... czy masz szansę podać link do paradygmatu programowania K?
WallyWest

@WallyWest code.kx.com zawiera wiele informacji na temat q, czyli cukru syntaktycznego, który znajduje się na k. q, jeszcze bardziej dziękuję k, jest to, co znajdziesz w systemach produkcyjnych, ale w golfa k ma przewagę. Sprawdź także Kona ( github.com/kevinlawler/kona ), która jest implementacją open source starszej wersji k
tmartin

10

Perl, 139 137 134 119 112

Oto kolejny działający kod ... Udokumentuję go później.

Kod do gry w golfa

Ze słownikiem (112):

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

Bez słownika (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}

Wydajność

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

Zobacz to w akcji!

http://ideone.com/4iwyEP


4
Definicję „krótkiego” należy oceniać według ilości żetonów, a nie znaków. Czytelność 4 życie!
Domi

10
@Domi - jesteś tu nowy, prawda ;-)
jimbobmcgee

4
@jimbobmcgee: Mam również wrażenie, że ta strona nie jest zbytnio poświęcona czytelności ...
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])`

Dane wyjściowe z głównym przypadkiem testowym:

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

(przetestuj tutaj: http://ideone.com/CjWG7v )


4

C - 257 253, jeżeli nie ma CR na końcu linii

Zależy od sizeof (krótki) == 2.

Brak sprawdzania przepełnienia bufora.

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

Wydajność:

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   

Mniej golfa:

#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

Powinien współpracować z dowolną wersją PHP 5.

Gra w golfa :

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

Bez golfa :

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

Wyjście :

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

Czy nie byłoby krótsze, gdybyś używał, preg_match_all()a następnie tylko raz zapętlił?
Damir Kasipovic

3

perl (184 znaki)

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

Wydajność

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

Wydajność:

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

Nie golfowany:

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

Miły! Podoba mi się twoje podejście :)
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;}

Zdaję sobie sprawę, że kod jest bardzo długi, ale dobrze się bawiłem. To jest mój pierwszy raz w golfa kodu i jestem nowy w C ++, więc sugestie dotyczące ulepszenia mojego kodu są bardzo mile widziane.

Ostateczne wyniki wyzwania

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

Kod niepoznany

#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
Cześć, miło widzieć przykład w C ++. Możesz zmniejszyć liczbę znaków, używając jednoliterowych identyfikatorów zamiast nazw opisowych, tj. Używaj i do wprowadzania danych , c dla krajów i tak dalej.
ahy1

Zgadzam się z @ ahy1 tutaj ... Jeśli zmniejszysz zmienne do 1 litery, możesz wyciąć trochę tego ... Możesz również zainteresować się przyszłymi wyzwaniami golfowymi: codegolf.stackexchange.com/questions/132/tips -for-golfing-in-c
WallyWest

Aha, i ty też nie będziesz potrzebować cout << "Output:\n";... To 20-bajtowa oszczędność tam ...
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]}}

I wyniki

$ 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

Bez golfa

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

(przetestuj tutaj: http://ideone.com/pxqc07 )


Po co w ogóle umieszczać te nagłówki? Bez nich zaoszczędzisz więcej bajtów ... nawet nie były częścią specyfikacji, którą ustawiłem ...;)
WallyWest

@WallyWest: Ok, więc nie zrozumiałem tego, ponieważ są one wyświetlane w pierwszym przykładzie danych wejściowych i wyjściowych, np .: (..) tally musi być pokazany: Wyjście: (..) Nie martw się tym, usuwam mój pierwszy przykład w tej chwili.
Doomsday

2

Rubin - 225

Najpierw spróbuj w takim wyzwaniu, na pewno może być znacznie lepiej ...

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

I wyniki

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

Cóż .. Wiem, że jest dość długi, ale to mój drugi golf.

Sugestie są mile widziane!

BTW, ciekawy Javascript zachowuje porządek elementów w mapach skrótów, więc nawet jeśli p zawiera tablicę słowników, mogę iterować każdy słownik jako tablicę i jestem pewien, że pierwszy element dykta jest wstawiany pierwszy. (nazwa kraju odnoszącego się do bieżącej linii)

Nie golfowany:

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.

Uwaga: wejście to prompt()powinna być pojedyncza linia. Ale jeśli skopiujesz / wkleisz tekst wielowierszowy (jak proponowane dane wejściowe) w prompt()oknie, JSprzeczytaj wszystko.

Wydajność:

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
W kodzie używasz słowa „zamień” cztery razy. Co powiesz na skrócenie tego w ten sposób 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 to uratowało mi 7 * 4- (3 * 4 + 11) znaków! ( (w!=null)(!w)
Podaję

@AntonioRagagnin Czy możesz pokazać swoje wyniki?
WallyWest

Dzięki za wiadomość @WallyWest. Okazało się, !wże sprawdzenie nie było dobrym pomysłem, w!=nulla skrypt już nie działał: p. Teraz zaktualizuję go o wyniki
Antonio Ragagnin

Spróbuj użyć: 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"))dla 229 bajtów ... To, co tutaj zrobiłem, sprowadza if(!c)sekwencję do jednego operatora trójskładnikowego, a także umieściłem ją w jej forpętli nadrzędnej ... Zrobiłem też coś podobnego z drugą forpętlą ... operatorzy przecinków mogą pracować cudownie, łącząc wiele instrukcji w pętli ...
WallyWest

2

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

Grał w golfa

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

Bez golfa

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

Wydajność

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

Nie jestem pewien, czy wariant nie golfowy będzie działał poprawnie, ponieważ w wariancie
golfowym

czy możesz proszę pokazać swoje wyniki?
WallyWest

1
Zamieniono R[b] ? R[b] += +v : R[b] = +vnaR[b]=R[b]||0+ +v
tt.Kilew

1
Usunięto indeks i=0;i++%2==0?b=vdob=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

Nie golfowany:

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

Czy zdarza ci się mieć link do tego, gdzie mogę znaleźć więcej informacji na temat Groovy?
WallyWest

@WallyWest: Mam tę książkę i nauczyłem się z niej mnóstwo. Uważam, że jest to jeden z tych języków, w którym dobrze jest mieć referencje na półce. link , również mnóstwo informacji tutaj: 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;}

Wersja bez golfa:

$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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.