El arma más rápida del oeste

23

Eres el vaquero más rudo, duro y frío al oeste del Mississippi. Sin embargo, un tipo extraño en un sitio web de nerd loco decidió que sería genial dejarte caer en paisajes y peleas al azar. No importa, aún ganarás. Sin embargo, para ayudarlo a ganar esos duros tiroteos sobre los que escribirá, es útil saber cuántas balas tiene el cobarde que acecha en el paisaje.

¿Qué tal si ayudas a este pobre chico? Dado un paisaje ASCII, encuentra el arma dentro y dile cuántas balas están cargadas en él. Esta es la pistola:

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

Cada uno Xen la imagen de arriba es un espacio potencial para una bala. La ranura contendrá un espacio o uno de 0,O,o(puede no ser consistente, el vaquero puede haber cargado diferentes tipos de balas en su arma).

Siempre habrá exactamente una pistola, que coincida con la descripción anterior, en el paisaje. Sin embargo, tenga en cuenta que los espacios alrededor y dentro de la pistola pueden contener cualquier cosa.

Entrada

Se le dará una cadena que contiene ASCII imprimible (por lo tanto, no pestañas) y nuevas líneas para separar las líneas. También puede tomar una lista de cadenas, si lo desea. Todas las cadenas se rellenarán con espacios, por lo que todas tendrán la misma longitud. La entrada tendrá al menos 4 filas de alto y 7 columnas de ancho.

Siempre habrá exactamente una pistola en el paisaje.

Salida

Sacará cuántas balas ( 0, O, o) hay en la pistola, por lo que su salida siempre estará entre 0y 6.

Casos de prueba

  (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

Este es el , por lo que la respuesta más corta en bytes gana.

Stephen
fuente
Sandbox
Stephen
10
+1 Si alguien FGITWs este desafío;)
Beta Decay
2
Debería agregar un caso de prueba donde haya un 0cuadro dentro del límite del arma pero fuera del arma.
Martin Ender
@StepHen Oh, claro, hay un cero dentro del arma que no le pertenece. Sería bueno tener ceros fuera del arma pero también dentro de su caja delimitadora.
Martin Ender
"La entrada tendrá al menos 4 filas de alto y 5 columnas de ancho". - si siempre hay una pistola, la entrada debe tener al menos 7 columnas de ancho.
manassehkatz-Reinstate Monica

Respuestas:

19

Caracoles , 71 bytes

Pruébalo en línea.

A
\/a=\)2w\V={\\u\(}c=\/b={\\c\(2}u!{(nb|.|.n.)=^o=^O=^0^ }{nb|.|.n.}^ 
Feersum
fuente
44
Programming language for 2-dimensional pattern matching.debes estar contento de haber hecho este desafío entonces: P
Stephen
25
¿Tienes un enlace a este idioma? Es bastante divertido que el arma más rápida del oeste sea un caracol.
PyRulez
66
@PyRulez puede hacer clic en el nombre del idioma en la página TIO
Stephen
Estoy interesado en cómo funciona esto.
Kritixi Lithos
6

Mathematica, 170 bytes

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

Toma una gran variedad de cadenas / caracteres. Devuelve el número de viñetas.

JungHwan Min
fuente
4

JavaScript, 215 211 209 bytes

¡Gracias a Shaggy por -4 bytes!

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>

Básicamente, trata de hacer coincidir los ncaracteres de una pistola después de un salto de línea, ndesde 0hasta la longitud de la cadena.

Artyer
fuente
Guarde unos pocos bytes asignándolos Zdentro del literal, la primera vez que lo use y deshaciéndose del {}.
Shaggy
@ Shaggy Gracias!
Artyer
3

Python 2, 219 224 227 bytes

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)

EDITAR: se corrigió un error que me costó 5 bytes: (... se encontraron 3 bytes adicionales r'' que no eran necesarios. ¡Y luego Grrr! No contaba los \caracteres en mi código correctamente, así que agregué 6 ...

Toma una cadena con líneas nuevas; vuelve a ejecutar la cantidad de balas encontradas.

Básicamente, aplica una expresión regular que busca el patrón de arma con 0, 1, ... lineLength caracteres de la almohadilla al comienzo de las líneas.

Chas Brown
fuente
3

C (gcc) , 357 351 bytes

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

Pruébalo en línea! (golfizado) (expandido) (357 golfizado) (357 expandido)

Me preguntaba qué tan mala sería una solución en un idioma sin una coincidencia de patrones incorporada. Salió mucho más pequeño de lo que temía.

Básicamente, este enfoque divide el arma en una serie de partes individuales que espera ver en ubicaciones específicas en relación con un índice específico. Si todas las partes se encuentran donde se espera, ¡es un arma! La prueba de balas incrementa un contador global para realizar un seguimiento de cuántas balas había en ella, que imprimimos cuando encontramos la única arma en el paisaje.

Nota 1: Rellené los casos de prueba con espacios para asegurar anchos de fila consistentes.

Nota 2: Agregue 10 bytes si no le gusta la asignación en lugar del truco de devolución . Para mayor claridad, utilicé declaraciones de devolución reales en el código expandido.

jiv
fuente
Tres optimizaciones menores: - Use putchar con el valor de b directamente en lugar de printf (3 bytes). - Utilice el operador ternario en lugar de la instrucción if para imprimir el recuento de viñetas (1 byte). - Inicializar el recuento de viñetas en ternario de impresión (2 bytes). El último es un poco maloliente, ya que significa que b es cero cuando se prueba el primer índice, pero como ninguna pistola podría estar en el índice 0 de todos modos, creo que es un cambio justo.
jiv