“ คุณต้องสร้างเสาเพิ่มเติม!”


28

บทนำ

ในเกมวางแผนกลยุทธ์ Starcraft 2 มีสาม "เผ่าพันธุ์" ให้เลือก: Terran, Zerg และ Protoss ในการท้าทายนี้เราจะมุ่งเน้นไปที่ Protoss และวลีที่เป็นสัญลักษณ์ "คุณต้องสร้างเสาเพิ่มเติม!" ข้อความนี้มีการระบุไว้เมื่อคุณหมดอุปทานเพื่อสร้างกองทัพของคุณ ดังนั้นเพื่อช่วยชุมชนสตาร์คราฟคุณต้องเขียนโปรแกรมหรือฟังก์ชั่นที่บอกผู้เล่นถึงจำนวนเสาที่ต้องการ

ความท้าทาย

คุณจะได้รับอินพุตของสตริงซึ่งประกอบด้วยรายการจำนวนเต็มเดียวNและรายการที่คั่นด้วยช่องว่าง Nจะเป็นศูนย์หรือเป็นบวกเสมอและรายการของหน่วยจะมีหน่วยที่ถูกต้องหนึ่งหน่วยขึ้นไปเสมอ Nแสดงจำนวนเสาที่ผู้เล่นมีอยู่ในปัจจุบัน งานของคุณคือการคำนวณว่าจำนวนเสาที่ผู้เล่นมีเพียงพอที่จะสร้างหน่วยหรือไม่ โปรแกรมหรือฟังก์ชั่นของคุณจะต้องส่งออก / คืนค่าความจริงหากมีอุปทานเพียงพอหรือหากมีอุปทานไม่เพียงพอคุณจะต้องส่งออกYou must construct ZZZ additional pylonsโดยที่ZZZจำนวนของเสาที่จำเป็นในการสร้างหน่วย โปรดทราบว่าpylon(s)จะต้องเป็นพหูพจน์เมื่อจำเป็นและไม่ได้หลายแบบเมื่อไม่ได้ ( ...1 additional pylon!, ...2 additional pylons!)

หน่วย Protoss และต้นทุนการจัดหา

นี่คือรายการของทุกหน่วยและต้นทุนการจัดหาที่สอดคล้องกัน เสาให้เพิ่มอีก 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. 

โบนัส

  1. ผู้เล่น Starcraft 2 ที่มีประสบการณ์ทุกคนจะรู้ว่าคุณต้องมีแกนความเป็นแม่ก่อนที่จะเปลี่ยนเป็นความเป็นแม่ นอกจากนี้คุณสามารถมีเพียงหนึ่งแม่ในเวลา (ไม่ว่าจะเป็นแม่ที่แท้จริงหรือแกนกลางของมารดา) หากไม่มีเงื่อนไขใด ๆ เหล่านี้เป็นจริงให้ส่งออกค่าเท็จ ๆ หากโปรแกรมของคุณสามารถตรวจสอบเพื่อดูว่ามีเพียงหนึ่งแม่ที่เปิดใช้งานในแต่ละครั้งและที่แกนกลางของแม่ถูกสร้างขึ้นก่อนที่จะเป็นแม่ที่แท้จริงให้ลด 20%นับไบต์ของคุณ
  2. คุณอาจรู้เพียงเล็กน้อย แต่ Nexus (ศูนย์ควบคุมโพรโทส) ก็จัดหาของให้ด้วยเช่นกัน! หากโปรแกรมของคุณสามารถเพิ่ม 11 จำนวนการจัดหาสูงสุดได้ทุกครั้งที่พบ Nexus ในรายการหน่วยรับส่วนลด 10%จากจำนวนไบต์ โปรดทราบว่ามันไม่สำคัญที่ Nexus เป็นในการสร้างการสั่งซื้อเพื่อให้ยังคงกลับมา0 Probe Nexustrue

ตัวอย่างที่มีโบนัส

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เป็นปริมาณของเสาที่ต้องการ ตรวจสอบให้แน่ใจว่าทำเสาพหูพจน์ถ้าจำเป็น

นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ (หรือวิธีการนับภาษาของคุณ) ชนะ!

ลีดเดอร์บอร์ด

นี่คือตัวอย่างข้อมูลเพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# 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>


1
มันจะต้องมีการแยกพื้นที่หรือว่า 'สะดวก'?
Blue

@muddyfish N unit1 unit2 unit3...ถ้าผมเข้าใจคุณอย่างถูกต้องใช่การป้อนข้อมูลจะต้องมีพื้นที่แยกออกจากกันในรูปแบบ
GamrCorps

จะมีมากกว่า 9 เสาหรือไม่ ฉันต้องส่งออกอย่างแน่นอนtrueหรือเป็นค่าความจริงที่ยอมรับได้?
Dom Hastings

@ DomHastings อาจมีมากกว่า 9 ค่าความจริงใด ๆ ที่เป็นที่ยอมรับ
GamrCorps

2
เข้ามา! ไม่มีใครจำ Starcraft: Broodwar หรือ Starcraft ดั้งเดิมได้หรือไม่ พวกเขามีวลีนั้นเช่นกัน!

คำตอบ:


4

Ruby, 263 - 30% = 184 ไบต์

v=c=k=0
l,a={PeOr:1,ZtSySrHrDrWmPxMe:2,Oe:3,VyIlAnTt:4,CsCr:6,Mp:8,Ns:-11},ARGV.shift
ARGV.map{|u|k+=l[l.keys.grep(/#{q=u[0]+u[-1]}/)[0]];c+=1if q=="Me";v=!0if c!=1&&q=~/M/}
n=k/8.0-a.to_i
p v ?n<0||"You must construct #{n.ceil} additional pylon#{'s'if n>1}!":nil

การใช้

ruby sc.rb 0 Probe Nexus


7

Python 3, 207 * .9 == 186.3 ไบต์

ใช้โบนัส nexus
บันทึก 26 ไบต์ด้วย DSM
บันทึก 2 ไบต์ขอบคุณ Tim Pederick

x,*l=input().split()
d=-((int(x)*8-sum((('vexuobcl'+2*'clsuie'+4*'Ratahoiesuhihi').count(q[-3:-1])*(1-12*(q[0]>'w'))or 2)for q in l))//8)
print((1,"You must construct %s additional pylon"%d+'s!'[d<2:])[d>0])

เยี่ยมมาก! เนื่องจากคุณจำเป็นต้องส่งออกเฉพาะค่า truthy ไม่จำเป็นต้องTrueคุณสามารถบันทึกไบต์ที่สองโดยการแทนที่ที่มีเพียง1>0 1
ทิม Pederick

@ TimPederick ฉันไม่แน่ใจว่านับว่าเป็นความจริงมากพอ
Morgan Thrapp


3
คุณจะต้องสร้างงูเหลือมเพิ่มเติม ...
Brian

4

JavaScript, 274 265 ไบต์ (ไม่มีโบนัส) 281 - 10% = 252.9 ไบต์

s=>(c=eval(s[a="replace"](" ","-(")[a](/ /g,"+")[a](/\w+/g,m=>m[b="match"](/^(Pr|Ob)/g)?1:m[b](/^([ZSHDWP]|M\w+C)/g)?2:m[b](/^O/g)?3:m[b](/^[IAVT]/g)?4:m[b](/^N/g)?-11:m[b](/^C/g)?6:+m!=m?8:m*8)+")"))>0?true:`You must construct ${Math.ceil(-c/8)} additional pylon${c/8<-1?"s":""}!`

ดูเหมือนว่าจะมีความยาวพอสมควร ...

การสาธิต + คำอธิบาย:

p = s => (c = eval(
  s[a = "replace"](" ", "-(")         //replace the first space (after the number of pylons) with "-" and open the bracket
   [a](/ /g, "+")                       //replace all the remaining spaces with "+"
   [a](/\w+/g, m =>                     //replace any sequence of characters with...
    m[b = "match"](/^(Pr|Ob)/g) ? 1 :   //with 1, if matches "Probe" or "Observer"
    m[b](/^([ZSHDWP]|M\w+C)/g) ? 2 :    //with 2, if it matches bunch of the units with cost 2. "Probe" didn't match already, so it's safe to catch "Phoenix" by only the first letter.
    m[b](/^O/g) ? 3 :                   //with 3, if match is "Oracle"
    m[b](/^[IAVT]/g) ? 4 :              //with 4, if matches "Immortal", "Archon", "VoidRay" or "Tempest"
    m[b](/^C/g) ? 6 :                   //with 6, if it's "Carrier" or "Colossus"
    m[b](/^N/g) ? -11 :                 //don't forget nexuses!
    +m != m ? 8 : m * 8                 //and if's not a number, then it's "Mothership", so with 8. If it's number, it can only be the number of pylons, replace it with itself multiplied by 8.
  ) + ")"                             //close the opened bracket
)) > 0 ? true : `You must construct ${Math.ceil(-c/8)} additional pylon${c/8<-1?"s":""}!`

document.write(
  p("2 Probe Probe Probe Probe Stalker Zealot Carrier Probe Zealot") + "<br>" +
  p("5 Mothership Carrier Probe Tempest HighTemplar") + "<br>" +
  p("0 Mothership Colossus Zealot") + "<br>" +
  p("0 Probe Nexus Probe")
)


ฉันไม่รู้ว่าทำไมฉันไม่ดูโบนัสควรทำ
nicael

บันทึก 8 ไบต์โดยใช้แทน-(c>>3) Math.ceil(-c/8)บันทึกอีก 2 ไบต์โดยใช้แทนc<-8 c/8<-1
Neil

การแข่งขันภายในของคุณไม่จำเป็นต้อง/gทำ? นั่นจะช่วยประหยัดอีก 6 ไบต์ นอกจากนี้ยัง/ob/iดูเหมือนว่ามันจะทำงานอีกประหยัด 5 ไบต์
Neil

การทดสอบของคุณดูเหมือนจะผิด - คุณกำลังใช้>0แต่ถ้าคุณมีคู่ที่ตรงกันนั่นก็ยังคงเป็นจริง เห็นได้ชัดว่าสำหรับวัตถุประสงค์ในการเล่นกอล์ฟคุณจะเปลี่ยนไปใช้<0และพลิก?:แขน
Neil

1
ฉันคิดว่าคุณสามารถบันทึกได้อีก 17 ไบต์โดยใช้การลบตลอด นี่คือสิ่งที่ฉันมีจนถึงตอนนี้: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
Neil

4

Python 3, 293 - 30% = 205.1 ไบต์

ใช้โบนัสทั้งสองอย่าง พิมพ์ 1 เป็นค่าความจริงและเป็น 0 หรือสตริงว่างเปล่าเป็นค่าเท็จ

s='5N 8O5P bDbHeM7P6S7S9W6Z 6O 6A8I7T7V . 7C8C . aM'.split()
m=M=n=o=0
p,*u=input().split()
for v in u:
 S=0
 while'%x'%len(v)+v[0]not in s[S]:S+=1
 n+=S or-11;M+=S>7;m+='pC'in v;o+=m>1or M>1or m<1<=M
q=int(p)+n//-8
print([1,'You must construct %d additional pylon'%-q+'s!'[q>-2:]][q<0]*(o<1))

ให้เครดิตกับโซลูชันของ Dom Hastings ที่ช่วยให้ฉันสามารถกำจัดสองสามไบต์ที่มี "คนยากจนceil" ของฉันเองและMorgan Thrappสำหรับแนวคิดที่เป็นพื้นฐาน's!'[q>-2:]ซึ่งช่วยฉันหกไบต์ - ไม่ต้องพูดถึงการชี้ให้เห็น เพื่อบันทึกไบต์อื่นบนบิตนั้น


คำอธิบาย

สตริงในบรรทัดที่ 1 เข้ารหัสหน่วยทั้งหมดและข้อกำหนดการจัดหา แต่ละหน่วยจะแสดงเป็นอักขระสองตัว: ตัวเลขฐานสิบหกที่ให้ความยาวของชื่อหน่วยและอักขระตัวแรกของชื่อ (เช่น8Oผู้สังเกตการณ์aMคือผู้เป็นแม่) ข้อกำหนดด้านอุปทานคือดัชนีของหน่วยที่เข้ารหัสภายในลำดับที่sเกิดขึ้นโดยแยกสตริงบนช่องว่าง Full stop ทำเครื่องหมายปริมาณการใช้ที่ไม่ได้ใช้ (ไม่มีหน่วยต้องการอุปทาน 5 หรือ 7) และในกรณีพิเศษ Nexus ( 5N) อยู่ที่ดัชนี 0

ค่าเริ่มต้นของบรรทัดที่ 2: mคือจำนวนแกนกลางของมารดาMคือจำนวนของมารดาnเป็นต้นทุนการจัดหาทั้งหมดและoบ่งชี้ว่ามีการละเมิดเงื่อนไขการสร้างมารดาหรือไม่ บรรทัดที่ 3 จะเข้าที่วางจำนวนเสาลงไปและรายชื่อของหน่วยเข้าไปในpu

ภายในวงที่เริ่มต้นที่บรรทัดที่ 4 Sเป็นดัชนีลงและจึงยังปริมาณของอุปทานที่จำเป็นสำหรับหน่วยปัจจุบันs vในบรรทัดที่ 6 whileคำสั่งจะดำเนินการไป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 หรือสตริง) โดย Boolean False(จัดการเป็นตัวเลข 0) จะให้ค่าเท็จ (0 หรือสตริงว่าง)


3

C ++ 11, 732-30% = 512.4 ไบต์

ใช้ceilคำแนะนำของชายผู้น่าสงสารของ Dom Hastings และ Martin Büttnerเรื่องย่อพจนานุกรม

#include <iostream>
#include <map>
#include <string>
#include <cctype>
using namespace std;
map<int,int>a ={{536,1},{655,2},{677,2},{758,2},{1173,2},{1175,2},{869,4},{891,6},{635,4},{872,1},{997,2},{763,2},{1516,2},{766,4},{630,3},{770,4},{744,6},{1091,8},{563,-11}};
int main(){string b,c;int d,e,l,j,k=0,m=0,n=0,v=0;cin>>d;getline(cin,b);
while(b.size()){e=0;auto z=b.find(" ");c=b.substr(0,z);b.erase(0,((z==string::npos)?z:z+1));
for(int i=0;i<c.size();i++){e+=tolower(c[i]);}
if(e==1516){m++;}else if(e==1091){((m>1)?v=1:v=0);}
if((l=k-(d*8)>0)&&(m==n==1)){j=(int)(((float)l/8)+0.99);cout<<"You must construct "<<j<<" additional pylon"<<((j==1)?"!":"s!")<<endl;}
else{cout<<((m==n==1&&!v)?"True":"False")<<endl;}}

+1 ยินดีต้อนรับสู่ Programming Puzzles และ Code Golf และ Stack Exchange ทั้งหมด นี่เป็นคำตอบแรกที่ดีมาก หากคุณต้องการความช่วยเหลือใด ๆ เพียงแค่ถามโดยพิมพ์ที่จุดเริ่มต้นของความคิดเห็นเช่น@username @wizzwizz4
wizzwizz4

2

Python 2, 442 359 464 332 314 306 - 10% = 275.4

a,*l=input().split(' ');p=int(a)*8;for i in l:p-={"Ne":-11,"Pr":1,"Ze":2,"Se":2,"St":2,"Hi":2,"Da":2,"Im":4,"Co":6,"Ar":4,"Ob":1,"Wa":2,"Ph":2,"MoC":2,"Vo":4,"Or":3,"Te":4,"Ca":6,"Mo":8}[i[:2]+("C"if i[-4:]=="Core")]
e=int(.9+p/8)+1;print[1,"You must construct "+`e`+" additional pylon"+"s!"[e>1:]][p>=0]

ฉันจะทำให้พจนานุกรมของฉันสั้นลงได้อย่างไร
NoOne อยู่ที่นี่

2
มีหลายวิธีที่จะทำเช่นนั้น เช่นคำตอบ JavaScript ใช้นิพจน์ทั่วไปแทนการตรวจสอบกับแต่ละสตริง บางทีคุณอาจลองค้นหาแฮชที่จับคู่แต่ละสตริงกับตัวเลขที่ไม่ซ้ำกัน (อาจจะเป็นผลรวมของรหัสอักขระ) ตัวเลขเหล่านั้นอาจสั้นกว่าสตริง
Martin Ender

ฉันไม่แน่ใจ แต่อาจนานพอที่จะได้รับเงินออมด้วยสิ่งที่ต้องการdict(x[:2],int(x[2:]) for x in "Ne-11 Pr1 Ze2".split())

1

Lua, 418 - 10% = 376,2 ไบต์

function p(i)i=i:gsub("(%w+)",function(w)q=tonumber(w)*8;return""end,1);n=0;i:gsub("(%w+)",function(w)m=w.match;n=n+(m(w,"^Pr.*")and 1 or m(w,"^Ob.*")and 1 or m(w,"^[ZSHDWP]")and 2 or m(w,"^M.*C")and 2 or m(w,"^O")and 3 or m(w,"^[IAVT]")and 4 or m(w,"^C")and 6 or m(w,"^N")and -11 or 8)end)if n>q then a=math.ceil((n-q)/8);print("You must construct "..a.." additional pylon"..(a>1 and"s"or"")..".")else print(1)end end

ใช้โบนัสของ Nexus

ครั้งแรกที่ฉันโพสต์บางสิ่งที่นี่ กำลังเขียนสคริปต์ Lua สำหรับเกมสะดุดไปกับเรื่องนี้

หมายเหตุ: ฟังก์ชัน Lua นี้สันนิษฐานว่าไลบรารีฐานถูกโหลดและโฮสต์แอ็พพลิเคชันกำหนดprintฟังก์ชันที่เหมาะสมซึ่งยอมรับค่าที่ไม่ใช่ค่าใด ๆ ฉันเอาเปรียบ Lua ของstring.gsubที่ดีที่สุดของความสามารถของฉันเช่นเดียวกับตนandและorผู้ประกอบการ

นี่คือรุ่นที่สวย:

function pylons(i)
    -- Replace the first word, the number, with a space, while also storing it as a number * 8
    i = i:gsub("(%w+)", function(w)
        q = tonumber(w) * 8
        return ""
    end, 1)
    n = 0
    -- the function passed to gsub gets every word in the string,  and then I misuse Lua's and/or
    -- operator order to assign supply values to string.match calls that do not return nil
    i:gsub("(%w+)", function(w)
        m = w.match
        n = n + (m(w,"^Pr.*") and 1 or
        m(w,"^Ob.*") and 1 or
        m(w,"^[ZSHDWP]") and 2 or
        m(w,"^M.*C") and 2 or
        m(w,"^O") and 3 or
        m(w,"^[IAVT]") and 4 or
        m(w,"^C") and 6 or
        m(w,"^N") and -11 or 8)
    end)
    if n>q then
        a = math.ceil((n-q)/8)
        print("You must construct "..a.." additional pylon"..(a>1 and"s"or"")..".")
    else
        print(1)
    end
end

pylons("5 Nexus Probe Observer Zealot Sentry Stalker HighTemplar DarkTemplar WarpPrism Phoenix MothershipCore Oracle Immortal Archon VoidRay Tempest Colossus Carrier Mothership")
pylons("2 Probe Probe Probe Probe Stalker Zealot Carrier Probe Zealot")
pylons("5 Mothership Carrier Probe Tempest HighTemplar")
pylons("0 Mothership Colossus Zealot")

0

JavaScript (ES6), 228-10% = 206

s=>(s.replace(/\w+/g,x=>t+=~~{Ns:-11,Pe:1,Zt:2,Sy:2,Sr:2,Hr:2,Dr:2,Il:4,Cs:6,An:4,Or:1,Wm:2,Px:2,Me:2,Vy:4,Oe:3,Tt:4,Cr:6,Mp:8}[x[0]+x.slice(-1)]-8*~~x,t=7),t=t/8|0,t<=0||`You must construct ${t} additional pylon${t>1?'s':''}!`)

ทดสอบ

F=s=>(
  t=7,
  s.replace(/\w+/g,
   x=>t+=~~{Ns:-11,Pe:1,Zt:2,Sy:2,Sr:2,Hr:2,Dr:2,Il:4,Cs:6,An:4,Or:1,Wm:2,Px:2,Me:2,Vy:4,Oe:3,Tt:4,Cr:6,Mp:8}[x[0]+x.slice(-1)]-8*~~x),
  t=t/8|0,
  t<=0||`You must construct ${t} additional pylon${t>1?'s':''}!`
)

console.log=x=>O.textContent+=x+'\n';

;['2 Probe Probe Probe Probe Stalker Zealot Carrier Probe Zealot',
'5 Mothership Carrier Probe Tempest HighTemplar',
'0 Mothership Colossus Zealot','0 Probe Nexus Probe'
].forEach(t=>console.log(t+'\n'+F(t)))
<pre id=O></pre>


0

Perl, 212 รหัสไบต์ + 3 สำหรับ-p- 10% = 193.5 ไบต์

ฉันแน่ใจว่าฉันสามารถลดจำนวนนี้ได้อีกไม่พอใจกับการfor$s(...){...}บล็อกเต็มแต่ตอนนี้ฉันทำเสร็จแล้ว!

$x=$_*8;s/^\d+ //;map{for$s(Pr,Ob,Or,C,V,I,A,T,Z,S,H,D,W,Ph,'.+C',N,'.+p$'){$x-=(1,1,3,6,(4)x4,(2)x7,-11,8)[$i++%17]*/^$s/}}/\w+/g;$x=int$x/-8+.9;$s=1<$x&&'s';$_=$x>0?"You must construct $x additional pylon$s!":1

ตัวอย่างที่น่าสนใจ

  • แย่ชายceil: int$n+.9- ฉันพยายามใช้0|แต่มีสิ่งที่ดูเหมือนล้น!
  • รายการซ้ำ: (9)x9อัตราผลตอบแทน(9,9,9,9,9,9,9,9,9,9)

การใช้งาน:

perl -p pylons.pl <<< '3 Mothership Zealot'
1

ขอบคุณTim Pederick ที่ช่วยประหยัดไบต์พิเศษ!


ฉันเชื่อว่า "คนจน" ของคุณceilต้องการเพียงเพิ่ม.9เพราะทศนิยมต่ำสุดที่คุณจะได้รับคือ 0.125 (1/8)
ทิม Pederick

@ TimPederick เป็นจุดที่ดีฉันต้องประหยัดมากขึ้นในการแข่งขัน! อาจจะมีมูลค่าการมองเข้าไปในโบนัสอื่น ๆ สำหรับฉัน ...
Dom เฮสติ้งส์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.