La pistola più veloce in Occidente


23

Sei il cowboy più ruvido, più duro e più freddo a ovest del Mississippi. Tuttavia, uno strano ragazzo su un sito Web strano secchione ha deciso che sarebbe bello lasciarti andare in paesaggi casuali incompiuti e combattere. Non importa, vincerai comunque. Tuttavia, per aiutarti a vincere quelle estenuanti sparatorie di cui ti scrivo a casa, è utile sapere quanti proiettili ha il codardo in agguato nel paesaggio.

Che ne dici di aiutare questo povero ragazzo. Dato un panorama ASCII, trova la pistola al suo interno e digli quanti proiettili sono caricati al suo interno. Questa è la pistola:

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

Ciascuno Xnella figura sopra è un potenziale slot per un proiettile. Lo slot conterrà uno spazio o uno di 0,O,o(potrebbe non essere coerente - il cowboy potrebbe aver caricato diversi tipi di proiettili nella sua pistola).

Ci sarà sempre esattamente un'arma, corrispondente alla descrizione sopra, nel paesaggio. Tuttavia, tieni presente che gli spazi attorno e all'interno della pistola possono contenere qualsiasi cosa.

Ingresso

Ti verrà data una stringa contenente ASCII stampabile (quindi non tabulazioni) e nuove righe per separare le righe. Puoi anche prendere un elenco di stringhe, se lo desideri. Le stringhe saranno tutte riempite di spazi, quindi avranno tutte la stessa lunghezza. L'input sarà alto almeno 4 righe e largo 7 colonne.

Ci sarà sempre esattamente una pistola nel paesaggio.

Produzione

Emetterai quanti proiettili ( 0, O, o) ci sono nella pistola, quindi il tuo output sarà sempre tra 0e 6.

Casi test

  (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

Questo è , quindi vince la risposta più breve in byte.



10
+1 Se qualcuno FGIT risponde a questa sfida;)
Decadimento beta

2
Dovresti aggiungere un caso di prova in cui è presente un 0riquadro di delimitazione della pistola ma all'esterno della pistola.
Martin Ender,

@StepHen Oh giusto, c'è uno zero all'interno della pistola che non gli appartiene. Sarebbe bello avere degli zeri all'esterno della pistola ma anche all'interno del suo riquadro di selezione.
Martin Ender,

"L'input sarà alto almeno 4 righe e largo 5 colonne." - se c'è sempre una pistola, l'ingresso deve essere largo almeno 7 colonne.
manassehkatz-Reinstate Monica,

Risposte:


19

Lumache , 71 byte

Provalo online.

A
\/a=\)2w\V={\\u\(}c=\/b={\\c\(2}u!{(nb|.|.n.)=^o=^O=^0^ }{nb|.|.n.}^ 

4
Programming language for 2-dimensional pattern matching.devi essere contento di aver fatto questa sfida allora: P
Stephen,

25
Hai un link a questa lingua? È abbastanza divertente che la pistola più veloce ad ovest sia una lumaca.
PyRulez,


6
@PyRulez puoi fare clic sul nome della lingua nella pagina TIO
Stephen

Sono interessato a come funziona.
Kritixi Lithos,

6

Mathematica, 170 byte

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

Accetta una serie di stringhe / caratteri. Restituisce il numero di proiettili.


4

JavaScript, 215 211 209 byte

Grazie a Shaggy per -4 byte!

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>

Fondamentalmente, cerca di abbinare i npersonaggi di una pistola dopo un'interruzione di linea, per ndalla 0lunghezza della corda.


Risparmia qualche byte assegnando Zall'interno del valore letterale, la prima volta che lo usi e rimuovilo {}.
Shaggy,

@Shaggy Grazie!
Artyer,

3

Python 2, 219 224 227 byte

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)

EDIT: corretto un bug che mi costava 5 byte: (... ho trovato 3 byte di messaggi extra r''che non erano necessari. E poi Grrr !! Non contava\ correttamente i caratteri nel mio codice, quindi ha aggiunto 6 ...

Prende una stringa con newline; riavvia il numero di proiettili trovati.

Fondamentalmente, applica una regex che cerca il modello di pistola con 0, 1, ... lineLength caratteri del pad all'inizio delle linee.


3

C (gcc) , 357 351 byte

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

Provalo online! (golfed) (ampliato) (357 golfed) (357 espanso)

Mi chiedevo quanto sarebbe male una soluzione in una lingua senza la corrispondenza dei pattern incorporata. È uscito molto più piccolo di quanto temessi.

Fondamentalmente, questo approccio suddivide la pistola in una serie di singole parti che prevede di vedere in posizioni specifiche rispetto a un indice specifico. Se tutte le parti vengono trovate dove sono previste, è una pistola! Il test dei proiettili incrementa un contatore globale per tenere traccia di quanti proiettili c'erano, che stampiamo quando abbiamo trovato l'unica e unica pistola nel panorama.

Nota 1: ho riempito i casi di test con spazi per garantire larghezze di riga coerenti.

Nota 2: aggiungi 10 byte se non ti piace l' assegnazione invece del trucco di ritorno . Per chiarezza, ho usato le dichiarazioni di ritorno effettive nel codice espanso.


Tre ottimizzazioni minori: - Utilizzare direttamente putchar con il valore di b anziché printf (3 byte). - Utilizzare l'operatore ternario anziché l'istruzione if per stampare il conteggio dei proiettili (1 byte). - Rotola l'inizializzazione del conteggio dei proiettili in ternario di stampa (2 byte). L'ultimo è un po 'puzzolente poiché significa che b è zero durante il test del primo indice, ma dal momento che nessuna pistola potrebbe essere all'indice 0, penso che sia un cambiamento equo.
jiv
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.