Lösen Sie die globale Verschuldung nach dem Code Golf-Prinzip

32

Die Staats- und Regierungschefs der Welt haben sich getroffen und schließlich zugegeben, dass der beste (und einzige) Weg, um die Probleme der Weltwirtschaft zu lösen, darin besteht, Bilanz darüber zu ziehen, wie viel sie sich gegenseitig schulden, und sich gegenseitig nur mit riesigen Schecks auszuzahlen. Sie haben Sie eingestellt (ironischerweise mit der niedrigsten möglichen Vertragsrate), um die besten Mittel dafür zu finden.

Nach langen Überlegungen und der Bitte, ein einfaches Beispiel zu zeichnen, haben sie die folgende Spezifikation entwickelt.

Jedes Land ist durch seinen ISO 3166-1 Alpha-2- Code vertreten: USfür die USA, AUfür Australien, JPfür Japan, CNfür China und so weiter ...

  1. Ein Hauptbuch besteht aus einer Reihe von Ländereinträgen und den Beträgen, die für jedes Land geschuldet werden.
  2. Der Eintrag jedes Landes beginnt mit der Domain-ID eines Doppelpunkts und der Höhe des Überschusses / Defizits (in Milliarden Euro), gefolgt von einem Semikolon und einer durch Kommas getrennten Liste der Länder und der Höhe (in Milliarden Euro) Euro) schulden sie.
  3. Wenn ein Land keinem anderen Land etwas schuldet, wird nach diesem Semikolon-Trennzeichen keine Erwähnung dieses Landes eingegeben.
  4. Defizite werden als negative Zahlen angegeben, Überschüsse als positive Zahlen.
  5. Werte können auch Floats sein.
  6. Das Ledger muss aus STDIN entnommen werden. Das Ende des Ledgers wird durch einen Zeilenumbruch in einer leeren Zeile angezeigt. Die Abrechnung muss an STDOUT erfolgen.

Ein Beispiel für ein Hauptbuch:

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

Das System berechnet dann, wie viel jedes Land schuldet und schuldet, und bestimmt seinen Überschuss / Defizit, zum Beispiel für AU:

AU = 8 (aktueller Überschuss) -10 (nach US) -15 (nach CN) -3 (nach JP) +12 (nach US) +8 (nach CN) +6 (nach JP) = 6

Wenn alle Berechnungen abgeschlossen sind, muss eine Liste angezeigt werden:

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

Ihre Aufgabe ist es, dieses System zu erstellen, das in der Lage ist, eine beliebige Anzahl von Buchungen für eine beliebige Anzahl von Ländern vorzunehmen und zu bestimmen, wie viel Defizit / Überschuss jedes Land aufweist, wenn alles ausgezahlt wird.

Der ultimative Test besteht darin, dass Sie Ihren Code verwenden, um die Schulden zwischen den folgenden Ländern im folgenden Testfall zu begleichen. Diese Zahlen stammen von BBC News ab Juni 2011. ( http://www.bbc.com/news/business-15748696 )

Für die Zwecke der Übung habe ich ihr jeweiliges BIP als aktuellen Überschuss verwendet ... Bitte beachten Sie, dass dies ausschließlich eine Übung der Code-Qualitätssicherung ist ... Es wird hier in dieser Frage keine Rede von einer globalen wirtschaftlichen Lösung sein ... Wenn Sie über Wirtschaft sprechen möchten, gibt es in SE sicher eine andere Subdomain, die sich darum kümmert ...

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

Jetzt sei der wirtschaftliche Retter der Welt!

Regeln:

  1. Kürzester Code gewinnt ... das ist doch Code-Golf ...
  2. Bitte geben Sie Ihre Ausgabe des Haupttestfalls mit Ihrer Code-Antwort an ...
WallyWest
quelle
1
Sollte es im "ultimativen Test" kein Semikolon danach geben JP:4100?
Mathieu Rodic
9
Ich frage mich, ob dies eine sehr clevere Art ist, eine Hausaufgabe für Sie zu erledigen. Wenn ja, haben Sie es verdient.
Mkingston
2
Ja, wenn du das tust, wirst du einen erstaunlichen Widerspruch bemerken. Die Summe aller Überschüsse und Defizite ist negativ.
Cruncher
3
Eigentlich ist es keine verkleidete Hausaufgabe ... Sie wurde von meinem wöchentlichen Pokerturnier mit meinen Freunden inspiriert ... Ich habe versucht, die Gewinne für jeden Spieler schneller zu ermitteln;)
WallyWest
1
@WallyWest LOL;) Übrigens, entschuldige mich für die OT-Kommentare, aber das ist eine Angelegenheit, die mir sehr am Herzen liegt. Kommen wir nun zu etwas Spaß beim Programmieren zurück und vergessen die Leiden der Welt ...
Tobia

Antworten:

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
quelle
Unglaublich beeindruckt von diesem einen ... Gibt es eine Möglichkeit, einen Link zum K-Programmierparadigma zu erstellen?
WallyWest
@WallyWest code.kx.com bietet viele Informationen zu q, dem syntaktischen Zucker, der auf k steht. q, moreso danke k, ist das, was Sie in Produktionssystemen finden, aber für das Golfen hat k den Vorteil. Überprüfen Sie auch heraus Kona ( github.com/kevinlawler/kona ) , die eine Open - Source - Implementierung von einer älteren Version von k
tmartin
10

Perl, 139 137 134 119 112

Hier ist ein weiteres Stück Code ... Ich werde es später dokumentieren.

Golf Code

Mit Wörterbuch (112):

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

Ohne Wörterbuch (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}

Ausgabe

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

Sehen Sie es in Aktion!

http://ideone.com/4iwyEP

Mathieu Rodic
quelle
4
Die Definition von "short" sollte anhand der Anzahl der Token und nicht anhand der Zeichen beurteilt werden. Lesbarkeit 4 Leben!
Domi
10
@ Domi - du bist neu hier, nicht
wahr ;-)
4
@jimbobmcgee: Ich habe auch das Gefühl, dass es auf dieser Website nicht viel um Lesbarkeit geht ...
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])`

Ausgabe mit Haupttestfall:

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

(Teste es hier: http://ideone.com/CjWG7v )

Mathieu Rodic
quelle
4

C - 257 253 wenn kein CR am Zeilenende

Hängt von sizeof (short) ab == 2.

Keine Überprüfung auf Pufferüberlauf.

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

Ausgabe:

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   

Weniger golfen:

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

PHP - 338280

Sollte mit jeder Version von PHP 5 funktionieren.

Golf gespielt :

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

Nicht golfen :

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

Ausgabe :

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
quelle
Wäre es nicht kürzer, wenn du es benutzt preg_match_all()und dann nur einmal geloopt hättest ?
Damir Kasipovic
3

Perl (184 Zeichen)

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

Ausgabe

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-Wunsch
quelle
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

Ausgabe:

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
quelle
Nett! Ich mag Ihren Ansatz :)
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;}

Mir ist klar, dass der Code sehr lang ist, aber ich habe den Spaß sehr genossen. Dies ist mein erstes Mal, dass ich Code Golf spiele, und ich bin neu in C ++, daher sind Vorschläge zur Verbesserung meines Codes sehr willkommen.

Endgültige Challenge-Ergebnisse

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 Code

#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
quelle
2
Hallo, schön ein Beispiel in C ++ zu sehen. Sie können die Anzahl der Zeichen verringern, indem Sie anstelle von beschreibenden Namen Kennungen mit einem Buchstaben verwenden, dh, Sie können i für die Eingabe , c für Länder usw. verwenden.
Ahy1
Hier mit @ ahy1 einverstanden ... Wenn Sie Ihre Variablen auf 1 Buchstaben reduzieren, können Sie ein gutes Stück davon abschneiden ... Dies könnte Sie auch für zukünftige Golfherausforderungen
golfing
Oh, und Sie werden es auch nicht brauchen cout << "Output:\n";... Das ist eine 20-Byte-Ersparnis ...
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]}}

Und die Ergebnisse

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

(Teste es hier: http://ideone.com/pxqc07 )

Weltuntergang
quelle
Warum diese Überschriften überhaupt einfügen? Sie sparen mehr Bytes ohne sie ... sie waren nicht einmal Teil der Spezifikation, die ich festgelegt habe ...;)
WallyWest
@WallyWest: Ok, also habe ich das nicht verstanden, weil sie in Ihrem ersten Beispiel für Eingabe und Ausgabe angezeigt werden, z Mein erstes Beispiel im Moment.
Tag des Jüngsten Gerichts,
2

Rubin - 225

Versuchen Sie es zuerst mit einer Herausforderung wie dieser, sicher könnte es viel besser sein ...

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

Und die Ergebnisse

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

Nun, ich weiß, es ist ziemlich lang, aber dies ist mein zweiter Code Golf.

Vorschläge sind willkommen!

Übrigens: Interessantes Javascript behält die Reihenfolge der Elemente in Hashmaps bei. Selbst wenn p ein Array von Wörterbüchern enthält, kann ich jedes Wörterbuch als Array durchlaufen und bin mir sicher, dass das erste Element eines Diktats das zuerst eingefügte ist. (der Name des Landes, auf das sich die aktuelle Zeile bezieht)

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.

Hinweis: Die Eingabe ist eine prompt()Zeile. Wenn Sie jedoch einen mehrzeiligen Text (wie die vorgeschlagene Eingabe) in ein prompt()Fenster kopieren / einfügen, JSlesen Sie alles.

Ausgabe:

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
quelle
1
Sie verwenden das Wort „ersetzen“ vier Mal in Ihrem Code. Wie wäre es so zu verkürzen 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 das hat mich gerettet 7 * 4- (3 * 4 + 11) Zeichen! (Ich habe auch (w!=null)als(!w)
Antonio Ragagnin
@AntonioRagagnin Könnten Sie bitte Ihre Ausgabe zeigen?
WallyWest
Vielen Dank für Ihre Nachricht @WallyWest. Es stellte sich heraus, dass !wes keine gute Idee war, dies zu überprüfen, w!=nullund das Skript funktionierte nicht mehr: p. Jetzt werde ich es mit den Ergebnissen aktualisieren
Antonio Ragagnin
Versuchen Sie es mit: 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"))für 229 Bytes ... Was ich hier gemacht habe, ist die if(!c)Sequenz auf einen einzigen ternären Operator reduziert , und ich habe es auch in die übergeordnete forSchleife aufgenommen ... Ich habe auch etwas Ähnliches mit der anderen forSchleife gemacht ...
Kommaoperatoren
2

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

Golf gespielt

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

Ausgabe

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
quelle
Ich bin mir nicht sicher, ob die ungolfed-Variante korrekt funktioniert, da ich in der golfed-Variante Einzeilenoperatoren verwende
tt.Kilew
Kannst du bitte deine Ergebnisse zeigen?
WallyWest
1
Ersetzt R[b] ? R[b] += +v : R[b] = +vdurchR[b]=R[b]||0+ +v
tt.Kilew
1
Der Index i=0;i++%2==0?b=vfürb=isNaN(+v)?v:
tt.Kilew wurde am
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
quelle
Haben Sie zufällig einen Link, auf den ich weitere Informationen zu Groovy finden kann?
WallyWest
@WallyWest: Ich habe dieses Buch und daraus gelernt. Ich denke, dies ist eine dieser Sprachen, für die es gut ist, eine Referenz im Regal zu haben. Link , auch
jede Menge
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-Version:

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