Самое быстрое оружие на Западе


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 Если кто-то FGITWs этот вызов;)
Beta Decay

2
Вы должны добавить тестовый случай, где есть 0внутренняя ограничительная рамка пистолета, но снаружи пистолета.
Мартин Эндер

@ StepHen Ах да, внутри пистолета есть один ноль, который ему не принадлежит. Было бы хорошо иметь нули вне пистолета, но также и в его ограничительной рамке.
Мартин Эндер

«Вход будет иметь высоту не менее 4 строк и ширину 5 столбцов». - если всегда есть пистолет, то вход должен иметь ширину не менее 7 столбцов.
Manassehkatz-Восстановить Монику

Ответы:


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 вы можете нажать на название языка на странице
Стивен

Мне интересно, как это работает.
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 Спасибо!
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 ...

Принимает строку с символами новой строки; возвращает количество найденных пуль.

В основном, применяется регулярное выражение, которое ищет образец оружия с 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.