Вирішіть глобальний борг, кодекс Golf


32

Лідери світу зустрілися і, нарешті, визнали, що найкращий (і єдиний) спосіб вирішення глобальних економічних негараздів - це підвести підсумки, скільки вони зобов’язані один одному і просто погасити один одного величезними чеками. Вони найняли вас (за іронією долі, за найнижчою можливою ставкою контракту), щоб розробити найкращі засоби для цього.

Після багато роздумів і попросивши когось зробити простий приклад, вони придумали наступні характеристики.

Кожна країна представлена ​​своїм кодом ISO 3166-1 альфа-2 : USдля США, AUАвстралії, JPЯпонії, CNКитаю тощо.

  1. Ведення книги складається у вигляді ряду записів країн та сум, що належать кожній країні.
  2. Запис кожної країни починається з ідентифікатора домену двокрапкою та скільки у них надлишку / дефіциту (у мільярдах євро), після чого крапкою з комою, потім списком країн, розділених колонами, і скільки (у мільярдах Євро) вони зобов'язані.
  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 = 8 (надлишок струму) -10 (до США) -15 (до CN) -3 (до JP) +12 (від США) +8 (від CN) +6 (від JP) = 6

Коли всі обчислення виконані, необхідно показати:

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

Ваше завдання полягає в створенні цієї системи, здатної приймати будь-яку кількість записів у головній книзі для будь-якої кількості країн і здатної визначити, скільки у кожної країни дефіцит / надлишок, коли все виплачується.

Кінцевим тестом є використання коду для вирішення боргу між наступними країнами у наведеному нижче тестовому випадку. Ці дані були взяті з BBC News станом на червень 2011 р. ( Http://www.bbc.com/news/business-15748696 )

Для цілей навчання я використовував відповідний ВВП як їх поточний надлишок ... Будь ласка, майте на увазі, що це суто вправа із забезпечення якості коду ... тут у цьому питанні не буде розмови про глобальну економічну вирішення. ... Якщо ви хочете поговорити про економіку, я впевнений, що в 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?
Матьє Родіч

9
Не можу не задатися питанням, чи це дуже розумний спосіб виконання домашнього завдання для вас. Якщо так, то ви заслуговуєте на це.
mkingston

2
Так, якщо ви зробите це справжніми цифрами, ви помітите дивовижне протиріччя. Сума всіх надлишків та дефіцитів буде негативною.
Cruncher

3
Насправді це не маскування домашніх завдань ... Це було натхнене на моєму щотижневому турнірі з покеру з друзями ... Намагаюся розібратися у більш швидкому способі опрацювати виграш для кожного гравця;)
WallyWest

1
@WallyWest LOL;) btw, вибачте за коментарі OT, але я дуже пристрасний. Тепер повернемося до забавного кодування та забудемо біди світу ...
Tobia

Відповіді:


11

К, 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, тим більше спасибі k - це те, що ви знайдете у виробничих системах, але для гольфу k має перевагу. Також перегляньте Kona ( github.com/kevinlawler/kona ), що є реалізацією старішої версії k
tmartin

10

Perl, 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 життя!
Домі

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

C - 257 253, якщо в кінці рядка немає CR

Залежить від розміруof (короткий) == 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()а потім просто циклічали один раз?
Дамір Касіпович

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

Приємно! Мені подобається ваш підхід :)
Матьє Родік

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";... Це
зекономлення

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: Гаразд, тому я цього не зрозумів, оскільки вони відображаються у вашому першому прикладі введення та виведення, наприклад: (..) повинен бути показаний підсумок: вихід: (..). мій перший приклад зараз.
Страшний день

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 містить масив словників, я можу повторити кожен словник як масив, і я впевнений, що перший елемент дикту є першим вставленим. (назва країни, що посилається на поточний рядок)

Безголівки:

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')):?
користувач2428118

Ох, це врятувало мене 7 * 4- (3 * 4 + 11) символів! (Я також ставлю (w!=null)як(!w)
Антоніо Рагагнін

@AntonioRagagnin Чи можете ви, будь ласка, показати свій результат?
WallyWest

Дякуємо за ваше повідомлення @WallyWest. Виявляється, !wперевірити w!=nullце було не надто добре, і сценарій вже не працював: p. Зараз я
оновлю

Спробуйте використовувати: 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])

Безумовно

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

Не впевнений, що варіант без вольфів буде працювати правильно, тому що в гольф-варіанті я використовую однолінійні оператори
tt.Kilew

Ви можете, будь ласка, показати свій результат?
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

Безголівки:

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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.