코드 골프 방식으로 글로벌 부채 해결


32

세계 지도자들은 세계 경제 문제를 해결하는 가장 좋은 (그리고 유일한) 방법은 그들이 서로 빚진 금액을 재고하고 단지 엄청난 수표로 서로를 지불하는 것임을 만났다. 그들은 최선의 방법을 찾기 위해 당신을 고용했습니다.

많은 심의를 거쳐 다른 사람에게 간단한 예를 그려달라고 요청하면 다음 사양이 제시됩니다.

각 국가는 ISO 3166-1 alpha-2 코드로 표시됩니다 : US미국, AU호주, JP일본, CN중국 등

  1. 원장은 일련의 국가 항목과 각 국가의 금액으로 구성됩니다.
  2. 각 국가의 입국은 도메인 ID에서 콜론으로 시작하고, 잉여 / 적자 (수십억 유로)에 얼마가 있고, 세미콜론이 뒤 따르고, 콜론으로 구분 된 쉼표로 구분 된 국가 목록 및 수 (십억 유로) 그들은 빚지고있다.
  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 News에서 발췌 한 것입니다. ( 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
"ultimate test"에서는 세미콜론이 없어야 JP:4100합니까?
Mathieu Rodic

9
숙제가 과제를 완성하는 매우 영리한 방법인지 궁금합니다. 그렇다면 자격이 있습니다.
mkingston

2
네, 이렇게하면 실수가됩니다. 놀라운 모순을 느낄 수 있습니다. 모든 잉여금과 적자의 합계는 음수입니다.
Cruncher

3
실제로, 그것은 위장에 숙제가 아닙니다. 그것은 친구들과의 주간 포커 토너먼트에서 영감을 얻었습니다 ... 각 플레이어의 상금을 해결하는 더 빠른 방법을 알아 내려고;)
WallyWest

1
@WallyWest LOL;) btw, OT 의견에 대한 사과하지만, 그것은 내가 매우 열정적 인 문제입니다. 이제 재미있는 코딩으로 돌아가서 세상의
번거 로움을

답변:


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에 관한 많은 정보를 제공하는데, 이는 k 위에있는 구문 설탕입니다. 또한 k는 생산 시스템에서 찾을 수 있지만 골프의 경우 k가 우위에 있습니다. 또한 이전 버전의 k
tmartin

10

139 137 134 119 112

다음은 작동하는 또 다른 코드입니다. 나중에 설명하겠습니다.

골프 코드

사전 (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 생활!
Domi

10
@Domi-당신은 여기 새로 왔어요 ;-)
jimbobmcgee

4
@jimbobmcgee : 나는 또한이 웹 사이트가 가독성에 관한 것이 아니라고 생각합니다 ...
Mathieu Rodic

4

파이썬, 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

줄 끝에서 CR이없는 경우 C- 257253

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에서 작동합니다.

골프 :

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()하고 한 번만 반복하면 더 짧지 않습니까?
Damir Kasipovic

3

펄 (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

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

좋은! 나는 당신의 접근 방식을 좋아합니다 :)
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;}

나는 코드가 매우 길다는 것을 알고 있지만 좋은 재미를 즐겼다. 이것은 나의 첫 번째 코드 골프이며, 나는 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 ++로 예제를 보았습니다. 당신은 설명 이름 대신에 하나의 문자 식별자를 사용하여 문자의 수를 줄일 수, 즉 사용 전을 위해 입력 , C 에 대한 국가 등등.
ahy1

@ ahy1과 합의했습니다 ... 변수를 1 자로 줄이면이 ​​부분을 상당히 줄일 수 있습니다 ... 미래의 골프 도전에 관심이있을 수도 있습니다 : codegolf.stackexchange.com/questions/132/tips 에 대한 골프
월리 웨스트

아, 그리고 당신은 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

@WallyWest : 좋아, 나는 그것이 입력 및 출력의 첫 번째 예에 표시되기 때문에 이해하지 못했습니다. 예 : (..) 탈리가 표시되어야합니다. 내 첫 번째 예입니다.
Doomsday

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

글쎄 .. 꽤 길지만 이것이 두 번째 코드 골프입니다.

제안은 환영합니다!

BTW, 재미있는 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()한 줄이어야합니다. 그러나 여러 줄의 텍스트 (예 : 제안 된 입력)를 복사하여 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
코드에서 "바꾸기"라는 단어를 번 사용합니다 . 이렇게 단축하는 것은 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 이것은 나에게 7 * 4- (3 * 4 + 11)자를 구했다! (나는 또한 넣어 (w!=null)(!w)
안토니오 Ragagnin

@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

자바 스크립트 (ES6) 175 , 166 , 161 , 156 , 153 (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

골프 변형에서 한 줄 연산자를 사용하기 때문에 ungolfed 변형이 올바르게 작동하는지 확실하지 않음
tt.Kilew

당신은 당신의 출력을 보여줄 수 있습니까?
WallyWest

1
대체 R[b] ? R[b] += +v : R[b] = +vR[b]=R[b]||0+ +v
tt.Kilew

1
인덱스 i=0;i++%2==0?b=v를 제거b=isNaN(+v)?v:
tt.Kilew

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

1

그루비 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

@WallyWest : 나는이 책을 가지고 있었고, 그로부터 많은 것을 배웠다. 나는 이것이 선반에서 참조하는 것이 좋은 언어 중 하나라고 생각합니다. link , 또한 수많은 정보가 여기 있습니다 : 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;}

언 골프 버전 :

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