Введение
В стратегической игре Starcraft 2 есть три «расы» на выбор: терран, зерг и протосс. В этом вызове мы сосредоточимся на протоссе и знаковой фразе «Вы должны построить дополнительные пилоны!» Это сообщение объявляется, когда у вас кончаются запасы для создания армии. Итак, чтобы помочь сообществу Starcraft, вы должны написать программу или функцию, которая сообщает игрокам, сколько именно пилонов им нужно.
Соревнование
Вам будет предоставлен ввод строки, состоящей из единственного целого N
и разделенного пробелами списка единиц. N
всегда будет нулевым или положительным, а список единиц будет всегда иметь одну или несколько действительных единиц. N
представляет количество пилонов, которые есть у игрока Ваша задача - рассчитать, достаточно ли количество пилонов, имеющихся у игрока, для построения юнитов. Ваша программа или функция должна выводить / возвращать истинное значение, если имеется достаточный запас, или если его недостаточно, вы должны вывести, You must construct ZZZ additional pylons
где ZZZ
находится количество пилонов, необходимое для построения модулей. Обратите внимание, что pylon(s)
должно быть множественным числом, когда это необходимо, и неплужным, когда нет ( ...1 additional pylon!
, ...2 additional pylons!
)
Единицы Протосса и Стоимость Поставки
Вот список всех единиц и их стоимость. Пилоны обеспечивают 8 дополнительных поставок.
Unit Supply Cost
Probe 1
Zealot 2
Sentry 2
Stalker 2
HighTemplar 2
DarkTemplar 2
Immortal 4
Colossus 6
Archon 4
Observer 1
WarpPrism 2
Phoenix 2
MothershipCore 2
VoidRay 4
Oracle 3
Tempest 4
Carrier 6
Mothership 8
Примеры БЕЗ Бонусов
Input:
2 Probe Probe Probe Probe Stalker Zealot Carrier Probe Zealot
Output:
You must construct 1 additional pylon!
Why?
Adding up the supply costs for all of the units gives 17. The current 2 pylons provide 16 supply, so one more is needed to provide enough for 17.
Input:
5 Mothership Carrier Probe Tempest HighTemplar
Output:
true
Why?
Adding up the units gets 21. The current 5 pylons provide 40 supply, which is plenty enough.
Input:
0 Mothership Colossus Zealot
Output:
You must construct 2 additional pylons!
Why?
Adding the units gets 16. There is no pylons so 2 need to be built to provide enough supply.
Бонусы
- Любой опытный игрок Starcraft 2 знает, что вам нужно ядро материнского корабля, прежде чем превратить его в материнский корабль. Кроме того, вы можете иметь только один материнский корабль за раз (будь то настоящий материнский корабль или ядро материнского корабля). Если ни одно из этих условий не выполняется, выведите любое ложное значение. Если ваша программа может проверить, что одновременно активен только один материнский корабль, и что ядро материнского корабля построено до фактического материнского корабля, снимите 20% с вашего количества байтов.
- Мало что вы знаете, но нексусы (командные центры протоссов) на самом деле тоже обеспечивают снабжение! Если ваша программа может добавить 11 к максимальному запасу каждый раз, когда она встречает нексус в списке модулей, снимите 10% с вашего количества байтов. Обратите внимание, что не имеет значения, где находится Nexus в порядке сборки, поэтому
0 Probe Nexus
все равно вернетсяtrue
.
Примеры с бонусами
Input (Bonus 1):
3 Mothership Zealot
Output:
false
Why?
According to the first bonus, a mothership core has to be built before a mothership.
Input (Bonus 1):
3 MothershipCore Mothership MothershipCore
Output:
false
Why?
According to the first bonus, only one mothership can be built and here there is two (MothershipCore -> Mothership and a second MothershipCore).
Input (Bonus 2):
0 Probe Nexus Probe
Output:
true
Why?
According to the second bonus, nexuses add 11 to the maximum supply, allowing both probes to be built.
Input (Both Bonuses):
0 Nexus MothershipCore Mothership Carrier
Output:
You must construct 1 additional pylon.
Why?
There are no pylons, but the nexus provides 11 supply. The motherships take up 2 and 8, respectively and the carrier takes up 6. You need one more pylon to have enough to provide for all 16 supply.
TL; DR
Введите строку, состоящую из целых и разделенных пробелами имен единиц (из таблицы выше). Выведите истинное значение, если вы можете построить все единицы с запасом, обеспеченным N
пилонами (целое число на входе). Выведите, You must construct ZZZ additional pylon(s)
если нужно больше пилонов, гдеZZZ
находится необходимое количество пилонов. Убедитесь, что пилоны множественного числа, если это необходимо.
Это код-гольф , поэтому выигрывает самый короткий код в байтах (или метод подсчета вашего языка)!
Leaderboard
Вот фрагмент стека, чтобы генерировать как регулярную таблицу лидеров, так и обзор победителей по языкам.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:
# Perl, 43 + 2 (-p flag) = 45 bytes
Вы также можете сделать название языка ссылкой, которая затем будет отображаться во фрагменте списка лидеров:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=69011,OVERRIDE_USER=36670;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?([\d\.]+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
N unit1 unit2 unit3...
.true
или приемлемо истинное значение?Ответы:
Рубин, 263 - 30% = 184 байта
использование
ruby sc.rb 0 Probe Nexus
источник
Python 3, 207 * .9 == 186,3 байта.
Реализует бонус нексуса.
Сохранено 26 байт благодаря DSM.
Сохранено 2 байта благодаря Тиму Педерику
источник
True
, вы можете сохранить два байта, заменив их1>0
просто1
.JavaScript,
274265 байт (без бонусов)281 - 10% = 252,9 байтЭто выглядит довольно долго ...
Демо + объяснение:
источник
-(c>>3)
вместоMath.ceil(-c/8)
. Сохраните еще 2 байта, используяc<-8
вместоc/8<-1
./g
? Это сэкономило бы еще 6 байтов. Кроме того,/ob/i
похоже, что это будет работать для сохранения еще 5 байтов.>0
но если у вас есть точное соответствие, то это все еще верно. Очевидно, что в целях игры в гольф вы бы переключили его<0
и повернули?:
руки.s=>(c=eval(s.replace(/ /g,"-").replace(/\w+/g,m=>m[b="match"](/ob/i)?1:m[b](/^([ZSHDWP]|M\w+C)/)?2:m[b](/^O/)?3:m[b](/^[IAVT]/)?4:m[b](/^N/)?-11:m[b](/^C/)?6:+m!=m?8:m*8)))<0?`You must construct ${-(c>>3)} additional pylon${c<-8?"s":""}!`:true
Python 3, 293 - 30% = 205,1 байта
Реализует оба бонуса. Печатает 1 в качестве истинного значения, а либо 0, либо пустую строку в качестве значения false.
Благодарю решение Dom Hastings за то, что оно помогло мне сэкономить несколько байт с
ceil
моим «бедняком », а Моргана Треппа - за основную идею's!'[q>-2:]
, которая спасла мне шесть байтов, не говоря уже о том, чтобы указать в комментариях, как чтобы сохранить еще один байт на этом бите.Пояснения
Строка в строке 1 кодирует все устройства и их требования к питанию. Каждый юнит представлен в виде двух символов: шестнадцатеричная цифра, указывающая длину имени юнита, и первый символ имени (например
8O
, «Наблюдатель»aM
- «Материнский корабль»). Требование к поставке - это индекс закодированной единицы в последовательностиs
, сформированной путем разбиения строки на пробелы. Полные остановки отмечают неиспользованные объемы поставок (ни одному устройству не нужно 5 или 7 поставок), и в качестве особого случая Nexus (5N
) имеет индекс 0.В строке 2 инициализируются значения:
m
количество ядер материнского судна,M
количество кораблей,n
общая стоимость поставок иo
указание, были ли нарушены условия строительства материнского судна. В строке 3 вводятся входные данные, в которые вводится число пилоновp
и список единицu
.Внутри цикла , который начинается в строке 4,
S
является индексом вs
и, таким образом, также количество подаваемого необходимого для текущего блока,v
. В строке 6while
оператор проходитs
до тех пор, пока единица не будет найдена. ('%x'%len(v)
превращает длину имени устройства в шестнадцатеричное число.)В строке 7 обновляется общая стоимость поставок
n
(обратите внимание на особый случай-11
, если онS
равен нулю). Затем он увеличивает количество материнских кораблейM
(определяемых по стоимости поставки более 7) и сердечников материнских кораблейm
(определяемых подстрокойpC
в имени подразделения). Затем, если какой-либо из них больше 1 или еслиM
хотя бы один изm
них все еще равен нулю, флагo
устанавливается. (На самом деле, он увеличивается, но позже мы заботимся только о том, является ли он нулевым или ненулевым.)Дефицит пилонов
q
рассчитывается, как ни странно, в строке 8. Наивно, он должен бытьn // 8 - int(p)
(т. Е. Одна восьмая стоимости поставки, за вычетом любых пилонов, которые у нас уже есть). Но это будет округлять, когда нам нужно округлить. Целочисленное деление (//
) округляет до отрицательной бесконечности, поэтому мы просто работаем с отрицательными значениями:,int(p) - -(n // -8)
что упрощает до фактически используемой формы.Наконец, вывод. Если у нас всего один пилон,
q
будет -1, отсюда и тестq>-2
(который вырезаетs
строку,s!
если она истинна, и сохраняет ее в противном случае). Если дефицита пилона нет,q
он будет нулевым или положительным, поэтомуq<0
нужно выбирать между истинным значением 1 или выходной строкой. Наконец, если флагo
не равен нулю, умножение результата (1 или строки) на BooleanFalse
(обрабатывается как числовой 0) даст значение Falsey (0 или пустую строку).источник
С ++ 11, 732-30% = 512,4 байта
Использует предложения бедного человека от Дома Гастингса
ceil
и Мартина Бюттнера о сокращении словаря.источник
@username
в начале комментария, например@wizzwizz4
.Python 2,
442359464332314306 - 10% = 275,4источник
dict(x[:2],int(x[2:]) for x in "Ne-11 Pr1 Ze2".split())
Lua, 418 - 10% = 376,2 байта
Реализует бонус Nexus.
Впервые я разместил что-то здесь. Писал сценарии Lua для игры, наткнулся на это и захотел помочь, хах.
Примечание: эта функция Lua предполагает, что базовая библиотека была загружена, и что приложение хоста определяет соответствующую
print
функцию, которая принимает любое значение, отличное от nil. Я использую Luastring.gsub
в меру своих возможностей, а также егоand
иor
операторов.Вот красивая версия:
источник
JavaScript (ES6), 228-10% = 206
Тест
источник
Perl, код 212 байт + 3 для
-p
- 10% = 193,5 байтЯ уверен, что смогу уменьшить это еще немного, не доволен полным
for$s(...){...}
блоком, но на этом я закончил!Интересные фрагменты
ceil
:int$n+.9
- Я пытался использовать,0|
но получил то, что выглядит как переполнение!(9)x9
выходы(9,9,9,9,9,9,9,9,9,9)
Использование:
Спасибо Тиму Педерику за помощь в сохранении дополнительного байта!
источник
ceil
» нужно только добавить.9
, потому что самое низкое десятичное число, которое вы получите, составляет 0,125 (1/8).