Które przełączniki są włączone?

12

Wprowadzenie

Siedzisz ze współpracownikiem, jesz lunch i chwalisz się nim / jej o najnowszym i podobno największym projekcie, nad którym pracujesz. Mając dość zmęczenia ciągłym pokazaniem egoizmu, daje ci wyzwanie, abyś się zamknął. Będąc egoistyczną i szczęśliwą osobą, którą jesteś, oczywiście akceptujesz (ponieważ musisz zaakceptować każde wyzwanie). Wyzwaniem , jak on / ona wyjaśnia to, podać wejście bloku tekstu zawierający 1 lub więcej w każdym znaku !@#$^&*, wyjścia w każdym rozsądnym formacie współrzędne przełącznika (ES), które jest / są „on”.

Według współpracownika przełącznik jest przełącznikiem $, a przełącznik jest klasyfikowany jako „włączony” tylko wtedy, gdy spełnia przynajmniej 1 z następujących kryteriów:

  1. Jest otoczony przez wszystkich ^. Więc...

    ^^^
    ^$^
    ^^^
    

    skutkuje przełączeniem „on”.

  2. Jest otoczony przez wszystkich &. Więc...

    &&&
    &$&
    &&&
    

    skutkuje przełączeniem „on”.

  3. Jest całkowicie pokryte co najmniej z dwóch stron *. Na przykład,

    ***
    &$&
    ***
    

    skutkuje przełączeniem „on”, ale

    &*&
    &$&
    &*&
    

    nie robi, ponieważ przełącznik nie jest całkowicie zakryty z dwóch stron przez *s.

  4. W każdym z rogów jest co najmniej 1 !i / lub 1 @. Nie ma to znaczenia, jeśli któryś z nich nie znajduje się w kącie. Więc...

    !&&
    ^$@
    @&!
    

    skutkuje przełączeniem „on”, ponieważ jest co najmniej 1 !i / lub @co najmniej 1 z rogów (w powyższym przypadku są 2 ważne !s i 1 ważne @w 3 rogach). I...

    &!&
    ^$@
    ^!&
    

    czy nie , chociaż istnieją 2 !s oraz 1 @, ponieważ żaden z nich nie są w każdy z rogów.

  5. 1 lub więcej nie# znajduje się po żadnej stronie wokół przełącznika, chyba że co najmniej 1 otacza przełącznik. Innymi słowy, jeśli na boku znajduje się co najmniej 1 , zastępuje on wszystkie inne reguły, chyba że istnieje również prezent. W związku z tym:&#&

    #&*
    *$*
    !**
    

    skutkuje przełączeniem „włączonym”, chociaż #istnieje, ponieważ &wokół przełącznika znajduje się obwódka i jest on zgodny z co najmniej 1 z powyższych zasad. Jeśli jednak wykrzyknik nie byłby obecny w ten sposób:

    #&*
    *$*
    ***
    

    Przełącznik byłby wyłączony, ponieważ nie spełnia co najmniej jednej z powyższych zasad. Dlatego nawet jeśli przełącznik może być otoczony przez a #i a &, nadal byłby wyłączony, chyba że będzie przestrzegał jednej lub więcej z tych zasad. Ponadto, aby przełącznik mógł być prawidłowy , zawsze musi istnieć stosunek> = 1: 1 między &si #is. Na przykład,

    #&!
    *$*
    **#
    

    nadal byłby nieprawidłowym przełącznikiem, chociaż jest zgodny z 1 z tych reguł, ponieważ istnieją 2 #s, ale tylko 1 &, a zatem nie stosunek> = 1: 1 między &s i #s. Aby to było ważne, musisz dodać 1 lub więcej dodatkowych &s do dowolnej krawędzi, aby zrównoważyć liczbę #s i &s, prawdopodobnie tak:

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

    Wreszcie...

    #^^
    ^$*
    @^!
    

    skutkuje przełączeniem „wyłączony”, chociaż jest zgodny z co najmniej 1 z powyższych zasad, ponieważ zawiera co najmniej 1 #wokół niego, i nie ma &możliwości zrównoważenia go.

  6. Prawidłowe przełączniki będą znajdować się tylko w danych wejściowych, dlatego też każdy prawidłowy $musi być całkowicie otoczony dowolnymi 8 poprawnymi znakami. Na przykład, jeśli całe dane wejściowe miałyby być:

    *$*
    !$!
    !!!
    

    góra $zdecydowanie nie jest prawidłowym przełącznikiem, ponieważ przełącznik znajduje się na krawędzi, a zatem przełącznik nie jest całkowicie otoczony 8 poprawnymi znakami. W takim przypadku przełącznik nie powinien nawet być brany pod uwagę. Jednak przełącznik pośrodku jest całkowicie prawidłowy i faktycznie jest „włączony”, ponieważ spełnia co najmniej jeden z powyższych wymagań.

Aby zademonstrować, rozważ ten blok znaków:

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

które możemy oznaczyć dla takich współrzędnych, nazywając oś pionową yi oś poziomą x:

y

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

  123456789 x

Współrzędne muszą zawsze być zwracane w (x,y)formacie podobnym do dwuwymiarowej siatki współrzędnych. Które przełączniki są włączone? Cóż, najpierw znajdźmy je wszystkie. Widzimy już, że jeden jest w najwyższym górnym rzędzie, a drugi w samym dolnym rzędzie. Są to jednak automatycznie brak operacji, ponieważ nie są całkowicie otoczone przez 8 znaków.

Dalej jest ten w rzędzie 2. W szczególności ten:

#^^
#$$
^!$

Widzimy, że są $w tym 3 znaki, ale chcemy po prostu skupić się na środku w środku i, jak zapewne widać, jest już nieprawidłowy, ponieważ ma #wokół siebie 2 s, bez &s, aby je zrównoważyć na zewnątrz. Ponadto nie jest to nawet zgodne z żadną z zasad, więc nawet jeśli byłby to prawidłowy przełącznik, i tak byłby „wyłączony”.

Następnie pojawia się kolejny wiersz 2:

^^$
$$*
!$!

Ponownie skup się tylko na środkowym przełączniku. Ten przełącznik jest „włączony”, ponieważ ma co najmniej 1 !w co najmniej 1 rogu. Współrzędne tego są (5,2).

Idąc dalej, w końcu przechodzimy na ostatni przełącznik. Ten jest również w drugim rzędzie i wygląda tak:

$#!
*$&
!@&

i, jak zapewne widać, ten jest również prawidłowym przełącznikiem, chociaż istnieje jego #otoczenie, ponieważ istnieją 2 inne &s do zrównoważenia #. Oprócz tego ma również co najmniej 1 !w co najmniej 1 narożniku, a zatem przełącznik jest nie tylko prawidłowy, ale także „włączony”. Współrzędne tego przełącznika to (7,2).

W końcu doszliśmy do końca i znaleźliśmy 2 przełączniki „on” w całym bloku tekstu. Ich współrzędne są (5,2)i (7,2), co jest naszą ostateczną odpowiedzią, i jaki powinien być wynik. Jednak ten wkład był bardzo prosty. Dane wejściowe mogą być znacznie większe, ponieważ nie ma ograniczeń co do wielkości bloku tekstu. Na przykład wejściem może być nawet losowy 200x200blok tekstu.

Przeciwwskazania

  • Standardowe luki są zabronione.

  • Nie może być może być wbudowany do tego, ale na wszelki wypadek nie jest (patrząc na ciebie Mathematica), korzystanie z wbudowanych wtyczek, które bezpośrednio rozwiązać ten jest zabronione.

Przypadki testowe:

Podany w formacie 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]]
^!!#&#&&&#*^#!^!^@!$
&$$^*$^$!#*&$&$#^^&$

Więcej wkrótce

Dodatkowe uwagi

  • Możesz założyć, że dane wejściowe będą zawsze w postaci pełnego bloku (tzn. Prostokąta lub kwadratu)
  • Na wejściu nigdy nie będzie żadnych innych znaków niż te w !@#$^&*.

Pamiętaj, to jest więc wygrywa najkrótszy kod!

R. Kap
źródło
12
Wydaje się trochę długi i arbitralny.
lub
@orlp Właśnie o to chodzi. To i tak wyzwanie. Dlaczego mówisz, że to arbitralne?
R. Kap
6
@ R.Kap Nie ma uzasadnienia dla żadnej z zasad; wydają się być skomponowane w celu zwiększenia złożoności bez powodu.
Pozew Fund Moniki w dniu
6
@QPaysTaxes Jakie uzasadnienie jest potrzebne? Zostały one wykonane ze względu na wyzwanie. To jest wyzwanie, a wyzwaniem może być dosłownie wszystko . Wszystko, czego tak naprawdę potrzebuje, to zestaw reguł, dane wejściowe i to, co wynik powinien być oparty na tych regułach.
R. Kap
1
Nie twierdzę, że się zgadzam, wyjaśniam, dlaczego wygląda to arbitralnie. Jako przykład weź moje najpopularniejsze wyzwanie : jeśli oderwałeś cały kontekst i powiedziałeś: „Otrzymujesz zestaw ciągów. Na podstawie wcięcia zgrupuj je, potasuj grupy, a następnie potasuj grupy wewnętrzne, ale zachowaj członków grupy wewnętrzne na dole, jeśli istnieją ”, to nie miałoby większego sensu. Ponieważ jednak ma kontekst, wszystkie te dziwne zasady i ograniczenia przynajmniej udają, że mają sens.
Pozew Fund Moniki w dniu

Odpowiedzi:

2

Haskell, 304 bajty

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]]]

Określa funkcję, fktóra wykonuje dane zadanie.

faubi
źródło
2

JavaScript (ES6), 363 339 312 309 298 bajtów

Ta funkcja przyjmuje dane wejściowe jako ciąg znaków i zwraca listę współrzędnych. Jest on podzielony na 2 główne części: transformację przełączników na parę współrzędnych i otaczające je postacie oraz kontrolę „czy to włączone” w oparciu o reguły wyzwania dla otaczających bohaterów.

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)
XavCo7
źródło
2

Python 2 , 299 297 279 275 261 259 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako listę ciągów

Drukuje dane wyjściowe jako parę współrzędnych x, y w każdej linii

TFeld
źródło