“Ek direkler inşa etmelisin!”


28

Giriş

Strateji oyununda Starcraft 2, aralarından seçim yapabileceğiniz üç "ırk" var: Terran, Zerg ve Protoss. Bu mücadelede, Protos'lara ve "Ek dikmeler inşa etmelisiniz!" İkonuna değineceğiz. Bu mesaj, ordunuzu kurmak için tedarikiniz bittiğinde belirtilir. Bu yüzden, Starcraft topluluğuna yardımcı olmak için, oyunculara tam olarak kaç tane direk istediklerini söyleyen bir program veya işlev yazmalısınız.

Meydan okuma

Tek bir tamsayı Nve boşlukla ayrılmış birimler listesinden oluşan bir dize girişi verilecektir . Nher zaman sıfır veya pozitif olur ve birimler listesinde her zaman bir veya daha fazla geçerli birim bulunur. NOyuncunun o anda sahip olduğu direkleri temsil eder. İşiniz, oyuncunun sahip olduğu pilon miktarının birimleri oluşturmak için yeterli olup olmadığını hesaplamaktır. Orada yeterli kaynağı ise veya Programınız veya işlev zorunluluk çıkışı / a truthy değeri döndürmek çıkış gerekir yeterince arz yoksa birimleri oluşturmak için gerekli direkler miktarıdır. Not gerekli ve unplural değilken (zaman çoğul olmalıdır , ).You must construct ZZZ additional pylonsZZZpylon(s)...1 additional pylon!...2 additional pylons!

Protoss Birimleri ve Arz Maliyeti

İşte tüm birimlerin bir listesi ve bunlara karşılık gelen tedarik maliyetleri. Direkler ek bir 8 tedarik sağlar.

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

Bonus OLMADAN Örnekler

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. 

Bonuslar

  1. Tecrübeli herhangi bir Starcraft 2 oyuncusu, onu bir ana gemiye dönüştürmeden önce bir ana gemiye ihtiyacınız olduğunu bilir. Ayrıca, bir seferde yalnızca bir ana anneliğe sahip olabilirsiniz (gerçek bir ana ya da ana bir çekirdek olup olmadığı). Bu koşullardan hiçbiri doğru değilse, herhangi bir sahte değeri verin. Programınız bir seferde yalnızca bir anneliğin aktif olduğunu ve gerçek annelikten önce bir annelik çekirdeğinin kurulduğunu kontrol edebilirse , % 20 edebilirse, bayt indirim alın.
  2. Çok az şey biliyor olabilirsiniz, ancak nexuses (protoss komut merkezleri) aslında tedarik de veriyor! Programınız, ünite listesindeki bir bağlantı noktasıyla her karşılaştığında maksimum arza 11 ekleyebilirse , bayt sayınızdan % 10 indirim alın. Nexus'un yapım sırasının neresinde olduğu önemli değil, 0 Probe Nexusyine de geri döneceğini unutmayın true.

Bonus İle Örnekler

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

Bir tamsayı ve boşlukla ayrılmış birim adlarından oluşan bir dize girin (yukarıdaki tablodan). Tüm birimleri Ndikmeler tarafından sağlanan beslemeyle (girilen tam sayı) oluşturabiliyorsanız bir gerçek değer verin. Çıktı You must construct ZZZ additional pylon(s)daha dikmesi gerektiği takdirde, nerede ZZZihtiyaç direklere miktarıdır. Gerekirse direkleri çoğalttığınızdan emin olun.

Bu , yani bayt cinsinden en kısa kod (veya dilinizin sayma yöntemi) kazanır!

Liderler Sıralaması

Burada hem düzenli bir lider tablosu hem de kazananların dile göre genel bir bakışı oluşturmak için bir Stack Snippet'i var.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

# Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

# Perl, 43 + 2 (-p flag) = 45 bytes

Dil adını, daha sonra büyük afiş snippet'inde görünecek bir bağlantı da yapabilirsiniz:

# [><>](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
Alandan ayrılması gerekiyor mu yoksa 'uygun' olabilir mi?
Mavi

@muddyfish Seni doğru anlarsam, evet girdi biçiminde boşluk bırakılmalıdır N unit1 unit2 unit3....
GamrCorps

9'dan fazla pilon olacak mı? Tam olarak çıktı yapmak zorunda truemıyım yoksa bir gerçek değeri kabul edilebilir mi?
Dom Hastings

@DomHastings 9'dan fazla olabilir. Herhangi bir gerçeği kabul edilebilir.
GamrCorps

2
Ah, hadi ama! Starcraft: Broodwar veya orijinal Starcraft'ı hatırlayan var mı? Onlar da bu cümleyi var!

Yanıtlar:


4

Ruby, 263 -% 30 = 184 bayt

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

kullanım

ruby sc.rb 0 Probe Nexus


7

Python 3, 207 * .9 == 186.3 bayt.

Nexus bonusunu uygular.
DSM sayesinde 26 bayt kaydedildi.
Tim Pederick sayesinde 2 bayt kaydedildi

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

İyi iş! Gerçekte değil, yalnızca bir gerçek değer üretmeniz gerektiğinden True, 1>0sadece yerine iki bayt kaydedebilirsiniz 1.
Tim Pederick

@TimPederick Bunun yeterince acayip sayıldığından emin değildim.
Morgan Thrapp


3
Ek pitonlar inşa etmelisin ...
Brian

4

JavaScript, 274 265 bayt (bonus yok) 281 - 10% = 252.9 bayt

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":""}!`

Bu oldukça uzun gözüküyor ...

Demo + açıklama:

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


Neden ikramiye bakmadığımı bilmiyorum, yapmalıyım.
nicael

Kullanarak 8 bayt kaydet -(c>>3)yerine Math.ceil(-c/8). Kullanarak başka 2 bayt kaydet c<-8yerine c/8<-1.
Neil

İç kibritlerine ihtiyacın /gyok mu? Bu 6 bayt daha kurtarır. Ayrıca /ob/ibaşka bir 5 byte tasarruf için işe yarayacak gibi görünüyor.
Neil

Testin yanlış görünüyor - kullanıyorsun >0ama kesin bir eşleşmen varsa, o zaman hala doğru. Açıkçası golf oynamak için onu değiştirir <0ve ?:kolları tersine çevirirsiniz .
Neil

1
Bence başından çıkarma yaparak daha fazla 17 byte tasarruf edebileceğinizi düşünüyorum Şu ana kadar sahip olduğum şey şu: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 bayt

uygular Her iki bonusu da . 1'i gerçek değeri olarak ve 0'ı veya falsey değeri olarak boş bir dize yazdırır.

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

Kredi Dom Hastings'in çözümü bana 'fakir adamın iyi bir kaç bayt traş yardımcı olduğunuz için ceil' benim kendi ve Morgan Thrapp en temel fikri için 's!'[q>-2:]yorumlardaki, işaret söz Bana altı bayt-değil kurtardı, nasıl bu bitte başka bir bayttan tasarruf etmek için.


açıklamalar

Satır 1'deki dize tüm birimleri ve tedarik gereksinimlerini kodlar. Her birim iki karakter olarak temsil edilir: ünitenin isminin uzunluğunu veren onaltılık bir hane ve ismin ilk karakteri (örn 8O. Gözlemci; aMAnneliktir). Arz gereksinimi, dizideki kodlanmış birimin sdizesidir ve dizgilerin boşluklara bölünmesiyle oluşur. Tam duraklar kullanılmayan tedarik miktarını işaretler (ünite 5 veya 7 tedarik gerektirmez) ve özel bir durum olarak, Nexus ( 5N) indeks 0'dadır.

Satır 2, değerleri başlatır: mana bilgisayar sayısı, ana bilgisayar Msayısı n, toplam arz maliyeti ve oana bina yapım koşullarının ihlal edilip edilmediğini gösterir. 3. satır giriş, direklerin sayısını pve birimlerin listesini girerek alıru .

Satır 4'te başlayan döngü içinde S, bir indekstir sve dolayısıyla mevcut birim için ihtiyaç duyulan tedarik miktarını v,. 6. satırda, whileifade sbirim bulunana kadar geçer . ('%x'%len(v) ünitenin adının uzunluğunu onaltılık basamağa çevirir.)

Satır 7 toplam tedarik maliyetini günceller n( -11eğer Ssıfır ise , özel durumu not alın ). Daha sonra, annelik sayısını M(arz bedeli 7'nin üzerinde olduğu tespit edilir) ve annelik çekirdeklerini m( pCbirimin adındaki alt madde ile tanımlanır ) artırır . Ardından, bunlardan biri 1'den büyükse veya Men az bir tane mhala sıfır ise, bayrak oayarlanır. (Aslında, bu artmıştır, ancak daha sonra sadece sıfır ya da sıfır olmasa da umursarız.)

Pilon açığı q, biraz garip bir şekilde, 8. satırda hesaplanır n // 8 - int(p). Fakat bu, toparlanmamız gerektiğinde toparlanacaktı. Tamsayı bölümü (// ) negatif sonsuzluğa yuvarlar, bu yüzden her şeyi negatif olarak çalışırız:int(p) - -(n // -8) bu aslında kullanılan forma basitleştirir.

Son olarak, çıktı. Eğer sadece bir pilon kısayız q-1, bu nedenle test q>-2( eğer doğruysa sdizginin s!dışını keser ve aksi halde tutar) test olur. Pilon açığı qyoksa sıfır veya pozitif olacaktır, bu nedenle q<0truthy değeri 1 ile çıkış dizgisi arasında seçim yapın. Son olarak, bayrak osıfır değilse, her iki sonucu da (1 veya bir dize) Boolean False(sayısal 0 olarak işlenir ) ile çarpmak, bir falsey değeri (0 veya boş dize) verir.


3

C ++ 11, 732-30% = 512.4 bayt

Dom Hastings'in zavallı adamın ceilve Martin Büttner'ın sözlüğü kısaltma önerilerini kullanır .

#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 Programlama Bulmacaları ve Code Golf'a ve tüm Stack Exchange'e hoş geldiniz. Bu çok iyi bir ilk cevap. Herhangi bir yardım istiyorsanız, sadece @usernamebir yorumun başında yazarak isteyin , örneğin @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]

Sözlüğümü nasıl kısaltabilirim?
NoOneIsHere

2
Bunu yapmanın tonlarca yolu var. Örneğin, JavaScript cevabı, münferit dizeleri kontrol etmek yerine normal ifadeleri kullanır. Belki her bir dizgiyi benzersiz bir sayıya eşleştiren bir hash bulmayı deneyebilirsiniz (belki karakter kodlarının toplamı). Bu sayılar dizgilerden daha kısa olabilir.
Martin Ender

Emin değilim, ama belki de böyle bir şeyle para biriktirmek yeterince uzundict(x[:2],int(x[2:]) for x in "Ne-11 Pr1 Ze2".split())

1

Lua, 418 -% 10 = 376,2 bayt

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 bonusunu uygular.

İlk defa buraya bir şey yolladım. Bir oyun için Lua senaryoları yazıyor, bunun üzerine tökezledi ve katkıda bulunmak istiyordum, hah.

Not: Bu Lua işlevi, temel kütüphanenin yüklendiğini ve ana bilgisayar uygulamasının printsıfır olmayan herhangi bir değeri kabul eden uygun bir işlev tanımladığını varsayar . Lua'yı string.gsubyeteneğimin en iyi yanı kadar onun andve orişleçleri için sömürüyorum .

İşte güzel sürüm:

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':''}!`)

Ölçek

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 bayt kodu + 3 -p-% 10 = 193,5 bayt

Eminim bunu biraz daha azaltabilirim, tüm for$s(...){...}bloktan memnun değil ama şimdilik bittim!

$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

İlginç pasajlar

  • Zavallı adam ceil: int$n+.9- Kullanmaya çalıştım 0|ama taşma gibi görünen bir şeye sahip oldum !
  • Liste çoğaltması: (9)x9verim(9,9,9,9,9,9,9,9,9,9)

Kullanımı:

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

Ekstra bayttan tasarruf etmenize yardımcı olduğu için Tim Pederick'e teşekkürler !


"Zavallı adamın ceil" sadece eklemesi gerektiğine inanıyorum .9, çünkü alacağınız en düşük ondalık sayı 0,255 (1/8).
Tim Pederick

@TimPederick İyi bir nokta, rekabetçi olabilmem için çok daha fazla tasarruf etmem gerekiyor! Benim için diğer ikramiye bakmaya değer olabilir ...
Dom Hastings
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.