Виділіть обмежувальний ящик, частина I: декартова сітка


19

Вам надається прямокутна сітка символів .і #, як це:

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

Ваше завдання полягає в тому, щоб заповнити всю вирівняний по осях прямокутника #з подальшим #:

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

Обмежувальний вісь, що вирівнюється по осі - це найменший прямокутник, який містить усі #.

Хочу більше? Спробуйте ІІ частину!

Правила

Ви можете використовувати будь-які два різних символи для друку ASCII (0x20 до 0x7E включно), замість #та .. Я продовжую посилатися на них як #і .на решту специфікації.

Введення та вихід можуть бути або окремим рядком, розділеним подачею рядків, або списком рядків (по одному для кожного рядка), але формат повинен бути узгодженим.

Можна припустити, що вхід містить хоча б один #і всі рядки однакової довжини.

Ви можете написати програму чи функцію та скористатися будь-яким із наших стандартних методів отримання вводу та надання виводу.

Ви можете використовувати будь-яку мову програмування , але зауважте, що ці лазівки за замовчуванням заборонені.

Це , тому найкоротша відповідна відповідь - вимірюється в байтах - виграє.

Випробування

Кожен тестовий випадок має вхід та вихід поруч.

#    #

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

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

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

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

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

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

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

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

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

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

Що ви маєте на увазі під "форматом повинен бути узгодженим"? Чи повинен формат введення відповідати формату виводу чи це означає, що формат введення повинен бути узгодженим, а формат виводу також повинен бути узгодженим?
Емінья

@Emigna формати введення та виведення повинні бути однаковими.
Мартін Ендер

@MartinEnder Моя програма вводить двовимірний масив символів та обробляє його. Результатом все ще є двовимірний масив char, але він відображається за замовчуванням як вміст масиву, тобто рядки, розділені новими рядками. Це прийнятно? Або повинен відображатися вихідний рядок цього двовимірного масиву?
Луїс Мендо

@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

Невикористаний код:

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.

Приклад вводу / виводу:

ВХОД

ВИХІД

Caveat: Переконайтеся, що кожна комірка в Sheet2 завжди порожня при кожному запуску програми.


1
Може =C.Valueв першому рядку бути ="#"?
Райлі

@Riley Так, це могло б. Спасибі.
Анастасія-Романова 秀

Здається, я можу зберегти ще кілька байтів, видаливши частини Sub і End Sub, а потім запустивши програму у негайному вікні. Я спробую це завтра, працює він чи ні. Не вдається отримати доступ до Excel зараз ...
Анастасія-Романова 秀

Але чи все-таки це вважатиметься програмою чи функцією, якби ви це зробили?
Ніл

@Neil Dunno щодо формального визначення, але для мене програма - це набір інструкцій, і вона як і раніше працює як звичайна програма, якщо ми поміщаємо код у Негайне вікно, хоча є обмеження. Один з них - цей код там не може бути виконаний. Ха-ха: D
Анастасія-Романова 秀

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 байт

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;};

Я буду гольфу далі, коли у мене буде більше часу.

Вона компілюється в a 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 ' s, обмежені стрічковими каналами.

Спробуйте в Інтернеті! або перевірити всі тестові випадки .

Як це працює

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

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

Безголовки:

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в ній), і якщо так, виводимо рядок. Використовує псевдотермінал замість if/else операції.

Рядок побудований з циклів через ширину вхідного рядка. Кожну ітерацію ми зав'язуємо на a 0або a 1залежно від того, чи 1є вона десь у відповідному вертикальному стовпчику. Наприклад, для останнього тестового випадку це призведе до типу рядка 0011001001. Потрібна v3 + для -inоператора. Цей рядок поєднується з вигадливим регулярним виразом заміни, щоб замінити будь-який "внутрішній" 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

Перл 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 (вилка тестової сторінки Джонатана Аллана)


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.