Giải quyết nợ toàn cầu, cách chơi Golf Code


32

Các nhà lãnh đạo của thế giới đã gặp gỡ và cuối cùng đã thừa nhận rằng cách tốt nhất (và duy nhất) để giải quyết các tai ương kinh tế toàn cầu là lấy số tiền họ nợ nhau và trả cho nhau bằng những tấm séc lớn. Họ đã thuê bạn (trớ trêu thay, với tỷ lệ hợp đồng thấp nhất có thể) để tìm ra phương tiện tốt nhất để làm việc đó.

Sau nhiều lần cân nhắc và yêu cầu ai đó rút ra một ví dụ đơn giản, họ đã đưa ra thông số sau.

Mỗi quốc gia được đại diện bởi mã ISO 3166-1 alpha-2 của họ : UScho Hoa Kỳ, AUcho Úc, JPcho Nhật Bản, CNcho Trung Quốc, v.v.

  1. Một sổ cái được vẽ lên như một loạt các mục nhập quốc gia và số tiền nợ cho mỗi quốc gia.
  2. Mỗi mục nhập của mỗi quốc gia bắt đầu bằng ID miền của họ một dấu hai chấm và số tiền họ có thặng dư / thâm hụt (tính bằng tỷ Euro), theo sau là dấu chấm phẩy, sau đó là danh sách các quốc gia được phân tách bằng dấu phẩy và bao nhiêu (tính bằng tỷ Euro) họ nợ.
  3. Nếu một quốc gia không nợ gì một quốc gia khác, không có đề cập đến quốc gia đó được nhập sau dấu phân cách dấu chấm phẩy đó.
  4. Thâm hụt được chỉ định là số âm, thặng dư được chỉ định là số dương.
  5. Giá trị cũng có thể là phao.
  6. Sổ cái phải được lấy từ STDIN. Sự kết thúc của sổ cái được chỉ định bởi một sự trở lại vận chuyển trên một dòng trống. Các kiểm đếm phải được gửi đến STDOUT.

Một ví dụ về sổ cá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

Sau đó, hệ thống sẽ tính xem mỗi quốc gia nợ bao nhiêu và nợ và xác định thặng dư / thâm hụt của họ, ví dụ, đối với AU:

AU = 8 (thặng dư hiện tại) -10 (sang Mỹ) -15 (tới CN) -3 (đến JP) +12 (từ Mỹ) +8 (từ CN) +6 (từ JP) = 6

Khi tất cả các tính toán được thực hiện, một kiểm đếm phải được hiển thị:

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

Công việc của bạn là tạo ra hệ thống này, có khả năng lấy bất kỳ số lượng sổ cái nào cho bất kỳ số lượng quốc gia nào và có khả năng xác định mỗi quốc gia có bao nhiêu thâm hụt / thặng dư khi mọi thứ được thanh toán.

Bài kiểm tra cuối cùng là để bạn sử dụng mã của mình để giải quyết khoản nợ giữa các quốc gia sau đây trong trường hợp kiểm tra dưới đây. Những số liệu này được lấy từ BBC News vào tháng 6 năm 2011 ( http://www.bbc.com/news/business-15748696 )

Với mục đích của cuộc tập trận, tôi đã sử dụng GDP tương ứng của họ làm thặng dư hiện tại của họ ... Xin lưu ý rằng đây hoàn toàn là một bài tập về đảm bảo chất lượng mã ... sẽ không có thảo luận về giải pháp kinh tế toàn cầu ở đây trong câu hỏi này ... Nếu bạn muốn nói về kinh tế, tôi chắc chắn có một tên miền phụ khác trong SE xử lý nó ...

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

Bây giờ, hãy là vị cứu tinh kinh tế của thế giới!

Quy tắc:

  1. Mã ngắn nhất sẽ thắng ... đây là mã golf sau tất cả ...
  2. Vui lòng cung cấp đầu ra của trường hợp thử nghiệm chính với câu trả lời mã của bạn ...

1
Trong "bài kiểm tra cuối cùng", không nên có dấu chấm phẩy sau JP:4100?
Mathieu Rodic

9
Tôi không thể không tự hỏi liệu đây có phải là một cách rất thông minh để hoàn thành bài tập về nhà cho bạn. Nếu vậy, bạn xứng đáng với nó.
mkingston

2
Vâng, nếu bạn đã làm điều này sẽ con số thực bạn sẽ nhận thấy một mâu thuẫn đáng kinh ngạc. Tổng của tất cả các khoản thặng dư và thâm hụt sẽ là âm.
Cruncher

3
Trên thực tế, đó không phải là bài tập về nhà trá hình ... Nó được lấy cảm hứng từ giải đấu bài xì phé hàng tuần của tôi với bạn bè của tôi ... Cố gắng tìm ra cách nhanh hơn để tìm ra số tiền thắng cho mỗi người chơi;)
WallyWest

1
@WallyWest LOL;) btw, xin lỗi vì những bình luận của OT, nhưng đó là vấn đề tôi khá đam mê. Bây giờ chúng ta hãy quay trở lại với một số mã hóa thú vị và quên đi những tai ương của thế giới ...
Tobia

Câu trả lời:


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

Cực kỳ ấn tượng với điều này ... bất kỳ cơ hội nào bạn có thể cung cấp một liên kết đến mô hình lập trình K?
WallyWest

@WallyWest code.kx.com cung cấp nhiều thông tin về q, đây là đường cú pháp nằm trên đầu k. q, moreso cảm ơn k, là những gì bạn sẽ tìm thấy trong các hệ thống sản xuất nhưng đối với golf thì k có lợi thế. Ngoài ra, hãy xem Kona ( github.com/kevinlawler/kona ), đây là một triển khai mã nguồn mở của phiên bản cũ hơn của k
tmartin

10

Perl, 139 137 134 119 112

Đây là một đoạn mã hoạt động khác ... Tôi sẽ ghi lại nó sau.

Mã đánh gôn

Với từ điển (112):

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

Không có từ điển (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}

Đầu ra

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

Xem nó trong hành động!

http://ideone.com/4iwyEP


4
Định nghĩa "ngắn" nên được đánh giá bằng số lượng mã thông báo, không phải ký tự. Dễ đọc 4 đời!
Domi

10
@Domi - bạn là người mới ở đây, phải không bạn ;-)
jimbobmcgee

4
@jimbobmcgee: Tôi cũng có cảm giác trang web này không có nhiều về khả năng đọc ...
Mathieu Rodic

4

Con trăn, 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])`

Đầu ra với trường hợp thử nghiệm chính:

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

(kiểm tra tại đây: http://ideone.com/CjWG7v )


4

C - 257 253 nếu không có CR ở cuối dòng

Phụ thuộc vào sizeof (ngắn) == 2.

Không kiểm tra tràn bộ đệm.

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

Đầu ra:

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   

Ít chơi gôn hơn:

#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 - 339, 280

Nên hoạt động với mọi phiên bản 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";

Chưa chơi gô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";

Đầu ra :

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

Nó sẽ không ngắn hơn nếu bạn sử dụng preg_match_all()và sau đó chỉ lặp một lần?
Damir Kasipovic

3

perl (184 ký tự)

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

Đầu ra

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

Đầu ra:

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

Ung dung:

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

Tốt đẹp! Tôi thích cách tiếp cận của bạn :)
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;}

Tôi nhận ra mã rất dài, nhưng tận hưởng niềm vui tốt. Đây là lần đầu tiên tôi chơi golf mã và tôi chưa quen với C ++, vì vậy các đề xuất cải thiện mã của tôi được đánh giá cao.

Kết quả thử thách cuối cùng

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

Mã bị đánh cắp

#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
Xin chào, rất vui khi thấy một ví dụ trong C ++. Bạn có thể giảm số lượng ký tự bằng cách sử dụng số nhận dạng một chữ cái thay cho tên mô tả, nghĩa là sử dụng i cho đầu vào , c cho các quốc gia , v.v.
ahy1

Đồng ý với @ ahy1 tại đây ... Nếu bạn giảm các biến của mình xuống còn 1 chữ cái, bạn có thể cắt giảm một chút công bằng này ... Bạn cũng có thể thấy điều này đáng quan tâm cho các thử thách golf trong tương lai: codegolf.stackexchange.com/questions/132/tips -for-golfing-in-c
WallyWest

Ồ, và bạn sẽ không cần cout << "Output:\n";... Đó là tiết kiệm 20 byte ở đó ...
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]}}

Và kết quả

$ 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

Ung dung

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

(kiểm tra tại đây: http://ideone.com/pxqc07 )


Tại sao thậm chí đặt những tiêu đề đó vào? Bạn sẽ tiết kiệm được nhiều byte hơn mà không có chúng ... chúng thậm chí không phải là một phần của thông số tôi đã đặt ...;)
WallyWest

@WallyWest: Ok, vì vậy tôi không hiểu điều đó, vì chúng được hiển thị trong ví dụ đầu tiên của bạn về Đầu vào và Đầu ra, ví dụ: (..) một kiểm đếm phải được hiển thị: Đầu ra: (..) Không phải lo lắng về điều đó, tôi xóa ví dụ đầu tiên của tôi ngay bây giờ.
Ngày tận thế

2

Hồng ngọc - 225

Lần đầu tiên thử thách trong một thử thách như thế này, chắc chắn rằng nó có thể tốt hơn rất nhiều ...

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

Và kết quả

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

Chà..Tôi biết nó khá dài nhưng đây là môn đánh gôn thứ hai của tôi.

Đề nghị được chào đón!

BTW, Javascript thú vị duy trì thứ tự các phần tử trong hashmap, vì vậy, ngay cả khi p chứa một mảng từ điển, tôi có thể lặp lại mỗi từ điển dưới dạng một mảng và tôi chắc chắn rằng phần tử đầu tiên của dict là phần đầu tiên được chèn. (tên quốc gia được gọi là dòng hiện tại)

Ung dung:

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.

Lưu ý: đầu vào là một dòng prompt()nên là một dòng duy nhất. Nhưng nếu bạn sao chép / dán một văn bản nhiều dòng (như đầu vào được đề xuất) trong một prompt()cửa sổ thì JShãy đọc tất cả.

Đầu ra:

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
Bạn sử dụng từ "thay thế" bốn lần trong mã của mình. Làm thế nào về việc rút ngắn nó như thế nà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){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'))?
dùng2428118

Woah này đã tiết kiệm cho tôi 7 * 4- (3 * 4 + 11) ký tự! (Tôi cũng đặt (w!=null)(!w)
Antonio Ragagnin

@AntonioRagagnin Bạn có thể vui lòng hiển thị đầu ra của bạn?
WallyWest

Cảm ơn tin nhắn của bạn @WallyWest. Hóa ra !wkhông phải là một ý tưởng tốt để kiểm tra w!=nullvà kịch bản không còn hoạt động nữa: p. Bây giờ tôi sẽ cập nhật kết quả với nó
Antonio Ragagnin

Hãy thử sử dụng: 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"))với 229 byte ... Những gì tôi đã làm ở đây đã giảm if(!c)chuỗi thành một toán tử tạm thời duy nhất và tôi cũng đã kết hợp nó trong forvòng lặp chính của nó ... Tôi cũng đã làm một cái gì đó tương tự với forvòng lặp khác ... Các nhà khai thác dấu phẩy có thể làm việc tuyệt vời để tham gia nhiều câu lệnh trong một vòng lặp ...
WallyWest

2

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

Chơi gôn

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

Ung dung

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

Đầu ra

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

Không chắc chắn rằng biến thể không được điều khiển sẽ hoạt động chính xác bởi vì trong biến thể chơi gôn, tôi đang sử dụng các toán tử một dòng
tt.Kilew

bạn có thể vui lòng cho thấy đầu ra của bạn?
WallyWest

1
Đã thay thế R[b] ? R[b] += +v : R[b] = +vthànhR[b]=R[b]||0+ +v
tt.Kilew 31/03 '

1
Đã xóa chỉ mục i=0;i++%2==0?b=vthànhb=isNaN(+v)?v:
tt.Kilew 31/03 '

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

Ung dung:

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

Bạn có tình cờ có một liên kết đến nơi tôi có thể tìm thêm thông tin về Groovy không?
WallyWest

@WallyWest: Tôi có cuốn sách này và học được rất nhiều từ nó. Tôi cảm thấy rằng đây là một trong những ngôn ngữ mà thật tốt khi có một tài liệu tham khảo trên kệ. liên kết , cũng rất nhiều thông tin ở đây: 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;}

Phiên bản bị đánh cắp:

$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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.