28
0
Introduction
In the strategy game Starcraft 2, there are three "races" to choose from: Terran, Zerg, and Protoss. In this challenge we will be focusing on the Protoss and the iconic phrase "You must construct additional pylons!" This message is stated when you run out of supply to build your army. So, to help out the Starcraft community, you must write a program or function that tells players exactly how many pylons they need.
The Challenge
You will be given an input of a string consisting of a single integer N
and space-separated list of units. N
will always be zero or positive, and the list of units will always have one or more valid units. N
represents the amount of pylons the player currently has. Your job is to calculate if the amount of pylons that the player has is enough to build the units. Your program or function must output/return a truthy value if there is enough supply, or if there is not enough supply you must output You must construct ZZZ additional pylons
where ZZZ
is the amount of pylons needed to build the units. Note that pylon(s)
must be plural when needed and unplural when not (...1 additional pylon!
, ...2 additional pylons!
).
Protoss Units and Supply Cost
Here is a list of all units and their corresponding supply cost. Pylons provide an additional 8 supply.
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
Examples WITHOUT Bonuses
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.
Bonuses
- Any experienced Starcraft 2 player would know that you need a mothership core before to transform it into a mothership. Also, you can only have one mothership at a time (whether it is an actual mothership or a mothership core). If neither of these conditions are true, output any falsy value. If your program can check to see that only one mothership is active at a time, and that a mothership core is built before the actual mothership, take 20% off your byte count.
- Little may you know, but nexuses (protoss command centers) actually provide supply too! If your program can add 11 to the maximum supply every time it encounters a nexus in the unit list, take 10% off your byte count. Note that it does not matter where the Nexus is in the build order, so
0 Probe Nexus
would still returntrue
.
Examples WITH Bonuses
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
Input a string consisting of an integer and space-separated unit names (from the table above). Output a truthy value if you can build all of the units with the supply provided by the N
pylons (the integer in input). Output You must construct ZZZ additional pylon(s)
if more pylons are needed, where ZZZ
is the amount of pylons needed. Make sure to make pylons plural if necessary.
This is code-golf, so shortest code in bytes (or your language's counting method) wins!
Leaderboard
Here is a Stack Snippet to generate both a regular leaderboard and an overview of winners by language.
To make sure that your answer shows up, please start your answer with a headline, using the following Markdown template:
# Language Name, N bytes
where N
is the size of your submission. If you improve your score, you can keep old scores in the headline, by striking them through. For instance:
# Ruby, <s>104</s> <s>101</s> 96 bytes
If there you want to include multiple numbers in your header (e.g. because your score is the sum of two files or you want to list interpreter flag penalties separately), make sure that the actual score is the last number in the header:
# Perl, 43 + 2 (-p flag) = 45 bytes
You can also make the language name a link which will then show up in the leaderboard snippet:
# [><>](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>
1Does it have to be space-separated or can it be 'convenient'? – Blue – 2016-01-09T18:11:29.410
@muddyfish If I understand you correctly, yes the input has to be space separated in the form
N unit1 unit2 unit3...
. – GamrCorps – 2016-01-09T18:12:21.810Will there ever be more than 9 pylons? Do I have to output exactly
true
or is a truthy value acceptable? – Dom Hastings – 2016-01-12T08:31:04.100@DomHastings there can be more than 9. Any truthy value is acceptable. – GamrCorps – 2016-01-12T13:01:50.883
I edited the leaderboard to handle floats, let me know if I broke something. – FryAmTheEggman – 2016-01-12T17:30:43.173
I saw pylons and I thought fallout 4. I swear preston gravey is haunting me. – Ashwin Gupta – 2016-01-18T18:44:41.397
Related: https://www.youtube.com/watch?v=HzccCLaLMmw
– Hannes Karppila – 2016-01-31T07:21:12.8102Oh, come on! Does anyone remember Starcraft: Broodwar or the original Starcraft? They have that phrase, too! – None – 2016-04-26T09:35:56.503