„Musisz zbudować dodatkowe pylony!”


28

Wprowadzenie

W grze strategicznej Starcraft 2 do wyboru są trzy „rasy”: Terran, Zerg i Protossi. W tym wyzwaniu skupimy się na protosach i kultowym zdaniu „Musisz zbudować dodatkowe pylony!” Ten komunikat pojawia się, gdy zabraknie Ci zapasów na budowę armii. Aby więc pomóc społeczności Starcraft, musisz napisać program lub funkcję, która mówi graczom dokładnie, ile pylonów potrzebują.

Wyzwanie

Otrzymasz wejście ciągu składającego się z jednej liczby całkowitej Ni oddzielonej spacjami listy jednostek. Nzawsze będzie zerowy lub dodatni, a lista jednostek będzie zawsze zawierać jedną lub więcej prawidłowych jednostek. Nreprezentuje ilość pylonów, którą aktualnie ma gracz. Twoim zadaniem jest obliczyć, czy ilość pylonów, które gracz ma, wystarcza do zbudowania jednostek. Twój program lub funkcja musi generować / zwracać prawdziwą wartość, jeśli jest wystarczająca podaż lub jeśli nie ma wystarczającej podaży, musisz wypisać, You must construct ZZZ additional pylonsgdzie ZZZjest ilość pylonów potrzebnych do zbudowania jednostek. Zauważ, że pylon(s)liczba mnoga musi być w razie potrzeby, a liczba mnoga, gdy nie jest ( ...1 additional pylon!, ...2 additional pylons!).

Jednostki Protossów i koszt zaopatrzenia

Oto lista wszystkich jednostek i odpowiadających im kosztów zaopatrzenia. Pylony zapewniają dodatkowe 8 zapasów.

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

Przykłady BEZ bonusów

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. 

Bonusy

  1. Każdy doświadczony gracz Starcraft 2 wiedziałby, że potrzebujesz rdzenia statku-matki, aby przekształcić go w statek-matki. Ponadto możesz mieć tylko jeden statek macierzysty na raz (niezależnie od tego, czy jest to faktyczny statek macierzysty, czy jego rdzeń). Jeśli żaden z tych warunków nie jest spełniony, wypisz dowolną wartość fałszowania. Jeśli twój program może sprawdzić, czy tylko jeden statek-matka jest aktywny na raz i że rdzeń statku-matki jest zbudowany przed faktycznym statkiem-matka, odejmij 20% swojej liczby bajtów.
  2. Mało może wiesz, ale nexusy (centra dowodzenia Protossów) faktycznie też zapewniają zapasy! Jeśli twój program może dodać 11 do maksymalnej podaży za każdym razem, gdy napotka nexus na liście jednostek, zabierz 10% zniżki na liczbę bajtów. Pamiętaj, że nie ma znaczenia, gdzie Nexus znajduje się w kolejności kompilacji, więc 0 Probe Nexusnadal by powrócił true.

Przykłady z bonusami

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

Wprowadź ciąg składający się z liczb całkowitych i nazw jednostek oddzielonych spacjami (z powyższej tabeli). Podaj prawdziwą wartość, jeśli możesz zbudować wszystkie jednostki z zasilaniem zapewnianym przez Npylony (liczba całkowita na wejściu). Wyjście, You must construct ZZZ additional pylon(s)jeśli potrzeba więcej pylonów, gdzie ZZZjest potrzebna ilość pylonów. W razie potrzeby upewnij się, że pylony są w liczbie mnogiej.

To jest , więc wygrywa najkrótszy kod w bajtach (lub metoda liczenia w Twoim języku)!

Tabela liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

Aby upewnić się, że Twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:

# [><>](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
Czy musi być oddzielony spacją czy może być „wygodny”?
Niebieski

@muddyfish Jeśli dobrze cię rozumiem, tak, dane wejściowe muszą być oddzielone spacją w formularzu N unit1 unit2 unit3....
GamrCorps

Czy kiedykolwiek będzie więcej niż 9 słupów? Czy muszę generować dane dokładnie, trueczy też dopuszczalna jest prawdziwa wartość?
Dom Hastings,

@DomHastings może być więcej niż 9. Każda prawdziwa wartość jest dopuszczalna.
GamrCorps

2
Daj spokój! Czy ktoś pamięta Starcraft: Broodwar lub oryginalny Starcraft? Oni też mają to zdanie!

Odpowiedzi:


4

Rubinowy, 263–30% = 184 bajty

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

Stosowanie

ruby sc.rb 0 Probe Nexus


7

Python 3, 207 * .9 == 186,3 bajtów.

Realizuje premię za nexus.
Zaoszczędź 26 bajtów dzięki DSM.
Oszczędność 2 bajtów dzięki Timowi Pederickowi

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

Dobra robota! Ponieważ potrzebujesz tylko wypisać prawdziwą wartość, niekoniecznie True, możesz zapisać dwa bajty, zastępując 1>0je just 1.
Tim Pederick

@ TimPederick Nie byłem pewien, czy to się liczy jako wystarczająco zgodne z prawdą.
Morgan Thrapp,


3
Musisz zbudować dodatkowe pytony ...
Brian

4

JavaScript, 274 265 bajtów (bez bonusów) 281 - 10% = 252,9 bajtów

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

Wydaje się to dość długie ...

Demo + objaśnienie:

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


Nie mam pojęcia, dlaczego nie spojrzałem na bonusy, powinienem to zrobić.
nicael

Zaoszczędź 8 bajtów, używając -(c>>3)zamiast Math.ceil(-c/8). Zaoszczędź kolejne 2 bajty, używając c<-8zamiast c/8<-1.
Neil

Twoje wewnętrzne mecze nie potrzebują, /gprawda? Pozwoliłoby to zaoszczędzić kolejne 6 bajtów. /ob/iWygląda również na to, że działałoby to dla kolejnych 5 bajtów oszczędności.
Neil

Twój test wydaje się być nieprawidłowy - używasz, >0ale jeśli masz dokładne dopasowanie, to nadal jest to prawda. Oczywiście do celów golfowych przerzuciłbyś go <0i odwrócił ?:ramiona.
Neil

1
Myślę, że możesz zapisać kolejne 17 bajtów, stosując odejmowanie w całym tekście. Oto, co mam do tej pory: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 bajtów

Realizuje oba bonusy. Drukuje 1 jako prawdziwą wartość, a 0 lub pusty ciąg jako wartość falsey.

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

Kredyt dla Domu Hastings' rozwiązanie dla pomagając mi zgolić dobre kilka bajtów z «biednych ceil» z własną rękę, a Morgan Thrapp użytkownika dla idei leżącej u podstaw 's!'[q>-2:], co zaoszczędziło mi sześć bajtów nie wspominając wskazując, w komentarzach, jak aby zapisać kolejny bajt na tym bicie.


Objaśnienia

Ciąg w linii 1 koduje wszystkie jednostki i ich wymagania dotyczące dostaw. Każda jednostka jest reprezentowana przez dwa znaki: cyfrę szesnastkową określającą długość nazwy jednostki i pierwszy znak nazwy (np. 8OJest Obserwatorem; aMjest statkiem-matką). Zapotrzebowanie na dostawę to indeks zakodowanej jednostki w sekwencji s, utworzony przez podział łańcucha na spacje. Kropki oznaczają niewykorzystane ilości dostaw (żadna jednostka nie potrzebuje 5 lub 7 dostaw), a jako szczególny przypadek Nexus ( 5N) ma indeks 0.

Wiersz 2 inicjuje wartości: mjest liczbą rdzeni statku-matki, Mjest liczbą statków-matek, njest całkowitym kosztem zaopatrzenia i owskazuje, czy warunki budowy statku-matki zostały naruszone. Wiersz 3 przyjmuje dane wejściowe, wprowadzając liczbę pylonów pi listę jednostek u.

Wewnątrz pętli, który rozpoczyna się w wierszu 4 Sjest indeksem się s, a tym samym również ilości potrzebnej do zasilania obecnego urządzenia v. W wierszu 6 whileinstrukcja przechodzi sdo momentu znalezienia jednostki. ( '%x'%len(v)zamienia długość nazwy urządzenia na cyfrę szesnastkową.)

Wiersz 7 aktualizuje całkowity koszt dostawy n(zwróć uwagę na przypadek szczególny -11, jeśli Swynosi zero). Następnie zwiększa liczbę statków-matek M(identyfikowanych przez koszt dostawy powyżej 7) i rdzeni statków-matek m(identyfikowanych przez podciąg pCw nazwie jednostki). Następnie, jeśli którykolwiek z nich jest większy niż 1 lub jeśli Mco najmniej jeden, gdy mjest jeszcze zero, flaga ojest ustawiana. (W rzeczywistości jest on zwiększany, ale później zależy nam tylko na tym, czy będzie zero czy nie.)

Deficyt pylonu qjest obliczany, nieco dziwnie, w linii 8. Powinien to być naiwnie n // 8 - int(p)(tj. Jedna ósma kosztu zaopatrzenia, pomniejszona o wszystkie pylony, które już mamy). Ale to zaokrągliby w dół, gdy musimy zaokrąglić w górę. //Jednak dzielenie liczb całkowitych ( ) zaokrągla się w kierunku ujemnej nieskończoności, więc po prostu wszystko działamy w negatywie: int(p) - -(n // -8)co upraszcza faktycznie używaną formę.

Wreszcie wynik. Jeśli brakuje nam tylko jednego pylonu, qbędzie wynosić -1, stąd test q>-2(który wycina słańcuch ze sznurka, s!jeśli jest prawdziwy, i zachowuje go inaczej). Jeśli nie ma deficytu pylonu, qbędzie zero lub dodatni, dlatego q<0należy wybrać między prawdą 1 a ciągiem wyjściowym. Na koniec, jeśli flaga onie jest równa zero, pomnożenie wyniku (1 lub ciągu) przez wartość logiczną False(traktowaną jako cyfra 0) da wartość falsey (0 lub pusty ciąg).


3

C ++ 11, 732–30% = 512,4 bajtów

Wykorzystuje ceilsugestie biedaka Dom Hastingsa i Martina Büttnera dotyczące skrócenia słownika.

#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 Witamy w Programowaniu łamigłówek i Code Golf oraz w całej wymianie stosów. To bardzo dobra pierwsza odpowiedź. Jeśli potrzebujesz pomocy, po prostu zapytaj, pisząc @usernamena początku komentarza, np @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]

Jak mogę skrócić mój słownik?
NoOneIsHere 10.01.16

2
Istnieje mnóstwo sposobów, aby to zrobić. Np. Odpowiedź JavaScript używa wyrażeń regularnych zamiast sprawdzania poszczególnych ciągów. Może możesz spróbować znaleźć skrót, który mapuje każdy ciąg na unikalny numer (może sumę kodów znaków). Te liczby mogą być krótsze niż ciągi.
Martin Ender

Nie jestem pewien, ale może to wystarczająco długo, aby uzyskać oszczędności z czymś takimdict(x[:2],int(x[2:]) for x in "Ne-11 Pr1 Ze2".split())

1

Lua, 418–10% = 376,2 bajtów

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

Realizuje bonus Nexus.

Pierwszy raz coś tu opublikowałem. Pisał scenariusze do gry Lua, natknąłem się na to i poczułem, że mam coś do powiedzenia, hah.

Uwaga: Ta funkcja Lua zakłada, że ​​biblioteka podstawowa została załadowana i że aplikacja hosta definiuje odpowiednią printfunkcję, która akceptuje dowolną wartość inną niż zero. Wykorzystuję Luę string.gsubnajlepiej jak potrafię, a także jej andi oroperatorów.

Oto ładna wersja:

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

Test

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, kod 212 bajtów + 3 dla -p- 10% = 193,5 bajtów

Jestem pewien, że mogę to trochę zmniejszyć, nie jestem zadowolony z pełnego for$s(...){...}bloku, ale na razie skończone!

$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

Ciekawe fragmenty

  • Biedni ludzie ceil: int$n+.9- Próbowałem użyć, 0|ale dostałem coś, co wygląda jak przepełnienie!
  • Powielanie listy: (9)x9daje(9,9,9,9,9,9,9,9,9,9)

Stosowanie:

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

Dzięki Tim Pederick za pomoc w zaoszczędzeniu dodatkowego bajtu!


Wierzę, że twój „biedak ceil” musi tylko dodać .9, ponieważ najniższy ułamek dziesiętny, jaki dostaniesz, to 0,125 (1/8).
Tim Pederick

@ TimPederick Dobra uwaga: muszę być bardziej oszczędny, aby być konkurencyjnym! Być może warto przyjrzeć się drugiej premii dla mnie ...
Dom Hastings,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.