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.



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.}^ 

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


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.


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.


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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.