어떤 스위치가 켜져 있습니까?


12

소개

동료와 함께 앉아 점심을 먹으며 작업중인 최신 프로젝트 중 가장 큰 프로젝트에 대해 자랑합니다. 끊임없는 이기주의 쇼케이스에 아프고 지치면, 당신은 당신에게 도전을 주므로 닥칠 것입니다. (당신이 있기 때문에 당연히 받아, 당신을 당신이있는 이기주의와 낙천적 인 사람이되는 있어야합니다 각각의 모든 도전을 받아). 챌린지 , 그 / 그녀가 설명한대로이다 주어진 입력 에 하나 또는 각각의 특성을 더 포함하는 텍스트 블록의 !@#$^&*, 출력 스위치이다 (ES) /의 좌표는 "녹색"이다 합리적인 형식.

동료에 따르면 스위치는 a $이고 스위치는 다음 기준 중 하나 이상을 충족하는 경우에만 "켜짐"으로 분류됩니다.

  1. 그것은 모두에 둘러싸여 ^있습니다. 그래서...

    ^^^
    ^$^
    ^^^
    

    "켜짐"스위치가됩니다.

  2. 그것은 모두에 둘러싸여 &있습니다. 그래서...

    &&&
    &$&
    &&&
    

    "켜짐"스위치가됩니다.

  3. 이 두 개 이상으로 완전히 덮여 *있습니다. 예를 들어

    ***
    &$&
    ***
    

    "켜짐"스위치가 발생하지만

    &*&
    &$&
    &*&
    

    스위치가 양쪽으로 완전히 덮 이지 않았기 때문에 *s 는 없습니다 .

  4. 주변 모서리 에는 최소한 1 개 !및 / 또는 1 @개가 있습니다. 이것은 않습니다 하지 둘 중 하나 인 경우 계산 하지 구석에. 그래서...

    !&&
    ^$@
    @&!
    

    코너 중 적어도 하나 !및 / 또는 적어도 하나가 있기 때문에 "온"스위치가된다 @(위의 경우, 2 개의 유효한 !s 및 1 개의 유효한 @3 개의 코너에 있음). 과...

    &!&
    ^$@
    ^!&
    

    수행 하지 2가 있지만, !s와 1 @그들 중 누구도에 없기 때문에, 어떤 코너의.

  5. 1 이상이 #되어 있지있는 적어도 1 않는 스위치 주위 측면 &스위치를 둘러싼 다. 다시 말해서, 한쪽에 최소한 1 개가 존재한다면 #, 존재하지 않는 한 다른 모든 규칙을 무시합니다 &. 따라서:

    #&*
    *$*
    !**
    

    스위치 #&주변에 있기 때문에 "on"스위치가 발생하지만 스위치는 위의 규칙 중 하나 이상을 따릅니다. 그러나 느낌표가없는 경우 :

    #&*
    *$*
    ***
    

    위의 규칙 중 하나 이상을 따르지 않으므로 스위치가 꺼져 있습니다. 따라서 스위치가 a #및 a 로 둘러싸여 있어도 &이러한 규칙 중 하나 이상을 따르지 않으면 여전히 꺼져 있습니다. 또한 스위치가 유효하려면 s와 s 사이에 항상 > = 1 : 1 비율 이 있어야합니다. 예를 들어&#

    #&!
    *$*
    **#
    

    이 규칙 중 1 개를 따르지만 2 개가 #있지만 1 개만 &있으므로 &s와 #s 사이 의 > = 1 : 1 비율이 아니기 때문에 여전히 유효하지 않은 스위치 입니다. 이것을 유효하게하려면, 다음 과 같이 s와 s &의 수의 균형을 맞추기 위해 가장자리에 하나 이상의을 추가해야합니다 .#&

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

    드디어...

    #^^
    ^$*
    @^!
    

    스위치를 "OFF"에서 결과는 포함하지 않기 때문에 그것보다 위의 규칙 1을 따르지만 적어도 하나 #주위를 더가 &그것을 ...보다 더 무겁다 s 내지.

  6. 유효한 스위치 할 안에 입력하고, 따라서, 각각이 유효한 $묶어야 완전히 유효한 문자 중 8. 예를 들어 전체 입력이 다음과 같은 경우

    *$*
    !$!
    !!!
    

    상단은 $확실히 하지 스위치가 가장자리에, 따라서 스위치가 완전히 8 개 유효한 문자로 둘러싸여되지 않기 때문에 유효한 스위치. 이 경우 스위치도 고려해서는 안됩니다. 그러나 중간에있는 스위치는 위의 요구 사항 중 하나 이상을 충족하므로 실제로 유효합니다.

시연하려면이 문자 블록을 고려하십시오.

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

수직 축 y과 수평 축을 호출하여 좌표에 레이블을 지정할 수 있습니다 x.

y

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

  123456789 x

좌표는 항상(x,y) 2 차원 좌표 그리드와 유사한 형식 으로 반환 되어야합니다 . 이제 어떤 스위치가 켜져 있습니까? 먼저 모두 찾아 봅시다. 우리는 이미 맨 위 줄에 1이 있고 맨 아래 줄에 1이 있음을 이미 알 수 있습니다. 그러나 8 자로 완전히 둘러싸여 있지 않기 때문에 자동으로 no-ops입니다.

다음은 2 행에있는 것입니다. 구체적으로,이 것 :

#^^
#$$
^!$

우리는 $이것에 3 개의 표시 가 있음을 알 수 있지만 중간에 하나의 표시에만 집중하고 싶을 것입니다. 아마도 보시다시피, 2 개의 부호가 있고 균형을 잡을 수 #없기 때문에 이미 유효하지 않습니다. &밖. 또한 이는 규칙을 따르지 않으므로 유효한 스위치 인 경우에도 "끄기"상태가됩니다.

다음은 2 행에 또 하나 있습니다.

^^$
$$*
!$!

다시, 중간에있는 스위치에만 초점을 맞 춥니 다. 그것을 가지고 있기 때문에이 스위치는, "에"입니다 적어도 1 !이상 1 코너. 이것의 좌표는 (5,2)입니다.

계속해서 마지막 스위치로 넘어갑니다. 이것은 두 번째 행에도 있으며 다음과 같이 나타납니다.

$#!
*$&
!@&

보시다시피 #, 이 스위치는 주변 스위치가 있지만이 스위치도 유효한 스위치 입니다. 또한 코너 중 적어도 하나에 1 이상이 있으므로 스위치가 유효 할뿐만 아니라 "켜짐"상태입니다. 이 스위치의 좌표는 입니다.&#!(7,2)

우리는 마침내 끝에 도달했고, 텍스트의 전체 블록에서 2 개의 "on"스위치를 발견했습니다. 그들의 좌표는 (5,2)and이며 (7,2), 이것이 우리의 최종 답변이며 출력은 무엇이어야합니다. 그러나이 입력은 매우 간단했습니다. 텍스트 블록의 크기에 제한이 없으므로 입력 이 훨씬 더 커질 수 있습니다. 예를 들어, 입력은 무작위 200x200텍스트 블록 일 수도 있습니다 .

금기

  • 표준 허점은 금지되어 있습니다.

  • 이 할 수없는 가능성이 내장이 들어 있지만, 그냥 거기 (당신 티카)를 찾고 있습니다 경우에, 직접이 문제를 해결 내장 기능의 사용이 금지됩니다합니다.

테스트 사례 :

다음과 같은 형식으로 제공됩니다 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 그게 내가가는거야. 어쨌든 도전입니다. 왜 그것이 임의적이라고 말합니까?
R. Kap

6
@ R.Kap 규칙에 대한 근거는 없습니다. 그들은 아무 이유없이 복잡성을 더하기 위해 만들어졌습니다.
기금 모니카의 소송

6
@QPaysTaxes 어떤 정당화가 필요합니까? 이들은 되는 도전을 위해 만들어. 그것은 이다 도전하고, 도전은 문자 그대로 수 있습니다 아무것도 . 실제로 필요한 것은 일련의 규칙, 입력 및 출력이 해당 규칙을 기반으로해야하는 것입니다.
R. Kap

1
나는 동의한다고 말하지 않고 왜 그것이 임의적으로 보이는지 설명하고 있습니다. 받아 내 가장 인기있는 도전을 예로 : 당신이 떨어져 모든 컨텍스트를 제거하고 단지 당신이 문자열의 집합 들여 쓰기, 그들, 그룹 셔플, 다음 내부 그룹 셔플,하지만 회원을 유지하는 그룹을 기반으로 주어진다 "고 말했다 경우. 내부 그룹이있는 경우 맨 아래에 있습니다 "라는 의미는 없습니다. 그러나 컨텍스트가 있기 때문에 모든 이상한 규칙과 제한은 적어도 이해하는 척합니다.
기금 모니카의 소송

답변:


2

하스켈, 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

자바 스크립트 (ES6) 363 339 312 309 298 바이트

입력을 문자열로 받아 좌표 목록을 반환하는 함수입니다. 두 가지 주요 부분으로 나뉩니다. 스위치를 한 쌍의 좌표와 주변 문자로 변환하고 주변 문자에 대한 챌린지 규칙을 기반으로 '사용 여부'를 확인합니다.

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

파이썬 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 좌표 쌍으로 인쇄합니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.