境界ボックスを強調表示、パートI:デカルトグリッド


19

次のように、文字.との長方形のグリッドが与えられます#

..........
..#.......
....#..#..
...#......
..........

あなたの仕事は#、さらに軸に沿った境界ボックス全体をさらに埋めること#です:

..........
..######..
..######..
..######..
..........

軸に沿った境界ボックスは、すべてを含む最小の長方形#です。

もっと欲しい?パートIIをお試しください!

ルール

およびの代わりに、任意の2つの異なる印刷可能なASCII文字(0x20〜0x7Eを含む)を使用できます。私はとしてそれらを参照続けるだろうといえ明細書の残りの部分のために。#.#.

入力と出力は、単一の改行で区切られた文字列または文字列のリスト(各行に1つ)のいずれかですが、形式は一貫している必要があります。

入力に少なくとも1つが含まれ#、すべての行が同じ長さであると想定できます。

プログラムまたは関数を作成し、入力を受け取り出力を提供する当社の標準的な方法を使用できます。

任意のプログラミング言語を使用できますが、これらの抜け穴はデフォルトでは禁止されています。

これはであるため、バイト単位で測定された最短の有効な回答が勝ちます。

テストケース

各テストケースには、入力と出力が隣り合っています。

#    #

...    ...
#..    #..
...    ...

...    ...
#..    ###
..#    ###

.#.    ###
#..    ###
..#    ###

.....    .....
.#.#.    .###.
.....    .....

...    ...
.#.    .#.
...    .#.
.#.    .#.
...    ...

..........    ..........
..........    ..........
....#.....    ....#.....
..........    ..........

..........    ..........
..........    ..........
....#.....    ...##.....
...#......    ...##.....

..........    ..........
..#.......    ..###.....
....#.....    ..###.....
...#......    ..###.....

..........    ..........
..#.......    ..######..
....#..#..    ..######..
...#......    ..######..

.........#    ..########
..#.......    ..########
....#..#..    ..########
...#......    ..########

「フォーマットは一貫していなければならない」とはどういう意味ですか?入力形式は出力形式と一貫している必要がありますか、それとも入力形式が一貫している必要があり、出力形式も一貫している必要があるということですか?
エミグナ

@Emignaの入力形式と出力形式は同じである必要があります。
マーティンエンダー

@MartinEnder私のプログラムは2D char配列を入力して処理します。結果は2D char配列のままですが、デフォルトでは配列の内容、つまり改行で区切られた文字列として表示されます。それは受け入れられますか?または、表示される出力はその2D配列の文字列表現である必要がありますか?
ルイスメンドー

@LuisMendo型の文字列表現が期待されます。改行で区切られた文字列、あなたの言語のネストされた配列の自然な文字列表現であるかどうかは言えません。(ただし、入力形式が異なるため、「可逆」表現ではないようです。おそらくそうではありません。)
Martin Ender

グラフィカル出力は許可されていますか?
12Me21

回答:


17

VBA Excel、150バイト 146バイト

命令:

2つの空白のワークシートでワークブックを作成します:Sheet1とSheet2。Sheet1に入力を設定し、次のコードをSheet1コードモジュールに配置します

Sub A:For Each C In UsedRange:If C.Value="#"Then Sheet2.Range(C.Address)="#"
Next:For Each C In Sheet2.UsedRange:Range(C.Address)="#":Next:End Sub

コードのゴルフを解きました:

Sub A()

For Each C In UsedRange
    If C.Value = "#" Then Sheet2.Range(C.Address) = "#"
Next

For Each C In Sheet2.UsedRange
    Range(C.Address) = "#"
Next

End Sub

説明:

  1. 使用範囲Sheet1内のすべてのセルをループします
  2. 条件付きステートメントを設定して、使用される範囲Sheet1の文字ハッシュタグ(#)を含むすべてのセルをコピーし、Sheet1と同じアドレスを持つSheet2のセルに貼り付けます。
  3. もう一度使用範囲Sheet2のすべてのセルをループして、その中のすべてのセルアドレスをコピーし、それを使用して使用範囲Sheet2と同じアドレスを持つSheet1のセルに文字ハッシュタグ(#)を割り当てます。

I / Oの例:

INPUT

OUTPUT

警告:プログラムを実行するたびに、Sheet2のすべてのセルが常に空白になるようにしてください。


1
でした=C.Value最初の行にありますか="#"
ライリー

@Rileyはい、できます。ありがとう。
アナスタシアロマノバ秀

SubパーツとEnd Subパーツを削除して、イミディエイトウィンドウでプログラムを実行すると、さらに数バイト節約できるようです。動作するかどうかを明日試します。すぐにExcelにアクセスできませんでした...
アナスタシアロマノバ秀

しかし、それをプログラムまたは機能として数えることはできますか?
ニール

@Neil Dunnoは正式な定義についてですが、私にとっては、プログラムは一連の命令であり、制限はありますがイミディエイトウィンドウにコードを配置すると、通常のプログラムのように動作します。その1つは、このコードをそこで実行できないことです。ハハ:D
アナスタシヤ・ロマノバ秀

8

05AB1E70 68 69 61 58 60 40バイト

€S`¹gG~}Dg©L*0KŸ<U¹v¼y1åi®FXNå}ë0®×}J}¾ä

説明

€S`                                       # split each string in input to a charlist and place separately on stack
   ¹gG~}                                  # OR the char arrays to produce a single list with 1's in the columns that have 1's and 0 in the rest
        Dg L*                             # multiply by indices (1-indexed)
          ©                               # store row length in register
             0K                           # remove 0's (the indices which should not have 1's
               Ÿ<U                        # store a list of the indices that should have 1's in X
                  ¹v                 }    # for each string in input
                    ¼                     # increase counter
                     y1åi      ë   }      # if the row contains at least one 1
                         ®FXNå}           # push 1 for indices which should have 1 and else 0
                                0®×       # else push a row of 0's
                                    J     # join into a string
                                      ¾ä  # split the string in rows

オンラインで試す


7

Mathematica、91 70バイト

@MartinEnderにより21バイトが節約されました

ReplacePart["."+0#,Tuples[Range@@@MinMax/@(#~Position~"#")]]->"#"]&

匿名関数。入力として文字行列を受け取り、出力として文字行列を返します。Unicode文字はのU + F3C7です\[Transpose]


5

C#、262 251バイト

s=>{int l,t,r,b,i,j,k;l=t=r=b=i=-1;for(;++i<s.Length;){j=s[i].IndexOf('#');if(j>-1){k=s[i].LastIndexOf('#');l=l==-1|j<l?j:l;t=t==-1?i:t;r=k>r?k:r;b=i;}}for(i=t;i<=b;++i)for(j=l;j<=r;){var c=s[i].ToCharArray();c[j++]='#';s[i]=new string(c);}return s;};

時間があれば、さらにゴルフをします。

にコンパイルされますFunc<string[], string[]>

フォーマット済みバージョン:

s =>
{
    int l, t, r, b, i, j, k;
    l = t = r = b = i = -1;

    for (; ++i < s.Length;)
    {
        j = s[i].IndexOf('#');
        if (j > -1)
        {
            k = s[i].LastIndexOf('#');

            l = l == -1 | j < l ? j : l;

            t = t == -1 ? i : t;

            r = k > r ? k : r;

            b = i;
        }
    } 

    for (i = t; i <= b; ++i)
        for (j = l; j <= r;)
        {
            var c = s[i].ToCharArray();
            c[j++] = '#';
            s[i] = new string(c);
        }

    return s;
};

5

ゼリー21 19 18 17 バイト

|/Tr/FṬ|
ỴµZÇZ&ÇY

これは完全なプログラムです。入力と出力は、改行で区切られた01の文字列です。

オンラインでお試しください!または、すべてのテストケースを確認します

使い方

ỴµZÇZ&ÇY  Main link. Argument: s (string)

Ỵ         Split s at linefeeds into the array A.
 µ        Begin a new, monadic chain. Argument: A
  Z       Zip/transpose A.
   Ç      Apply the helper link to the transpose.
    Z     Zip/transpose to restore the original order.
      Ç   Apply the helper link to A.
     &    Take the bitwise AND of both results.
       Y  Join, separating by linefeeds.

|/Tr/FṬ|  Helper link. Argument: A (array of strings)

|/        Reduce A columnwise by bitwise OR. This casts to integer.
  T       Truth; yield the indices of 1's.
   r/     Reduce by range. This yields an exponentially growing, nested, ragged
          array that contains all integers between the lowest and highest index
          in the previous result, at least once but possibly multiple times.
     F    Flatten the result.
      Ṭ   Untruth; yield an array with 1's at the specified indices.
          Multiple occurrences of the same index are ignored.
       |  Take the bitwise OR of the result and each row of A.


3

Scala、317文字

val a=input.split("\n");val e=a.map{s=>(s.indexOf("#"),s.lastIndexOf("#"))}.zipWithIndex.filter(_._1._1!= -1);val b=(e.map{s=>s._1._1}.min,e.map{s=>s._1._2}.max,e.head._2,e.last._2);print((0 to a.length-1).map{y=>(0 to a(y).length-1).map{x=>if(x>=b._1&&x<=b._2&&y>=b._3&&y<=b._4)"#" else "."}.mkString+"\n"}.mkString)

より読みやすいバージョンは、おそらくそれをもっとゴルフしたかもしれません:

val a=input.split("\n")
val e=a.map{s=>
    (s.indexOf("#"),s.lastIndexOf("#"))
}.zipWithIndex        // Need the indexes for the Y values
.filter(_._1._1!= -1) // Ugly because of tupleception: (actual tuple, index)

val b=(
    e.map{s=>s._1._1}.min,
    e.map{s=>s._1._2}.max,
    e.head._2,
    e.last._2)

print(
    (0 to a.length-1).map{y=>
        (0 to a(y).length-1).map{x=>
            if(x>=b._1&&x<=b._2&&y>=b._3&&y<=b._4)"#" 
            else "."
        }.mkString+"\n"
    }.mkString
)

3

JavaScript(ES6)、168バイト

s=>/^#/gm.test(s)?/#$/gm.test(s)?s.replace(/^.*#[^]*#.*$/m,s=>s.replace(/./g,'#'))?f(s.replace(/.$/gm,'')).replace(/$/gm,'.'):f(s.replace(/^./gm,'')).replace(/^/gm,'.')

入力を複数行の文字列として受け取ります。.少なくとも1つの行が始まり、1つがa #で終わるまで、すべての行から先頭と末尾のsを再帰的に除去し、#すべての.sを含む行で開始および終了する行をできるだけ多く選択し#ます。おそらく容易にゴルフできる。


3

R、158155バイト

このプログラムは、入力ポイント.とハッシュタグ#を1行ずつ取り込みます。

v=c();f=which((d=matrix(strsplit(paste0(a<-scan(,""),collapse=""),"")[[1]],nr=sum(a<0),b=T))=="#",a=T);d[min(f[,1]):max(f[,1]),min(f[,2]):max(f[,2])]="#";d

アンゴルフド:

a<-scan(,"")             #Input

v=c()                   #Empty vector
f=which((d=(matrix(strsplit(paste0(a,collapse=""),"")[[1]],nr=length(a),b=T)))=="#",a=T) #Main work is here !


d[min(f[,1]):max(f[,1]),min(f[,2]):max(f[,2])]="#"                        #Creates 
                                                                          #the new figure

d                       #Displays it

3行目の詳細は次のとおりです。

paste0(a,collapse="") 
#Collapses the input into a single string

strsplit(paste0(a,collapse=""),"")[[1]] 
#Split this string character-wise

matrix(strsplit(paste0(a,collapse=""),"")[[1]],nr=sum(a<0),b=T) 
#Creates and fills (by row) a matrix with number of row the number of line of the input

which((d=(matrix(strsplit(paste0(a,collapse=""),"")[[1]],nr=l,b=T)))=="#",a=T)
#Gives the index of the matrix's elements that are "#"

3

PowerShell v3 +、215 162 148 144 139バイト

param($n)$n|%{(((-join(0..($n[0].length-1)|%{$i=$_;+('1'-in(0..($n.length-1)|%{$n[$_][$i]}))}))-replace'(?<=1.*?).(?=.*?1)',1),$_)[0-ge$_]}

文字列の配列として入力を受け取り$nと、0代わりの.及び1代わりに#。次に、ループを$n繰り返し、現在の文字列がより小さいかどうか0(つまり、その1中にaがあるかどうか)をテストし、そうであれば、文字列を出力します。/ 操作の代わりに擬似3項を使用します。ifelse

文字列は、入力文字列の幅のループから構成されます。各反復では、対応する垂直列のどこかにあるかどう0かに1応じて、a またはa を付加し1ます。たとえば、最後のテストケースの場合、これはのような文字列になります0011001001-inオペレーターにはv3 +が必要です。その文字列は、「内部」0のをで置き換えるために、空想的な正規表現の置換とペアになり1ます。それを支援してくれたチャットのBusiness Catに感謝します。0011111111この時点で文字列があります。

そうでない場合は、現在の(すべてゼロの)stringを出力します$_

結果の文字列はパイプラインに残り、出力は暗黙的です。Write-Output文字列の配列のデフォルトは、各要素間に改行があるため、視覚的に何が起こるかです。

PS C:\Tools\Scripts\golfing> .\highlight-the-bounding-box-cartesian.ps1 '0000000001','0010000000','0000100100','0001000000'
0011111111
0011111111
0011111111
0011111111

PS C:\Tools\Scripts\golfing> .\highlight-the-bounding-box-cartesian.ps1 '0000000000','0000000000','0000100000','0001000000'
0000000000
0000000000
0001100000
0001100000

2

Python、219 212バイト

def b(a):j=len(a[0]);g=range;z=g(len(a));h=[i for i in z if'#'in a[i]];w=[i for i,c in[(i,[r[i]for r in a])for i in g(j)]if'#'in c];return[[any((r<h[0],h[-1]<r,c<w[0],w[-1]<c))and'.'or'#'for c in g(j)]for r in z]

(別の方法はもっと短いかもしれませんが)

文字のリストのリストを取得して返します。

イデオオンでテストする


2

Perl 6、62バイト

{.[.grep(/a/,:k).minmax;$_».grep('a',:k).flat.minmax]='a'xx*}

文字の配列の配列(行列を表す)を引数として渡すことができ、呼び出し元のスコープが後で変更された配列を持つようにインプレースで変更できる匿名ルーチン。

「オン」文字としてのa代わりに使用し#ます。「オフ」文字は何でも構いませんが、気にしません。


2

Python 3、153バイト

r=lambda w:list(zip(*w[::-1]))
f=lambda w,n=4:list(map(''.join,n and(('#'in w[0])and r(r(r(f(r(w),n-1))))or[w[0]]+foo(w[1:],n))or['#'*len(w[0])]*len(w)))

入力と出力は文字列のリストです。

食べない

r=lambda w:list(zip(*w[::-1]))   # rotate grid cw 90 degrees

def f(w,n=4):
    if n:
        if '#' in w[0]:
            u = r(r(r(f(r(w), n-1))))

        else:
            u = [w[0]] + foo(w[1:], n)

    else:
        u = ['#'*len(w[0])]*len(w)

 return list(map(''.join,u))

動作理論

主なアイデアは、配列の外側の行と列に「#」がない場合は削除することです。残っているものはすべて「#」で埋める必要があります。

再帰関数を使用して実装されます。

ケース1:行0に「#」が含まれていません。結果は、行0 +残りの行の再帰呼び出しです。

ケース2:行0には「#」が含まれています。これ以上行を削除できません。配列cwを回転して、列0が行0になるようにします。次に、回転した配列を再帰的に処理します。結果はccw回転します。

基本ケース:配列は4回回転されています。つまり、可能であれば、すべての外側の行/列が削除されています。残っているものはすべて「#」で埋めてください


2

Perl、51バイト

+2を含む -0p

STDINに入力を与え、オフ文字はA、オン文字はa、たとえば:

bounding.pl
AAAAAAAAAA
AAaAAAAAAA
AAAAaAAaAA
AAAaAAAAAA
AAAAAAAAAA
^D

bounding.pl

#!/usr/bin/perl -0p
s%(?=\D*a).+%$a|=$&%eg;s%.*a.*%$a%g;s/a.*a/\L$&/g

同じ長さ:

#!/usr/bin/perl -0p
s%.+%${a./a/g}|=$&%eg;s%.*a.*%$a1%g;s/a.*a/\L$&/g

1

Python 2、184バイト

def c(i):
 m=n=();e,z=enumerate,'for j,r in e(i):\n for k,c in e(r):%s'
 exec z%'\n  if"#"==c:m+=j,;n+=k,'
 exec z%'\n  if min(m)<=j<=max(m)<[]>min(n)<=k<=max(n):i[j][k]="#"'
 return i

入力と出力は文字列のリストです。

Ideoneで試してみてください(ジョナサンアランのテストページの分岐点)


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.