Creare uno strumento di blocco del codice


18

Quando si utilizza Markup, come sulla rete SE, un rientro di quattro spazi prima di una riga di testo lo indica come parte di un blocco di codice, come spero che tu sappia. In caso contrario, ecco un esempio (con la .rappresentazione di uno spazio):

.... Codice
.... Altro codice

risultati in

Code
More code

Il problema è che quando si copia e incolla il codice in una risposta, è necessario rientrare manualmente ciascuna riga. Ciò è particolarmente difficile quando si lavora con codice non salvato, poiché è probabilmente già rientrato e può causare confusione. Puoi semplicemente selezionare il codice e premere Ctrl + K, si scopre. Ore della mia vita sprecate senza motivo a parte ...

Quindi, il tuo obiettivo è, dato un input, restituirlo con quattro spazi prima di ogni riga. Nello spirito di risparmiare tempo per copiare e incollare, devi elaborare l'intero input come una singola stringa (purché la tua lingua possa analizzarlo). Se la tua lingua non è in grado di elaborare un carattere (come le nuove righe) nelle stringhe, puoi supporre che sia indicato / sfuggito attraverso qualche altro metodo supportato dalla lingua; tuttavia, l'output deve emettere ogni riga sulla propria riga (quindi non passare qualcosa di simile ....foo\n....bar).

Scappatoie standard non consentite. Dato che si tratta di , vince la risposta più breve in byte. In bocca al lupo!


3
"devi rientrare manualmente in ciascuna riga" (oppure seleziona il testo e fai clic sul pulsante :))
Jonathan Allan

11
@JonathanAllan "Button"? Sicuramente intendi "scorciatoia da tastiera". (Ctrl + K)
Martin Ender

31
@JonathanAllan ... Io ... sono molto turbato. COSÌ TANTO TEMPO. Sprecato.
Papayaman1000,

6
Mentre sono abbastanza fiducioso che la risposta a V di Kritixi non sarà battuta, in genere consiglierei di aspettare un po 'più a lungo prima di accettare una risposta, perché accettare così presto rappresenta uno svantaggio per le persone che potrebbero rispondere con una risposta più breve ma non erano attive il sito al momento (fusi orari o semplicemente non sempre su PPCG 24/7)
HyperNeutrino

2
+1 per informare la gente suCtrl + K
Koishore Roy

Risposte:


17

V , 4 byte

Î4É 

Provalo online!

(Nota lo spazio finale)

V è codificato in latino1, dove è codificato in questo modo:

00000000: ce34 c920                                .4. 

Spiegazione

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

Ecco una soluzione che è anche 4 byte in UTF-8!

VG4>

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

2
Spero che qualcuno risponda a quel telefono, perché wow qualcuno l'ha chiamato.
Papayaman1000

Soluzione alternativa:4ñ>G
DJMcMayhem

@DJMcMayhem Ma utilizza le schede per rientrare al posto degli spazi
Kritixi Lithos

In verità, sì. In V, no, sono 4 spazi
DJMcMayhem

@DJMcMayhem Grazie, che ha ispirato un'altra soluzione alternativa che è solo 4 byte in UTF-8!
Kritixi Lithos

9

Pastello , 7 byte

`¤q;3xq

Provalo online!

Spiegazione

Crayon è un linguaggio basato su stack progettato per la creazione di arte ASCII. È ancora nelle prime fasi di sviluppo, ma sa quanto basta per completare questa sfida con un numero di byte piuttosto basso:

         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

Disegnare lo spazio non interrotto è necessario perché Crayon ritaglia automaticamente l'output in un rettangolo, quindi senza NBSP stampa solo l'input originale.


Crayon ti permetterebbe di fare il contrario: emettere la stringa, quindi spostare quattro spazi a sinistra e produrre un nbsp? Probabilmente costerà meno nella manipolazione dello stack, anche se non so se Crayon sposterà correttamente la tela nel posto giusto.

@ ais523 Hmm, è davvero una buona idea ... sfortunatamente, ciò richiederebbe il passaggio a x = -4, che al momento non è un compito facile. Dovrei davvero spingere questi cambiamenti a cui sto lavorando da un mese ...: P
ETHproductions

7

Retina , 8 byte

%`^

Provalo online!

Ci sono quattro spazi sulla seconda riga. Le soluzioni alternative utilizzano m`^o %1`o 1%`sulla prima riga. Tutti questi corrispondono alla posizione all'inizio di ogni riga e la sostituiscono con quattro spazi.


Sospettavo che una risposta alla Retina sarebbe stata la prima.
Neil,

Beh, è ​​stato veloce.
Papayaman1000,

@Neil Sarò sorpreso se questo non viene battuto da V (o anche da Vim crudo). :)
Martin Ender

1
@MartinEnder Ecco qui (4 byte in V): codegolf.stackexchange.com/a/115870/41805 :)
Kritixi Lithos

7

Cheddar, 31 byte

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

Davvero semplicemente, ma ho pubblicato perché mette in mostra i nuovi operatori funzionali.

(" ":+)è lo stesso di A -> " " + A. (ovvero +op come funzione " "associata a LHS).

Non penso nemmeno che abbia bisogno di spiegazioni


Oh, hai cambiato il funzionamento del parser? Da quello che ricordo :causerebbe problemi con?:
Conor O'Brien,

@ ConorO'Brien Ho un po 'dimenticato come l'ho risolto, ma credo che poiché c'è un :senza corrispondenza ?, il parser sceglierà di trattarlo come un'operazione funzionale. Ciò richiede ancora che l'operazione funzionale sia racchiusa tra parentesi ma sì
Downgoat

+1 per emoticon:+)
LarsW

Cosa @significa?
Leaky Nun,

6

Python ,  44  39 byte

Barrato & nbsp; 44 & nbsp; non ha più 44 anni :)

-5 byte grazie agli ovs (evita il dequeue con un prepend)

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

Provalo online!


lambda s:' '*4+s.replace('\n','\n ')per 39 byte
ovs

@ovs - Non lo vedo ... intendi lambda s:' '*4+s.replace('\n','\n ')[1:]per 40 (che non funziona) o qualcos'altro?
Jonathan Allan,

1
Solo lambda s:' '*4+s.replace('\n','\n<4 spaces>') TIO
ovs

@ovs Ah sì, certo (il commento con il rendering del markdown dello spazio quattro mi ha gettato e non l'ho notato neanche nella mia risposta) grazie per il salvataggio!
Jonathan Allan,

6

JavaScript, 26 byte

Grazie @Conor O'Brien per il golf off 8 byte

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

Sostituisci con una regex con / g sostituisce tutte le istanze. m fa in modo che regex tratti ciascuna riga separatamente per l'inizio della stringa ^.

Provalo online!


Sembra mescolare non-spazi bianchi nell'input in asdfripetuti più e più volte.
Papayaman1000,

Dovresti notare ciò che avevo messo come input in TIO
f 8nɛtɪk

È possibile salvare alcuni byte eseguendo x=>x.replace(/^|\n/g,"$&    ")la prima riga e le seguenti righe in una volta sola
ETHproductions


1
Oppure ^ credo anche io ;-)
ETHproductions

4

Python 2, 87 45 byte

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

L'immissione è considerata come 'Line1\nLine2\nLine3...'(virgolette necessarie)

Grazie a @WheatWizard per avermi dato un'idea che mi ha aiutato a golf 42 byte.


Sono cresciuto su Python. Questo è ciò che mi ha fatto pensare che sarebbe stato un po 'difficile. Anche ignorando RegEx, mi sbagliavo così tanto , risulta.
Papayaman1000,

@ Papayaman1000 È una sfida abbastanza banale, sia con che senza RegEx, anche se trovo che sia molto interessante.
HyperNeutrino

2
Devo ammettere che, poiché non ne ero a conoscenza Ctrl + K, le vere ragioni della proposta di questa sfida erano ... meno che solo per puro enigma.
Papayaman1000,

@ Papayaman1000 Haha, sì, è stato abbastanza fastidioso dover premere lo spazio 4 volte davanti a ogni riga. Soprattutto perché di solito uso Python e quindi ho più linee in ogni momento (non è poi così male quando usavo Java). Alla fine sono diventato pigro e ho usato il mio editor di testo per sostituirlo ^con ``.
HyperNeutrino

1
@WheatWizard Grazie per il suggerimento, l'ho provato un po '. Ora va un po 'meglio?
HyperNeutrino

4

Gelatina , 8 byte

Ỵṭ€⁶ẋ4¤Y

Provalo online!

Come?

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

Alcune altre varianti di 8 byte sono:
Ỵṭ€⁶Yµ4¡(4 ripetizioni di divisione su newline, virata in un unico spazio);
⁶ḤḤ;ЀỴY(raddoppiare due volte è come moltiplicare per 4, Ѐmappe sull'argomento giusto, quindi possiamo concatenare invece di virare);
e altri riarrangiamenti.


4

Emacs, 5 portachiavi, 5 byte

C-x h M-4 C-x tab

In almeno una codifica comunemente usata per l'immissione da tastiera, ciascuno di questi tasti è un singolo byte: 18 68 b4 18 09 . Le voci di Emacs tendono ad essere molto pesanti, poiché ogni carattere ASCII stampabile rappresenta se stesso tranne che come carattere successivo di un comando multi-carattere (il che significa che solo i tasti chiave possono essere usati per dare comandi effettivi).

Non sono sicuro di come si paragona a Vim (al contrario di V). Ma Vim è abbastanza comunemente usato su PPCG, e quindi ho pensato che anche l'altra parte delle guerre dell'editor meriti il ​​suo tempo sotto i riflettori.

This assumes that I/O is done via the buffer (the equivalent of the normal I/O conventions for vim), or taken from a file and output onto the screen (which comes to the same thing). If you do I/O via the region instead, which is natural for some forms of program, you can remove the leading two characters, for a score of 3 bytes; however, I don't think that complies with PPCG rules.

Explanation

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

The last builtin used here is, of course, incredibly useful for this challenge; the rest is just structure.


3

PowerShell, 29 28 Bytes

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

-1 Thanks to fergusq, using an actual newline instead of the `n

takes the "$args" input as a string (cast using "s) and -splits it on a newline, then loops (%{}) through it, appending four spaces (" "*4) and the line ($_) then outputs it implicitly.


Can you use a newline character instead of `n?
fergusq

@fergusq indeed I can, updated.
colsw

Presumably the newline character is \r\n on windows which is still two bytes - or are there rules clarifying how many bytes a newline character takes?
poizan42

@poizan42 I'm not sure if there's a meta post on it, but I can run this in the default console with just the newline so there's no reason to consider it invalid.
colsw


2

Röda, 21 bytes

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

Try it online!

It is an anonymous function. The input is pulled from the stream.

Explanation:

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

Does identity() just pull all values from STDIN?
Kritixi Lithos

@KritixiLithos Yes. identity pulls values from the input stream and pushes them to its output stream. It is identical to push(x) for x.
fergusq

2

Perl 5, 11+1 = 12 bytes

11 bytes of code + -p flag.

s/^/    /mg

Try it online!

For once, explanations will be short: The regex replaces each beginning of line (^ combined with /m modifier) by four spaces - the end.


This reads input a line at a time, rather than a string as a whole.

@ais523 Roughly half of the answers, including the top two, read input in the exact same way.
Maxim Mikhaylov

@ais523 I'd say it processes the input one line at a time, but it can read it as a whole string (if you supply it with <<< "..." for instance). Don't you agree?
Dada

@ais523 after thinking a bit more about it, I think you're right. (I've update my code accordingly)
Dada

2

Perl 6, 11 bytes

*.indent(4)

Try it

Expanded:

*\       # declare a WhateverCode lambda/closure (this is the parameter)
.indent( # call the `indent` method on the argument
  4      # with the number 4
)

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

Stacked, 13 bytes

'^'4' '*mrepl

Try it online!

Explanation

'^'4' '*mrepl      (* input: top of stack *)
        mrepl      perform multiline regex replacements,
'^'                  replacing /^/ with
   4' '*             four spaces


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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.