サンタを必死に探して


13

混雑したシーンでサンタと彼のトナカイを見つけてください。

入力

入力はSTDIN上にあり、長さは等しいが可変の文字の可変行数になります。サンタ(キャラクターで表されるS)がシーンにいる場合、プレゼントの袋(キャラクターで表されるP)は、彼に隣接する位置(水平、垂直、または斜め)のいずれかにあります。彼のトナカイ(キャラクターで表されるR)はすべて、彼を囲む5x5の正方形内にあります。Sプレゼントの袋がないシーン、または少なくとも4人のトナカイが同伴していないシーンに登場する場合は、サンタではありません。

出力

シーンはすべての難読化をクリアし(サンタ以外、プレゼントなし、トナカイ以外のキャラクターはすべてスペースに置き換えられます)、サンタ、プレゼントの袋、トナカイを表示します。他のすべてのキャラクターはスペースに置き換えられます。サンタとトナカイがシーンにない場合は、そのまま出力します。ソリューションは1つのみであることが保証されているため、有効なサンタが複数存在することはなく、プレゼントの袋を複数持ち歩くこともありません。

これらの例では、私はちょうど使用している*ことが容易に参照できるようにすること、文字をSPRの文字が、しかし、あなたのプログラムから任意の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の正方形内にないトナカイの1つ)

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

出力:

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

テストスクリプト

過去の質問のいくつかと同様に、JoeyVenteroが元々作成したいくつかのテストスクリプトをもう一度処理して、この質問のテストケースを提供しました。

使用法: ./test [your program and its arguments]

参照用のテストのプレーンテキストバージョン:プレーンテキスト

報酬

仕様を満たしていることを確認でき、テストに合格し、明らかにゴルフの試みを行った各エントリは、私から賛成票を受け取ります(そのため、使用方法を回答してください)。2013年12月31日の終わりまでに最短のソリューションが勝者として受け入れられます。


これは以前の質問である顔の認識と似ていますが、それから数年経ちました。また、質問サンドボックスをスキップしたことをおizeびしますが、クリスマスに関連しているため、迅速に投稿する必要があります。そうしないと、関連性がなくなります。
ガレス

最初の出力例は適切に表示されません(小さいサイズのように見えます)。
デニスジャエルディン

@DennisJaheruddin Markdownがすべての空白行を削除しているようです。それらの行の先頭にドットを追加して、それらが存在することを示しています。混乱してすみません。
ガレス

回答:


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

うーん、これでテストスクリプトを実行するのは面倒です。コードを簡単に見ると、上記の例では、*文字を群衆として使用してSPおよびR文字を見やすくするだけであることが示唆されています-一方、テストスクリプトのテストでは33(!)以上のすべてのASCII文字を使用しています96( `` `)まで(を含む)。質問でこれを明確にします。合格する必要があるテストのプレーンテキストバージョンを作成しました。これも質問に追加します。
ガレス

@Garethが更新され、テストに合格したようです。残念ながら、サンタはQ不変の衣装を着ていないので、少なくとも2人のキャラクターが救われたでしょう。
デニスジャエルディン

はい。私はMatlabを持っていないので、Octaveをダウンロードしているだけです(インターネットからMatlabコードを実行するのに最適な無料の方法であると言われています)。朝にテストを実行して確認します。
ガレス

さて、これを確認しましたが、仕様を満たしているようです。不当な利点があるのは、入力要件です。私は賛成しましたが、(MatlabはSTDINから読み取っていないように見えるので、ファイルから)入力を読み取らない限り、勝者として受け入れることはできません。
ガレス

SQL_2サンプル入力に滑り込んだ...素敵な:)
Timtech

1

Python 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からの入力の読み取りは、要件の1つです(テストスクリプトの実行を可能にし、ユーザーが独自の入力形式を思い付かないようにします)。
ガレス

おっと、それを見逃した。
mura 8

コードを変更しましたが、実際に動作するかどうかをテストできません。以前と同じ形式で読む必要があります。
Sumurai813年

さて、これでテストを実行する機会がありましたが、いくつかの問題があります。1)サンタが見つかった場合、入力はソリューションの前にそのまま出力されます。2)ソリューションは、入力とは異なるサイズです。私はこの点で質問をより明確にしようとしました-すべての非(サンタ、プレゼント、トナカイ)文字はスペースに置き換える必要があります。最初の例ではこのようでしたが、質問では明示的に述べられていません。3)サンタが見つからない場合、出力には二重の行間隔があります。
ガレス

0

ファイルにはサンタが1つしかありません(「S」が2つ以上ある場合は、コードを更新する必要があります)。

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

これをすぐにレビューしないことをおologiesびします(私は休暇中で、wifiに簡単にアクセスできません)。残念ながら、S「有効な」サンタである限り、2 は許可されます。テスト(質問で提供)には、この理由で失敗するいくつかのケースがあります。
ガレス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.