ไฮไลต์กล่อง Bounding ตอนที่ 1: ตารางคาร์ทีเซียน


19

คุณได้รับตารางสี่เหลี่ยมของตัวละคร.และ#เช่นนี้

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

งานของคุณคือเติมช่องว่างที่จัดเรียงตามแนวแกนของกล่อง#ด้วย#:

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

#แกนชิดกรอบเป็นรูปสี่เหลี่ยมผืนผ้าขนาดเล็กที่สุดที่มีทั้งหมด

ต้องการมากขึ้น? ลอง Part II!

กฎระเบียบ

คุณอาจจะใช้ทั้งสองแตกต่างกันตัวอักขระ ASCII (0x20 เพื่อ 0x7E รวม) ในสถานที่และ# .ฉันจะอ้างถึงพวกเขาเป็น#และ.สำหรับส่วนที่เหลือของข้อกำหนดแม้ว่า

อินพุตและเอาต์พุตอาจเป็นสตริงที่คั่นด้วยบรรทัดเดียวหรือรายการสตริง (หนึ่งสำหรับแต่ละบรรทัด) แต่รูปแบบต้องสอดคล้องกัน

คุณอาจสมมติว่าอินพุตมีอย่างน้อยหนึ่ง#บรรทัดและทุกบรรทัดมีความยาวเท่ากัน

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นและใช้วิธีการมาตรฐานของเราในการรับอินพุตและให้เอาต์พุต

คุณอาจใช้ภาษาการเขียนโปรแกรมใด ๆแต่โปรดทราบว่าช่องโหว่เหล่านี้เป็นสิ่งต้องห้ามตามค่าเริ่มต้น

นี่คือดังนั้นคำตอบที่สั้นที่สุดที่ถูกต้อง - วัดเป็นไบต์ - ชนะ

กรณีทดสอบ

กรณีทดสอบแต่ละชุดมีอินพุตและเอาต์พุตอยู่ติดกัน

#    #

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

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

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

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

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

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

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

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

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

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

คุณหมายถึงอะไรโดย "รูปแบบต้องมีความสอดคล้อง"? รูปแบบอินพุตต้องสอดคล้องกับรูปแบบเอาต์พุตหรือหมายความว่ารูปแบบอินพุตต้องสอดคล้องกันและรูปแบบเอาต์พุตต้องสอดคล้องกันหรือไม่
Emigna

@Emigna รูปแบบอินพุตและเอาต์พุตต้องเหมือนกัน
Martin Ender

@MartinEnder โปรแกรมของฉันป้อนถ่านแบบสองมิติและประมวลผลมัน ผลลัพธ์ยังคงเป็นอาร์เรย์ถ่าน 2 มิติ แต่จะแสดงตามค่าเริ่มต้นเป็นเนื้อหาของอาร์เรย์นั่นคือสตริงที่คั่นด้วยการขึ้นบรรทัดใหม่ เป็นที่ยอมรับหรือไม่? หรือผลลัพธ์ที่แสดงควรเป็นตัวแทนสตริงของอาร์เรย์ 2D นั้น?
Luis Mendo

@LuisMendo ฉันคาดว่าจะเป็นตัวแทนของประเภทสตริง ไม่ว่าสตริงที่คั่นด้วยตัวป้อนบรรทัดนั้นจะเป็นตัวแทนสตริงธรรมชาติของอาร์เรย์ที่ซ้อนกันในภาษาของคุณฉันไม่สามารถพูดได้ (แม้ว่าจะไม่ใช่การแสดงที่ "ย้อนกลับ" เนื่องจากรูปแบบการป้อนข้อมูลของคุณแตกต่างกันอาจไม่ใช่)
Martin Ender

อนุญาตให้แสดงผลกราฟิก
12Me21

คำตอบ:


17

VBA Excel 150 ไบต์ 146 ไบต์

คำแนะนำ:

สร้างสมุดงานที่มีแผ่นงานเปล่าสองแผ่น: 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

Ungolfed รหัส:

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 และวางลงในเซลล์ใน Sheet2 ด้วยที่อยู่เดียวกันกับ Sheet1
  3. วนซ้ำอีกครั้งทุกเซลล์ในช่วงที่ใช้ Sheet2 เพื่อคัดลอกที่อยู่เซลล์ทุกเซลล์ในนั้นแล้วใช้เพื่อกำหนดอักขระแฮชแท็ก (#) ให้กับเซลล์ใน Sheet1 ด้วยที่อยู่เดียวกันกับช่วงที่ใช้ Sheet2

ตัวอย่าง I / O:

INPUT

เอาท์พุท

Caveat:ตรวจสอบให้แน่ใจว่าทุกเซลล์ใน Sheet2 ว่างเสมอทุกครั้งที่คุณเรียกใช้โปรแกรม


1
เป็นไปได้=C.Valueในบรรทัดแรก="#"หรือไม่
Riley

@ ไรลีย์ใช่มันสามารถ ขอบคุณ
Anastasiya-Romanova 秀

ดูเหมือนว่าฉันสามารถบันทึกได้อีกสองสามไบต์โดยการลบส่วนย่อยและส่วนย่อยจากนั้นเรียกใช้โปรแกรมในหน้าต่างทันที ฉันจะลองมันพรุ่งนี้ว่ามันใช้งานได้หรือเปล่า ไม่สามารถเข้าถึง Excel ได้ในขณะนี้ ...
Anastasiya-Romanova 秀

แต่นั่นจะยังคงนับเป็นโปรแกรมหรือฟังก์ชั่นถ้าคุณทำเช่นนั้น?
Neil

@ Neil Dunno เกี่ยวกับคำจำกัดความที่เป็นทางการ แต่สำหรับฉันแล้วโปรแกรมคือชุดคำสั่งและมันยังทำงานเหมือนโปรแกรมปกติถ้าเราใส่รหัสในหน้าต่าง Immediate แม้ว่าจะมีข้อ จำกัด หนึ่งในนั้นคือรหัสนี้ไม่สามารถดำเนินการได้ Ha-ha: D
Anastasiya-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

Mathematica, 91 70 ไบต์

21 ไบต์บันทึกไว้เนื่องจาก@MartinEnder

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

นี่เป็นโปรแกรมเต็ม อินพุตและเอาต์พุตเป็นสตริงที่0และ1คั่นด้วย linefeeds

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

มันทำงานอย่างไร

Ỵµ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)

เวอร์ชันที่อ่านได้มากกว่าอาจมี golfed มากกว่า

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,'.')

รับอินพุตเป็นสตริงหลายบรรทัด ทำงานโดยการลอกซ้ำชั้นนำและต่อท้าย.S จากทุกสายอย่างน้อยก็จนกว่าหนึ่งบรรทัดเริ่มต้นและจบลงด้วย#แล้วเลือกเป็นเส้นมากที่สุดเท่าที่เป็นไปได้ แต่เริ่มต้นและจบในบรรทัดที่มี#และการเปลี่ยนแปลงทั้งหมดเพื่อ. #น่าจะเล่นกอล์ฟได้ง่าย


3

R, 158 155 ไบต์

โปรแกรมนี้ใช้ในจุดอินพุต.และแฮชแท็ก#ทีละบรรทัด

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

Ungolfed:

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(เช่นมี1ในนั้น) และถ้าเป็นเช่นนั้นส่งออกสตริง ใช้pseudo-ternaryแทนการดำเนินการif/else

สตริงถูกสร้างจากลูปผ่านความกว้างของสตริงอินพุต การวนซ้ำแต่ละครั้งเราจัดให้มี0หรือ1ขึ้นอยู่กับว่า1พบที่ไหนสักแห่งในคอลัมน์แนวตั้งที่เกี่ยวข้อง 0011001001สำหรับกรณีทดสอบที่ผ่านมาเช่นนี้จะส่งผลในสตริงเหมือน ต้องการ v3 + สำหรับ-inผู้ปฏิบัติงาน สตริงนั้นถูกจับคู่กับแทนที่ regex แฟนซี -dancy เพื่อแทนที่ "ภายใน" ใด ๆ ที่0มี1s ต้องขอบคุณBusiness Catในการแชทเพื่อขอความช่วยเหลือ สตริงของเราจะอยู่0011111111ที่จุดนี้

อื่นเอาท์พุทปัจจุบัน (ทุกศูนย์) $_สตริง

สตริงผลลัพธ์จะถูกทิ้งไว้บนไพพ์ไลน์และเอาต์พุตจะเป็นนัย ค่าเริ่มต้น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]

(แม้ว่าฉันคิดว่าวิธีอื่นอาจสั้นกว่านี้)

ใช้และส่งคืนรายการของตัวอักษร

ทดสอบบนideoone


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)))

อินพุตและเอาต์พุตเป็นรายการสตริง

ungolfed

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))

ทฤษฎีการทำงาน

แนวคิดหลักคือการลบแถวและคอลัมน์รอบด้านนอกของอาร์เรย์ถ้าไม่มี '#' สิ่งที่เหลือควรกรอกด้วย '#' s

มันถูกนำมาใช้โดยใช้ฟังก์ชั่นซ้ำ

กรณีที่ 1: แถว 0 ไม่มี '#' ผลที่ได้คือแถว 0 + เรียกซ้ำในแถวที่เหลือ

กรณีที่ 2: แถว 0 ประกอบด้วย '#' ไม่สามารถลบแถวได้อีก หมุนอาร์เรย์ cw เพื่อให้คอลัมน์ 0 เป็นแถวที่ 0 จากนั้นประมวลผลอาร์เรย์ที่หมุนซ้ำ ผลลัพธ์ถูกหมุน ccw

กรณีฐาน: อาร์เรย์หมุนได้ 4 ครั้งหมายความว่าแถว / คอลัมน์ด้านนอกทั้งหมดถูกลบทิ้งถ้าเป็นไปได้ สิ่งที่เหลือควรกรอกด้วย '#' s


2

Perl, 51 ไบต์

รวมถึง +2 สำหรับ -0p

ให้อินพุตกับ STDIN, off character คือA, บน character คือ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 (หน้าทดสอบของ Jonathan Allan)


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.