Pistol Tercepat di Barat

23

Anda adalah koboi yang paling kasar, paling tangguh, dan paling keren di sebelah barat Mississippi. Namun, beberapa pria aneh di situs web aneh aneh memutuskan bahwa itu akan keren untuk menjatuhkan Anda ke lanskap acak yang belum selesai dan berkelahi. Tidak masalah, Anda masih akan menang. Namun, untuk membantu Anda memenangkan baku tembak melelahkan yang akan Anda tulis di rumah, akan sangat membantu untuk mengetahui berapa banyak peluru yang dimiliki pengecut yang bersembunyi di lanskap.

Bagaimana kalau kamu membantu pria malang ini. Diberikan lanskap ASCII, temukan pistol di dalamnya dan katakan padanya berapa banyak peluru yang dimuat ke dalamnya. Ini pistolnya:

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

Masing-masing Xdalam gambar di atas adalah slot potensial untuk peluru. Slot tersebut akan berisi ruang atau salah satu dari 0,O,o(mungkin tidak konsisten - koboi mungkin telah memuat berbagai jenis peluru di senjatanya).

Akan selalu ada tepat satu senjata, cocok dengan deskripsi di atas, di lanskap. Namun, harap diperhatikan bahwa ruang di sekitar dan di dalam pistol dapat berisi apa saja.

Memasukkan

Anda akan diberi string berisi ASCII yang dapat dicetak (jadi bukan tab) dan baris baru untuk memisahkan baris. Anda juga dapat mengambil daftar string, jika mau. Semua string akan diisi dengan spasi, sehingga semuanya memiliki panjang yang sama. Input akan minimal 4 baris dan lebar 7 kolom.

Akan selalu ada tepat satu senjata di lanskap.

Keluaran

Anda akan menampilkan berapa banyak peluru ( 0, O, o) yang ada di pistol, sehingga output Anda akan selalu berada di antara 0dan 6.

Uji Kasus

  (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

Ini adalah , jadi jawaban tersingkat dalam byte menang.

Stephen
sumber
Sandbox
Stephen
10
+1 Jika seseorang FGITW tantangan ini;)
Beta Decay
2
Anda harus menambahkan test case di mana ada di 0dalam kotak senapan tapi di luar pistol.
Martin Ender
@ Langkah Oh, benar, ada nol di dalam pistol yang bukan miliknya. Akan lebih baik memiliki angka nol di luar pistol tetapi di dalam kotak pembatasnya juga.
Martin Ender
"Inputnya akan setidaknya 4 baris tinggi dan lebar 5 kolom." - jika selalu ada senjata maka inputnya harus paling sedikit 7 kolom.
manassehkatz-Reinstate Monica

Jawaban:

19

Siput , 71 byte

Cobalah online.

A
\/a=\)2w\V={\\u\(}c=\/b={\\c\(2}u!{(nb|.|.n.)=^o=^O=^0^ }{nb|.|.n.}^ 
feersum
sumber
4
Programming language for 2-dimensional pattern matching.Anda pasti senang saya membuat tantangan ini: P
Stephen
25
Apakah Anda memiliki tautan ke bahasa ini? Cukup lucu bahwa senjata tercepat di barat adalah siput.
PyRulez
1
@PyRulez Ini tautan untuk Anda
ovs
6
@PyRulez Anda dapat mengklik nama bahasa di halaman TIO
Stephen
Saya tertarik dengan cara kerjanya.
Kritixi Lithos
6

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

Mengambil array string / karakter. Mengembalikan jumlah peluru.

JungHwan Min
sumber
4

JavaScript, 215 211 209 byte

Berkat Shaggy untuk -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>

Pada dasarnya, cobalah untuk mencocokkan nkarakter pistol setelah jeda baris, untuk ndari 0panjang tali.

Artyer
sumber
Simpan beberapa byte dengan menetapkan ke Zdalam literal, pertama kali Anda menggunakannya dan menyingkirkan {}.
Shaggy
@Shaggy Terima kasih!
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: Memperbaiki bug yang menghabiskan biaya 5 byte: (... menemukan 3 byte tambahan r''yang tidak diperlukan. Dan kemudian Grrr !! Tidak menghitung \karakter dalam kode saya dengan benar, jadi menambahkan 6 ...

Mengambil string dengan baris baru; Kembalikan jumlah peluru yang ditemukan.

Pada dasarnya, terapkan regex yang mencari pola pistol dengan karakter 0, 1, ... lineLength pad pada awal baris.

Chas Brown
sumber
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;}}

Cobalah online! (golf) (diperluas) (357 golf) (357 diperluas)

Saya bertanya-tanya seberapa buruk solusinya dalam bahasa tanpa pencocokan pola bawaan. Itu keluar jauh lebih kecil daripada yang saya takutkan.

Pada dasarnya, pendekatan ini memecah pistol menjadi serangkaian bagian individu yang diharapkan untuk dilihat di lokasi tertentu relatif terhadap indeks tertentu. Jika semua bagian ditemukan di tempat yang diharapkan, itu adalah pistol! Tes peluru menambah counter global untuk melacak berapa banyak peluru yang ada di dalamnya, yang kami cetak ketika kami telah menemukan satu-satunya senjata di lanskap.

Catatan 1: Saya mengisi ruang uji dengan spasi untuk memastikan lebar baris yang konsisten.

Catatan 2: Tambahkan 10 byte jika Anda tidak menyukai penetapan alih-alih trik pengembalian . Untuk kejelasan, saya menggunakan pernyataan pengembalian aktual dalam kode yang diperluas.

jiv
sumber
Tiga optimasi kecil: - Gunakan putchar dengan nilai b secara langsung, bukan printf (3 byte). - Gunakan operator ternary alih-alih jika pernyataan untuk mencetak hitungan peluru (1 byte). - Gulung inisialisasi jumlah peluru ke terner cetak (2 byte). Yang terakhir agak bau karena itu berarti b adalah nol ketika menguji indeks pertama, tetapi karena tidak ada senjata yang bisa berada di indeks 0, saya pikir itu adalah perubahan yang adil.
jiv