Создать инструмент кодового блока


18

При использовании разметки, как в сети SE, отступ в четыре пробела перед строкой текста обозначает ее как часть блока кода, как я надеюсь, вы знаете. Если вы этого не сделаете, вот пример (с .представлением пробела):

.... код
.... больше код

результаты в

Code
More code

Проблема в том, что когда вы копируете и вставляете код в ответ, вам нужно делать отступ каждой строки вручную. Это особенно сложно при работе с кодом без кода, поскольку он, вероятно, уже имеет отступ и может вызвать путаницу. Вы можете просто выбрать свой код и нажать Ctrl + K, оказывается. Часы моей жизни впустую без причины ...

Итак, ваша цель, учитывая ввод, вернуть его с четырьмя пробелами перед каждой строкой. В духе экономии времени при вставке копии вы должны обрабатывать весь ввод как одну строку (при условии, что ваш язык может ее анализировать). Если ваш язык не может обработать символ (например, новые строки) в строках, вы можете предположить, что он обозначается / экранируется с помощью другого метода, поддерживаемого языком; однако выходные данные должны выводить каждую строку в отдельной строке (поэтому не нужно передавать что-то подобное ....foo\n....bar).

Стандартные лазейки не допускаются. Поскольку это , выигрывает самый короткий ответ в байтах. Удачи!


3
«Вы должны сделать отступ для каждой строки вручную» (или выделите текст и нажмите кнопку :))
Джонатан Аллан

11
@JonathanAllan "Кнопка"? Конечно, вы имеете в виду «сочетание клавиш». (Ctrl + K)
Мартин Эндер

31
@JonathanAllan ... Я ... я очень расстроен. ТАК МНОГО ВРЕМЕНИ. ВПУСТУЮ.
Papayaman1000

6
Хотя я довольно уверен, что V-ответ Критичи не будет побежден, я бы обычно рекомендовал подождать немного дольше, прежде чем принимать ответ, потому что столь раннее принятие ставит в невыгодное положение людей, которые могли бы ответить более коротким ответом, но не были включены сайт в то время (часовые пояса или просто не всегда на PPCG 24/7)
HyperNeutrino

2
+1 для информирования людей оCtrl + K
Koishore Roy

Ответы:


17

V , 4 байта

Î4É 

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

(Обратите внимание на завершающий пробел)

V кодируется в Latin1, где это кодируется так:

00000000: ce34 c920                                .4. 

объяснение

Î            " On every line
 4É<space>   " Prepend 4 spaces

Вот решение, которое также составляет 4 байта в UTF-8!

VG4>

VG          " Select everything
   >        " Indent
  4         " 4 times (with spaces)

2
Надеюсь, кто-нибудь поднимет этот телефон, потому что кто-то позвонил.
Papayaman1000

Альтернативное решение:4ñ>G
DJMcMayhem

@DJMcMayhem Но он использует вкладки для отступа вместо пробелов
Kritixi Lithos

В VIM да. В V нет, это 4 пробела
DJMcMayhem

@DJMcMayhem Спасибо, это вдохновило другое альтернативное решение, которое в UTF-8 занимает всего 4 байта!
Критиси Литос

9

Crayon , 7 байтов

`¤q;3xq

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

объяснение

Crayon - это стековый язык, предназначенный для создания ASCII-арта. Он все еще находится на ранней стадии разработки, но он знает достаточно, чтобы завершить эту задачу с довольно низким количеством байтов:

         Implicit: input string is on the stack
`¤       Push a non-breaking space to the stack.
  q;     Draw this at the cursor (0,0 by default) and pop it.
    3x   Move three more spaces to the right.
      q  Draw the input string here (at 4,0).
         Implicit: output the canvas, trimmed to a rectangle

Рисование неразрывного пробела необходимо, потому что Crayon автоматически обрезает вывод в прямоугольник, поэтому без NBSP он просто напечатает исходный ввод.


Позволит ли Crayon сделать обратное: вывести строку, затем переместить четыре пробела влево и вывести nbsp? Это, вероятно, будет стоить дешевле при манипуляциях со стеком, хотя я не знаю, правильно ли Crayon переместит холст в нужное место.

@ ais523 Хм, это действительно хорошая идея ... к сожалению, это потребовало бы перехода к x = -4, что на данный момент не простая задача. Я действительно должен продвинуть эти изменения, над которыми я работал в течение месяца ...: P
ETHproductions

7

Сетчатка , 8 байт

%`^

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

На второй строке четыре пробела. Альтернативные решения используют либо m`^или, %1`либо 1%`в первой строке. Все они соответствуют позиции в начале каждой строки и заменяют ее четырьмя пробелами.


Я подозревал, что ответ Retina будет первым.
Нил

Ну, это было быстро.
Papayaman1000

@Neil Я буду удивлен, если это не будет побеждено V (или даже сырым Vim). :)
Мартин Эндер

1
@MartinEnder А вот и я (4 байта в V): codegolf.stackexchange.com/a/115870/41805 :)
Kritixi Lithos,

7

Чеддер, 31 байт

@.lines.map(("    ":+)).asLines

Действительно просто, но я написал, потому что это демонстрирует новые функциональные операторы.

(" ":+)так же, как A -> " " + A. (т.е. +оп как функция с " "привязкой к LHS).

Я не думаю, что даже нуждается в объяснении


О, вы изменили, как работает парсер? Из того, что я помню :, возникли бы проблемы с?:
Конор О'Брайен

@ ConorO'Brien Я вроде забыл, как я это исправил, но я верю, что, поскольку :нет совпадений ?, парсер выберет его для функциональной операции. Это все еще требует, чтобы функциональная
операция

+1 для смайлика:+)
LarsW

Что @значит?
Утренняя монахиня

6

Python ,  44  39 байт

Вычеркнуто 44 & NBSP; больше не 44 :)

-5 байт благодаря ovs (избегайте удаления с предприставкой)

lambda s:' '*4+s.replace('\n','\n    ')

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


lambda s:' '*4+s.replace('\n','\n ')39 байт
OVS

@ovs - я этого не вижу ... ты имеешь в виду lambda s:' '*4+s.replace('\n','\n ')[1:]40 (что не работает) или что-то еще?
Джонатан Аллан

1
Просто lambda s:' '*4+s.replace('\n','\n<4 spaces>') TIO
овс

@ovs Ах да, конечно (рендеринг отступа от комментария в четырех местах бросил меня, и я тоже не заметил этого в своем ответе) спасибо за экономию!
Джонатан Аллан

6

JavaScript, 26 байт

Спасибо @Conor O'Brien за игру в 8 байт

x=>x.replace(/^/gm,"    ")

Заменить на регулярное выражение с / g заменяет все экземпляры. m заставляет регулярное выражение обрабатывать каждую строку отдельно для начала строки ^.

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


Кажется, что беспорядочные пробелы во вводе asdfповторяются снова и снова.
Papayaman1000

Вы должны заметить, что я положил в качестве ввода в
TIO

Вы можете сэкономить несколько байтов, выполнив x=>x.replace(/^|\n/g,"$&    ")первые строки и следующие строки за один раз
ETHproductions


1
Или ^ тоже работает, я думаю ;-)
ETHproductions

4

Python 2, 87 45 байт

print' '*4+'\n    '.join(input().split('\n'))

Ввод принимается как 'Line1\nLine2\nLine3...'(необходимо цитаты)

Спасибо @WheatWizard за предоставленную мне идею, которая помогла мне сыграть в гольф 42 байта.


Я вырос на питоне. Вот что заставило меня думать, что это будет довольно сложно. Даже без учета RegEx, я был так неправильно, получается.
Papayaman1000

@ Papayaman1000 Это довольно тривиальная задача, как с RegEx, так и без него, хотя я нахожу это очень интересным.
HyperNeutrino

2
Я признаю, поскольку, поскольку я не знал об этом Ctrl + K, реальные причины предлагаемого вызова были ... меньше, чем просто чистая загадка.
Papayaman1000

@ Papayaman1000 Хаха, да, это было довольно неприятно - нажимать пробел 4 раза перед каждой строкой. Тем более, что я обычно использую Python и поэтому у меня все время несколько строк (это не так плохо, когда я использовал Java). В конце концов я просто стал ленивым и использовал свой текстовый редактор для замены ^на ``.
HyperNeutrino

1
@WheatWizard Спасибо за предложение, я немного проиграл. Это сейчас немного лучше?
HyperNeutrino

4

Желе , 8 байт

Ỵṭ€⁶ẋ4¤Y

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

Как?

Ỵṭ€⁶ẋ4¤Y - Main link: string
Ỵ        - split on newlines
      ¤  - nilad followed by ink(s) as a nilad:
   ⁶     -     a space character
    ẋ4   -     repeated four times
 ṭ€      - tack for €ach
       Y - join with newlines

Некоторые другие 8-байтовые варианты:
Ỵṭ€⁶Yµ4¡(4 повторения разбиения на новых строках, вставьте один пробел);
⁶ḤḤ;ЀỴY(удвоение в два раза похоже на умножение на 4, Ѐсопоставление с правильным аргументом, поэтому мы можем объединять вместо привязки);
и другие их перестановки.


4

Emacs, 5 брелоков, 5 байт

C-x h M-4 C-x tab

По крайней мере, в одной обычно используемой кодировке для ввода с клавиатуры каждая из этих цепочек ключей представляет собой один байт: 18 68 b4 18 09 . Записи в Emacs, как правило, очень тяжелы для ключей, так как каждый печатный символ ASCII обозначает себя, за исключением последующего символа многосимвольной команды (это означает, что только действующие команды могут использоваться только для ключей).

Я не уверен, как это сравнивается с Vim (в отличие от V). Но Vim довольно широко используется в PPCG, и поэтому я подумал, что другая сторона войн редакторов также заслуживает своего времени в центре внимания.

Это предполагает, что ввод / вывод осуществляется через буфер (эквивалент нормальных соглашений ввода / вывода для vim) или берется из файла и выводится на экран (что аналогично). Если вместо этого вы выполняете ввод-вывод через регион, что является естественным для некоторых форм программы, вы можете удалить два первых символа, чтобы получить оценку 3 байта; Однако я не думаю, что это соответствует правилам PPCG.

объяснение

C-x h M-4 C-x tab
C-x h               Specify the entire buffer as the region
      M-4           Give the argument 4 to the next command that runs
          C-x tab   Increase the indentation level of each line by a constant

Последнее встроенное здесь, конечно, невероятно полезно для этой задачи; остальное просто структура.


3

PowerShell, 29 28 байт

"$args"-split"
"|%{" "*4+$_}

-1 Благодаря fergusq, используя реальный перевод строки вместо `n

принимает "$args"входные данные в виде строки (приведенной с использованием "s") и -splitпомещает ее на новую строку , затем %{}перебирает ( ) через нее, добавляя четыре пробела ( " "*4) и строка ( $_) затем выводит ее неявно.


Можете ли вы использовать символ новой строки вместо `n?
fergusq

@ Fergusq действительно могу, обновил.
Colsw

Предположительно символ новой строки в окнах \ r \ n равен двум байтам - или есть правила, поясняющие, сколько байт занимает символ новой строки?
poizan42

@ poizan42 Я не уверен, есть ли на нем мета-пост, но я могу запустить его в консоли по умолчанию, используя только символ новой строки, поэтому нет причин считать его недействительным.
colsw

3

Pyth, 10 байт

jm+*4\ d.z

Попытайся!

Если бы вход в виде списка строк был разрешен, я мог бы сделать это в 7 байтов:

jm+*4\ 

Попробуй это

более длинные решения:

12 байт:

+*4d:Eb+b*4d

12 байт:

+*4dj+b*4d.z

13 байт:

t:E"^|
"+b*4d

Получил до 9:jbm*4\ .z
хлоп


Я забыл d, упс. В любом случае, ваш 10-байтный ответ - это то, к чему я
хлопните

2

Рёда , 21 байт

{(_/"
")|[`    $_
`]}

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

Это анонимная функция. Вход извлекается из потока.

Объяснение:

{
    (_/"\n") |        /* Splits the input at newlines */
    ["    ".._.."\n"] /* For each line, prints four spaces before the line */
}

Есть ли identity()просто вытащить все значения из STDIN?
Критиси Литос

@KritixiLithos Да. identityизвлекает значения из входного потока и передает их в выходной поток. Это идентично push(x) for x.
fergusq

2

Perl 5 , 11 + 1 = 12 байт

11 байт кода + -pфлаг.

s/^/    /mg

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

На этот раз объяснения будут короткими: регулярное выражение заменяет каждое начало строки (в ^сочетании с /mмодификатором) на четыре пробела - конец.


Это читает ввод строки за раз, а не строку в целом.

@ ais523 Примерно половина ответов, включая два верхних, прочитали ввод точно так же.
Максим Михайлов

@ ais523 Я бы сказал, что он обрабатывает ввод по одной строке за раз, но он может прочитать его как целую строку (например, если вы предоставите ему <<< "..."). Ты не согласен?
Дада

@ ais523, подумав немного об этом, думаю, ты прав. (Я обновить свой код соответственно)
Dada


2

sed , 16 10 9 байт

s/^/    /

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

Правки

Уменьшен размер решения с 16 до 10 байт благодаря Kritixi Lithos .

-1 байт благодаря сешумаре .


Вы можете получить до 15 байтов, используя -rфлаг (1 байт), так что вы можете удалить обратную косую черту перед скобками.
Критиси Литос

Вы можете получить до 13 с помощью s/.*/ &/(удалить скобки и заменить \1с &)
Kritixi Lithos

@KritixiLithos Спасибо! Работает даже без *.
Максим Михайлов

Или просто s:^: :, для 9 байтов.
Сешумара

@seshoumara Я никогда не видел, чтобы двоеточия использовались таким образом в сценарии sed ... Вы знаете, какая часть руководства описывает этот синтаксис?
Максим Михайлов

2

Java 7, 58 байт

String c(String s){return"    "+s.replace("\n","\n    ");}

Объяснение:

Попробуй это здесь.

  • Добавить с четырьмя ведущими пробелами
  • Заменить каждую новую строку на новую строку + четыре пробела

Мне всегда грустно, что механизмы регулярных выражений Java по большей части требуют других библиотек.
Poke

Я думаю тебе нужно replaceAll
Халед.К

@ Khaled.K Почему? И то .replaceи другое .replaceAllзаменит все найденные строки с заменой. .replaceиспользуется для буквенных строк и .replaceAllрегулярных выражений. Поскольку \nэто не регулярное выражение, его .replaceможно без проблем использовать для замены всех новых строк на новую строку + четыре пробела, что вы также можете проверить по ссылке «Попробуй», которую я предоставил.
Кевин Круйссен

2

Brain-Flak , 109 103 байта

-6 благодаря Мастеру Пшеницы

Включает +1 для -c

((()()()()()){}){(({}<>)[()()((()()()()){})]<(((((({}){}){}))))>){(<{}{}{}{}{}>)}{}<>}<>{({}<>)<>}<>{}

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

((()()()()()){})        # Add a newline to the beginning
                        # This is needed to get spaces infront of the first line)
{                       # For every character (call it C)
  (({}<>)               #   Move C to the other stack
  [()()((()()()()){})]  #   Push 8 and subtract 10 (\n) from C
  <(((((({}){}){}))))>) #   Push 4 spaces using the 8 from earlier
  )                     #   Push C - 10
  {(<                   #   If C - 10 != 0...
    {}{}{}{}{}          #     Pop the 4 spaces that we added
  >)}{}                 #   End if
  <>                    #   Switch stacks to get the next character
}                       # End while
<>{({}<>)<>}<>          # Reverse the stack (back to the original order)
{}                      # Pop the newline that we added



@WheatWizard Ницца. Мне нужно начать искать такие увольнения. Это, вероятно, случается со мной больше, чем пуш-поп. Это просто автоматически сейчас. Благодарность
Райли




1

MATL , 12 байт

10&Yb"4Z"@gh

Ввод - это строка с символами новой строки. Чтобы ввести это, вам нужно объединить символ 10 между обычными символами для представления новой строки (квадратные скобки являются конкатенацией):

['Code' 10 'More code']

Попробуйте это в MATL онлайн!

объяснение

10&Yb   % Implicit input. Split at char 10 (newline). Gives cell array of strings
"       % For each
  4Z"   %   Push string of 4 spaces
  @g    %   Push the contents of current cell array, i.e. a string with one of the
        %   original lines
  h     %   Concatenate the two strings horizontally
        % Implicit end. Implicit display

1

PHP, 16

echo"    $argn";

беги с php -R <code>. -Rзапускает данный код для каждой строки ввода и $argnполучает текущую строку ввода. Так что это просто печатает каждую строку с дополнительными четырьмя пробелами перед ней.


1

V , 3 байта (не конкурирует)

4>G

В этом ответе используется функция, которую я планировал добавить некоторое время, но только что нашел способ добавить сегодня. Это делает этот ответ неконкурентным и недействительным для победы. Но все же здорово показать такую ​​полезную / конкурентоспособную особенность!

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

Объяснение:

4>   " Add an indent of 4 to...
  G  "   Every line from the current line (0 by default) to the end of the buffer

Ухоженная! По крайней мере, гордитесь тем, что ваш язык занял первое место даже заранее [даже если это грязный язык игры в гольф ... нет, jk]!
Papayaman1000

1

Vim, 6 нажатий клавиш

<Ctrl-V>G4I <Esc>

Предполагается, что курсор находится в начале файла, как если бы вы открывали файл из командной строки с помощью vim filename.

<Ctrl-V>            " Enter visual block move (enables rectangular selection)
        G           " Move to bottom line (selecting the entire first column)
         4          " Repeat the following action 4 times
          I         " Insert at start of (each selected) line
                    " [input a space]
            <Esc>   " Exit insert mode

С ВИМ настроен для использования 4 пробела для отступа было бы 2 нажатия клавиш: >G.


Я уверен, что вы можете удалить ZZв конце. Обычно отправка vim - это просто вывод в буфер, а не в файл.
DJMcMayhem

Хорошо, спасибо, я удалил ZZтогда.
Даниеро

1

Japt , 7 6 байт

Сохранено 1 байт благодаря @ETHproductions

miS²²R

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

Объяснение:

miS²²R
m       // At each char in the input:
 iS²²   //   Prepend " " repeated 4 times
     R  // Rejoin with newlines  

Хорошая работа. S²²будет работать на месте Sp4, а не то, что это спасет вас в этом случае. Говоря об этом, я думаю, что вы можете просто сделать, miS²²Rчтобы удалитьR флаг (в основном miS²², но разделить на новые строки заранее и присоединиться с новыми строками позже)
новым

1

UberGenes , 62 байта

Мне пришлось вступить в эту проблему с UberGenes, так как очень похожая программа (в которую вставлен только один пробел) была одной из первых программ, которые я когда-либо писал на языке, и казалось, что ее будет легко изменить для этой цели.

=aA=p9=z4=cI=AC+a1-z1:pz=Ao:CA:Ii  =b5+b5-bA+a1=d3*d7:db=i0   

Как это устроено:

=aA                                                         Set a to 61
                                                            (Begin main loop)
   =p9                                                      Set p to 9
      =z4                                                   z counts spaces
         =cI                                                Set c to 61
                                                            (Jumping to p jumps here)
            =AC                                             Put the space at position 61
                                                              at position a.
               +a1-z1                                       Move a right and decrement z
                     :pz                                    Jump to p if z is nonzero
                                                            (Jumping to d jumps here)
                        =Ao                                 Read a character to position a.
                           :CA                              Jump to position 32+3 if input
                                                              was nonzero.
                              :Ii                           Otherwise, jump to position 61,
                                                              causing the entire string
                                                              that begins there to be
                                                              printed before halting.
                                                            (This is position 32+3=35)
                                   =b5+b5                   Set b to 10 (newline).
                                         -bA                Subtract the input character to
                                                              compare it with newline.
                                            +a1             Move a right.
                                               =d3*d7       Set d to 21
                                                     :db    Jump to d if not newline.
                                                        =i0 Jump back to begin main loop.
(The 3 spaces at the end position a space character at position 61 so that, after =cI,
C refers to the space character--it will also be the first space printed.)

1

CJam , 11 байт

Благодаря @ Challenger5 за исправление

qN/{S4*\N}%

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

объяснение

q              e#  Read whole input as a string with newlines
 N/            e#  Split at newlines, keeping empty pieces. Gives an array of strings
   {     }%    e#  Map this function over the array of strings
               e#  The current string is automatically pushed
    S4*        e#  Push a string of four spaces
       \       e#  Swap. Moves the original string after the four spaces
        N      e#  Push a newline
               e#  Implicity display stack contents

1
Не работает на abc\n\ndef. Возвращается, ....abc\n....defпотому что %отбрасывает пустые элементы. Вы хотите использовать /вместо разделения, потому что он сохраняет пустые элементы.
Esolanging Fruit

@ Challenger5 Спасибо, исправлено!
Луис Мендо

1

J-uby , 17 16 байт

~:gsub&' '*4&/^/

объяснение

~:gsub           # :gsub with reversed arguments: 
                 # (f)[regex,sub,str] == str.gsub(regex, sub)
      &' '*4     # replace with four spaces
            &/^/ # match the start of each line

Это прямо переводит на (в Ruby):

->s{s.gsub(/^/,' '*4)}


1

C 66 65 байт

p(){printf("    ");}f(char*s){for(p();*s;)putchar(*s++)-10||p();}

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


Отличное решение, но вы могли бы пойти с s;char*l;f(){while(getline(&l,&s,stdin)+1)printf("____%s",l);} какими 62 байтами
Khaled.K

@ Khaled.K Спасибо, но, кажется, это не работает без учета <stdio.h>(из-за stdin).
Steadybox
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.