Utwórz narzędzie do blokowania kodu

18

Podczas korzystania ze znaczników, podobnie jak w sieci SE, wcięcie czterech spacji przed wierszem tekstu oznacza go jako część bloku kodu, jak mam nadzieję, wiesz. Jeśli nie, oto przykład (z .reprezentacją spacji):

.... Kod
.... Więcej kodów

prowadzi do

Code
More code

Problem polega na tym, że po skopiowaniu i wklejeniu kodu do odpowiedzi należy ręcznie wciąć każdy wiersz. Jest to szczególnie trudne w przypadku pracy z nie golfowym kodem, ponieważ prawdopodobnie jest już wcięty i może powodować zamieszanie. Możesz po prostu wybrać kod i nacisnąć Ctrl + K, jak się okazuje. Godziny mojego życia zmarnowane bez żadnego powodu ...

Zatem twoim celem jest, biorąc pod uwagę dane wejściowe, zwrócić go z czterema spacjami przed każdą linią. Aby zaoszczędzić czas na wklejanie i kopiowanie, musisz przetwarzać cały tekst jako pojedynczy ciąg znaków (o ile Twój język może go parsować). Jeśli twój język nie jest w stanie przetworzyć znaku (np. Nowego wiersza) w łańcuchach, możesz założyć, że jest on oznaczony / zmieniony za pomocą innej metody obsługiwanej przez ten język; jednak dane wyjściowe muszą wysyłać każdy wiersz w osobnym wierszu (więc nie należy przekazywać czegoś podobnego ....foo\n....bar).

Standardowe luki są niedozwolone. Ponieważ jest to , wygrywa najkrótsza odpowiedź w bajtach. Powodzenia!

Papayaman1000
źródło
3
„musisz ręcznie wciąć każdą linię” (lub zaznaczyć tekst i kliknąć przycisk :))
Jonathan Allan
11
@JonathanAllan „Button”? Na pewno masz na myśli „skrót klawiaturowy”. (Ctrl + K)
Martin Ender
31
@JonathanAllan ... ja ... jestem bardzo zdenerwowany. TAK DUŻO CZASU. ZMARNOWANY.
Papayaman1000,
6
Chociaż jestem całkiem pewien, że odpowiedź V Kritixi nie zostanie pobita, zwykle zalecałbym poczekać nieco dłużej, zanim zaakceptujesz odpowiedź, ponieważ zaakceptowanie tak wcześnie stanowi wadę dla osób, które mogłyby odpowiedzieć krótszą odpowiedzią, ale nie były na strona w tym czasie (strefy czasowe lub po prostu nie zawsze są w PPCG 24/7)
HyperNeutrino
2
+1 za informowanie ludzi oCtrl + K
Koishore Roy

Odpowiedzi:

17

V , 4 bajty

Î4É 

Wypróbuj online!

(Zwróć uwagę na spację końcową)

V jest kodowany w Latin1, gdzie jest to kodowane w następujący sposób:

00000000: ce34 c920                                .4. 

Wyjaśnienie

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

Oto rozwiązanie, które ma również 4 bajty w UTF-8!

VG4>

VG          " Select everything
   >        " Indent
  4         " 4 times (with spaces)
Kritixi Lithos
źródło
2
Mam nadzieję, że ktoś odbierze ten telefon, bo wow, jak ktoś to nazwał.
Papayaman1000,
Alternatywne rozwiązanie:4ñ>G
DJMcMayhem
@DJMcMayhem Ale używa tabulacji do wcięcia zamiast spacji
Kritixi Lithos
W vimie tak. W V nie, to 4 spacje
DJMcMayhem
@DJMcMayhem Dzięki, to zainspirowało inne alternatywne rozwiązanie, które ma tylko 4 bajty w UTF-8!
Kritixi Lithos
9

Kredka , 7 bajtów

`¤q;3xq

Wypróbuj online!

Wyjaśnienie

Crayon to język oparty na stosie, zaprojektowany do tworzenia sztuki ASCII. Jest wciąż na wczesnym etapie rozwoju, ale wie wystarczająco dużo, aby ukończyć to wyzwanie z dość małą liczbą bajtów:

         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

Narysowanie niełamliwej przestrzeni jest konieczne, ponieważ Crayon automatycznie przycina wydruk do prostokąta, więc bez NBSP po prostu wydrukowałby oryginalne wejście.

ETHprodukcje
źródło
Czy Crayon pozwoli ci zrobić coś przeciwnego: wypisz ciąg, a następnie przesuń cztery spacje w lewo i wypisz nbsp? To prawdopodobnie kosztuje mniej przy manipulowaniu stosem, chociaż nie wiem, czy Crayon poprawnie przesunął płótno we właściwe miejsce.
@ ais523 Hmm, to naprawdę dobry pomysł ... niestety, wymagałby przejścia do x = -4, co w tej chwili nie jest łatwym zadaniem. Naprawdę powinienem wprowadzić zmiany, nad którymi pracuję od miesiąca ...: P
ETHproductions
7

Siatkówka , 8 bajtów

%`^

Wypróbuj online!

W drugiej linii są cztery spacje. Rozwiązania alternatywne użyć jednej m`^lub %1`lub 1%`na pierwszej linii. Wszystkie pasują do pozycji na początku każdej linii i zastępują ją czterema spacjami.

Martin Ender
źródło
Podejrzewałem, że odpowiedź na siatkówkę będzie pierwsza.
Neil,
Cóż, to było szybkie.
Papayaman1000,
@Neil Będę zaskoczony, jeśli nie zostanie pobity przez V (lub nawet surowego Vima). :)
Martin Ender,
1
@MartinEnder Proszę bardzo (4 bajty w V): codegolf.stackexchange.com/a/115870/41805 :)
Kritixi Lithos
7

Cheddar, 31 bajtów

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

Naprawdę po prostu, ale napisałem, ponieważ pokazuje nowe operatory funkcjonalne.

(" ":+)jest taki sam jak A -> " " + A. (tj. +op jako funkcja " "związana z LHS).

Myślę, że nawet nie potrzebuje wyjaśnienia

Downgoat
źródło
Och, zmieniłeś sposób działania parsera? Z tego, co pamiętam :, spowodowałoby problemy?:
Conor O'Brien
@ ConorO'Brien Trochę zapomniałem, jak to naprawiłem, ale wierzę, że ponieważ nie :ma dopasowania ?, parser zdecyduje się potraktować go jako funkcjonalną operację. Wciąż wymaga to opakowania funkcjonalnego w pareny, ale tak
Downgoat
+1 za buźkę:+)
LarsW
Co @znaczy
Leaky Nun
6

Python ,  44  39 bajtów

Przekreślony & nbsp; 44 & nbsp; nie ma już 44 :)

-5 bajtów dzięki ovs (unikaj dequeue z prepend)

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

Wypróbuj online!

Jonathan Allan
źródło
lambda s:' '*4+s.replace('\n','\n ')za 39 bajtów
ows
@ovs - nie widzę ... masz na myśli lambda s:' '*4+s.replace('\n','\n ')[1:]40 (co nie działa) czy coś innego?
Jonathan Allan,
1
Wystarczy lambda s:' '*4+s.replace('\n','\n<4 spaces>') TIO
OVS
@ovs Ach tak, oczywiście (komentarz rzucił mi cztery spacje renderowania znaczników i nie zauważyłem tego w odpowiedzi) dzięki za zapisanie!
Jonathan Allan,
6

JavaScript, 26 bajtów

Dzięki @Conor O'Brien za grę w golfa poza 8 bajtami

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

Zamień na wyrażenie regularne na / g zastępuje wszystkie wystąpienia. m sprawia, że ​​regex traktuje każdą linię osobno na początek ciągu ^.

Wypróbuj online!

Fəˈnɛtɪk
źródło
Wygląda na to, że zbiera spacje w danych wejściowych w celu asdfpowtarzania w kółko.
Papayaman1000,
Powinieneś zwrócić uwagę na to, co
podałem
Możesz zaoszczędzić kilka bajtów, wykonując jeden x=>x.replace(/^|\n/g,"$&    ")wiersz i kolejne wiersze za jednym razem
ETHproductions
1
26 bajtów: Wypróbuj online!
Conor O'Brien
1
Albo ^ chyba też działa ;-)
ETHproductions
4

Python 2, 87 45 bajtów

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

Dane wejściowe są traktowane jako 'Line1\nLine2\nLine3...'(konieczne są oferty)

Dzięki @WheatWizard za pomysł, który pomógł mi w golfie 42 bajty.

HyperNeutrino
źródło
Dorastałem na Pythonie. Właśnie dlatego pomyślałem, że byłoby to trochę trudne. Okazuje się , że nawet ignorując RegEx, tak się myliłem.
Papayaman1000,
@ Papayaman1000 To dość trywialne wyzwanie, zarówno z RegEx, jak i bez niego, choć uważam, że jest bardzo interesujące.
HyperNeutrino
2
Przyznam, że skoro nie wiedziałem Ctrl + K, prawdziwymi powodami tego wyzwania były ... mniej niż zwykła zagadka.
Papayaman1000,
@ Papayaman1000 Haha, tak, dość denerwujące było wciskanie spacji 4 razy przed każdą linią. Zwłaszcza, że ​​zwykle używam Pythona, a więc mam wiele linii przez cały czas (nie jest tak źle, kiedy korzystałem z Javy). W końcu stałem się leniwy i użyłem mojego edytora tekstu, by zamienić na ^``.
HyperNeutrino
1
@WheatWizard Dzięki za sugestię, grałem trochę w golfa. Czy teraz jest trochę lepiej?
HyperNeutrino
4

Galaretka , 8 bajtów

Ỵṭ€⁶ẋ4¤Y

Wypróbuj online!

W jaki sposób?

Ỵṭ€⁶ẋ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

Inne 8-bajtowe warianty to:
Ỵṭ€⁶Yµ4¡(4 powtórzenia podziału na nowe wiersze, zaznacz jedną spację);
⁶ḤḤ;ЀỴY(dwukrotne podwojenie jest jak pomnożenie przez 4, Ѐmapy nad odpowiednim argumentem, dzięki czemu możemy konkatenować zamiast halsowania);
i inne ich zmiany.

Jonathan Allan
źródło
4

Emacs, 5 słów kluczowych, 5 bajtów

C-x h M-4 C-x tab

W co najmniej jednym z najczęściej używanych kodowania do wprowadzania za pomocą klawiatury, każdy z tych keychords jest pojedynczy bajt: 18 68 b4 18 09. Wpisy Emacsa są zwykle bardzo obciążone na słowa-klucze, ponieważ każdy znak ASCII, który można wydrukować, jest sam w sobie, chyba że jest to kolejny znak polecenia wieloznakowego (co oznacza, że ​​do wydawania poleceń można używać tylko słów kluczowych).

Nie jestem pewien, jak to się ma do Vima (w przeciwieństwie do V). Ale Vim jest dość powszechnie używany w PPCG, więc pomyślałem, że druga strona wojen edytorskich zasługuje na swój czas w centrum uwagi.

Zakłada się, że operacje we / wy są wykonywane przez bufor (odpowiednik normalnych konwencji we / wy dla vima) lub pobierane z pliku i wyprowadzane na ekran (co dochodzi do tego samego). Jeśli zamiast tego wykonujesz operacje wejścia / wyjścia za pośrednictwem regionu, co jest naturalne w przypadku niektórych form programu, możesz usunąć dwa pierwsze znaki, uzyskując wynik 3 bajtów; nie sądzę jednak, aby było to zgodne z zasadami PPCG.

Wyjaśnienie

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

Ostatnie użyte tutaj wbudowanie jest oczywiście niezwykle przydatne w tym wyzwaniu; reszta to tylko struktura.


źródło
3

PowerShell, 29 28 bajtów

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

-1 Dzięki fergusq, użycie rzeczywistej nowej linii zamiast `n

pobiera dane "$args"wejściowe jako ciąg znaków (rzutuje się za pomocą „s”) -splits na nowej linii, a następnie wykonuje pętlę ( %{}), dodając cztery spacje ( " "*4) i wiersz ( $_), a następnie generuje je niejawnie.

colsw
źródło
Czy możesz użyć znaku nowej linii zamiast `n?
fergusq
@fergusq rzeczywiście mogę, zaktualizowałem.
colsw
Przypuszczalnie znakiem nowego wiersza jest \ r \ n w systemie Windows, który wciąż ma dwa bajty - czy istnieją reguły wyjaśniające, ile bajtów zajmuje znak nowej linii?
poizan42
@ poizan42 Nie jestem pewien, czy jest na nim meta post, ale mogę go uruchomić w domyślnej konsoli tylko z nową linią, więc nie ma powodu, aby uważać go za nieprawidłowy.
colsw
3

Pyth, 10 bajtów

jm+*4\ d.z

Spróbuj!

Jeśli wprowadzanie jako listy linii byłoby dozwolone, mógłbym to zrobić w 7 bajtach:

jm+*4\ 

Spróbuj tego

dłuższe rozwiązania:

12 bajtów:

+*4d:Eb+b*4d

12 bajtów:

+*4dj+b*4d.z

13 bajtów:

t:E"^|
"+b*4d
KarlKastor
źródło
Zrobiłem to do 9:jbm*4\ .z
klaskać
Zapomniałem d. W każdym razie twoja 10 bajtowa odpowiedź jest tym, o co mi chodziło
klaśnięcie
2

Röda , 21 bajtów

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

Wypróbuj online!

To anonimowa funkcja. Dane wejściowe są pobierane ze strumienia.

Wyjaśnienie:

{
    (_/"\n") |        /* Splits the input at newlines */
    ["    ".._.."\n"] /* For each line, prints four spaces before the line */
}
fergusq
źródło
Czy identity()po prostu pobiera wszystkie wartości z STDIN?
Kritixi Lithos
@KritixiLithos Tak. identitypobiera wartości ze strumienia wejściowego i wypycha je do strumienia wyjściowego. Jest identyczny z push(x) for x.
fergusq
2

Perl 5 , 11 + 1 = 12 bajtów

11 bajtów kodu + -pflaga.

s/^/    /mg

Wypróbuj online!

Po raz pierwszy wyjaśnienia będą krótkie: wyrażenie regularne zastępuje każdy początek wiersza (w ^połączeniu z/m modyfikatorem) czterema spacjami - końcem.

Dada
źródło
Odczytuje to wprowadzanie wiersza naraz, a nie ciąg znaków jako całości.
@ ais523 Mniej więcej połowa odpowiedzi, w tym dwie pierwsze, odczytuje dane wejściowe dokładnie w ten sam sposób.
Maxim Mikhaylov,
@ ais523 Powiedziałbym, że przetwarza dane wejściowe po jednym wierszu na raz, ale może odczytać je jako cały ciąg znaków (jeśli podasz mu na przykład <<< „...”). Nie zgadzasz się
Dada,
@ ais523, po przemyśleniu czegoś więcej, myślę, że masz rację. (Odpowiednio zaktualizowałem swój kod)
Dada,
2

Perl 6 , 11 bajtów

*.indent(4)

Spróbuj

Rozszerzony:

*\       # declare a WhateverCode lambda/closure (this is the parameter)
.indent( # call the `indent` method on the argument
  4      # with the number 4
)
Brad Gilbert b2gills
źródło
2

sed , 16 10 9 bajtów

s/^/    /

Wypróbuj online!

Edycje

Zmniejszony rozmiar rozwiązania z 16 do 10 bajtów dzięki Kritixi Lithos .

-1 bajt dzięki seshoumara .

Maxim Michajłow
źródło
Możesz dostać się do 15 bajtów, używając -rflagi (1 bajt), dzięki czemu możesz usunąć odwrotne ukośniki przed nawiasami.
Kritixi Lithos
Można uzyskać do 13 przy użyciu s/.*/ &/(usuń nawiasy i wymienić \1z &)
Kritixi Lithos
@KritixiLithos Thanks! Działa nawet bez *.
Maxim Mikhaylov,
Lub po prostu s:^: :dla 9 bajtów.
seshoumara,
@seshoumara Nigdy nie widziałem dwukropków używanych w ten sposób w skrypcie sed ... Czy wiesz, która część instrukcji opisuje tę składnię?
Maxim Mikhaylov,
2

Java 7, 58 bajtów

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

Wyjaśnienie:

Wypróbuj tutaj.

  • Dołącz z czterema wiodącymi spacjami
  • Zamień każdą nową linię na nową linię + cztery spacje
Kevin Cruijssen
źródło
Zawsze mi przykro, że mechanizmy wyrażeń regularnych Java w większości wymagają innych bibliotek.
Poke
Myślę, że potrzebujeszreplaceAll
Khaled.K
@ Khaled.K Dlaczego? Zarówno .replacei .replaceAllzastąpi wszystkie wystąpienia szukanego ciągu przez zastąpienie. .replacejest używany do dosłownych ciągów .replaceAllznaków i wyrażeń regularnych. Ponieważ \nnie jest wyrażeniem regularnym, .replacemożna go bez problemu zastąpić wszystkie nowe wiersze znakiem nowego wiersza + cztery spacje, które można również sprawdzić w podanym przeze mnie linku „Wypróbuj linię”.
Kevin Cruijssen
2

Brain-Flak , 109 103 bajtów

-6 dzięki Wheat Wizard

Obejmuje +1 dla -c

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

Wypróbuj 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
Riley
źródło
... i jeszcze dwa bajty
Post Rock Garf Hunter
@WheatWizard Nice. Muszę zacząć szukać takich zwolnień. Prawdopodobnie zdarza mi się to bardziej niż push pop. Teraz są po prostu automatyczne. Dzięki
Riley
1

PHP, 43 bajty

<?="    ".strtr($_GET[0],["\n"=>"\n    "]);
Jörg Hülsermann
źródło
1

Skumulowane , 13 bajtów

'^'4' '*mrepl

Wypróbuj online!

Wyjaśnienie

'^'4' '*mrepl      (* input: top of stack *)
        mrepl      perform multiline regex replacements,
'^'                  replacing /^/ with
   4' '*             four spaces
Conor O'Brien
źródło
1

MATL , 12 bajtów

10&Yb"4Z"@gh

Dane wejściowe to ciąg znaków z nowymi wierszami. Aby wprowadzić to, musisz połączyć znak 10 między normalnymi znakami, aby reprezentować znak nowej linii (nawiasy kwadratowe są konkatenacją):

['Code' 10 'More code']

Wypróbuj w MATL online!

Wyjaśnienie

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
Luis Mendo
źródło
1

PHP, 16

echo"    $argn";

biegać z php -R <code>. -Ruruchamia podany kod dla każdej linii wejściowej i $argnpodaje bieżącą linię wejściową. To po prostu drukuje każdą linię z dodatkowymi czterema spacjami przed nią.

Christoph
źródło
1

V , 3 bajty (niekonkurujące)

4>G

Ta odpowiedź korzysta z funkcji, którą planowałem dodać już od jakiegoś czasu, ale właśnie zacząłem dodawać dzisiaj. To sprawia, że ​​ta odpowiedź nie konkuruje i jest nieważna z powodu wygranej. Ale nadal fajnie jest pochwalić się taką przydatną / konkurencyjną funkcją!

Wypróbuj online!

Wyjaśnienie:

4>   " Add an indent of 4 to...
  G  "   Every line from the current line (0 by default) to the end of the buffer
DJMcMayhem
źródło
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.

daniero
źródło
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  
Oliver
źródło
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.)
quintopia
źródło
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
Luis Mendo
źródło
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)}
Cyoce
źródło
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
Mego
źródło
1

C, 66 65 bytes

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

Try it online!

Steadybox
źródło
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