囲まれているもの


18

私はいつもいくつかのテキストを#sで囲むことを望んでいましたが、私が何を囲んでいるかわからないので、この課題では、あなたはそれを行うプログラムを書くことになります

入力/出力は改行で区切られます。

###
#a#
###

a
 #
#a#
 #

a
  ###  
 # a #
# b c #
#######

  a 
 b c 
ABCDHIJ
E####GK
F# M #L
#   N#O
P####

  M 
   N
###A###
#C#B#o#
#d###e#
 # go#
  ###

C   o
d   e
  go

スペック

  • #sはテキストのブロックを「囲む」ものです
  • # 常に互いに隣接します(対角線を含む)
  • # 常に閉じた形状を形成します
  • 1つだけあります #図形は
  • 凹面形状の場合、穴はスペースで埋められる必要があります。
  • 出力で空白を保持する必要があります

最初は…のようなものを取り出して#、そこへ行くだけでした...そしてそれは難しくなりました。
ハゲバンタ16

javascriptで入力を取得して改行で分割するのに問題があります...入力を取得するにはどうすればよいですか?\n入力の各行の後にフォーマットし、プログラムに関数パラメータとして渡すことができますか?
ハゲバンタ16

1
有効な入力文字のセットは何ですか?
トンホスペル

MNの例の出力にエラーはありますか?出力は囲まれたテキストのみで構成されます_M_\n___N(書式設定の問題のため、スペースの代わりにアンダースコアを使用)、abcおよびCodegoの例では、入力に#sが含まれる空白も含まれます。#sで囲まれたテキストのみを印刷する場合、abcの例の出力は_a_\n_b_c_(ではなく__a_\n_b_c)であり、Codegoの例の出力はCo\nde\n_go(ではなくC___o\nd___e\n__go)である必要があります。
疫学者

@エピデミアンああ、いいキャッチ。私はMN例を修正しました。Mの後に余分なスペースはないはずです
。– Downgoat

回答:


6

Perl、144 138 132 129 128 127 126 124バイト

+2を含む -p0

コードは\0、有効な入力文字ではないと想定しています(少なくともの内部#)。

STDINの入力で実行します。

surround.pl < surround.txt

surround.pl

#!/usr/bin/perl -p0
/^#[^#\0]/m&&s/^|[^#\n\0]\0/\0\0/mg,s%.%s/.(.*)/$+\0/g;/#/&&reverse"\n",/^./mg%seg until$?++<$$_++;y/\0/#/;s/^#*\n|#+$|^#//mg;y;#; 

コードはそのまま機能しますが、クレームスコアのリテラルバージョンで\0andを置き換え\nます。スペースがあることに注意してください行の末尾に。コードのループ回数が多すぎるため、出力まで30秒ほど待たなければならない場合があります。

説明

私は、直交方向に外側から\0立ち寄った状態でフラ​​ッドフィルを行い#ます。その後、#側面を切り取り、残りのスペースをすべて置き換えます。フラッドフィルですべての方向を処理する必要を回避するために、ターゲット領域を繰り返し回転させ、フラッドフィルのみを右から左に行います

/^#[^#\0]/m                   The rotation is written such that it slices
                              off the first column. That is ok unless the
                              first column contains a # that is followed by
                              something that could be the inside. There is
                              no newline inside the [] because short lines
                              will get extended during the rotation and 
                              the character following the # will end
                              up as a \0 and match in a later round
    &&s/^|[^#\n\0]\0/\0\0/mg  In case the # could be an interior border I
                              will add two columns of \0's in front. One 
                              will be a sacrifice for the rotation, the
                              other column will end up at the end of the area
                              after two rotations and function as seed for the
                              floodfill. This regex also does one step of
                              the floodfill from the back to the front.
                              After a certain number of loops we are certain
                              to get to a first column that must not be 
                              dropped so at some point the last column is 
                              guaranteed to consist of only \0. And we only need
                              to fill backward since the rotations will make
                              any direction backward at some point

s%.%  process column  %seg    I will replace each character (including \n)
                              in the string by the next column in reversed
                              order or an empty string if there are no more
                              interesting columns. This is therefore a right
                              rotation. There are less columns than
                              characters so this loop is long enough

    s%.%s/.(.*)/$+\0/g        Remove the next (now first) character from each
                              row (so remove the column). Because the
                              original area is not necessarily a rectangle
                              add a \0 at the end of the row so we won't run
                              out out of columns (this would cause shorter
                              rows to have no entry in the new rotated row)
                              This will not do anything for empty lines so
                              they DO get squeezed out. But that is not a 
                              problem since the problem statement says there
                              will be only one # shape so any empty lines
                              are can be safely dropped (this would not be
                              so if there could be multiple # shapes because
                              that could create a new surrounded area

    /#/                       Check if any of the remaining columns still 
                              has a #. If not all remaining columns are on 
                              the outside and can be dropped
       &&reverse"\n",/^./mg   Collect the column and add a \n to its reverse

 until$?++<$$_++              Keep doing this until we get to a multiple of
                              65536 rotations when $? waraps back around to 0
                              (this is a multiple of 4 so the area is left
                              unrotated) and an area we have seen before
                              ($$_ >= 1)
                              (so all slicing and flood filling is finished)
                              $_ having been seen in a previous rotations is
                              not a problem (though rather tricky to prove)

この時点で、例えば

AB##J
E####GK
F# M #L
#   N#O
P####

次のものに置き換えられます。

0000000
0####00
0# M #0
#   N#0
0####00

基本的に、内側に直接接していないすべての列と行は切り取られています。残っている外部文字はすべて\ 0に置き換えられています。最上部と右側には、\ 0の追加レイヤーがあります。したがって、残っているのはクリーンアップだけです。

y/\0/#/                       Replace any outside that is left by #
s/^#*\n|#+$|^#//mg            Removes the first two and last line (the only 
                              lines that can consist of purely #)
                              Removes any trailing #
                              Removes the first column of #
y;#; \n;                      Replace any remaining # by space since they 
                              are needed to fill the concave parts
                              The final \n; is not written since it is implicit
                              in the -p loop

塗りつぶしがある場合、内部の隅々で機能しますか?
mbomb007

@ mbomb007:はい、エリアは繰り返し回転されるため、曲がりくねった廊下をたどることができます。私が知る限り早すぎる非常に厚い壁を削減する前に停止ループが唯一の欠点である
トンHospel

@ mbomb007:Aaaaand厚い壁の欠陥が解決されました
トンホスペル

ソリューションをそのままコピーアンドペーストする(エスケープされた文字を置き換えない)場合、出力はすべて#削除された入力になります。bashセッションを確認してください:codepad.org/YbCzB4O4
ardnew

@ardnew:申し訳ありません。最後の更新ではソリューション全体が繰り返されなかったため、whileをuntilに置き換える必要がありました。今すぐ修正、もう一度お試しください
トンホスペル

4

Javascript、485 464 427 417 396 390バイト

s='indexOf';k='lastIndexOf';h="#";t=b=>b[0].map((x,i)=>b.map(x=>x[i]));i=>{m=i.split`
`;for(h of m){m[m[s](h)]=h.split``;}for(y=0;y<m.length;y++){for(z=x=0;x<m[y].length;x++){if(m[y][x]==h)break;if(m[y][s](h)<x&&m[y][k](h)>x)z++;q=t(m);if(q[y][s]h)<x&&m[y][k](h)>x)z++;if(z>2)m[y][x]=h}}for(p of m){v=p.join``.match(/\S/);e=v?p.join``:'';m[m[s](p)]=e;}m=m.join`
`;return m.replace(#/g," ")}

はい。私は試した。そして、私は485バイトですが、誰もこの質問に答える気がなかったので、勝ちました。だから、ハァッ!
そして、私はこの負荷をゴルフできることをよく知っています、私はちょうど今疲れています... 今、私は396でいますゴルフのほとんどをコナーに感謝しています...:D


1
外側のループの内部変数宣言y=z=0
バリント
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.