แก้ไขหนี้ทั่วโลก, แนวทางการเล่นกอล์ฟ


32

ผู้นำของโลกได้พบและยอมรับในที่สุดว่าวิธีที่ดีที่สุด (และเท่านั้น) ในการแก้ไขปัญหาเศรษฐกิจโลกคือการเอาหุ้นของพวกเขาเป็นหนี้กันและเพียงแค่จ่ายเงินออกด้วยเช็คขนาดใหญ่ พวกเขาจ้างคุณ (อย่างแดกดันในอัตราสัญญาต่ำที่สุดเท่าที่จะทำได้) เพื่อหาวิธีที่ดีที่สุดในการทำเช่นนั้น

หลังจากการไตร่ตรองอย่างถี่ถ้วนแล้วและขอให้บางคนวาดตัวอย่างง่ายๆพวกเขาได้สร้างสเปคต่อไปนี้

แต่ละประเทศมีรหัส ISO 3166-1 alpha-2ของพวกเขา: USสำหรับสหรัฐอเมริกา, AUออสเตรเลีย, JPญี่ปุ่น, CNจีน, และอื่น ๆ

  1. บัญชีแยกประเภทจะถูกวาดขึ้นเป็นชุดของรายการประเทศและจำนวนเงินเนื่องจากแต่ละประเทศ
  2. แต่ละประเทศเริ่มต้นด้วยโคลอน ID ของโดเมนและมีจำนวนเกินดุล / ขาดดุล (ในพันล้านยูโร) ตามด้วยเครื่องหมายอัฒภาคจากนั้นรายการที่คั่นด้วยเครื่องหมายจุลภาคของประเทศและจำนวนเท่าใด (ในพันล้านของ ยูโร) พวกเขาเป็นหนี้
  3. หากไม่มีประเทศใดเป็นหนี้ประเทศอื่นจะไม่มีการเอ่ยถึงประเทศนั้นหลังจากตัวคั่นเครื่องหมายอัฒภาคนั้น
  4. การขาดดุลจะถูกระบุว่าเป็นจำนวนลบส่วนเกินจะถูกระบุว่าเป็นจำนวนบวก
  5. ค่าสามารถเป็นแบบลอยได้
  6. บัญชีแยกประเภทจะต้องนำมาจาก STDIN จุดสิ้นสุดของบัญชีแยกประเภทจะแสดงด้วยการขึ้นบรรทัดใหม่บนบรรทัดว่าง Tally ต้องถูกส่งไปยัง 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 (เป็น US) -15 (เป็น CN) -3 (เป็น JP) +12 (จากสหรัฐอเมริกา) +8 (จาก CN) +6 (จาก JP) = 6

เมื่อการคำนวณทั้งหมดเสร็จสิ้นจะต้องนับรวม:

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

งานของคุณคือการสร้างระบบนี้มีความสามารถในการบันทึกจำนวนบัญชีแยกประเภทใด ๆ สำหรับจำนวนของประเทศใด ๆ และสามารถกำหนดจำนวนในแต่ละประเทศที่มีการขาดดุล / เกินดุลเมื่อทุกอย่างได้รับการจ่ายเงิน

การทดสอบขั้นสุดท้ายสำหรับคุณที่จะใช้รหัสของคุณเพื่อแก้ไขหนี้ที่ค้างชำระระหว่างประเทศต่อไปนี้ในกรณีทดสอบด้านล่าง ตัวเลขเหล่านี้นำมาจากข่าว BBC เมื่อเดือนมิถุนายน 2554 ( 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หรือไม่
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 q, moreso thank k, เป็นสิ่งที่คุณจะพบในระบบการผลิต แต่สำหรับ golfing k นั้นมีความทันสมัย นอกจากนี้ให้ตรวจสอบ Kona ( github.com/kevinlawler/kona ) ซึ่งเป็นการใช้งานโอเพ่นซอร์สของ k
tmartin

10

Perl, 139 137 134 119 112

นี่คือโค้ดอีกชิ้นที่ทำงานได้ ... ฉันจะบันทึกไว้ในภายหลัง

รหัส Golfed

ด้วยพจนานุกรม (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

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 - 257 253 ถ้าไม่มี CR ที่ท้ายบรรทัด

ขึ้นอยู่กับ sizeof (สั้น) == 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()แล้วจะไม่สั้นกว่านี้ไหม
Damir Kasipovic

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

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

ดี! ฉันชอบแนวทางของคุณ :)
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 ++ คุณสามารถลดจำนวนตัวอักษรโดยใช้ตัวระบุตัวอักษรหนึ่งตัวแทนชื่อที่สื่อความหมายเช่นใช้iสำหรับอินพุต , cสำหรับประเทศและอื่น ๆ
ahy1

เห็นด้วยกับ @ ahy1 ที่นี่ ... หากคุณลดตัวแปรของคุณเป็น 1 ตัวอักษรคุณสามารถลดความยุติธรรมลงได้ ... คุณอาจพบสิ่งที่น่าสนใจสำหรับความท้าทายในอนาคตของกอล์ฟ: codegolf.stackexchange.com/questions/132/tips -for-golfing-in-c
WallyWest

โอ้และคุณไม่ต้องการ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

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

(ทดสอบที่นี่: 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 จาวาสคริปต์ที่น่าสนใจรักษาลำดับขององค์ประกอบใน hashmaps ดังนั้นแม้ว่า p มีอาร์เรย์ของพจนานุกรมฉันสามารถทำซ้ำแต่ละพจนานุกรมเป็นอาร์เรย์และฉันแน่ใจว่าองค์ประกอบแรกของ dict นั้นถูกแทรกครั้งแรก (ชื่อของประเทศที่อ้างถึงบรรทัดปัจจุบัน)

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.

หมายเหตุ: อินพุตคือสิ่ง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
คุณใช้คำว่า "replace" สี่ครั้งในรหัสของคุณ วิธีการเกี่ยวกับการตัดทอนมันเช่นนี้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

ว้าวสิ่งนี้ช่วยฉันได้ 7 * 4- (3 * 4 + 11) ตัวละคร! (ฉันใส่(w!=null)เป็น(!w)
Antonio 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

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

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

เอาท์พุต

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 จะทำงานได้อย่างถูกต้องเพราะในรุ่น
golfed

คุณช่วยแสดงผลลัพธ์ของคุณได้ไหม?
WallyWest

1
แทนที่R[b] ? R[b] += +v : R[b] = +vเป็นR[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

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

คุณมีลิงค์ไปยังที่ที่ฉันสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับ Groovy ได้หรือไม่?
WallyWest

@WallyWest: ฉันมีหนังสือเล่มนี้และเรียนรู้มากมายจากมัน ฉันรู้สึกว่านี่เป็นหนึ่งในภาษาเหล่านั้นที่ดีสำหรับการอ้างอิงบนชั้นวาง ลิงก์นอกจากนี้ยังมีข้อมูลอีกมากมายที่นี่: ลิงก์
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.