"Kamu harus membuat tiang tambahan!"


28

pengantar

Dalam permainan strategi Starcraft 2, ada tiga "ras" untuk dipilih: Terran, Zerg, dan Protoss. Dalam tantangan ini kita akan fokus pada Protoss dan frase ikonik "Anda harus membuat tiang tambahan!" Pesan ini dinyatakan saat Anda kehabisan persediaan untuk membangun pasukan Anda. Jadi, untuk membantu komunitas Starcraft, Anda harus menulis program atau fungsi yang memberi tahu pemain persis berapa banyak tiang yang mereka butuhkan.

Tantangan

Anda akan diberi input string yang terdiri dari satu bilangan bulat Ndan daftar unit yang dipisahkan ruang. Nakan selalu nol atau positif, dan daftar unit akan selalu memiliki satu atau lebih unit yang valid. Nmewakili jumlah tiang yang dimiliki pemain saat ini. Tugas Anda adalah menghitung apakah jumlah tiang yang dimiliki pemain cukup untuk membangun unit. Program atau fungsi Anda harus menampilkan / mengembalikan nilai yang sebenarnya jika ada cukup persediaan, atau jika tidak ada cukup persediaan, Anda harus menampilkan di You must construct ZZZ additional pylonsmana ZZZjumlah tiang yang dibutuhkan untuk membangun unit. Perhatikan bahwa pylon(s)harus jamak bila diperlukan dan unplural saat tidak ( ...1 additional pylon!, ...2 additional pylons!).

Unit Protoss dan Biaya Pasokan

Berikut adalah daftar semua unit dan biaya pasokan yang sesuai. Pylons menyediakan 8 pasokan tambahan.

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

Contoh TANPA Bonus

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. 

Bonus

  1. Setiap pemain Starcraft 2 yang berpengalaman akan tahu bahwa Anda memerlukan inti induk sebelum mengubahnya menjadi induk. Selain itu, Anda hanya dapat memiliki satu peran sebagai ibu sekaligus (apakah itu peran ibu yang sebenarnya atau inti peran sebagai ibu). Jika tidak satu pun dari kondisi ini yang benar, berikan nilai falsy. Jika program Anda dapat memeriksa untuk melihat bahwa hanya satu induk kapal yang aktif pada suatu waktu, dan bahwa inti induk tersebut dibangun sebelum induk yang sebenarnya, ambil 20% dari jumlah byte Anda.
  2. Sedikit yang mungkin Anda ketahui, tetapi nexus (pusat perintah protoss) sebenarnya menyediakan persediaan juga! Jika program Anda dapat menambahkan 11 ke persediaan maksimum setiap kali menemukan nexus di daftar unit, ambil 10% dari jumlah byte Anda. Perhatikan bahwa tidak masalah di mana Nexus berada dalam urutan pembuatan, jadi 0 Probe Nexusmasih akan kembali true.

Contoh DENGAN Bonus

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

Masukkan string yang terdiri dari bilangan bulat dan nama unit yang dipisahkan spasi (dari tabel di atas). Keluarkan nilai yang sebenarnya jika Anda bisa membangun semua unit dengan pasokan yang disediakan oleh Ntiang (bilangan bulat dalam input). Keluarkan You must construct ZZZ additional pylon(s)jika diperlukan lebih banyak tiang, di mana ZZZjumlah tiang dibutuhkan. Pastikan untuk membuat tiang jamak jika perlu.

Ini adalah , jadi kode terpendek dalam byte (atau metode penghitungan bahasa Anda) menang!

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

# [><>](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
Apakah harus terpisah dengan ruang atau dapatkah 'nyaman'?
Biru

@muddyfish Jika saya mengerti Anda dengan benar, ya input harus dipisahkan ruang dalam formulir N unit1 unit2 unit3....
GamrCorps

Akankah ada lebih dari 9 tiang? Apakah saya harus menampilkan dengan tepat trueatau apakah nilai yang sebenarnya dapat diterima?
Dom Hastings

@HomHastings bisa lebih dari 9. Nilai kebenaran apa pun bisa diterima.
GamrCorps

2
Oh ayolah! Adakah yang ingat Starcraft: Broodwar atau Starcraft asli? Mereka memiliki ungkapan itu juga!

Jawaban:


4

Ruby, 263 - 30% = 184 byte

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

Pemakaian

ruby sc.rb 0 Probe Nexus


7

Python 3, 207 * .9 == 186,3 byte.

Menerapkan bonus nexus.
Disimpan 26 byte berkat DSM.
Disimpan 2 byte berkat 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])

Kerja bagus! Karena Anda hanya perlu menampilkan nilai yang benar, tidak harus True, Anda dapat menyimpan dua byte dengan menggantinya 1>0dengan hanya 1.
Tim Pederick

@TimPederick Saya tidak yakin apakah itu dianggap cukup jujur.
Morgan Thrapp


3
Anda harus membuat ular sanca tambahan ...
Brian

4

JavaScript, 274 265 byte (tidak ada bonus) 281 - 10% = 252,9 byte

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

Ini tampaknya cukup panjang ...

Demo + penjelasan:

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


Saya tidak tahu mengapa saya tidak melihat bonus, harus melakukannya.
nicael

Hemat 8 byte dengan menggunakan -(c>>3)bukan Math.ceil(-c/8). Simpan 2 byte lagi dengan menggunakan c<-8alih-alih c/8<-1.
Neil

Kecocokan batinmu tidak perlu, kan /g? Itu akan menghemat 6 byte lagi. Juga /ob/iterlihat seperti itu akan bekerja bagi orang lain penghematan 5 byte.
Neil

Tes Anda tampaknya salah - Anda menggunakan >0tetapi jika Anda memiliki kecocokan yang tepat maka itu masih benar. Jelas untuk tujuan bermain golf Anda akan mengubahnya <0dan membalikkan ?:lengan.
Neil

1
Saya pikir Anda dapat menyimpan 17 byte lebih lanjut dengan menggunakan pengurangan seluruh. Inilah yang saya miliki sejauh ini: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 byte

Menerapkan kedua bonus. Mencetak 1 sebagai nilai sebenarnya, dan 0 atau string kosong sebagai nilai falsey-nya.

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

Kredit untuk Dom Hastings' solusi untuk membantu saya mencukur habis beberapa byte yang baik dengan 'orang miskin ceil' dari saya sendiri, dan Morgan Thrapp ini untuk ide yang mendasari 's!'[q>-2:], yang menyelamatkan saya enam byte-belum lagi menunjukkan, di komentar, bagaimana untuk menyimpan byte lain pada bit itu.


Penjelasan

String pada baris 1 mengkodekan semua unit dan persyaratan pasokannya. Setiap unit direpresentasikan sebagai dua karakter: digit heksadesimal yang memberikan panjang nama unit, dan karakter pertama dari nama tersebut (mis. 8OAdalah Pengamat; aMadalah Mothership). Persyaratan pasokan adalah indeks unit yang dikodekan dalam urutan s, yang dibentuk dengan memisahkan string pada spasi. Stop penuh menandai jumlah persediaan yang tidak digunakan (tidak ada unit yang membutuhkan pasokan 5 atau 7), dan sebagai kasus khusus, Nexus ( 5N) berada pada indeks 0.

Baris 2 menginisialisasi nilai: madalah jumlah inti induk, Madalah jumlah induk, nadalah total biaya persediaan, dan omenunjukkan apakah kondisi bangunan induk telah dilanggar atau tidak. Baris 3 mengambil input, memasukkan jumlah tiang ke dalam pdan daftar unit ke dalamnya u.

Dalam loop yang dimulai pada baris 4, Sadalah indeks ke sdan, dengan demikian, juga jumlah pasokan yang dibutuhkan untuk unit saat ini, v. Pada baris 6, whilepernyataan berjalan ssampai unit ditemukan. ( '%x'%len(v)mengubah panjang nama unit menjadi digit hex.)

Baris 7 memperbarui total biaya persediaan n(perhatikan kasus khusus -11,, jika Snol). Ini kemudian menambah jumlah induk M(diidentifikasi oleh biaya pasokan lebih dari 7) dan inti induk m(diidentifikasi oleh substring pCdalam nama unit). Kemudian, jika salah satu dari ini lebih besar dari 1, atau jika Msetidaknya satu saat mmasih nol, bendera oditetapkan. (Sebenarnya, itu bertambah, tetapi nanti kita hanya peduli apakah itu nol atau tidak nol.)

Defisit tiang qdihitung, sedikit aneh, di baris 8. Naif, seharusnya n // 8 - int(p)(yaitu seperdelapan dari biaya pasokan, dikurangi setiap tiang yang sudah kita miliki). Tapi itu akan bulat, ketika kita perlu mengumpulkan. Integer Division ( //) berputar ke arah infinity negatif, jadi kami hanya mengerjakan semuanya secara negatif int(p) - -(n // -8):, yang menyederhanakan bentuk yang sebenarnya digunakan.

Terakhir, output. Jika kita hanya satu tiang pendek, qakan menjadi -1, maka tes q>-2(yang mengiris skeluar dari string s!jika benar, dan menyimpannya sebaliknya). Jika tidak ada defisit tiang, qakan menjadi nol atau positif, maka q<0untuk memilih antara nilai kebenaran 1 atau string output. Terakhir, jika flag obukan nol, mengalikan hasil (1 atau string) dengan Boolean False(ditangani sebagai angka 0) akan memberikan nilai falsey (0 atau string kosong).


3

C ++ 11, 732-30% = 512,4 byte

Menggunakan ceilsaran pria malang Dom Hastings dan Martin Büttner untuk menyingkat kamus.

#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 Selamat Datang di Programming Puzzles dan Code Golf, dan ke semua Stack Exchange. Ini jawaban pertama yang sangat bagus. Jika Anda butuh bantuan, tanyakan saja dengan mengetik @usernamedi awal komentar, mis @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]

Bagaimana saya bisa mempersingkat kamus saya?
NoOneIsHere

2
Ada banyak cara untuk melakukan itu. Misalnya, jawaban JavaScript menggunakan ekspresi reguler alih-alih memeriksa string individu. Mungkin Anda bisa mencoba menemukan hash yang memetakan setiap string ke nomor unik (mungkin jumlah kode karakter). Angka-angka itu mungkin lebih pendek dari string.
Martin Ender

Saya tidak yakin, tapi mungkin cukup lama, dapatkan penghematan dengan sesuatu sepertidict(x[:2],int(x[2:]) for x in "Ne-11 Pr1 Ze2".split())

1

Lua, 418 - 10% = 376,2 byte

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

Menerapkan bonus Nexus.

Pertama kali saya memposting sesuatu di sini. Sedang menulis skrip Lua untuk sebuah game, menemukan ini dan merasa ingin berkontribusi, hah.

Catatan: Fungsi Lua ini mengasumsikan bahwa pustaka dasar telah dimuat, dan bahwa aplikasi host mendefinisikan printfungsi yang sesuai yang menerima nilai non-nil. Saya memanfaatkan Lua string.gsubuntuk yang terbaik dari kemampuan saya, serta yang anddan oroperator.

Ini versi cantiknya:

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

Uji

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, kode 212 byte + 3 untuk -p- 10% = 193,5 byte

Saya yakin saya bisa mengurangi ini lagi, tidak senang tentang for$s(...){...}blok penuh tetapi saya sudah selesai sekarang!

$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

Cuplikan yang menarik

  • Pria miskin ceil: int$n+.9- Saya mencoba menggunakan 0|tetapi mendapatkan apa yang tampak seperti meluap!
  • Daftar duplikasi: (9)x9hasil(9,9,9,9,9,9,9,9,9,9)

Pemakaian:

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

Terima kasih kepada Tim Pederick karena telah membantu menghemat byte tambahan!


Saya percaya "pria malang ceil" Anda hanya perlu menambahkan.9 , karena desimal terendah yang akan Anda dapatkan adalah 0,125 (1/8).
Tim Pederick

@TimPederick Poin yang bagus, saya perlu menyimpan lebih banyak untuk bisa bersaing! Mungkin layak untuk melihat ke dalam bonus lain untuk saya ...
Dom Hastings
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.