西部最快的枪


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
+1如果有人FGITW挑战;)
Beta Decay

2
您应该添加一个测试用例,其中0枪的边界框内有一个东西,但枪的外部有一个。
Martin Ender

@StepHen哦,对了,枪里面有一个不属于它的零。最好在枪外但在其边界框内也有零。
Martin Ender

“输入将至少为4行高和5列宽。” -如果总是有枪,则输入必须至少为7列宽。
manassehkatz-恢复莫妮卡

Answers:


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页面上的语言名称
斯蒂芬

我对这是如何工作感兴趣。
Kritixi Lithos'7

6

Mathematica,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

JavaScript中,215个 211 209字节

感谢Shaggy的-4个字节!

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在换行后匹配机枪字符,n0到字符串的长度。


通过Z在字面量内分配到第一次使用它并摆脱来节省一些字节{}
毛茸茸的

@粗野的谢谢!
Artyer

3

Python 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)

编辑:修复了一个花了我5个字节的错误:(...发现了3字节的不需要的额外r''s。然后Grrr!没有\正确计算我代码中的字符,因此添加了6 ...

带换行符的字符串;调整找到的子弹数量。

基本上,应用正则表达式,在行的开头查找填充为0、1 ... lineLength字符的枪图案。


3

C(gcc)357351字节

#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:如果您不喜欢分配而不是返回技巧,则添加10个字节。为了清楚起见,我在扩展代码中使用了实际的return语句。


三个较小的优化:-直接使用带有b值的putchar而不是printf(3个字节)。-使用三元运算符代替if语句来打印项目符号计数(1个字节)。-将项目符号计数初始化滚动到打印三进制(2字节)。最后一个有点臭,因为它在测试第一个索引时意味着b为零,但是由于无论如何枪都不会在索引0处,我认为这是一个公平的变化。
2017年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.