Batının En Hızlı Silahı


23

Sen Mississippi'nin batısındaki en sert, en sert, en havalı kovboyusun. Ancak, tuhaf bir inek web sitesinde bazı garip bir adam sizi rastgele bitmemiş manzaralar içine sokmak ve mücadele etmek için serin olacağına karar verdi. Olursa olsun, yine de kazanacaksın. Bununla birlikte, eve yazacağınız yorucu silahlı dövüşleri kazanmanıza yardımcı olmak için, manzaradaki korkak adamın kaç tane mermi olduğunu bilmek yararlı olacaktır.

Bu zavallı adama yardım etmene ne dersin? Bir ASCII manzarası göz önüne alındığında, içindeki silahı bulun ve ona kaç tane kurşun yüklü olduğunu söyleyin. Bu silah:

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

XYukarıdaki resimde her biri bir kurşun için potansiyel bir yuvadır. Yarık ya bir boşluk içerecek ya da bunlardan birini içerecektir 0,O,o(tutarlı olmayabilir - kovboy silahına farklı türde mermiler yerleştirmiş olabilir).

Peyzajda, yukarıdaki açıklama ile eşleşen her zaman tam olarak bir silah olacaktır. Ancak, lütfen silahın içindeki ve içindeki boşlukların herhangi bir şey içerebileceğini unutmayın.

Giriş

Yazdırılabilir ASCII (sekmeler değil) ve satırları ayırmak için yeni satırlar içeren bir dize verilecektir. İsterseniz dizelerin bir listesini de alabilirsiniz. Dizelerin tümü boşluklarla doldurulur, böylece hepsi aynı uzunlukta olur. Giriş en az 4 satır yüksekliğinde ve 7 sütun genişliğinde olacaktır.

Manzarada her zaman tam olarak bir silah olacak.

Çıktı

0, O, oSilahın içinde kaç tane kurşun ( ) olduğunu çıkartacaksınız, böylece çıktınız daima 0ve arasında olacaktır 6.

Test Kılıfları

  (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

Bu , bayt cinsinden en kısa cevap kazanır.



10
+1 Eğer birisi bu mücadeleyi FGITWs yaparsa;)
Beta Decay

2
0Silahın sınırlayıcı kutusunun içinde ancak silahın dışında olduğu bir test çantası eklemelisiniz .
Martin Ender

@StepHen Ah doğru, silahın içinde ona ait olmayan bir sıfır var. Silahın dışında ancak sınırlayıcı kutunun içinde sıfır olması iyi olurdu.
Martin Ender

"Girdi, en az 4 satır yüksekliğinde ve 5 sütun genişliğinde olacak." - her zaman bir tabanca varsa, giriş en az 7 sütun genişliğinde olmalıdır.
manassehkatz-Reinstate Monica 14

Yanıtlar:


19

Salyangoz , 71 bayt

Çevrimiçi deneyin.

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.o zaman bu meydan okumayı yaptığım için mutlu olmalısın: P
Stephen

25
Bu dilin bağlantısı var mı? Batının en hızlı silahının bir salyangoz olması oldukça komik.
PyRulez


6
@PyRulez TIO sayfasındaki dil adını tıklayabilirsiniz
Stephen

Bunun nasıl çalıştığıyla ilgileniyorum.
Kritixi Lithos,

6

Mathematica, 170 bayt

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

Bir dizi dizge / karakter alır. Mermi sayısını döndürür.


4

JavaScript, 215 211 209 bayt

-4 bayt için Shaggy'ye teşekkürler!

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>

Temel olarak, bir silah eşleştirmeye çalışır n, bir çizgi aradan sonra karakterleri ngelen 0dize uzunluğuna.


ZDeğişmez içine atayarak , ilk kullanışınızda ve ondan kurtularak birkaç bayt kazanın {}.
Shaggy,

@Shaggy Teşekkürler!
Artyer

3

Python 2, 219 224 227 bayt

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: Bana 5 bayta mal olan bir hata düzeltildi: (... r''gerekmeyen 3 baytlık fazlalık bulundu . Ve sonra Grrr !! Kodumdaki \karakterleri doğru saymadım, bu yüzden 6 ...

Newlines ile bir dize alır; bulunan mermi sayısını geri döndürür.

Temel olarak, tabanca düzenini 0, 1, ... satır uzunluğu satırının başlangıcında yastıklı karakterlerle arayan bir regex uygular.


3

C (gcc) , 357 351 bayt

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

Çevrimiçi deneyin! (golf) (genişletilmiş) (357 golf) (357 genişletilmiş)

Bir çözümün yerleşik kalıp eşleşmesi olmadan bir dilde ne kadar kötü olacağını merak ettim. Korktuğumdan çok daha küçük çıktı.

Temel olarak, bu yaklaşım tabancayı, belirli bir endekse göre belirli yerlerde görmeyi beklediği bir dizi ayrı parçaya böler. Tüm parçalar beklendikleri yerde bulunursa, bu bir silahtır! Mermi testi, manzaradaki bir ve biricik silahı bulduğumuzda bastığımız kaç merminin olduğunu takip etmek için küresel bir sayacı arttırır.

Not 1: Tutarlı satır genişlikleri sağlamak için test kılıflarını boşluklarla doldurdum.

Not 2: Dönüş numarası yerine atamayı beğenmiyorsanız 10 bayt ekleyin . Netlik sağlamak için genişletilmiş kodda gerçek iade ifadeleri kullandım.


Üç küçük optimizasyon: - Doğrudan printf (3 bayt) yerine b'nin değerini kullanarak putchar kullanın. - Madde işareti sayısını (1 bayt) yazdırmak için if ifadesi yerine üçlü işleç kullanın. - Mermi sayısının başlatılmasını yazdırma üçlüsüne (2 bayt) döndürün. Sonuncusu biraz koklamak, çünkü ilk endeksi test ederken b'nin sıfır olduğu, ancak hiçbir silahın 0 indeksinde olamayacağı için adil bir değişiklik olduğunu düşünüyorum.
jiv,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.