拼命寻找圣诞老人


13

在一个拥挤的场景中找到圣诞老人和他的驯鹿。

输入值

输入将在STDIN上,并且将是可变长度的,相等但可变的字符行。如果S场景中有圣诞老人(由角色表示),则他的礼物袋(由角色表示P)将位于与他相邻的位置之一(水平,垂直或对角线)。他的驯鹿(每个由字符代表R)都将在他周围的5x5正方形内。如果S场景中出现的礼物没有礼物袋,或者没有至少四只驯鹿陪伴,则不是圣诞老人。

输出量

场景清除了所有混淆(所有非圣诞老人,非礼物,非驯鹿角色替换为空格),显示了圣诞老人,他的礼物袋和他的驯鹿-所有其他角色均应替换为空格。如果圣诞老人和他的驯鹿不在现场,则将其输出不变。可以保证只有一种解决方案,因此有效的圣诞老人不会超过一个,他也不会携带超过一袋的礼物。

例子

在这些例子中,我只是用*字符可以很容易地看到SPR人物,但是你的程序应该能够从处理任何ASCII字符!`(33至96)。为了避免混淆,我省略了小写字母和大写字母。

输入:

***********
***********
***********
*****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日的最短解决方案将被接受。


我意识到这与我之前的问题“ 面部识别”相似,但是此已有两年了。另外,对于跳过“ 问题”沙箱,我深表歉意,但由于它与圣诞节有关,因此需要快速发布,否则就不相关了。
Gareth 2013年

第一个示例输出未正确显示(显示为较小的尺寸)。
丹尼斯·贾赫鲁丁

@DennisJaheruddin好像Markdown正在删除所有空白行。我在这些行的开头添加了点,以表明它们已经存在。对不起,我很困惑。
Gareth 2013年

Answers:


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***'
'***********'
'***********'
'***********'
'***********'];

嗯,在此上运行测试脚本会很尴尬。就让我们来看看在代码提示,你只使用上面的例子中,其给出使用*字符的人群,使其更容易看到的SPR人物-而测试在测试脚本中使用的所有ASCII字符从33( !)了至(并包括)96(```)。我将在问题中阐明这一点。我已经完成了需要通过的测试的纯文本版本,我还将添加到问题中。
Gareth 2013年

@Gareth已更新,似乎现在已通过测试。太糟糕了,圣诞老人没有穿上正Q装,会为我节省至少2个字符。
丹尼斯·贾赫鲁丁

好的。我没有Matlab,所以我只是下载Octave(互联网告诉我,这是运行Matlab代码的最佳免费方式),并且将在早上进行测试以进行检查。
Gareth 2013年

好的,我已经检查过了,它确实符合规格。它具有不公平优势的一个地方是输入需求。我已经投票赞成,但是除非它读取输入(从文件中读取,因为Matlab似乎没有从STDIN读取),否则我将不能接受它作为赢家。
Gareth 2013年

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]

首先尝试编写尽可能紧凑的代码。Python并不是真正的语言,因为缩进和换行符只是设计需要的。我主要选择使用这种语言,因为您可以使用列表和字符串作为列表来玩。一种易于矩阵操作的语言是完成此任务的理想选择,但可惜我不了解它们。

要测试事物,需要将事物分配给例如

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 2013年

哎呀,完全错过了。
Sumurai13年

更改了代码,但是无法测试它是否在这里真正起作用。它应该在它使用的是相同的格式阅读。
Sumurai8

好的,我现在有机会对此进行测试,并且有几个问题。1)在找到圣诞老人的情况下,输入将按解决方案之前的原样输出。2)您的解决方案与输入的大小不同。在这一点上,我试图使问题更清楚-所有非(圣诞老人,礼物,驯鹿)字符都应替换为空格。在第一个示例中就是这样,但是在问题中没有明确说明。3)当找不到圣诞老人时,输出具有双行间距。
Gareth 2013年

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.