Súng nhanh nhất ở phương Tây


23

Bạn là cao bồi thô bạo nhất, cứng rắn nhất, lạnh lùng nhất phía tây Mississippi. Tuy nhiên, một số anh chàng kỳ lạ trên một trang web mọt sách đã quyết định rằng sẽ rất tuyệt nếu đưa bạn vào những cảnh quan còn dang dở ngẫu nhiên và chiến đấu. Không có vấn đề, bạn vẫn sẽ giành chiến thắng. Tuy nhiên, để giúp bạn chiến thắng những cuộc đấu súng mệt mỏi mà bạn sẽ viết về nhà, thật hữu ích khi biết có bao nhiêu viên đạn mà kẻ hèn nhát ẩn nấp trong cảnh quan có.

Làm thế nào về bạn giúp anh chàng nghèo này ra. Đưa ra một cảnh quan ASCII, tìm khẩu súng bên trong nó và cho anh ta biết có bao nhiêu viên đạn được nạp vào nó. Đây là khẩu súng:

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

Mỗi Xtrong hình trên là một khe tiềm năng cho một viên đạn. Khe cắm sẽ chứa một khoảng trống hoặc một trong số 0,O,o(có thể không nhất quán - cao bồi có thể đã nạp các loại đạn khác nhau trong súng của mình).

Sẽ luôn có chính xác một khẩu súng, khớp với mô tả ở trên, trong khung cảnh. Tuy nhiên, xin lưu ý rằng các khoảng trống xung quanh và bên trong súng có thể chứa bất cứ thứ gì.

Đầu vào

Bạn sẽ được cung cấp một chuỗi chứa ASCII có thể in (không phải các tab) và dòng mới cho các dòng riêng biệt. Bạn cũng có thể lấy một danh sách các chuỗi, nếu bạn muốn. Tất cả các chuỗi sẽ được đệm với các khoảng trắng, vì vậy tất cả chúng sẽ có cùng độ dài. Đầu vào sẽ có ít nhất 4 hàng cao và 7 cột rộng.

Sẽ luôn có chính xác một khẩu súng trong cảnh quan.

Đầu ra

Bạn sẽ xuất ra bao nhiêu viên đạn ( 0, O, o) trong khẩu súng, vì vậy đầu ra của bạn sẽ luôn nằm giữa 06.

Các trường hợp thử nghiệm

  (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

Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.



10
+1 Nếu ai đó FGITWs thử thách này;)
Beta Decay

2
Bạn nên thêm một trường hợp thử nghiệm trong đó có một 0hộp bên trong súng nhưng bên ngoài súng.
Martin Ender

@StepHen Oh phải, có một số không trong khẩu súng không thuộc về nó. Nó sẽ là tốt để có số không bên ngoài súng nhưng mặc dù trong hộp giới hạn của nó là tốt.
Martin Ender

"Đầu vào sẽ có ít nhất 4 hàng cao và rộng 5 cột." - nếu luôn có súng thì đầu vào phải rộng tối thiểu 7 cột.
manassehkatz-Phục hồi Monica

Câu trả lời:


19

Ốc , 71 byte

Hãy thử trực tuyến.

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. bạn phải vui mừng khi tôi thực hiện thử thách này: P
Stephen

25
Bạn có một liên kết đến ngôn ngữ này? Thật là buồn cười khi khẩu súng nhanh nhất ở phía tây là một con ốc sên.
PyRulez


6
@PyRulez bạn có thể nhấp vào tên ngôn ngữ trên trang TIO
Stephen

Tôi quan tâm đến cách thức này hoạt động.
Kritixi Lithos

6

Toán học, 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]&

Có một chuỗi các chuỗi / ký tự. Trả về số lượng đạn.


4

JavaScript, 215 211 209 byte

Cảm ơn Shaggy cho -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>

Về cơ bản, cố gắng khớp các nký tự súng sau khi ngắt dòng, ntừ 0chiều dài của chuỗi.


Lưu một vài byte bằng cách gán vào Zbên trong nghĩa đen, lần đầu tiên bạn sử dụng nó và thoát khỏi {}.
Xù xì

@Shaggy Cảm ơn!
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: Đã sửa một lỗi khiến tôi mất 5 byte: (... đã tìm thấy 3 byte bổ sung r''không cần thiết. Và sau đó Grrr !! Không được tính\ chính xác các ký tự trong mã của tôi, vì vậy đã thêm 6 ...

Đưa ra một chuỗi với các dòng mới; lấy lại số lượng đạn được tìm thấy

Về cơ bản, áp dụng một biểu thức chính tìm kiếm mẫu súng với các ký tự 0, 1, ... lineLpm ở đầu dòng.


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

Hãy thử trực tuyến! (đánh gôn) (mở rộng) (357 đánh gôn) (mở rộng 357)

Tôi tự hỏi làm thế nào xấu một giải pháp trong ngôn ngữ mà không có mô hình phù hợp. Nó đi ra nhỏ hơn nhiều so với tôi sợ.

Về cơ bản, cách tiếp cận này chia khẩu súng thành một loạt các bộ phận riêng lẻ mà nó dự kiến ​​sẽ thấy ở các vị trí cụ thể liên quan đến một chỉ số cụ thể. Nếu tất cả các bộ phận được tìm thấy nơi họ mong đợi, đó là một khẩu súng! Thử nghiệm viên đạn tăng một bộ đếm toàn cầu để theo dõi xem có bao nhiêu viên đạn trong đó, chúng tôi in khi chúng tôi tìm thấy khẩu súng duy nhất và duy nhất trong cảnh quan.

Lưu ý 1: Tôi đã đệm các trường hợp thử nghiệm với khoảng trắng để đảm bảo độ rộng hàng nhất quán.

Lưu ý 2: Thêm 10 byte nếu bạn không thích bài tập thay vì thủ thuật trả về . Để rõ ràng, tôi đã sử dụng các báo cáo trả lại thực tế trong mã mở rộng.


Ba tối ưu hóa nhỏ: - Sử dụng putar với giá trị b trực tiếp thay vì printf (3 byte). - Sử dụng toán tử ternary thay vì câu lệnh if để in số lượng đạn (1 byte). - Cuộn khởi tạo số lượng đạn vào ternary in (2 byte). Cái cuối cùng có chút mùi vì nó có nghĩa là b bằng 0 khi kiểm tra chỉ số đầu tiên, nhưng vì dù sao không có khẩu súng nào có thể ở chỉ số 0, tôi nghĩ đó là một sự thay đổi hợp lý.
jiv
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.