Найшвидший пістолет на Заході


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 вирішує цей виклик;)
бета-розпад

2
Вам слід додати тестовий випадок, коли 0всередині обмежувальної коробки гармати, але поза пістолетом.
Мартін Ендер

@StepHen О так, у рушниці є один нуль, який йому не належить. Було б добре мати нулі поза пістолетом, але всередині його обмежувальної коробки.
Мартін Ендер

"Вхід буде принаймні 4 рядками та 5 колонами шириною." - якщо завжди є пістолет, то вхід повинен бути не менше 7 стовпців.
manassehkatz-Reinstate Моніка

Відповіді:


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
Stephen

Мене цікавить, як це працює.
Kritixi Lithos

6

Математика, 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 байти!

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)

EDIT: Виправлена ​​помилка, яка коштувала мені 5 байт: (... знайдено 3 байти зайвих r''s, які не потрібні були. І тоді Grrr !! Не рахував \правильно знаків у моєму коді, тому додав 6 ...

Бере рядок з новими рядками; повертає кількість знайдених куль.

В основному, застосовується регулярний вираз, який шукає шаблон пістолета з 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 байт, якщо вам не подобається призначення замість зворотного фокусу. Для наочності я використовував фактичні оператори повернення в розширеному коді.


Три незначні оптимізації: - Використовуйте putchar зі значенням b безпосередньо замість printf (3 байти). - Використовуйте потрійний оператор замість оператора if, щоб надрукувати кількість куль (1 байт). - Ініціалізація підрахунку куль кулі до потрійного друку (2 байти). Останній трохи смердючий, оскільки означає, що b є нульовим при тестуванні першого індексу, але оскільки жоден пістолет не міг би бути в індексі 0, я думаю, що це справедлива зміна.
jiv
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.