Які вимикачі включені?


12

Вступ

Ви сидите зі своїм колегою, обідаєте та хвастотуєтесь йому / їй про останній і нібито найбільший проект, над яким ви працювали. Хворіючи і втомившись від вашої постійної прояви егоїзму, він / вона доставляє вам виклик лише для того, щоб ви заткнулися. Звичайно, що ви є егоїстичною і щасливою людиною, яку ви, звичайно, приймаєте (адже ви повинні приймати кожен виклик). Виклик , як він / вона пояснює це, дається вхід блоку тексту , що містить 1 або більше кожен символ в !@#$^&*, вихід в будь-якому прийнятному форматі координата комутатора (ів) , що є / є «на».

За словами Вашого колеги, перемикач є a $, а перемикач класифікується як "увімкнено", якщо і лише якщо він відповідає щонайменше 1 із наступних критеріїв:

  1. Він оточений усіма ^. Так...

    ^^^
    ^$^
    ^^^
    

    приводить до перемикача "увімкнено".

  2. Він оточений усіма &. Так...

    &&&
    &$&
    &&&
    

    приводить до перемикача "увімкнено".

  3. Він повністю покритий як мінімум з двох сторін *. Наприклад,

    ***
    &$&
    ***
    

    приводить до перемикача "увімкнено", але

    &*&
    &$&
    &*&
    

    ні, оскільки вимикач повністю не покритий з двох сторін *s.

  4. У будь-якому з кутів навколо нього є щонайменше 1 !та / або 1 @. Це не рахується, якщо жодне з них не знаходиться в кутку. Так...

    !&&
    ^$@
    @&!
    

    приводить до перемикача "увімкнено", оскільки є щонайменше 1 !та / або @принаймні 1 кут (у наведеному вище випадку є 2 дійсних !s та 1 дійсний @у 3 кутах). І ...

    &!&
    ^$@
    ^!&
    

    робить НЕ , хоча є 2 !з і 1 @, так як жоден з них не в будь-який з кутів.

  5. 1 або більше не# знаходяться з жодної сторони навколо вимикача, якщо принаймні 1 оточує вимикач. Іншими словами, якщо на стороні є принаймні 1 присутність, це перекриває всі інші правила, якщо тільки немає присутніх. Тому:&#&

    #&*
    *$*
    !**
    

    приводить до перемикача "ввімкнено", хоча він #існує, оскільки існує &комутатор навколо, і він дотримується щонайменше 1 з вищезазначених правил. Однак якщо знак оклику не був таким:

    #&*
    *$*
    ***
    

    Перемикач буде вимкнено, оскільки він не відповідає принаймні одному з вищезазначених правил. Тому, навіть якщо комутатор може бути оточений a #і a &, він все одно буде вимкнено, якщо він не керується одним або кількома з цих правил. Крім того, завжди має бути співвідношення> = 1: 1 між &s і #s, щоб комутатор був дійсним. Наприклад,

    #&!
    *$*
    **#
    

    все-таки буде неприпустимим перемикачем, хоча він дотримується 1 цих правил, оскільки існує 2 #с, але лише 1 &, а отже, не співвідношення a> = 1: 1 між &s та #s. Щоб зробити це дійсним, потрібно додати 1 або більше додаткових &s до будь-якого краю, щоб врівноважити кількість #s і &s, можливо так:

    #&!
    *$&
    &*#
    
    3:2 ratio between &s and #s
    

    Нарешті ...

    #^^
    ^$*
    @^!
    

    приводить до вимикача "вимкнено", хоча він дотримується 1 або більше вищезазначених правил, оскільки він містить принаймні 1 #навколо нього, і немає &s, щоб його збалансувати.

  6. Діючі перемикачі будуть тільки бути в якості вхідних даних, і , отже, кожен дійсний $повинен бути оточеним повністю будь-яким 8 з допустимих символів. Наприклад, якщо весь вхід повинен бути:

    *$*
    !$!
    !!!
    

    вершина $, безумовно, не є дійсним перемикачем, оскільки перемикач знаходиться на краю, і тому перемикач не повністю оточений 8 дійсними символами. У цьому випадку перемикач навіть не слід розглядати. Однак перемикач посередині цілком справедливий і фактично "включений", оскільки відповідає хоча б одній із вищезазначених вимог.

Для демонстрації розглянемо цей блок символів:

!@#^^$#!@
!@#$$*$&@
@$^!$!@&&

яку ми можемо позначити для таких координат, називаючи вертикальну вісь yі горизонтальну вісь x:

y

3 !@#^^$#!@
2 !@#$$*$&@
1 @$^!$!@&&

  123456789 x

Координати завжди повинні повертатися у (x,y)форматі, подібному до двовимірної координатної сітки. Тепер, які вимикачі включені? Що ж, давайте спочатку їх знайдемо. Ми вже бачимо, що в самому верхньому ряду є 1, а в самому нижньому. Однак вони автоматично відсутні, оскільки вони не повністю оточені 8 символами.

Далі йде друга у рядку 2. Зокрема, ця:

#^^
#$$
^!$

Ми можемо побачити, що в цьому є 3 $знаки, але ми просто хочемо зосередитись на тому, що знаходиться посередині, і, як ви, напевно, бачите, він уже недійсний, оскільки у нього є 2 #с навколо нього, без &s щоб збалансувати їх з. Крім того, це навіть не відповідає жодному з правил, тому навіть якби це був дійсний перемикач, він все одно буде "вимкнено".

Далі йде ще один у другому ряду:

^^$
$$*
!$!

Знову ж зосередьтеся лише на вимикачі посередині. Цей перемикач «на», так як вона має по крайней мере , 1 !в , щонайменше 1 кут. Координати цього є (5,2).

Рухаючись далі, ми нарешті переходимо на останній вимикач. Цей також знаходиться у другому ряду і виглядає так:

$#!
*$&
!@&

і, як ви, напевно, бачите, цей також є дійсним перемикачем, хоча є #оточуючий його, оскільки є 2 інших &s, щоб збалансувати #. На додаток до цього, він також має щонайменше 1 !в принаймні 1 кутах, і тому не тільки дійсний вимикач, але він також "увімкнено". Координати цього перемикача є (7,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]]
^!!#&#&&&#*^#!^!^@!$
&$$^*$^$!#*&$&$#^^&$

Більше скоро

додаткові нотатки

  • Ви можете припустити, що вхід завжди буде у вигляді повного блоку (тобто прямокутника або квадрата)
  • Ніколи не буде жодного іншого символу, крім символів в !@#$^&*.

Пам'ятайте, що це тому найкоротший код виграє!


12
Здається трохи довгим і довільним.
orlp

@orlp Саме тому я йду. Все одно це виклик. Чому ти кажеш, що це довільно?
Р. Кап

6
@ R.Kap Жодне виправдання не має; вони здаються складеними для додавання складності без причини.
Позов по

6
@QPaysTaxes Яке обґрунтування для цього потрібно? Вони складаються заради виклику. Це є проблемою, і виклик може бути в буквальному сенсі нічого . Все, що йому дійсно потрібно, - це набір правил, вхідних даних і те, на чому результат повинен базуватися на цих правилах.
Р. Кап

1
Я не кажу, що згоден, я пояснюю, чому це виглядає довільно. Візьміть мій найпопулярніший виклик як приклад: Якщо ви викреслили весь контекст і просто сказали: "Вам надається набір рядків. На основі відступів згрупуйте їх, перетасуйте групи, перетасуйте групи інтер'єру, але тримайте членів внутрішні групи внизу, якщо вони існують ", це не мало б сенсу. Однак, оскільки він має контекст, усі ці дивні правила та обмеження принаймні прикидаються сенсом.
Позов по

Відповіді:


2

Haskell, 304 байти

import Data.List
s!c=sum[1|a<-s,a==c]
f t|Just w<-elemIndex '\n't,h<-t!'\n'=[c|c<-mapM(\a->[2..a-1])[w,h],s<-[(\[x,y]->t!!((h-y-1)*(w+1)+x))<$>mapM(\a->[a-2..a])c],s!!4=='$',foldr1(-)((s!)<$>"#&")<1,or$("@!"/="@!"\\map(s!!)[0,2..8]):zipWith(\c i->all(==c)$(s!!)<$>[0..8]\\(4:i))"^&**"[[],[],[1,7],[3,5]]]

Це визначає функцію, fяка виконує дане завдання.


2

JavaScript (ES6), 363 339 312 309 298 байт

Це функція, що приймає введення як рядок і повертає список координат. Він розділений на 2 основні частини: перетворення перемикачів на пару координат та оточуючих його символів, а перевірку "чи це на" на основі правил виклику навколишніх символів.

a=>[...a].map((z,p,m)=>(y-=z==B,z)=='$'&&(r=m[p-n-2]+m[p-n]+m[p+n]+m[p+n+2]+m[p-n-1]+m[p-1]+m[p+1]+m[p+n+1],r=r[L]<9?r:'')[T]`&`[L]>=r[T]`#`[L]&&(/(\^|&){8}|\*{4}(.\*\*.|\*..\*)/.exec(r)||/!|@/.exec(r.substr(0,4)))&&[1+(p-(w-y))%n,y],y=w=a[T='split'](B='\n')[L='length'],n=a.search(B)).filter(e=>e)

2

Python 2 , 299 297 279 275 261 259 байт

m=input()
R=range
h=len(m)
for y in R(h-2):
 for x in R(len(m[0])-2):
	a=''.join(m[y+o][x:x+3]for o in R(3))
	if(a.count('&')>=a.count('#'))*(a[:4]+a[5:]in('^'*8,'&'*8)or'*'*6in(a[:3]+a[6:],a[::3]+a[2::3])or'!'in a[::2]or'@'in a[::2])*a[4]=='$':print x+2,h+~y

Спробуйте в Інтернеті!

Вводиться як список рядків

Виводить вихід у вигляді пари координат x, y у кожному рядку

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.