Створіть інструмент для блокування коду


18

При використанні розмітки, як у мережі SE, відступ чотирьох пробілів перед рядком тексту позначає її як частину кодового блоку, як я сподіваюся, ви знаєте. Якщо цього немає, ось приклад (із .зображенням пробілу):

.... Код
.... Більше коду

призводить до

Code
More code

Проблема полягає в тому, що при копіюванні коду і вставки у відповідь потрібно вводити кожен рядок вручну. Це особливо складно при роботі з кодом, який не використовується для гольфу, оскільки він, ймовірно, вже з відступом і може спричинити плутанину. Можна просто вибрати свій код і натиснути Ctrl + K, виявляється. Години мого життя даремно витрачалися без уваги ...

Отже, ваша мета полягає в тому, щоб отримати дані, повернути її з чотирма пробілами перед кожним рядком. В дусі заощадження часу на копіювання, ви повинні обробити весь вхід як один рядок (до тих пір, поки ваша мова зможе його розібрати). Якщо ваша мова не в змозі обробити символ (наприклад, нові рядки) в рядках, ви можете припустити, що він позначається / уникається за допомогою іншого методу, підтримуваного мовою; однак, вихід повинен виводити кожен рядок у своєму власному рядку (таким чином, не передаючи щось подібне ....foo\n....bar).

Стандартні лазівки не допускаються. Оскільки це , виграє найкоротша відповідь у байтах. Удачі!


3
"Вам потрібно відступити кожен рядок вручну" (або виберіть текст і натисніть кнопку :))
Джонатан Аллан

11
@JonathanAllan "Кнопка"? Звичайно, ви маєте на увазі "комбінацію клавіш". (Ctrl + K)
Мартін Ендер

31
@JonathanAllan ... Я ... я дуже засмучений. ТАКИЙ ЧАС. ВІДХОДЕН.
Papayaman1000

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

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

Відповіді:


17

V , 4 байти

Î4É 

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

(Зверніть увагу на пробіл)

V кодується латинським1, де це закодовано так:

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

In vim, так. У V ні, це 4 місця
DJMcMayhem

@DJMcMayhem Дякую, що надихнуло ще одне альтернативне рішення, яке становить лише 4 байти в UTF-8!
Kritixi Lithos

9

Олівець , 7 байт

`¤q;3xq

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

Пояснення

Crayon - мова на основі стека, створена для створення ASCII-art. Це ще на ранніх стадіях розробки, але він знає достатньо, щоб закінчити цю проблему досить низьким числом байтів:

         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 Here ya go (4 байти в V): codegolf.stackexchange.com/a/115870/41805 :)
Kritixi Lithos

7

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

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

Насправді просто, але я розмістив, оскільки це демонструє нових функціональних операторів.

(" ":+) те саме, що A -> " " + A . (тобто +op як функція, " "пов'язана з LHS).

Я не думаю, що навіть пояснення не потребує


Ой ти змінив, як працює парсер? З того, що я пам’ятаю, це :могло б створити проблеми з?:
Conor O'Brien

@ ConorO'Brien Я начебто забув, як я це виправив, але вважаю, що оскільки :немає відповідності ?, аналізатор вирішить трактувати це як функціональний варіант. Це все ще вимагає, щоб функціональний оп був загорнутий у парени, але так
Пуховик

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

Що @означає?
Лина монашка

6

Пітон ,  44  39 байт

Закреслено & nbsp; 44 & nbsp; вже не 44 :)

-5 байт завдяки ovs (уникайте dequeue з подачею)

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

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


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

@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
fəˈnɛtɪk

Ви можете зберегти кілька байт, виконавши, 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

Щонайменше , один часто використовується для кодування введення з клавіатури, кожна з цих keychords є один байт: 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

Піт, 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?
Kritixi Lithos

@KritixiLithos Так. identityвитягує значення з вхідного потоку і підштовхує їх до вихідного потоку. Він ідентичний push(x) for x.
fergusq

2

Perl 5, 11+1 = 12 bytes

11 байт коду + -pпрапор.

s/^/    /mg

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

Одного разу пояснення будуть короткими: регулярний вимір замінює кожен початок рядка (у ^поєднанні з /mмодифікатором) чотирма пробілами - кінцем.


Це зчитує введення рядка за часом, а не рядка в цілому.

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

@ ais523 Я б сказав, що він обробляє вхід по одному рядку, але він може читати його як цілий рядок (якщо, наприклад, ви постачаєте його <<< "..."). Ви не згодні?
Дада

@ ais523 подумавши трохи більше про це, я думаю, ти маєш рацію. (Я відповідно оновив свій код)
Дада,


2

sed, 16 10 9 bytes

s/^/    /

Try it online!

Edits

Reduced solution size from 16 to 10 bytes thanks to Kritixi Lithos.

-1 byte thanks to seshoumara.


You can get to 15 bytes by using the -r flag (1 byte) so that you can remove the backslashes before the parentheses.
Kritixi Lithos

You can get to 13 by using s/.*/ &/ (remove the parentheses and replace \1 with &)
Kritixi Lithos

@KritixiLithos Thanks! It works even without *.
Maxim Mikhaylov

Or simply s:^: :, for 9 bytes.
seshoumara

@seshoumara I've never seen colons used this way in a sed script... Do you know which part of the manual describes this syntax?
Maxim Mikhaylov

2

Java 7, 58 bytes

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

Explanation:

Try it here.

  • Append with four leading spaces
  • Replace every new-line for a new-line + four spaces

I am forever sad that Java's regex mechanisms require other libraries for the most part.
Poke

I think you need replaceAll
Khaled.K

@Khaled.K Why? Both .replace and .replaceAll will replace all occurrences of the searched String with the replacement. .replace is used for literal Strings, and .replaceAll for regexes. Since \n isn't a regex, .replace can be used without a problem to replace all newlines with a newline + four spaces, which you can also check in the "Try it line" link I provided.
Kevin Cruijssen

2

Brain-Flak, 109 103 bytes

-6 thanks to Wheat Wizard

Includes +1 for -c

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

Try it online!

((()()()()()){})        # 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 Nice. I need to start looking for redundancies like that. It probably happens to me more than push pop does. Those are just automatic now. Thanks
Riley




1

MATL, 12 bytes

10&Yb"4Z"@gh

Input is a string with newlines. To enter this, you need to concatenate character 10 between the normal characters to represent newline (square brackets are concatenattion):

['Code' 10 'More code']

Try it at MATL online!

Explanation

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

run with php -R <code>. -R runs the given code for every input line and $argn is fed the current input line. So this simply prints each line with additional four spaces in front of it.


1

V, 3 bytes (Non-competing)

4>G

This is answer uses a feature that I have been planning on adding for a while, but just got around to adding today. That makes this answer non-competing and invalid for winning. But it's still cool to show off such a useful/competitive feature!

Try it online!

Explanation:

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

Neat! At least take some pride in the fact that your language took the top spot even beforehand [even if it is a dirty golfing language... nah, jk]!
Papayaman1000

1

Vim, 6 keystrokes

<Ctrl-V>G4I <Esc>

Assumes that the cursor is on the beginning of the file, as if you opened the file from from the command line via 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

With a vim configured to use 4 spaces for indentation it would be 2 keystrokes: >G.


I'm pretty sure you can remove the ZZ at the end. Usually vim submissions are fine just outputting to the buffer rather than to a file.
DJMcMayhem

Alright thanks, I removed ZZ then.
daniero

1

Japt, 7 6 bytes

Saved 1 byte thanks to @ETHproductions

miS²²R

Try it online!

Explanation:

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

Nice job. S²² would work as well in place of Sp4, not that it saves you anything in this case. Speaking of which, I think you can just do miS²²R to remove the R flag (basically miS²², but split at newlines beforehand and join with newlines afterward)
ETHproductions

1

UberGenes, 62 bytes

I had to enter this challenge with UberGenes, as a very similar program (that only inserted one space) was one of the first programs I ever wrote in the language, and it seemed like it would be easy to modify for this purpose.

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

How it works:

=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 bytes

Thanks to @Challenger5 for a correction

qN/{S4*\N}%

Try it online!

Explanation

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
Doesn't work on abc\n\ndef. It returns ....abc\n....def because % discards empty elements. You want to use / to split instead, because it keeps the empty elements.
Esolanging Fruit

@Challenger5 Thanks, corrected!
Luis Mendo

1

J-uby, 17 16 Bytes

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

Explanation

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

This directly translates to (in Ruby):

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

1

Actually, 16 bytes

9uc;§s⌠' 4*+⌡M@j

Try it online!

Explanation:

9uc;§s⌠' 4*+⌡M@j
9uc;              push two newlines
    §s            raw input, split on newlines
      ⌠' 4*+⌡M    for each line:
       ' 4*+        prepend 4 spaces
              @j  join with newlines

1

C, 66 65 bytes

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

Try it online!


Neat solution, but you could go with s;char*l;f(){while(getline(&l,&s,stdin)+1)printf("____%s",l);} which 62 bytes
Khaled.K

@Khaled.K Thanks, but that doesn't seem to work without including <stdio.h> (because of the stdin).
Steadybox
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.