コードゴルフの方法であるグローバル債務を解決する


32

世界の指導者たちは会い、ついに世界的な経済的苦難を解決する最善の(そして唯一の)方法は、彼らがお互いに借りている額を評価し、巨大な小切手でお互いに返済することであると認めました。彼らは、(皮肉なことに、可能な限り低い契約率で)あなたを雇い、そうするための最良の手段を考え出しました。

多くの検討を重ね、簡単な例を描くように頼んだ後、次の仕様を思いつきました。

それぞれの国は、ISO 3166-1 alpha-2コードで表されます。US米国、AUオーストラリア、JP日本、CN中国など...

  1. 元帳は、一連の国エントリと各国への支払い額として作成されます。
  2. 各国のエントリは、ドメインIDコロンから始まり、余剰/不足の量(10億ユーロ)、その後にセミコロン、コロンで区切られた国のコンマ区切りのリスト、および量(10億単位)ユーロ)彼らは借りている。
  3. 国が他の国に何も負わない場合、その国の言及はそのセミコロン区切りの後に入力されません。
  4. 赤字は負の数で示され、余剰は正の数で示されます。
  5. 値はフロートにすることもできます。
  6. 元帳はSTDINから取得する必要があります。元帳の終わりは、空白行の改行で示されます。集計はSTDOUTに配信する必要があります。

元帳の例:

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

次に、システムは、各国の債務額と債務額を計算し、たとえばAUの場合の黒字/赤字を決定します。

AU = 8(現在の余剰)-10(米国へ)-15(CNへ)-3(JPへ)+12(米国から)+8(CNから)+6(JPから)= 6

すべての計算が完了したら、集計を表示する必要があります。

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

あなたの仕事は、このシステムを作成することです。このシステムは、任意の国の元帳エントリをいくつでも取得でき、すべてが支払われたときに各国の赤字/余剰額を決定できます。

究極のテストは、コードを使用して、以下のテストケースで次の国々の間に負う債務を解決することです。これらの数値は、2011年6月現在のBBCニュースから引用されています。(http://www.bbc.com/news/business-15748696

演習の目的のために、私はそれぞれのGDPを現在の余剰として使用しています...これは厳密にコード品質保証の演習であることに留意してください... ...経済学について話したい場合、SEにそれを処理する別のサブドメインがあると確信しています...

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

さあ、世界の経済的救世主になろう!

ルール:

  1. 最短のコードが勝ちます...これは結局のところコードゴルフです...
  2. 主要なテストケースの出力にコードの回答を入力してください...

1
「究極のテスト」では、後にセミコロンを置くべきではありませんJP:4100か?
マチューロディック14年

9
これは宿題を完了するのに非常に賢い方法であるかどうか疑問に思わずにはいられません。もしそうなら、あなたはそれに値する。
mkingston 14年

2
ええ、これをやると、驚くべき矛盾に気付くでしょう。すべての黒字と赤字の合計はマイナスになります。
ランチャー14年

3
実際、それは変装した宿題ではありません...私の友人との毎週のポーカートーナメントからインスピレーションを受けました...各プレーヤーの賞金をより迅速に
計算する方法を見つけよ

1
@WallyWest LOL;)ところで、OTのコメントはおologiesびしますが、それは私が非常に情熱を持っている問題です。今...さんが戻っていくつかの楽しみコーディングと世界の悲哀を忘れて取得してみましょう
トビア

回答:


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

これに非常に感銘を受けました... Kプログラミングパラダイムへのリンクを提供できる可能性はありますか?
WallyWest

@WallyWest code.kx.comは、qに関する多くの情報を提供します。qは、kの上にある構文糖衣です。q、さらにkに感謝しますが、プロダクションシステムにありますが、ゴルフにはkが優れています。またコナ(チェックアウトgithub.com/kevinlawler/kona kの古いバージョンのオープンソース実装である)
tmartin

10

Perlの、139 137 134 119 112

コードのもう1つの作業部分を次に示します。後で説明します。

ゴルフコード

辞書あり(112):

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

辞書なし(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}

出力

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

実際にご覧ください!

http://ideone.com/4iwyEP


4
「ショート」の定義は、文字ではなくトークンの量で判断する必要があります。可読性4ライフ!
ドミ14年

10
@Domi-あなたはここにいるんだよね;-)
jimbobmcgee 14年

4
@jimbobmcgee:私も...このウェブサイトは、読みやすさについてはあまりないです感を持っている
マチュー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])`

主要なテストケースの出力:

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

(ここでテスト:http : //ideone.com/CjWG7v


4

C- 行末にCRがない場合は257 253

sizeof(short)== 2に依存します。

バッファオーバーフローのチェックはありません。

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

出力:

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   

少ないゴルフ:

#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のどのバージョンでも動作するはずです。

Golfed

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

ゴルフをしていない

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

出力

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

使用してpreg_match_all()から一度ループするだけで短くなりませんか?
ダミールカシポビッチ14年

3

perl(184文字)

コード

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

出力

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

出力:

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

ゴルフをしていない:

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

いいね!私はあなたのアプローチが好きです:)
マチューロディック14年

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

私はコードが非常に長いことを知っていますが、楽しいことを楽しみました。これは初めてのコードゴルフであり、C ++を初めて使用するため、コードを改善するための提案は大歓迎です。

最終チャレンジ結果

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

未ゴルフコード

#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
こんにちは、ニース、C ++の例をご覧ください。説明的な名前の代わりに1文字の識別子を使用することで文字数を減らすことができます。つまり、入力iを、cなどを使用します。
ahy1

ここで@ ahy1に同意します...変数を1文字に減らすと、これをかなり削減できます...これは、将来のゴルフの課題にも役立ち
golfing

ああ、あなたcout << "Output:\n";もどちらも必要ありません...それはそこに20バイトの節約です...
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]}}

そして結果

$ 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

非ゴルフ

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

(ここでテスト:http : //ideone.com/pxqc07


なぜそれらのヘッダーを入れるのでしょうか?それらなしでより多くのバイトを保存します...それらは私が設定した仕様の一部でさえありませんでした
;;

@WallyWest:わかりました。入力と出力の最初の例で表示されるため、理解できませんでした。例:(..)集計を表示する必要があります:出力:(..)私の最初の例です。
終末14年

2

ルビー-225

最初にこのようなチャレンジを試してみてください、それがはるかに良いことを確認してください...

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

そして結果

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

まあ..私はそれがかなり長いことを知っていますが、これは私の2番目のコードゴルフです。

提案を歓迎します!

ところで、興味深いJavascriptはハッシュマップの要素の順序を保持するため、pに辞書の配列が含まれている場合でも、各辞書を配列として反復でき、dictの最初の要素が最初に挿入されると確信しています。(現在の行を参照している国の名前)

ゴルフをしていない:

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.

注:入力は prompt() 1行である必要があります。ただし、prompt()ウィンドウに複数行のテキスト(入力候補など)をコピー/貼り付けすると、JSと、すべてが読み取られます。

出力:

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
コードで「置換」という単語を4回使用します。次のように短縮してみては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 14年

これで7 * 4-(3 * 4 + 11)キャラクターが救われました!(私は次のように言い(w!=null)ます(!w)
アントニオ・ラガニン14年

@AntonioRagagnin出力を表示してください。
WallyWest

メッセージ@WallyWestをありがとう。ターンはアウト!wチェックするために良いアイデアではなかったw!=nullとスクリプトはもう働いていませんでした:P。次に、結果で更新します
Antonio Ragagnin

使用してみてください: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バイト...ここで行ったことは、if(!c)シーケンスを単一の三項演算子に減らし、親forループにも組み込みました...他のforループでも同様のことを行いました。...コンマ演算子は、ループ内の複数のステートメントに参加するように素晴らしく作業することができます...
WallyWest

2

JavaScriptの(ES6)175166161156153 147

ゴルフ

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

非ゴルフ

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

出力

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

golfed変種で、私は1行の演算子を使用していますので、ungolfedバリアントは正常に働くことになりますわからないこと
tt.Kilew

出力を見せていただけますか?
WallyWest 14年

1
に置き換えられましR[b] ? R[b] += +v : R[b] = +vR[b]=R[b]||0+ +v
tt.Kilew 14年

1
インデックスi=0;i++%2==0?b=vを削除b=isNaN(+v)?v:
tt.Kilew 14年

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

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

ゴルフをしていない:

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の詳細情報を入手できるリンクがありますか?
WallyWest 14年

@WallyWest:私はこの本を持っており、そこからたくさんのことを学びました。私は、これが棚の参照を持っていることが良いそれらの言語の1つであると感じます。リンクまた、ここでは情報のトン:リンク
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;}

非ゴルフバージョン:

$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;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.