Автоматический расширитель коробки


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
Можно ли заполнить коробку пробелами?
Утренняя монахиня

@ 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

Что делает другой?
Конор О'Брайен

@ 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.

введите описание изображения здесь


Почему бы не использовать 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)

Объяснение: Первое регулярное выражение дублирует второй столбец, а второе регулярное выражение дублирует второй ряд, таким образом увеличивая поле по желанию. Редактировать: 4 байта сохранены благодаря MartinEnder ♦.


6

Python, 49 42 байта

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

-7 из хнор

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

Haskell, 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 за -r) 15

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

1
Вы не можете просто сделать /.\(.\)/\0\1;2p?
Нил

@Neil Я искал повсюду это 2p, я думал , что есть способ сделать это, но я не мог найти это. Благодарность!
Райли

Часть -r '' не нужна, если вы добавляете 1 байт для флага r, тем самым сохраняя 3 байта. Кроме того, поскольку вы отредактировали свою первую версию кода, пояснение в конце теперь недействительно.
Сешумара

@Neil Не поверил своим глазам, когда увидел обратную ссылку \0, так как они начинаются с 1. Онлайн-руководство GNU sed ни о чем не говорит. Тем не менее, использование &, я думаю, эквивалентно и короче.
seshoumara

@seshoumara А, эти тонкости регулярных выражений ... какой из них \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{…}/), которая дает transpose ( +) правого аргумента indexed ( 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 monadic matrix - это транспонирование матрицы, что не то же самое, что поворот на 90 градусов.
JohnE

1
@JohnE: конечно. Должно быть, я был более уставшим, чем думал. На самом деле вращение на 90 градусов будет ⌽⍉или ⊖⍉, но в этом случае это не имеет значения.
marinus

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

Dyalog 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])}

Очень простое решение, принимая входные данные в виде массива строк. Я не люблю дублированные insertбуквы, поэтому постараюсь сыграть в гольф.


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.