Вступление
Вы сидите со своим коллегой, обедаете и хвастаетесь ему / ей о последнем и, возможно, величайшем проекте, над которым вы работали. Устав от постоянной демонстрации эгоизма, он бросает вам вызов, чтобы вы заткнулись. Будучи эгоистичным и счастливым человеком, которым вы являетесь, вы, конечно, принимаете (потому что вы должны принять каждый вызов). Вызов , как он / она объясняет это, дается вход блока текста , содержащего 1 или более каждый символ в !@#$^&*
, выходе в любом приемлемом формате координата коммутатора (ов) , что является / является «на».
По словам вашего коллеги, переключатель является $
, и переключатель классифицируется как «включенный», если и только если он удовлетворяет хотя бы одному из следующих критериев:
Он окружен всем
^
. Так...^^^ ^$^ ^^^
приводит к включению.
Он окружен всем
&
. Так...&&& &$& &&&
приводит к включению.
Он полностью покрыт как минимум с двух сторон
*
. Например,*** &$& ***
приводит к включению, но
&*& &$& &*&
нет, так как переключатель не полностью покрыт с двух сторон
*
s.В любом из углов вокруг него есть как минимум 1
!
и / или 1@
. Это не считается, если один из них не в углу. Так...!&& ^$@ @&!
приводит к переключению «вкл», так как есть по крайней мере 1
!
и / или@
по крайней мере 1 из углов (в вышеупомянутом случае есть 2 действительных!
s и 1 действительный@
в 3 углах). И...&!& ^$@ ^!&
делает не , хотя есть 2
!
с и 1@
, так как ни один из них не в любой из углов.1 или более
#
являются не на каких - либо сторон вокруг выключателя, если по крайней мере , 1&
окружает переключатель. Другими словами, если#
на стороне присутствует хотя бы 1 подарок, он отменяет все остальные правила, если только не&
присутствует подарок. Следовательно:#&* *$* !**
приводит к переключению «включено», хотя
#
существует, так как&
вокруг переключателя есть, и оно следует по крайней мере 1 из вышеупомянутых правил. Однако, если восклицательный знак не присутствовал так:#&* *$* ***
Переключатель будет выключен, поскольку он не соответствует хотя бы одному из приведенных выше правил. Следовательно, даже если переключатель может быть окружен символами a
#
и a&
, он все равно будет выключен, если он не следует одному или нескольким из этих правил. Кроме того, всегда должно быть отношение> = 1: 1 между&
s и#
s, чтобы переключатель был действительным. Например,#&! *$* **#
все равно будет недопустимым переключателем, хотя он следует 1 из этих правил, так как есть 2
#
с, но только 1&
, и, следовательно, нет отношения> = 1: 1 между&
s и#
s. Чтобы сделать это действительным, вы должны добавить 1 или более дополнительных&
s к любому ребру, чтобы сбалансировать количество#
s и&
s, возможно, так:#&! *$& &*# 3:2 ratio between &s and #s
В заключение...
#^^ ^$* @^!
Результаты в «выключено» переключателя, хотя это следующим образом: 1 или более из указанных выше правил, так как он не содержит по меньшей мере 1
#
вокруг него, а не&
с до перевесить его.Действующие переключатели будут только быть в качестве входных данных, и , следовательно, каждый действительный
$
должен быть окруженным полностью любым 8 из допустимых символов. Например, если весь ввод должен быть:*$* !$! !!!
вершина
$
определенно не является допустимым переключателем, так как переключатель находится на краю, и поэтому переключатель не полностью окружен 8 действительными символами. В этом случае переключатель даже не следует рассматривать. Тем не менее, переключатель в середине полностью действителен и, по сути, включен, так как он соответствует по крайней мере одному из указанных выше требований.
Чтобы продемонстрировать, рассмотрим этот блок символов:
!@#^^$#!@
!@#$$*$&@
@$^!$!@&&
который мы можем пометить для координат так, называя вертикальную ось y
и горизонтальную ось x
:
y
3 !@#^^$#!@
2 !@#$$*$&@
1 @$^!$!@&&
123456789 x
Координаты всегда должны быть возвращены в (x,y)
формате, аналогичном двумерной координатной сетке. Теперь, какие переключатели включены? Что ж, давайте сначала найдем их всех. Мы уже видим, что 1 находится в самом верхнем ряду, а другой - в самом нижнем. Тем не менее, они автоматически запрещаются, поскольку они не полностью окружены 8 символами.
Далее идет тот, что в строке 2. В частности, этот:
#^^
#$$
^!$
Мы можем видеть, что в этом есть 3 $
знака, но мы просто хотим сосредоточиться на том, что посередине, и, как вы, вероятно, можете видеть, он уже недействителен, так как имеет 2 #
с вокруг, без &
s, чтобы сбалансировать их вне. Кроме того, это даже не соответствует ни одному из правил, поэтому, даже если это был допустимый переключатель, он все равно был бы «выключен».
Далее идет еще один в ряду 2:
^^$
$$*
!$!
Опять же, сосредоточьтесь только на переключателе в середине. Этот переключатель включен, так как он имеет по крайней мере 1 !
в по крайней мере 1 углу. Координаты этого есть (5,2)
.
Двигаясь дальше, мы наконец переходим к последнему переключателю. Этот также находится во втором ряду и выглядит так:
$#!
*$&
!@&
и, как вы, вероятно, видите, этот также является допустимым переключателем, хотя есть и #
окружающий его, так как есть 2 других &
s, чтобы перевесить #
. В дополнение к этому, он также имеет по крайней мере 1 !
в по крайней мере 1 из углов, и, следовательно, не только действителен переключатель, но он также «включен». Координаты этого коммутатора (7,2)
.
Мы наконец достигли конца и нашли 2 переключателя «вкл» во всем этом блоке текста. Их координаты (5,2)
и (7,2)
, что является нашим окончательным ответом, и каким должен быть вывод. Однако этот вклад был очень прост. Входные данные могут стать намного больше, так как нет ограничений на размер блока текста. Например, ввод может быть даже рандомизированным 200x200
блоком текста.
контрсилами
Стандартные лазейки запрещены.
Возможно, для этого не может быть встроенной функции, но на всякий случай (глядя на вас, Mathematica) использование встроенных модулей, непосредственно решающих эту проблему, запрещено.
Тестовые случаи:
Дано в формате string input -> [array output]
:
@#$$&^!&!#
@*&!!^$&^@
$!#*$@#@$! -> [[7,3],[9,2]]
*@^#*$@&*#
#^&!$!&$@@#&^^&*&*&&
!^#*#@&^#^*$&!$!*^$$
#^#*#$@$@*&^*#^!^@&* -> [[19,3],[15,3],[8,2]]
#$@$!#@$$^!#!@^@^^*#
@!@!^&*@*@
*$*^$!*&#$
@$^*@!&&&#
**$#@$@@#! -> [[2,8],[5,8],[6,6],[9,3]]
##*&*#!^&^
$&^!#$&^&@
^^!#*#@#$*
$@@&#@^!!&
#@&#!$$^@$
!!@##!$^#!&!@$##$*$#
$^*^^&^!$&^!^^@^&!#!
@*#&@#&*$!&^&*!@*&** -> [[9,4],[9,3]]
^!!#&#&&&#*^#!^!^@!$
&$$^*$^$!#*&$&$#^^&$
Продолжение следует
Дополнительные замечания
- Вы можете предположить, что ввод всегда будет в форме полного блока (то есть прямоугольника или квадрата)
- На входе никогда не будет другого символа, кроме того, что на
!@#$^&*
.
Помните, это код-гольф, поэтому выигрывает самый короткий код!
Ответы:
Haskell, 304 байта
Это определяет функцию,
f
которая выполняет данную задачу.источник
JavaScript (ES6),
363339312309298 байтЭто функция, принимающая входные данные в виде строки и возвращающая список координат. Он разделен на 2 основные части: преобразование переключателей в пару координат и окружающих их персонажей и проверка «включен ли он» на основе правил испытания для окружающих персонажей.
источник
Python 2 ,
299297279275261259 байтПопробуйте онлайн!
Принимает ввод как список строк
Выводит выходные данные в виде пары координат x, y в каждой строке
источник