Автоматичний розширювач коробки


16

Вступ

Іноді мої ящики занадто малі, щоб вмістити в нього що-небудь. Мені потрібно, щоб ти зробив розширювач коробки! Отже, що робить коробку коробкою у цьому виклику.

 OOOO
O    O
O    O
O    O
 OOOO

Кути коробки - це завжди пробіли. Сама коробка може бути зроблена з того ж символу. Цей символ може бути будь-яким символом для друку ASCII , крім пробілу. Отже, ось такі персонажі:

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

Бічні довжини коробки вгорі - 4, 3 . Ви можете припустити, що довжина сторони завжди позитивна . Це означає, що це найменший ящик, з яким потрібно звертатися:

 #
# #
 #

Для того щоб розгорнути коробку, потрібно збільшити довжину кожної сторони. Перейдемо до цього, крок за кроком, з наведеним вище прикладом. Спочатку беремо верхню сторону коробки, а саме:

 OOOO

Розширюємо це по черзі, і отримуємо:

 OOOOO

Це верхня і нижня частина коробки зараз. Після цього робимо те ж саме зі сторонами зліва та справа:

O
O
O

Стає:

O
O
O
O

Тепер ми знову збираємо поле, в результаті чого:

 OOOOO
O     O
O     O
O     O
O     O
 OOOOO

Завдання

Давши вікно, розгорніть його на 1. Поле можна подати у декількох рядках чи у масиві.

Тестові справи

 OOOO          OOOOO
O    O    >   O     O
 OOOO         O     O
               OOOOO

 XXXXXX        XXXXXXX
X      X  >   X       X
X      X      X       X
 XXXXXX       X       X
               XXXXXXX

 ~             ~~
~ ~       >   ~  ~
 ~            ~  ~
               ~~

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


1
Чи може в коробці перед ним новий рядок?
Райлі

@ Райлі Так, це дозволено :).
Аднан

1
Чи можна коробку застелити пробілами?
Leaky Nun

@LeakyNun Так, ви можете це зробити.
Аднан

Відповіді:


4

V , 6 5 байт

yêpjÄ

Спробуйте в Інтернеті!

Це насправді байт довше, ніж повинен бути. Це повинно було бути:

äêjÄ

Але в цьому є невідома помилка. :(

Пояснення:

yê     "yank this colum
  p    "paste what we just yanked
   j   "move down to line 2
    Ä  "and duplicate this line

Що робить інший?
Conor O'Brien

@ ConorO'Brien ä- оператор дублікатів (по суті, "y" і "p" разом в одному байті), так äêце "копія стовпців"
DJMcMayhem

11

Vim, 7 байт

♥GYPjYp

де ♥ - Control-V.

           The cursor starts on the first non-whitespace character of the first line.
♥G         Enter visual block mode and go to bottom of document.
  YP       Duplicate this column.
    j      Move down to the second line of the file.
     Yp    Duplicate this line.

enter image description here


Чому б не використовувати YPобидва рази для консистенції?
Ніл

Я випадково потрапив pпід час запису анімації, тому я застряг із нею під час переписування відповіді. Це важливо? > _>;
Лінн

Я просто виявив невідповідність дивним, але мені подобається ваше пояснення.
Ніл

Це точно те саме, що і моя відповідь V, тільки що мені трапилось створити однобайтові відображення для <C-v> Gта YP. Це ніби змушує мою мову відчувати себе дешево. : /
DJMcMayhem

Гм, control-V відображається як серце на моєму телефоні ... ❤
Beta Decay

6

JavaScript (ES6), 57 53 52 байти

s=>s.replace(/^.(.)/gm,s="$&$1").replace(/(\n.*)/,s)

Пояснення: Перше regexp дублює другий стовпець, а друге regexp дублює другий ряд, таким чином збільшуючи поле за бажанням. Редагувати: Збережено 4 байти завдяки MartinEnder ♦


6

Пітона, 49 42 байти

Анонімна лямбда:

-7 від xnor

lambda s:[t[:2]+t[1:]for t in s[:2]+s[1:]]

Попередня версія:

D=lambda s:s[:2]+s[1:]
lambda s:D(list(map(D,s)))

D - це функція, що дублює другий елемент послідовності.


1
Ідея повторного використання функції розумна, але це , здається, коротше просто повторювати код lambda L:[s[:2]+s[1:]for s in L[:2]+L[1:]].
xnor

Бічна примітка до попередньої версії: я думаю, map(D,D(s))що дасть 43 натомість
Sp3000

5

Сітківка , 20 байт

Кількість байтів передбачає кодування ISO 8859-1.

1`¶
¶$%'¶
%2=`.
$&$&

Спробуйте в Інтернеті!(Є кілька додаткових рядків, які включають тестовий набір, коли тестові випадки розділені двома стрічковими каналами.)

Пояснення

1`¶
¶$%'¶

1це межа, яка обмежує Retina застосовувати заміну лише до першого знайденого нами матчу. відповідає одній передачі рядків, тому нам потрібно лише розглянути можливість заміни передачі рядків у кінці першого рядка. Він замінюється на ¶$%'¶, де $%'вставляється весь рядок, що відповідає збігу (елемент заміщення, характерний для Retina). Отже, це дублює другий рядок.

%2=`.
$&$&

Тут %діє лінійний режим, тому кожен рядок обробляється індивідуально, а лінії з'єднуються знову. 2=також є межею. Це означає "застосувати заміну лише до другого матчу". Сам матч простий з одним символом, а заміна його дублює. Отже, цей етап дублює другий стовпчик.


5

Хаскелл, 24 байти

f(a:b:c)=a:b:b:c
f.map f

Використовує ідею RootTwo про дублювання другого рядка та стовпця. Це map fробить для кожного ряду, а f.потім робить це для рядків.


4

PowerShell v2 +, 57 53 52 байти

param($n)($n-replace'^.(.)','$&$1')[0,1+1..$n.count]

Трохи схожий на відповідь Ніла в JavaScript . Перша заміна відповідає початку рядка та наступним двом символам та замінює їх першим символом та другим символом - двічі. Замість другої заміни він заміняється на індексацію масиву, щоб дублювати другий рядок. Приймає введення як масив рядків. Отримані фрагменти масиву залишаються на конвеєрі і друк неявний.

Збережено 4 байти завдяки Мартіну.

Деякі приклади:

PS C:\Tools\Scripts\golfing> .\automatic-box-expander.ps1 ' oooo ','o    o',' oooo '
 ooooo 
o     o
o     o
 ooooo 

PS C:\Tools\Scripts\golfing> .\automatic-box-expander.ps1 ' # ','# #',' # '
 ## 
#  #
#  #
 ## 

2
@MartinEnder Так, дякую, Мудрий Реджекс-Сенсей.
AdmBorkBork


3

MATL , 12 байт

tZy"@:2hSY)!

Вхід - це двовимірний масив знаків, крапка з комою як роздільник рядків. Наприклад, перший тестовий випадок має вхід

[' OOOO ';'O    O';' OOOO ']

Спробуйте в Інтернеті! Тестові справи 1 , 2 , 3 .

Пояснення

Код виконує такі дії двічі: повторіть другий рядок масиву та перемістіть.

Щоб повторити другий рядок масиву m× n, вектор [1 2 2 3 ... m]використовується як індекс рядків. Цей вектор генерується наступним чином: діапазон [1 2 3 ... m], додавання іншого 2, сортування.

t       % Take input implicitly. Duplicate
Zy      % Size of input as a two-element array [r, c]
"       % For each of r and c
  @     %   Push r in first iteration (or c in the second)
  :     %   Generate range [1 2 3 ... r] (or [1 2 3 ... c])
  2hS   %   Append another 2 and sort
  Y)    %   Apply as row index
  !     %   Transpose
        % End for. Display implicitly


2

СЕД 69 19 (14 + 1 за -р) 15

s/.(.)/&\1/;2p   

1
Ви не можете просто зробити /.\(.\)/\0\1;2p?
Ніл

@Neil Я все це переглянув 2p, я зрозумів, що є спосіб це зробити, але не зміг його знайти. Спасибі!
Райлі

Частина -r '' не потрібна до тих пір, поки ви додасте 1 байт для прапора r, економлячи 3 байти. Крім того, оскільки ви редагували свою першу версію коду, пояснення в кінці зараз не є дійсним.
seshoumara

@Neil Не міг повірити своїм очам, коли я побачив \0зворотній зв'язок, оскільки вони починаються з 1. Інтерактивний посібник GNU sed не говорить про це. Однак, &я вважаю, що це рівнозначно і коротше.
seshoumara

@seshoumara Ах, ті тонкощі версії regexp ... які ви використовуєте \0тоді?
Ніл

1

CJam , 14 байт

q~{~\_@]z}2*N*

Аналогічно моїй відповіді MATL , але повторює другий-останній ряд замість другого.

Спробуйте в Інтернеті!

Пояснення

q                e# Read input
 ~               e# Interpret as an array
  {      }2*     e# Do this twice
   ~             e# Dump array contents onto the stack
    \            e# Swap top two elements
     _           e# Duplicate
      @          e# Rotate
       ]         e# Pack into an array again
        z        e# Zip
            N*   e# Join by newlines. Implicitly display

1

К, 15 байт

2{+x@&1+1=!#x}/

Вводиться як матриця символів:

  b: (" OOOO ";"O    O";" OOOO ")
(" OOOO "
 "O    O"
 " OOOO ")

Застосовуйте функцію двічі ( 2{…}/), яка дає перенесення ( +) правильного аргументу, індексованого ( x@) за допомогою додаткового декодування довжини пробігу ( &) одного плюс ( 1+), список розташувань, рівних 1 ( 1=), в діапазоні від 0 до ( !) розмір зовнішнього виміру правильного аргументу (#x ).

Крок за кроком,

  #b
3
  !#b
0 1 2
  1=!#b
0 1 0
  1+1=!#b
1 2 1
  &1+1=!#b
0 1 1 2
  b@&1+1=!#b
(" OOOO "
 "O    O"
 "O    O"
 " OOOO ")
  +b@&1+1=!#b
(" OO "
 "O  O"
 "O  O"
 "O  O"
 "O  O"
 " OO ")
  2{+x@&1+1=!#x}/b
(" OOOOO "
 "O     O"
 "O     O"
 " OOOOO ")

Спробуйте тут .


1

APL, 17 15 байт

{⍉⍵⌿⍨1+2=⍳≢⍵}⍣2

Тест:

      smallbox largebox
┌───┬──────┐
│ # │ OOOO │
│# #│O    O│
│ # │O    O│
│   │O    O│
│   │ OOOO │
└───┴──────┘
      {⍉⍵⌿⍨1+2=⍳≢⍵}⍣2 ¨ smallbox largebox
┌────┬───────┐
│ ## │ OOOOO │
│#  #│O     O│
│#  #│O     O│
│ ## │O     O│
│    │O     O│
│    │ OOOOO │
└────┴───────┘

Пояснення:

             ⍣2   run the following function 2 times:
{           }     stretch the box vertically and transpose
         ⍳≢⍵      indices of rows of box
       2=         bit-vector marking the 2nd row
  ⍵/⍨1+           replicate the 2nd row twice, all other rows once
 ⍉                transpose

Символ APL монадичний ⍉ - це матричне переміщення, що не те саме, що обертання на 90 градусів.
JohnE

1
@JohnE: звичайно. Я, мабуть, більше втомився, ніж я думав. Насправді обертання на 90 градусів було б ⌽⍉або ⊖⍉, але в цьому випадку це не має значення.
Марін

0

ListSharp , 326 байт

STRG a=READ[<here>+"\\a.txt"]
ROWS p=ROWSPLIT a BY ["\r\n"]
ROWS p=GETLINES p [1 TO p LENGTH-1]
ROWS p=p+p[1]+p[0]
STRG o=p[0]
ROWS y=EXTRACT COLLUM[2] FROM p SPLIT BY [""]
ROWS x=EXTRACT COLLUM[3] FROM p SPLIT BY [""]
[FOREACH NUMB IN 1 TO o LENGTH-1 AS i]
ROWS m=COMBINE[m,x] WITH [""]
ROWS m=COMBINE[y,m,y] WITH [""]
SHOW=m

Я точно потрібно додати функції вкладання, але це працює дуже добре

коментуйте, якщо ви хочете пояснення


0

JavaScript, 160 146 141 байт

s=>{a=s[1];r="";l=s.split("\n");m=l.length;n=l[0].length;for(i=0;i<=m;i++){for(j=0;j<=n;j++)r+=!(i%m)&&j%n||i%m&&!(j%n)?a:" ";r+="\n"}return r}

0

Діалог APL , 14 байт

(1 2,1↓⍳)¨∘⍴⌷⊢

(

1 2, {1, 2} передчував

1↓ один елемент випав із

індекси

кожного

з

{кількість рядків, кількість стовпців}

індексує в

аргумент

Напр

 XX
X  X
 XX

знаходимо індекси; {1, 2, 3} для рядків і {1, 2, 3, 4} для стовпців. Тепер відкидаємо початкові елементи, щоб отримати {2, 3} і {2, 3, 4}, а потім додаємо до {1, 2}, даючи {1, 2, 2, 3} і {1, 2, 2, 3, 4}. Нарешті, ми використовуємо це для вибору рядків і стовпців, одночасно подвоюючи рядок 2 та стовпець 2.

СпробуйтеAPL онлайн!


0

Рубін, 46 байт

->a{a.map{|r|r.insert(2,r[1])}.insert(2,a[1])}

Дуже пряме рішення, що приймає дані як масив ліній. Мені не подобається дублювання inserts, тому спробую пограти в нього.


0

C #, 127 124 байт

s=>{int n=s.Count-1,i=0;s[0]=s[n]=s[0].Insert(1,s[0][1]+"");s.Insert(1,s[1]);for(;i++<n;)s[i]=s[i].Insert(1," ");return s;};

Компілює до а Func<List<string>, List<string>>.

Відформатована версія:

s =>
{
    int n = s.Count - 1, i = 0;

    s[0] = s[n] = s[0].Insert(1, s[0][1] + "");

    s.Insert(1, s[1]);

    for (; i++ < n;)
        s[i] = s[i].Insert(1, " ");

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