Решить глобальный долг, путь Code Golf


32

Лидеры мира встретились и, наконец, признали, что лучший (и единственный) способ решения глобальных экономических проблем - подвести итоги того, сколько они должны друг другу, и просто расплатиться друг с другом огромными чеками. Они наняли вас (по иронии судьбы, с минимально возможной ставкой контракта), чтобы выработать наилучшие способы сделать это.

После долгих размышлений и прося кого-нибудь нарисовать простой пример, они придумали следующую спецификацию.

Каждая страна представлена ​​своим кодом ISO 3166-1 alpha-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;) Кстати, извиняюсь за комментарии 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: У меня также есть ощущение, что этот сайт не так много о читабельности ...
Матье Родик

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 в конце строки

Зависит от 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 - 338280

Должен работать с любой версией 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

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

Ницца! Мне нравится ваш подход :)
Матье Родик

3

С ++ - 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

Код Ungolfed

#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 для игры в гольф
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: Хорошо, я не понял этого, потому что они отображаются в вашем первом примере ввода и вывода, например: (..) должен отображаться подсчет: Output: (..) Не беспокойтесь об этом, я удаляю мой первый пример прямо сейчас.
Конец света

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

Ну ... я знаю, что это довольно долго, но это мой второй код гольф.

Предложения приветствуются!

Кстати, интересный Javascript сохраняет порядок элементов в хэш-картах, поэтому, даже если 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
Вы используете слово «заменить» четыре раза в своем коде. Как насчет сокращения, как это 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)
Антонио Раганьин

@AntonioRagagnin Не могли бы вы показать свой вывод?
WallyWest

Спасибо за ваше сообщение @WallyWest. Оказалось, !wчто проверять было не очень хорошо, w!=nullи скрипт больше не работал: с. Теперь я буду обновлять его с результатами
Антонио Раганьин

Попробуйте использовать: 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

Golfed

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

Не уверен, что вариант без игры в гольф будет работать правильно, потому что в варианте игры в гольф я использую однострочные операторы
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:
тт.Килью

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;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.