ปืนที่เร็วที่สุดในโลกตะวันตก


23

คุณเป็นคาวบอยที่หยาบที่สุดแกร่งและเด็ดสุดทางตะวันตกของแม่น้ำมิสซิสซิปปี อย่างไรก็ตามมีบางคนที่ประหลาดในเว็บไซต์แปลกประหลาดตัดสินใจว่ามันจะเจ๋งมากที่จะส่งเสียงคุณภูมิทัศน์ที่ไม่เสร็จและต่อสู้แบบสุ่ม ไม่ว่าคุณจะยังชนะอยู่ อย่างไรก็ตามเพื่อช่วยให้คุณชนะการชกต่อยอย่างโหดร้ายที่คุณเขียนถึงที่บ้านคุณควรทราบว่ามีกระสุนจำนวนเท่าใดที่คนขี้เกียจหลบซ่อนตัวอยู่ในภูมิประเทศ

แล้วคุณช่วยคนจนคนนี้ออกมาได้อย่างไร รับภูมิทัศน์ ASCII ค้นหาปืนที่อยู่ภายในและบอกเขาว่ามีกระสุนจำนวนมากบรรจุเข้ามา นี่คือปืน:

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

แต่ละXภาพด้านบนเป็นช่องสำหรับกระสุน ช่องจะมีช่องว่างหรือหนึ่งใน0,O,o(อาจไม่สอดคล้องกัน - คาวบอยอาจโหลดกระสุนชนิดต่าง ๆ ในปืนของเขา)

จะมีปืนหนึ่งกระบอกเสมอซึ่งตรงกับคำอธิบายข้างต้นในแนวนอน อย่างไรก็ตามโปรดทราบว่าช่องว่างรอบ ๆ และด้านในของปืนสามารถบรรจุได้ทุกอย่าง

อินพุต

คุณจะได้รับสตริงที่มี ASCII ที่พิมพ์ได้ (ดังนั้นไม่ใช่แท็บ) และการขึ้นบรรทัดใหม่เพื่อแยกบรรทัด นอกจากนี้คุณยังอาจใช้รายการสตริงถ้าคุณต้องการ สตริงทั้งหมดจะถูกบุด้วยช่องว่างดังนั้นพวกเขาทั้งหมดจะมีความยาวเท่ากัน อินพุตจะสูงอย่างน้อย 4 แถวและกว้าง 7 คอลัมน์

จะมีปืนหนึ่งกระบอกในแนวนอนเสมอ

เอาท์พุต

คุณจะออกวิธีการหลายกระสุน ( 0, O, o) ที่มีอยู่ในปืนเพื่อส่งออกของคุณจะเสมอระหว่างและ06

กรณีทดสอบ

  (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 หากมีคน FGITWs ความท้าทายนี้;)
สลายตัวของเบต้า

2
คุณควรเพิ่มกรณีทดสอบที่มี0ด้านในของกล่องปืน แต่อยู่นอกปืน
Martin Ender

@ ขั้นตอนที่ถูกต้องมีหนึ่งในศูนย์ปืนที่ไม่ได้เป็นของมัน มันจะเป็นการดีถ้ามีเลขศูนย์อยู่นอกปืน แต่อยู่ในกรอบของมันเช่นกัน
Martin Ender

"อินพุตจะสูงอย่างน้อย 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
Stephen

25
คุณมีลิงค์ไปยังภาษานี้หรือไม่? มันตลกดีที่ปืนที่เร็วที่สุดในฝั่งตะวันตกเป็นหอยทาก
PyRulez


6
@PyRulez คุณสามารถคลิกชื่อภาษาบนหน้า TIO
Stephen

ฉันสนใจในการทำงานนี้
Kritixi Lithos

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ตัวละครปืนหลังจากตัวแบ่งบรรทัดสำหรับnจาก0ความยาวของสายอักขระ


บันทึกไม่กี่ไบต์โดยมอบหมายให้ภายในที่แท้จริงเป็นครั้งแรกที่คุณใช้มันและการกำจัดZ {}
Shaggy

@Shaggy ขอบคุณ!
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''ที่ไม่จำเป็นแล้ว Grrr !! ไม่นับ\ตัวอักษรในรหัสของฉันอย่างถูกต้องเพิ่ม 6 ...

ใช้สตริงที่มีการขึ้นบรรทัดใหม่; retuns จำนวนกระสุนที่พบ

โดยทั่วไปให้ใช้ regex ที่มองหารูปแบบปืนที่มี 0, 1, ... line ตัวอักษรความยาวของแผ่นที่จุดเริ่มต้นของบรรทัด


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

ลองออนไลน์! (golfed) (ขยายแล้ว) (357 golfed) (ขยาย 357)

ฉันสงสัยว่าวิธีแก้ปัญหาจะเลวร้ายในภาษาโดยไม่ต้องจับคู่รูปแบบในตัว มันออกมาเล็กกว่าที่ฉันกลัวมาก

โดยพื้นฐานแล้ววิธีการนี้แบ่งปืนออกเป็นชุดของแต่ละส่วนที่คาดว่าจะเห็นในสถานที่เฉพาะเมื่อเทียบกับดัชนีเฉพาะ หากพบชิ้นส่วนทั้งหมดที่พวกเขาคาดว่าจะเป็นปืน! การทดสอบสัญลักษณ์แสดงหัวข้อย่อยเพิ่มเคาน์เตอร์ทั่วโลกเพื่อติดตามจำนวนกระสุนอยู่ในนั้นซึ่งเราพิมพ์เมื่อเราพบปืนหนึ่งเดียวในภูมิทัศน์

หมายเหตุ 1: ฉันเสริมกรณีทดสอบด้วยช่องว่างเพื่อให้แน่ใจว่าความกว้างของแถวที่สอดคล้องกัน

หมายเหตุ 2: เพิ่ม 10 ไบต์ถ้าคุณไม่ชอบการมอบหมายแทนการหลอกลวงกลับ เพื่อความชัดเจนฉันใช้คำสั่ง return จริงในโค้ดที่ถูกขยาย


การเพิ่มประสิทธิภาพย่อยสามประการ: - ใช้ putchar กับค่าของ b โดยตรงแทน printf (3 ไบต์) - ใช้โอเปอเรเตอร์แทนคำสั่ง if เพื่อพิมพ์จำนวน bullet (1 ไบต์) - การเริ่มต้นการนับจำนวนกระสุนเข้าสู่การพิมพ์ที่สาม (2 ไบต์) อันสุดท้ายมีกลิ่นเหม็นเล็กน้อยเพราะมันหมายถึง b เป็นศูนย์เมื่อทำการทดสอบดัชนีแรก แต่เนื่องจากไม่มีปืนอยู่ที่ดัชนี 0 ต่อไปฉันคิดว่ามันเป็นการเปลี่ยนแปลงที่ยุติธรรม
jiv
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.