필사적으로 산타를 찾는


13

붐비는 장면에서 산타와 그의 순록을 찾으십시오.

입력

입력은 STDIN에 있으며 길이는 동일하지만 가변적 인 길이의 문자 수입니다. 산타 (캐릭터로 S표시됨)가 장면에있는 경우, 그의 선물 자루 (캐릭터로 P표시됨)는 옆에있는 위치 중 하나에 있습니다 (가로, 세로 또는 대각선). 그의 순록 (각각 캐릭터로 R표시됨)은 모두 그를 둘러싼 5x5 정사각형 내에 있습니다. 이 경우 S선물의 자루를 가지고 있지 않거나, 적어도 4 순록을 동반하지 않는 장면에 나타납니다, 그것은 산타 없습니다.

산출

이 장면은 모든 난독 화 (산타가 아닌 사람, 존재하지 않는 사람, 순록이 아닌 캐릭터가 공백으로 바))를 없애고 산타, 선물 자루 및 순록을 보여줍니다. 다른 모든 캐릭터는 공백으로 바꿔야합니다. 산타와 그의 순록이 장면에 없으면 그대로 변경하십시오. 하나의 솔루션 만 보장되므로 유효한 산타는 두 개 이상 없으며 선물 자루를 두 개 이상 들고 다니지 않습니다.

예

이 예에서 그냥 사용하고 *이 쉽게 볼 수 있도록 문자 S, P그리고 R문자를하지만 프로그램에서 모든 ASCII 문자를 처리 할 수 있어야 !에 `(96-33). 혼란을 피하기 위해 소문자 이상을 생략했습니다.

입력:

***********
***********
***********
*****R*****
******P****
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********

출력 : (점을 무시하고 페이지에 빈 줄이 표시되도록 강제합니다)

.           
.          
.           
     R     
      P    
     S     
     R     
    R  R   
.           
.           
.           
.           

입력 : (순록이 충분하지 않음)

***********
***********
***********
***********
******P****
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********

산출:

***********
***********
***********
***********
******P****
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********

입력 : (선물 자루 없음)

***********
***********
***********
*****R*****
***********
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********

산출:

***********
***********
***********
*****R*****
***********
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********

입력 : (충분히 근접하지 않음)

***********
***********
***********
*****R*****
***********
*****S*P***
*****R*****
****R**R***
***********
***********
***********
***********

산출:

***********
***********
***********
*****R*****
***********
*****S*P***
*****R*****
****R**R***
***********
***********
***********
***********

입력 : (산타 주위 5x5 광장 안에없는 순록 중 하나)

***********
***********
***********
*****R*****
******P****
*****S*****
*****R*****
****R******
*******R***
***********
***********
***********

산출:

***********
***********
***********
*****R*****
******P****
*****S*****
*****R*****
****R******
*******R***
***********
***********
***********

테스트 스크립트

지난 몇 가지 질문과 마찬가지로, Joey 와 Ventero 가 처음 만든이 테스트 스크립트를 다시 한 번 도살 하여이 질문에 대한 테스트 사례를 제공했습니다.

용법: ./test [your program and its arguments]

참조 테스트의 일반 텍스트 버전 : 일반 텍스트

보상

사양을 충족하고 테스트를 통과했으며 골프를 시도한 것으로 보이는 모든 항목은 저에게 공감대를받습니다 (답변에 사용 지침을 제공하십시오). 2013 년 12 월 31 일까지 가장 짧은 솔루션이 승자로 인정됩니다.


나는 이것이 이전의 질문 인 얼굴 인식 과 유사하다는 것을 알고 있지만 그 이후로 2 년이 지났습니다. 또한 질문 샌드 박스 를 건너 뛰어 죄송 하지만 크리스마스와 관련하여 빠르게 게시해야하거나 관련이 없습니다.
— Gareth

첫 번째 예제 출력이 제대로 표시되지 않습니다 (작은 크기로 나타남).
— Dennis Jaheruddin

@DennisJaheruddin Markdown이 모든 빈 줄을 제거하는 것처럼 보입니다. 그 선의 시작 부분에 점이 있음을 나타 내기 위해 점을 추가했습니다. 혼란에 대해 죄송합니다.
— Gareth

답변:


2

MATLAB : 110,95 자

f=@(x,y) filter2(ones(x),y);a=M==83;b=M==82;c=M==80;d=f(5,a&f(5,b)>3&f(3,c))&(a|b|c);if ~d,M,else,M(~d)=32,end

입력이 처리되는 방식에 대해서는 확실하지 않지만 나머지는 매우 간단합니다.

일반적으로 형식이 지정된 버전 :

f=@(x,y) filter2(ones(x),y);
a=M==83;
b=M==82;
c=M==80;
d=f(5,a&f(5,b)>3&f(3,c))&(a|b|c);
if ~d
  M
else
  M(~d)=32
end

입력 예 :

M=['***********'
'***********'
'***********'
'*****R*****'
'******P****'
'*****SQL_2*'
'*****R*****'
'****R**R***'
'***********'
'***********'
'***********'
'***********'];

흠, 이것에 테스트 스크립트를 실행하는 것은 어색 할 것입니다. 코드를 통해 빠른 보면 당신은 어떤 위에서 주어진 예제를 사용하고 사용하는 것을 제안 *군중 같은 문자가 쉽게 볼 수 있도록 S, P그리고 R반면에 테스트를 테스트 스크립트 사용에있는 모든 ASCII 문자 (33) (- 문자 !)를 96 (```)까지 (포함). 나는 질문에서 이것을 분명히 할 것입니다. 나는 당신이 통과해야 할 시험의 평문 버전을 시험에 추가했습니다.
— Gareth

@Gareth 업데이트, 지금 테스트를 통과 한 것 같습니다. 산타가 Quilt를 입지 않아서 너무 나빠서 적어도 2자를 구해 주었을 것입니다.
— Dennis Jaheruddin

괜찮아. Matlab이 없으므로 Octave (인터넷에서 Matlab 코드를 실행하는 가장 좋은 방법이라고 알려줍니다)를 다운로드하고 아침에 테스트를 통해 확인합니다.
— Gareth

좋아, 이것을 확인했는데 사양을 충족시키는 것으로 보입니다. 불공정 한 이점이있는 곳은 입력 요구 사항입니다. 나는 upvoted했지만 입력을 읽지 않으면 (Matlab이 STDIN에서 읽지 않는 것처럼 보이기 때문에) 파일을 읽지 않으면 승자로 받아 들일 수 없습니다.
— Gareth

당신은 미끄러 SQL_2:) 샘플 입력 ... 좋은으로
— Timtech

1

파이썬 2 ( 353 381)

import re,sys
a=sys.stdin.readlines()
h=len(a)
w=len(a[0])
a=''.join(a)+' '*99
print a
b=[''.join(q) for x in range(0,w) for y in range(0,h) for q in [[a[(y+z)*w+x:(y+z)*w+x+5] for z in range(0,5)]]]
for c in b:
 if c[12]=='S' and 'P' in ''.join([c[1+5*z:4+5*z] for z in range(1,4)]) and c.count('R')>3:
  a=re.sub('[^RPS]','.',c)
  w=h=5
for y in range(0,h):
 print a[y*w:(y+1)*w]

먼저 가능한 한 간결한 코드 작성을 시도하십시오. 들여 쓰기와 줄 바꿈은 디자인에 필요하기 때문에 파이썬은 실제로 언어가 아닙니다. 나는 목록과 문자열을 목록으로 연주 할 수있는 방식 때문에이 언어를 주로 사용합니다. 쉬운 매트릭스 조작이 가능한 언어가이 작업에 이상적이지만 슬프게도 그 중 어느 것도 모릅니다.

테스트하려면 무언가를 할당해야합니다. 예 :

a=['1**********','*2*********','**3********','***4*******','****5*P****','*****S*****','*****,*****','****R**R***','***********','***********','****R******','**RPSRRR***']

이 코드에서 가장 흥미로운 것은 아마도 :

b=[''.join(q) for x in range(0,w) for y in range(0,h) for q in [[a[(y+z)*w+x:(y+z)*w+x+5] for z in range(0,5)]]]

"b는 원래 표현에서 5x5 정사각형의 표현 (25 자 문자열) 목록이된다"는 멋진 글쓰기 방법입니다.


Matlab은 STDIN에서 읽기가 어려울 수 있지만 Python은 두렵지 않습니다. STDIN에서 입력을 읽는 것은 요구 사항 중 하나입니다 (테스트 스크립트를 실행하여 사람들이 자신의 입력 형식을 찾지 못하도록하는 것).
— Gareth

죄송합니다.
— Sumurai8

코드를 변경했지만 실제로 작동하는지 테스트 할 수 없습니다. 이전과 같은 형식으로 읽어야합니다.
— Sumurai8

좋아, 나는 지금 이것을 테스트 할 기회가 있었고 몇 가지 문제가있다. 1) 산타가 발견되면 솔루션 이전의 입력이 출력됩니다. 2) 솔루션이 입력 값과 다른 크기입니다. 이 시점에서 질문을 명확하게하려고 노력했습니다. (산타, 선물, 순록) 모든 문자는 공백으로 바꿔야합니다. 첫 번째 예에서는 이와 같지만 질문에 명시 적으로 언급되지 않았습니다. 3) 산타를 찾을 수 없을 때 출력에는 두 줄 간격이 있습니다.
— Gareth

0

파일에 산타가 하나만 있어야합니다 (2 개 이상의 "S"인 경우 코드를 업데이트해야 함).

awk 사용

cat santa.awk

BEGIN{FS=""}
{ for (i=1;i<=NF;i++)
         { a[NR FS i]=$i
           if ($i=="S") {l=NR;c=i}
         }
     }
END{ if (l=="") {print "No Santa";exit}
     for (i=l-1;i<=l+1;i++)
        for (j=c-1;j<=c+1;j++)
          if (a[i FS j]=="P") p++
     if (p<1) {print "Santa has no presents";exit}
     for (i=l-2;i<=l+2;i++)
        for (j=c-2;j<=c+2;j++)
          if (a[i FS j]=="R") r++
     if (r<4) {print "Santa has no enough reindeers";exit}
     else {  print "found Santa "
             for (i=1;i<=NR;i++)
               { for (j=1;j<=NF;j++)
                   if (a[i FS j]~/[R|S|P]/) {printf a[i FS j]} else {printf " "}
                 printf RS
                }
           }
    }

아래와 같이 awk 명령을 실행하십시오

awk -f santa.awk file

결과

found Santa



     R
    R R
    PS
    RR
    R  R

이것을 더 빨리 검토하지 않은 것에 대한 사과 (나는 휴가 중이고 wifi에 쉽게 액세스 할 수 없다). 불행히도, S오직 하나가 '유효한'산타 인 한 2 개 는 허용됩니다. 테스트 (질문에 제공됨)에는 이러한 이유로 실패 할 수있는 몇 가지 사례가 있습니다.
— Gareth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.