경계 상자 강조 표시, 1 부 : 직교 그리드


19

다음 .#같이 문자의 직사각형 그리드가 제공됩니다 .

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

당신의 작업은 전체 축 정렬 경계 상자 채우는 것입니다 #추가로를 #:

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

축 정렬 경계 상자는 모든을 포함하는 가장 작은 사각형입니다 #.

더 원해? 파트 II를보십시오!

규칙

및 대신에 두 가지 인쇄 가능한 ASCII 문자 (0x20 ~ 0x7E 포함)를 사용할 수 있습니다 . 나는 그들을 참조 계속 것입니다 및 하지만 사양의 나머지.#.#.

입력 및 출력은 단일 줄 바꿈으로 구분 된 문자열이거나 문자열 목록 (각 줄마다 하나씩) 일 수 있지만 형식은 일관되어야합니다.

입력에 하나 이상이 #있고 모든 행의 길이가 같다고 가정 할 수 있습니다 .

당신은 쓸 수 있습니다 프로그램이나 기능을 하고, 우리의 사용 표준 방법 입력을 수신하고 출력을 제공합니다.

모든 프로그래밍 언어를 사용할 수 있지만 이러한 허점 은 기본적으로 금지되어 있습니다.

이것은 이므로 바이트 단위로 측정 된 가장 짧은 유효한 답변이 이깁니다.

테스트 사례

각 테스트 케이스에는 서로 옆에 입력 및 출력이 있습니다.

#    #

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

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

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

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

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

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

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

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

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

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

"형식이 일관성이 있어야한다"는 것은 무엇을 의미합니까? 입력 형식이 출력 형식과 일치해야합니까, 아니면 입력 형식이 일치해야하고 출력 형식도 일관성이 있어야합니까?
Emigna

@Emigna 입력 및 출력 형식이 동일해야합니다.
Martin Ender

@MartinEnder 내 프로그램은 2D 문자 배열을 입력하고 처리합니다. 결과는 여전히 2D 문자 배열이지만 기본적으로 배열 내용으로 표시됩니다 (예 : 줄 바꿈으로 구분 된 문자열). 괜찮습니까? 또는 표시된 출력이 해당 2D 배열의 문자열 표현이어야합니까?
Luis Mendo

@LuisMendo 타입의 문자열 표현이 필요합니다. 줄 바꿈으로 구분 된 문자열 귀하의 언어로 중첩 배열의 자연스러운 문자열 표현 인지 여부는 말할 수 없습니다. (즉, 사용자의 입력 형식이 다른 아마 때문에,에 "가역적"표현 인 것처럼 보이지 않기 때문에, 비록.)
마틴 청산

그래픽 출력이 허용됩니까?
12Me21

답변:


17

VBA Excel, 150 바이트 146 바이트

교수:

시트 1과 시트 2라는 두 개의 빈 워크 시트가있는 통합 문서를 만듭니다. 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 :

입력

산출

주의 사항 : 프로그램을 실행할 때마다 Sheet2의 모든 셀이 항상 비어 있는지 확인하십시오.


1
=C.Value첫 번째 줄에있을 ="#"?
Riley

@Riley 네, 가능합니다. 감사.
Anastasiya-Romanova 秀

Sub 및 End Sub 부분을 삭제 한 다음 직접 실행 창에서 프로그램을 실행하여 몇 바이트를 더 절약 할 수 있습니다. 작동 여부에 관계없이 시도해 볼 것입니다. 지금 Excel에 액세스 할 수 없습니다 ...
Anastasiya-Romanova 秀

그러나 그렇게하면 여전히 프로그램이나 기능으로 간주됩니까?
Neil

@Neil Dunno는 공식적인 정의에 관한 것이지만 나에게 프로그램은 일련의 명령이며 제한 사항이 있지만 직접 창에 코드를 넣으면 일반 프로그램처럼 작동합니다. 그중 하나는이 코드를 실행할 수 없다는 것입니다. 하 - 하 : D
아나스타샤 - Romanova에秀

8

05AB1E , 70 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

매스 매 티카, 91 70 바이트

@MartinEnder 로 인해 21 바이트가 저장되었습니다 .

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

익명의 기능. 문자 행렬을 입력으로 사용하고 문자 행렬을 출력으로 반환합니다. 유니 코드 문자는 U + F3C7입니다 \[Transpose].


5

C #, 262251 바이트

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

스칼라, 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

자바 스크립트 (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,'.')

여러 줄 문자열로 입력을받습니다. .하나 이상의 줄이 시작되고 하나가 a로 끝날 때까지 모든 줄에서 선행 및 후행을 반복적으로 제거 #하여 가능한 한 많은 줄을 선택하지만 #모든 줄을 포함 하고 변경 하는 줄에서 시작 및 마무리를 수행 .합니다 #. 아마 쉽게 골프를 칠 수 있습니다.


3

R, 158155 바이트

이 프로그램은 입력 포인트 .와 해시 태그 #를 한 줄씩받습니다.

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

세 번째 줄의 세부 사항은 다음과 같습니다.

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(즉, a 가 있는지)를 테스트하고 반복 하는 1경우 문자열을 출력합니다. / 연산 대신 의사 삼항 을 사용합니다 .ifelse

문자열은 입력 문자열의 너비를 통해 루프로 구성됩니다. 각 반복마다 해당 세로 열의 어딘가에 있는지에 따라 a 0또는 a 1에 고정합니다 1. 예를 들어 마지막 테스트 사례의 경우 다음과 같은 문자열이됩니다 0011001001. -in연산자 에는 v3 +가 필요합니다 . 이 문자열은 "내부"를 0s로 대체하기 위해 공상 -dancy 정규식 바꾸기와 쌍을 이룹니다 1. 이에 대한 도움을 주신 Business Cat 에게 감사드립니다 . 우리의 끈은 0011111111이 시점에 있을 것 입니다.

그렇지 않으면 현재 (0이 아닌) 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

파이썬, 219212 바이트

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

펄 6 , 62 바이트

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

문자 배열 (행렬을 나타냄)을 인수로 전달할 수있는 익명 루틴으로, 호출 범위가 나중에 수정 된 배열을 갖도록 제자리에서 수정합니다.

"on"문자 a대신 사용 합니다 #. "off"문자는 무엇이든 상관 없습니다.


2

파이썬 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

펄, 51 바이트

에 +2 포함 -0p

STDIN, off character is A, on character is 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

파이썬 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 (Jonathan Allan의 테스트 페이지 포크) 에서 사용해보십시오.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.