Najszybsza broń na zachodzie

23

Jesteś najostrzejszym, najtwardszym i najfajniejszym kowbojem na zachód od Missisipi. Jednak jakiś dziwny facet na obłąkanej stronie frajerów uznał, że fajnie byłoby wrzucić cię w losowe niedokończone krajobrazy i walczyć. Bez względu na to, nadal wygrywasz. Jednak, aby pomóc Ci wygrać te wyczerpujące strzelaniny, o których napiszesz do domu, warto wiedzieć, ile kul ma tchórz czający się w krajobrazie.

Co powiesz na pomoc temu biednemu facetowi? Biorąc pod uwagę krajobraz ASCII, znajdź w nim broń i powiedz mu, ile pocisków jest w nią załadowanych. To jest pistolet:

  (X)
(X\ /X)
 (XVX)
  \X/

Każde Xz powyższych zdjęć jest potencjalnym miejscem na pocisk. Miejsce będzie albo zawierać spację, albo jedno z nich 0,O,o(może nie być spójne - kowboj mógł załadować różne rodzaje pocisków do swojej broni).

W krajobrazie zawsze będzie dokładnie jedna broń zgodna z powyższym opisem. Należy jednak pamiętać, że przestrzenie wokół i wewnątrz pistoletu mogą zawierać wszystko.

Wkład

Otrzymasz ciąg znaków zawierający drukowalne ASCII (więc nie tabulatory) i znaki nowej linii do oddzielnych linii. Możesz również wziąć listę ciągów, jeśli chcesz. Wszystkie ciągi zostaną wypełnione spacjami, więc będą miały tę samą długość. Dane wejściowe będą miały co najmniej 4 rzędy wysokości i 7 kolumn szerokości.

W krajobrazie zawsze będzie dokładnie jedna broń.

Wydajność

Wyrzucisz ile pocisków ( 0, O, o) jest w pistolecie, więc twój wynik zawsze będzie pomiędzy 0a 6.

Przypadki testowe

  (0)   ( )
(o\ /o( \ / )
 (oVo) ( V )
  \o/   \ /

0

----------------------------
////////////////////////////
////////////////////////////
/////////////(o)////////////
///////////(0\// )//////////
////////////( Vo)///////////
/////////////\ /////////////
////////////////////////////
----------------------------

3

()()()()()()()()()()()()()()()()\)/)()()()()()()()()()()()()
()()()()()()()()()()()()()()()()(V)()()()()()()()()()()()()(
()()()()()()()(\0/)()()()()()()()()()()()()()()()()()()()()(
()()()()()()()()()()()()()()()()()()()()()()()( )()()()()()(
()()()()()()(o)()()()()()()()(00)()()()()()(( \(/0)()()()()(
()()()()()()()()()()()()()()()()()()()()()()(( V )()()()()()
()()()()()()()()()()()()()()()()()()()()()()()\O/()()()()()(

2

------(0)---
||||(0\|/0)
-----(0V0)--
||||||\0/
-------_------
|||||||-|
------|-|
|||||||-|
------|-|

6

00ooOO(0)/\\/V

  ( )
( \\/ )
 ( V )
 \\ /

00OOoo()()()())))

0

  (\)     (0)
(0\\/0) ( \0/ )
 (0V0)   ( V )
 \\0/     \ /

1 (left gun is invalid because of the `\` in the bullet slot)

-00(0)00\0
-(O\0/o)\ 
- (OVo)o\0
-o \ /oo/ 

5

To jest , więc wygrywa najkrótsza odpowiedź w bajtach.

Stephen
źródło
Piaskownica
Stephen
10
+1 Jeśli ktoś FGITW podejmie to wyzwanie;)
Rozpad
2
Powinieneś dodać skrzynkę testową, w której znajduje się 0wnętrze obwiedni pistoletu, ale poza pistoletem.
Martin Ender
@ StepHen O tak, w pistolecie jest zero, które do niego nie należy. Dobrze byłoby mieć zera poza pistoletem, ale również w jego obwiedni.
Martin Ender
„Dane wejściowe będą miały co najmniej 4 rzędy wysokości i 5 kolumn szerokości”. - jeśli zawsze jest broń, wejście musi mieć szerokość co najmniej 7 kolumn.
manassehkatz-Reinstate Monica

Odpowiedzi:

19

Ślimaki , 71 bajtów

Wypróbuj online.

A
\/a=\)2w\V={\\u\(}c=\/b={\\c\(2}u!{(nb|.|.n.)=^o=^O=^0^ }{nb|.|.n.}^ 
feersum
źródło
4
Programming language for 2-dimensional pattern matching.musisz się cieszyć, że podjąłem wtedy to wyzwanie: P
Stephen
25
Czy masz link do tego języka? To zabawne, że najszybszym pistoletem na zachodzie jest ślimak.
PyRulez
1
@PyRulez Tu jest link dla ciebie
OVS
6
@PyRulez możesz kliknąć nazwę języka na stronie TIO
Stephen
Jestem zainteresowany tym, jak to działa.
Kritixi Lithos
6

Mathematica, 170 bajtów

Catch@BlockMap[b="O"|"o"|"0";MatchQ[#,p=Characters@{"  (X)  ","(X\\ /X)"," (XVX) ","  \\X/  "}/." "->_/."X"->$;p/.$->b|"X"|" "]&&Throw@Count[Pick[#,p,$],b,2]&,#,{4,7},1]&

Pobiera tablicę ciągów znaków / znaków. Zwraca liczbę pocisków.

JungHwan Min
źródło
4

JavaScript, 215 211 209 bajtów

Dzięki Shaggy za -4 bajty!

f=

i=>[...i].map((_,x)=>eval(String.raw`a=i.match(/(\n|^).{${x}}..\(${Z='([oO0 ])'}\).*\n.{${x}}\(${Z}\\.\/${Z}\).*\n.{${x}}.\(${Z}V${Z}\).*\n.{${x}}..\\${Z}\//);a&&alert(a.filter(i=>/^[oO0]$/.test(i)).length)`))

tests = [["  (0)   ( )\n(o\\ /o( \\ / )\n (oVo) ( V )\n  \\o/   \\ /",0],["----------------------------\n////////////////////////////\n////////////////////////////\n/////////////(o)////////////\n///////////(0\\// )//////////\n////////////( Vo)///////////\n/////////////\\ /////////////\n////////////////////////////\n----------------------------",3],["()()()()()()()()()()()()()()()()\\)/)()()()()()()()()()()()()\n()()()()()()()()()()()()()()()()(V)()()()()()()()()()()()()(\n()()()()()()()(\\0/)()()()()()()()()()()()()()()()()()()()()(\n()()()()()()()()()()()()()()()()()()()()()()()( )()()()()()(\n()()()()()()(o)()()()()()()()(00)()()()()()(( \\(/0)()()()()(\n()()()()()()()()()()()()()()()()()()()()()()(( V )()()()()()\n()()()()()()()()()()()()()()()()()()()()()()()\\O/()()()()()(",2],["------(0)---\n||||(0\\|/0)\n-----(0V0)--\n||||||\\0/\n-------_------\n|||||||-|\n------|-|\n|||||||-|\n------|-|",6],["00ooOO(0)/\\\\/V\n\n  ( )\n( \\\\/ )\n ( V )\n \\\\ /\n\n00OOoo()()()())))",0],["  (\\)     (0)\n(0\\\\/0) ( \\0/ )\n (0V0)   ( V )\n \\\\0/     \\ /",1]]

alert = x => i = x;

tests.forEach((t, index) => {
    i = 'Not Found'
    f(t[0]);
    document.getElementById('a').textContent += t[0] + '\n\n' + i + '\n\n';
    if (i != t[1]) {
        document.getElementById('a').textContent += 'Failed test ' + index + '! Expected '  + t[1] + '\n\n';
        document.getElementById('a').style = 'color: red'
    }
})
<pre id="a"></pre>

Zasadniczo próbuje dopasować nznaki pistoletu po przerwaniu linii, nod 0do długości łańcucha.

Artyer
źródło
Zaoszczędź kilka bajtów, przypisując do Zliterału przy pierwszym użyciu i pozbyciu się {}.
Kudłaty
@Shaggy Thanks!
Artyer
3

Python 2, 219 224 227 bajtów

import re
f=lambda s:sum(sum(g>' 'for g in m.groups())for m in[re.match(r'.*@..\(X\)..@\(X\\./X\)@.\(XVX\).@..\\X/.*'.replace('X','([0Oo ])').replace('@',r'[^\n]*\n.{%d}'%i),'\n'+s,re.DOTALL)for i in range(0,s.find('\n'))]if m)

EDYCJA: Naprawiono błąd, który kosztował mnie 5 bajtów: (... znalazłem 3 bajty dodatkowych r''s, które nie były potrzebne. A potem Grrr !! Nie zliczał \poprawnie znaków w moim kodzie, więc dodał 6 ...

Bierze ciąg z nowymi liniami; resetuje liczbę znalezionych kul.

Zasadniczo stosuje wyrażenie regularne, które szuka wzoru pistoletu ze znakami padu 0, 1, ... lineLength na początku linii.

Chas Brown
źródło
3

C (gcc) , 357 351 bajtów

#define M(F,C)F(i){i=s[i]==C;}
b,i;char*s,c;M(L,'(')M(R,')')M(A,'/')M(D,'\\')M(V,'V')B(i){i=b=(c=s[i])==32?b:c==111?b+1:c==79?b+1:c==48?b+1:0;}(*t[])(int)={L,B,R,L,B,D,A,B,R,L,B,V,B,R,D,B,A};main(j,v,k,l)char**v;{for(s=v[1];s[l++]!=10;);for(;k=i,s[i++];){for(j=17;j--;)if(!(t[j])(k-=j==13?l-3:j==8?l-5:j==5?2:j==2?l-4:1))break;b=j<0?putchar(b+47):1;}}

Wypróbuj online! (golfed) (rozwinięty) (357 golfa) (357 rozwinięty)

Zastanawiałem się, jak złe byłoby rozwiązanie w języku bez wbudowanego dopasowania wzorca. Wyszło znacznie mniej niż się obawiałem.

Zasadniczo takie podejście dzieli pistolet na szereg pojedynczych części, które spodziewa się zobaczyć w określonych lokalizacjach w stosunku do określonego indeksu. Jeśli wszystkie części zostaną znalezione tam, gdzie są oczekiwane, to broń! Test pocisku zwiększa globalny licznik, aby śledzić, ile było w nim pocisków, które drukujemy, gdy znajdziemy jedyną broń w krajobrazie.

Uwaga 1: Wypełniłem przypadki testowe spacjami, aby zapewnić spójne szerokości wierszy.

Uwaga 2: Dodaj 10 bajtów, jeśli nie podoba ci się przypisanie zamiast lewy powrotu . Dla jasności użyłem rzeczywistych instrukcji return w rozszerzonym kodzie.

jiv
źródło
Trzy drobne optymalizacje: - Użyj putchar z wartością b bezpośrednio zamiast printf (3 bajty). - Użyj operatora trójskładnikowego zamiast instrukcji if, aby wydrukować liczbę wypunktowaną (1 bajt). - Zrolowanie inicjowania liczby pocisków w trójskładnikowe drukowanie (2 bajty). Ostatni jest trochę śmierdzący, ponieważ oznacza to, że b jest zerowy podczas testowania pierwszego indeksu, ale ponieważ i tak żadne działo nie może mieć indeksu 0, myślę, że to uczciwa zmiana.
jiv