Лидеры мира встретились и, наконец, признали, что лучший (и единственный) способ решения глобальных экономических проблем - подвести итоги того, сколько они должны друг другу, и просто расплатиться друг с другом огромными чеками. Они наняли вас (по иронии судьбы, с минимально возможной ставкой контракта), чтобы выработать наилучшие способы сделать это.
После долгих размышлений и прося кого-нибудь нарисовать простой пример, они придумали следующую спецификацию.
Каждая страна представлена своим кодом ISO 3166-1 alpha-2 : US
для США, AU
для Австралии, JP
для Японии, CN
для Китая и так далее ...
- Регистр составляется в виде серии записей о странах и сумм, причитающихся каждой стране.
- Вступление каждой страны начинается с идентификатора их домена, двоеточия, и того, сколько у них в избытке / дефиците (в миллиардах евро), после чего следует точка с запятой, затем список стран, разделенных запятыми, и сколько (в миллиардах Евро) они должны.
- Если страна ничего не должна другой стране, то после этой точки с запятой не указывается эта страна.
- Дефицит указывается в виде отрицательного числа, избыток указывается в виде положительного числа.
- Значения также могут быть плавающими.
- Регистр должен быть взят из 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
Теперь станьте экономическим спасителем мира!
Правила:
- Самый короткий код выигрывает ... в конце концов, это код-гольф
- Пожалуйста, предоставьте ваш вывод основного теста с вашим кодом ответа ...
JP:4100
?Ответы:
К, 66
,
источник
Perl,
139137134119112Вот еще один рабочий кусок кода ... Я документирую это позже.
Гольф-код
Со словарем (112):
Без словаря (137):
Выход
Смотрите это в действии!
http://ideone.com/4iwyEP
источник
Питон,
211185183Выход с основным контрольным примером:
(проверьте это здесь: http://ideone.com/CjWG7v )
источник
C -
257253, если нет CR в конце строкиЗависит от sizeof (короткий) == 2.
Нет проверки на переполнение буфера.
Выход:
Менее гольф:
источник
PHP -
338280Должен работать с любой версией PHP 5.
Гольф :
Без гольфа :
Выход :
источник
preg_match_all()
а затем просто зациклились один раз?Perl (184 символа)
Код
Выход
источник
Perl -
116114112Выход:
Ungolfed:
источник
С ++ - 1254
Я понимаю, что код очень длинный, но получал удовольствие. Это мой первый опыт игры в код, и я новичок в C ++, поэтому предложения по улучшению моего кода очень ценятся.
Итоговые результаты соревнований
Код Ungolfed
источник
cout << "Output:\n";
... Это 20-байтовая экономия там ...AWK -
138120И результаты
Ungolfed
(проверьте это здесь: http://ideone.com/pxqc07 )
источник
Рубин - 225
Сначала попробуйте выполнить такой вызов, конечно, это может быть намного лучше ...
И результаты
источник
JS,
254240245Ну ... я знаю, что это довольно долго, но это мой второй код гольф.
Предложения приветствуются!
Кстати, интересный Javascript сохраняет порядок элементов в хэш-картах, поэтому, даже если p содержит массив словарей, я могу перебирать каждый словарь как массив, и я уверен, что первый элемент dict является первым вставленным. (название страны указано в текущей строке)
Ungolfed:
Примечание: ввод
prompt()
должен быть одной строкой. Но если вы копируете / вставляете многострочный текст (например, предложенный ввод) вprompt()
окне, тогдаJS
читайте все это.Выход:
источник
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'))
:?(w!=null)
как(!w)
!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
циклом ... операторы запятой могут чудесно работать для объединения нескольких операторов в цикле ...JavaScript (ES6)
175,166,161,156,153147Golfed
Ungolfed
Выход
источник
R[b] ? R[b] += +v : R[b] = +v
наR[b]=R[b]||0+ +v
i=0;i++%2==0?b=v
кb=isNaN(+v)?v:
isNaN(+v)
->!+v
Groovy 315
Ungolfed:
источник
PHP, 333
Безголовая версия:
источник