Arma mais rápida do Ocidente

23

Você é o caubói mais duro, mais difícil e mais legal do oeste do Mississippi. No entanto, um cara estranho em um site nerd maluco decidiu que seria legal colocar você em paisagens inacabadas aleatórias e lutar. Não importa, você ainda vai ganhar. No entanto, para ajudá-lo a vencer os tiroteios cansativos sobre os quais você escreverá em casa, é útil saber quantas balas o covarde à espreita na paisagem tem.

Que tal você ajudar esse pobre rapaz? Dada uma paisagem ASCII, encontre a arma dentro dela e diga a ele quantas balas são carregadas nela. Esta é a arma:

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

Cada X na figura acima é um slot potencial para uma bala. O slot conterá um espaço ou um dos 0,O,o(pode não ser consistente - o cowboy pode ter carregado diferentes tipos de balas em sua arma).

Sempre haverá exatamente uma arma, correspondendo à descrição acima, na paisagem. No entanto, observe que os espaços ao redor e dentro da pistola podem conter qualquer coisa.

Entrada

Você receberá uma sequência contendo ASCII imprimível (e não guias) e novas linhas para separar as linhas. Você também pode pegar uma lista de strings, se desejar. Todas as cadeias de caracteres serão preenchidas com espaços, portanto, todas terão o mesmo comprimento. A entrada terá pelo menos 4 linhas de altura e 7 colunas de largura.

Sempre haverá exatamente uma arma na paisagem.

Saída

Você produzirá quantas balas ( 0, O, o) existem na pistola, portanto sua saída sempre será entre 0e 6.

Casos de teste

  (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

Isso é , então a resposta mais curta em bytes vence.

Stephen
fonte
Sandbox
Stephen
10
+1 Se alguém FGITWs enfrentar esse desafio;)
Decay Beta
2
Você deve adicionar um caso de teste em que haja um 0dentro da caixa delimitadora da pistola, mas fora dela.
Martin Ender
@StepHen Oh, certo, há um zero dentro da arma que não pertence a ela. Seria bom ter zeros fora da arma, mas também dentro de sua caixa delimitadora.
Martin Ender
"A entrada terá pelo menos 4 linhas de altura e 5 colunas de largura." - se houver sempre uma pistola, a entrada deve ter pelo menos 7 colunas de largura.
manassehkatz-Reinstate Monica

Respostas:

19

Caracóis , 71 bytes

Experimente online.

A
\/a=\)2w\V={\\u\(}c=\/b={\\c\(2}u!{(nb|.|.n.)=^o=^O=^0^ }{nb|.|.n.}^ 
feersum
fonte
4
Programming language for 2-dimensional pattern matching.você deve estar feliz por eu ter feito esse desafio então: P
Stephen
25
Você tem um link para este idioma? É bem engraçado que a arma mais rápida do oeste seja um caracol.
PyRulez 01/07/19
1
@PyRulez Aqui está um link para você
ovs 01/07
6
@PyRulez, você pode clicar no nome do idioma na página do TIO
Stephen
Estou interessado em como isso funciona.
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 uma matriz de seqüências de caracteres / caracteres. Retorna o número de marcadores.

JungHwan Min
fonte
4

JavaScript, 215 211 209 bytes

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

Basicamente, tenta corresponder os ncaracteres de uma arma após uma quebra de linha, ndesde 0o comprimento da corda.

Artyer
fonte
Salve alguns bytes atribuindo ao Zliteral, na primeira vez em que você o usar e se livrando do {}.
Shaggy
@ Shaggy Thanks!
Artyer 03/07/19
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)

EDIT: Corrigido um bug que me custou 5 bytes: (... encontrei 3 bytes de r''s extras que não eram necessários. E então Grrr !! Não estava contando \caracteres no meu código corretamente, então adicionei 6 ...

Pega uma string com novas linhas; Retorna o número de marcadores encontrados.

Basicamente, aplica uma regex que procura o padrão de pistola com 0, 1, ... lineLength caracteres do teclado no início das linhas.

Chas Brown
fonte
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;}}

Experimente online! (golfe) (expandido) (357 golfe) (357 expandido)

Eu me perguntava o quão ruim seria uma solução em um idioma sem correspondência de padrões embutida. Saiu muito menor do que eu temia.

Basicamente, essa abordagem divide a arma em uma série de partes individuais que espera ver em locais específicos em relação a um índice específico. Se todas as peças forem encontradas onde são esperadas, é uma arma! O teste de bala incrementa um contador global para acompanhar quantas balas havia nele, que imprimimos quando encontramos a única arma na paisagem.

Nota 1: Eu preenchi os casos de teste com espaços para garantir larguras de linha consistentes.

Nota 2: adicione 10 bytes se você não gostar da atribuição, em vez do truque de retorno . Para maior clareza, usei declarações de retorno reais no código expandido.

jiv
fonte
Três otimizações menores: - Use putchar com o valor de b diretamente em vez de printf (3 bytes). - Use o operador ternário em vez da instrução if para imprimir a contagem de marcadores (1 byte). - Rolar a contagem de marcadores na impressão ternária (2 bytes). O último é um pouco malcheiroso, pois significa que b é zero ao testar o primeiro índice, mas como nenhuma arma poderia estar no índice 0, acho que é uma mudança justa.
jiv