필사적으로 산타를 찾는


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

테스트 스크립트

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

용법: ./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.