서쪽에서 가장 빠른 총


23

당신은 미시시피 서부에서 가장 거칠고, 거칠고, 멋진 카우보이입니다. 그러나 이상한 괴상한 웹 사이트의 이상한 사람이 당신을 무작위 미완성 풍경으로 끌어 들여 싸우는 것이 시원하다고 결정했습니다. 어쨌든, 당신은 여전히 ​​이길 것입니다. 그러나 집에 쓸 잔인한 총격전에서 이기기 위해 조경에 숨어있는 겁쟁이가 얼마나 많은 총알인지 아는 것이 도움이됩니다.

이 불쌍한 사람을 도와주세요. ASCII 풍경이 주어지면 그 안에 총을 찾아 얼마나 많은 총알이로드되었는지 알려주십시오. 이것이 총입니다.

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

X위의 그림에서 각각 은 총알의 잠재적 인 슬롯입니다. 슬롯에는 공백 또는 공간 중 하나가 포함됩니다 0,O,o(일관되지 않을 수 있습니다-카우보이가 총에 다른 유형의 총알을로드했을 수 있습니다).

풍경에 위의 설명과 일치하는 총이 항상 정확히 하나 있습니다. 그러나 건 주변과 내부의 공간에는 무엇이든 포함될 수 있습니다.

입력

인쇄 가능한 ASCII (탭이 아님) 및 줄 바꾸기를 포함하는 줄이 포함 된 문자열이 제공됩니다. 원하는 경우 문자열 목록을 가져올 수도 있습니다. 문자열은 모두 공백으로 채워 지므로 모두 같은 길이입니다. 입력은 높이가 4 행 이상이고 너비가 7 열입니다.

풍경에는 항상 정확히 하나의 총이 있습니다.

산출

0, O, o총에 총알이 몇 개 있는지 출력하므로 항상 0과 사이에 출력됩니다 6.

테스트 사례

  (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

이것은 이므로 바이트 단위의 최단 답변이 이깁니다.



10
한 사람이이 문제를 FGITWs 경우)
베타 붕괴

2
0건의 경계 상자 안에 있지만 건 밖에 있는 테스트 케이스를 추가해야합니다 .
마틴 엔더

@StepHen 아 맞다, 총 안에 속하지 않은 0이있다. 건 밖에 있지만 경계 상자 안에 0을 두는 것이 좋습니다.
Martin Ender

"입력은 4 행 이상 5 열 이상이어야합니다." -항상 건이 있으면 입력 폭이 7 열 이상이어야합니다 .
manassehkatz-Reinstate Monica

답변:


19

달팽이 , 71 바이트

온라인으로 사용해보십시오.

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.당신은 내가 그 다음이 문제를 만든 기뻐해야합니다 : P
스티븐

25
이 언어에 대한 링크가 있습니까? 서쪽에서 가장 빠른 총이 달팽이라는 것은 꽤 재밌습니다.
PyRulez


6
@PyRulez 당신은 TIO 페이지에서 언어 이름을 클릭 할 수 있습니다
Stephen

이것이 어떻게 작동하는지에 관심이 있습니다.
Kritixi Lithos

6

매스 매 티카, 170 바이트

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

문자열 / 문자 배열을 취합니다. 글 머리 기호 수를 반환합니다.


4

자바 스크립트, 215 (211) 209 바이트

-4 바이트의 Shaggy에게 감사합니다!

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>

기본적으로 n줄 바꿈 후 문자열 길이 n부터 총기 문자를 0찾습니다.


Z리터럴 내에서 할당 하여 처음 사용하고를 제거 하여 몇 바이트를 절약하십시오 {}.
얽히고 설킨

@Shaggy 감사합니다!
Artyer

3

파이썬 2 219 224 227 바이트

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)

편집 : ... (추가의 3 바이트 발견 : 나에게 5 바이트 비용 버그 수정 r''이 필요하지 않은들 그리고 유감스럽게도!가 계산되지 않았습니다. \제대로 내 코드에서 문자를, 그래서 6을 추가 ...

줄 바꿈이있는 문자열을 가져옵니다. 발견 된 총알 수를 다시 조정합니다.

기본적으로 줄의 시작 부분에 0, 1, ... lineLength 문자가있는 총 패턴을 찾는 정규식을 적용합니다.


3

C (gcc) , 357 351 바이트

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

온라인으로 사용해보십시오! (골프) (확장) (357 골프) (357 확장)

내장 패턴 일치가없는 언어로 솔루션이 얼마나 나쁜지 궁금했습니다. 내가 두려워했던 것보다 훨씬 작게 나왔습니다.

기본적으로이 접근 방식은 건을 특정 지수와 비교하여 특정 위치에서 볼 것으로 예상되는 일련의 개별 부품으로 분류합니다. 모든 부품이 예상되는 곳에서 발견되면 총입니다! 총알 테스트는 총알이 얼마나 많은지를 추적하기 위해 글로벌 카운터를 증가시킵니다. 우리는 풍경에서 하나의 총을 발견했을 때 인쇄합니다.

참고 1 : 일관된 행 너비를 보장하기 위해 테스트 케이스를 공백으로 채웠습니다.

참고 2 : 리턴 트릭 대신 assign이 마음에 들지 않으면 10 바이트를 추가하십시오 . 명확성을 기하기 위해 확장 코드에서 실제 return 문을 사용했습니다.


세 가지 사소한 최적화 :-putf를 printf (3 바이트) 대신 b 값으로 직접 사용하십시오. -글 머리 기호 수 (1 바이트)를 인쇄하려면 if 문 대신 삼항 연산자를 사용하십시오. -글 머리 기호 수를 인쇄 3 진 (2 바이트)으로 롤하십시오. 마지막 것은 첫 번째 인덱스를 테스트 할 때 b가 0을 의미하기 때문에 약간 냄새가납니다. 그러나 어쨌든 인덱스 0에 총이 없을 수 있기 때문에 공정한 변화라고 생각합니다.
jiv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.