西で最速の銃


23

あなたはミシシッピ川西部で最も荒く、最も強く、最もクールなカウボーイです。しかし、おかしなオタクWebサイトの一部の奇妙な男は、ランダムな未完成の風景にあなたを乗せて戦うことはクールだと判断しました。関係なく、あなたはまだ勝ちます。しかし、あなたが家に書くこれらの厳しい銃撃戦に勝つのを助けるために、風景の中に潜んでいるco病者がいくつの弾丸を持っているかを知ることは役に立ちます。

この貧しい男を助けてくれませんか。ASCIIランドスケープが与えられたら、その中の銃を見つけて、そこにいくつの弾丸が装填されているかを伝えます。これが銃です:

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

X上の写真のそれぞれは、弾丸の潜在的なスロットです。スロットにはスペースまたは次のいずれかが含まれます0,O,o(一貫性がない場合があります-カウボーイは銃にさまざまな種類の弾丸を装填した可能性があります)。

ランドスケープには、上記の説明に一致する銃が常に1つだけ存在します。ただし、銃の周囲および内部のスペースには何でも入れることができます。

入力

印刷可能なASCII(タブではない)と改行を区切る改行を含む文字列が与えられます。必要に応じて、文字列のリストを取得することもできます。文字列はすべてスペースで埋められるため、すべて同じ長さになります。入力は、少なくとも高さ4行、幅7列です。

ランドスケープには常に1本の銃があります。

出力

あなたはどのように多くの弾丸(出力は以下となり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した場合;)
ベータ崩壊

2
0銃の境界ボックスの内側にあるが銃の外側にあるテストケースを追加する必要があります。
マーティンエンダー

@StepHenそうそう、銃の中にはそれに属さないゼロがあります。ただし、銃の外側にあるが、その境界ボックス内にもゼロがあるとよいでしょう。
マーティンエンダー

「入力は、少なくとも高さ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ページで言語名をクリックできます
スティーブン

この仕組みに興味があります。
クリティキシリソス

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バイト

-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ありがとう!
アーティアー

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バイトかかったバグを修正しました:(... r''不要な3バイトの余分なsを見つけました。そしてGrrr !! \私のコードで文字を正しくカウントしていなかったので、6を追加しました...

改行を含む文字列を受け取ります。見つかった弾丸の数を調整します。

基本的に、行の先頭にpadの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:リターントリックの代わりに割り当てが気に入らない場合は、10バイトを追加します。明確にするために、拡張コードでは実際のreturnステートメントを使用しました。


3つのマイナーな最適化:-printf(3バイト)の代わりに、bの値を持つputcharを直接使用します。-箇条書き(1バイト)を出力するには、ifステートメントの代わりに三項演算子を使用します。-弾丸カウントの初期化を3進法で印刷(2バイト)。最後の1つは、最初のインデックスをテストするときにbが0であることを意味するため少し臭いですが、とにかくインデックス0に銃を置くことはできないので、かなりの変化だと思います。
-jiv
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.