Crear una herramienta de bloque de código

18

Al usar Markup, como en la red SE, una sangría de cuatro espacios antes de una línea de texto lo denota como parte de un bloque de código, como espero que sepa. Si no lo hace, aquí hay un ejemplo (con la .representación de un espacio):

.... Código
.... Más código

resultados en

Code
More code

El problema es que cuando copia y pega código en una respuesta, necesita sangrar cada línea manualmente. Esto es especialmente difícil cuando se trabaja con código no protegido, ya que probablemente ya esté sangrado y pueda causar confusión.Simplemente puede seleccionar su código y presionar Ctrl + K, resulta. Horas de mi vida desperdiciadas sin ninguna razón aparte ...

Entonces, su objetivo es, dada una entrada, devolverlo con cuatro espacios antes de cada línea.En el espíritu de ahorrar tiempo al copiar y pegar, debe procesar toda la entrada como una sola cadena (siempre que su idioma pueda analizarla). Si su idioma no puede procesar un carácter (como líneas nuevas) en cadenas, puede suponer que se denota / escapa a través de algún otro método admitido por el idioma; sin embargo, la salida debe generar cada línea en su propia línea (por lo que no debe pasar algo parecido ....foo\n....bar).

Lagunas estándar no permitidas. Como se trata de , gana la respuesta más corta en bytes. ¡Buena suerte!

Papayaman1000
fuente
3
"necesita sangrar cada línea manualmente" (o seleccione el texto y haga clic en el botón :))
Jonathan Allan
11
@JonathanAllan "Botón"? Seguramente te refieres a "atajo de teclado". (Ctrl + K)
Martin Ender
31
@JonathanAllan ... yo ... estoy muy molesto. MUCHO TIEMPO. VANO.
Papayaman1000
66
Si bien estoy bastante seguro de que la respuesta V de Kritixi no será superada, generalmente recomendaría esperar un poco más antes de aceptar una respuesta, porque aceptar tan pronto plantea una desventaja para las personas que podrían responder con una respuesta más corta pero no estaban el sitio en ese momento (zonas horarias o simplemente no siempre están en PPCG 24/7)
HyperNeutrino
2
+1 por informar a la gente sobreCtrl + K
Koishore Roy

Respuestas:

17

V , 4 bytes

Î4É 

Pruébalo en línea!

(Tenga en cuenta el espacio final)

V está codificado en Latin1, donde esto se codifica así:

00000000: ce34 c920                                .4. 

Explicación

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

¡Aquí hay una solución que también tiene 4 bytes en UTF-8!

VG4>

VG          " Select everything
   >        " Indent
  4         " 4 times (with spaces)
Kritixi Lithos
fuente
2
Espero que alguien levante ese teléfono, porque wow alguien lo llamó.
Papayaman1000
Solución alternativa:4ñ>G
DJMcMayhem
@DJMcMayhem Pero usa pestañas para sangrar en lugar de espacios
Kritixi Lithos
En vim, sí. En V, no, son 4 espacios
DJMcMayhem
@DJMcMayhem Gracias, ¡eso inspiró otra solución alternativa que solo tiene 4 bytes en UTF-8!
Kritixi Lithos
9

Crayón , 7 bytes

`¤q;3xq

Pruébalo en línea!

Explicación

Crayon es un lenguaje basado en pila diseñado para crear arte ASCII. Todavía está en las primeras etapas de desarrollo, pero sabe lo suficiente para terminar este desafío con un recuento de bytes bastante bajo:

         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

Dibujar el espacio sin interrupciones es necesario porque Crayon recorta automáticamente la salida a un rectángulo, por lo que sin el NBSP simplemente imprimiría la entrada original.

ETHproducciones
fuente
¿Crayon le permitiría hacer lo contrario: generar la cadena, luego mover cuatro espacios a la izquierda y generar un nbsp? Es probable que cueste menos en la manipulación de la pila, aunque no sé si Crayon movería correctamente el lienzo al lugar correcto.
@ ais523 Hmm, esa es una muy buena idea ... desafortunadamente, eso requeriría pasar a x = -4, lo que no es una tarea fácil en este momento. Realmente debería impulsar estos cambios en los que he estado trabajando durante un mes ...: P
ETHproductions
7

Retina , 8 bytes

%`^

Pruébalo en línea!

Hay cuatro espacios en la segunda línea. Las soluciones alternativas usan o m`^o %1`o 1%`en la primera línea. Todos estos coinciden con la posición al comienzo de cada línea y la reemplazan con cuatro espacios.

Martin Ender
fuente
Sospeché que una respuesta de Retina sería la primera.
Neil
Bueno, eso fue rápido.
Papayaman1000
@Neil Me sorprendería si esto no es golpeado por V (o incluso Vim en bruto). :)
Martin Ender
1
@MartinEnder Aquí tienes (4 bytes en V): codegolf.stackexchange.com/a/115870/41805 :)
Kritixi Lithos
7

Cheddar, 31 bytes

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

Realmente simple, pero publiqué porque muestra los nuevos operadores funcionales.

(" ":+)es el mismo que A -> " " + A. (es decir, +op como una función con " "enlace a LHS).

Ni siquiera creo que necesite explicación

Downgoat
fuente
¿Cambiaste el funcionamiento del analizador? Por lo que recuerdo :causaría problemas?:
Conor O'Brien
@ ConorO'Brien Olvidé un poco cómo lo arreglé, pero creo que debido a que hay un :sin coincidencia ?, el analizador elegirá tratarlo como una operación funcional. Esto todavía requiere que la
operación
+1 para smiley:+)
LarsW
Que @significa
Leaky Nun
6

Python ,  44  39 bytes

Tachado & nbsp; 44 & nbsp; ya no es 44 :)

-5 bytes gracias a los ovs (evitar la cola con un antecedente)

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

Pruébalo en línea!

Jonathan Allan
fuente
lambda s:' '*4+s.replace('\n','\n ')por 39 bytes
ovs
@ovs - No lo veo ... ¿te refieres lambda s:' '*4+s.replace('\n','\n ')[1:]a 40 (que no funciona) o algo más?
Jonathan Allan
1
Just lambda s:' '*4+s.replace('\n','\n<4 spaces>') TIO
ovs
@ovs Ah, sí, por supuesto (el comentario de cuatro espacios reducidos me arrojó y tampoco lo noté en mi respuesta) ¡gracias por el ahorro!
Jonathan Allan
6

JavaScript, 26 bytes

Gracias @Conor O'Brien por jugar 8 bytes

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

Reemplazar con una expresión regular con / g reemplaza todas las instancias. m hace que la expresión regular trate cada línea por separado para el inicio de la cadena ^.

Pruébalo en línea!

fəˈnɛtɪk
fuente
Parece mezclar no espacios en blanco en la entrada en asdfrepetidos una y otra vez.
Papayaman1000
Debe tener en cuenta lo que había puesto como entrada en TIO
fəˈnɛtɪk
Puede guardar algunos bytes haciendo x=>x.replace(/^|\n/g,"$&    ")para obtener la primera línea y las siguientes líneas de una sola vez
ETHproductions
1
26 bytes: ¡ Pruébelo en línea!
Conor O'Brien
1
O ^ funciona también, supongo ;-)
ETHproductions
4

Python 2, 87 45 bytes

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

La entrada se toma como 'Line1\nLine2\nLine3...'(Citas necesarias)

Gracias a @WheatWizard por darme una idea que me ayudó a jugar golf de 42 bytes.

Hiperneutrino
fuente
Crecí en python. Eso es lo que me hizo pensar que esto sería un poco difícil. Incluso ignorando RegEx, estaba tan equivocado, resulta.
Papayaman1000
@ Papayaman1000 Es un desafío bastante trivial, con y sin RegEx, aunque me parece muy interesante.
HyperNeutrino
2
Debo admitir que, como no sabía Ctrl + K, las verdaderas razones de este desafío que se proponían eran ... menos que solo por pura confusión.
Papayaman1000
@Papayaman1000 Haha, yes, it was quite annoying having to press space 4 times in front of each line. Especially since I usually use Python and so I have multiple lines all the time (it's not so bad when I used to use Java). Eventually I just got lazy and used my text editor to replace ^ with ` `.
HyperNeutrino
1
@WheatWizard Thanks for the suggestion, I golfed it down a bit. Is it a bit better now?
HyperNeutrino
4

Jelly, 8 bytes

Ỵṭ€⁶ẋ4¤Y

Try it online!

How?

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

Algunas otras variantes de 8 bytes son:
Ỵṭ€⁶Yµ4¡(4 repeticiones de división en líneas nuevas, agregar un solo espacio);
⁶ḤḤ;ЀỴY(doblar dos veces es como multiplicar por 4, Ѐmapas sobre el argumento correcto, por lo que podemos concatenar en lugar de agregar);
y otros reordenamientos de los mismos.

Jonathan Allan
fuente
4

Emacs, 5 teclados, 5 bytes

C-x h M-4 C-x tab

En al menos una codificación de uso común para la entrada del teclado, cada uno de estos acordes de teclado es un solo byte: 18 68 b4 18 09. Emacs entries tend to be very keychord-heavy, as each printable ASCII character stands for itself except as a subsequent character of a multi-character command (meaning that only keychords can be used to give actual commands).

No estoy seguro de cómo esto se compara con Vim (a diferencia de V). Pero Vim se usa con bastante frecuencia en PPCG, por lo que pensé que el otro lado de las guerras editoriales también merece su tiempo en el centro de atención.

Esto supone que la E / S se realiza a través del búfer (el equivalente de las convenciones de E / S normales para vim), o se toma de un archivo y se envía a la pantalla (que es lo mismo). Si en su lugar realiza E / S a través de la región, lo cual es natural para algunas formas de programa, puede eliminar los dos caracteres iniciales, para una puntuación de 3 bytes; Sin embargo, no creo que cumpla con las reglas de PPCG.

Explicación

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

La última construcción utilizada aquí es, por supuesto, increíblemente útil para este desafío; el resto es solo estructura.


fuente
3

PowerShell, 29 28 bytes

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

-1 Gracias a fergusq, usando una nueva línea real en lugar de la `n

toma la "$args"entrada como una cadena (se convierte usando "s) y la envía -splita una nueva línea, luego la recorre ( %{}) a través de ella, agregando cuatro espacios ( " "*4) y la línea ( $_) luego la genera implícitamente.

colsw
fuente
¿Se puede usar un carácter de nueva línea en lugar de `n?
fergusq
@fergusq sí puedo, actualizado.
colsw
Presumiblemente, el carácter de nueva línea es \ r \ n en ventanas que todavía tiene dos bytes, o ¿hay reglas que aclaren cuántos bytes ocupa un carácter de nueva línea?
poizan42
@ poizan42 No estoy seguro de si hay una meta publicación en él, pero puedo ejecutar esto en la consola predeterminada con solo la nueva línea, por lo que no hay razón para considerarlo inválido.
colsw
3

Pyth, 10 bytes

jm+*4\ d.z

¡Intentalo!

Si se permitiera la entrada como una lista de líneas, podría hacerlo en 7 bytes:

jm+*4\ 

Trata eso

soluciones más largas:

12 bytes:

+*4d:Eb+b*4d

12 bytes:

+*4dj+b*4d.z

13 bytes:

t:E"^|
"+b*4d
KarlKastor
fuente
Lo bajé a 9:jbm*4\ .z
aplaude
Olvidé el d, whoops. Tu respuesta de 10 bytes es lo que buscaba, de todos modos
aplaude
2

Röda , 21 bytes

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

Pruébalo en línea!

Es una función anónima. La entrada se extrae de la secuencia.

Explicación:

{
    (_/"\n") |        /* Splits the input at newlines */
    ["    ".._.."\n"] /* For each line, prints four spaces before the line */
}
fergusq
fuente
¿ identity()Solo extrae todos los valores de STDIN?
Kritixi Lithos
@KritixiLithos Sí. identityextrae valores del flujo de entrada y los empuja a su flujo de salida. Es idéntico al push(x) for x.
fergusq
2

Perl 5 , 11 + 1 = 12 bytes

11 bytes de código + -pbandera.

s/^/    /mg

Pruébalo en línea!

Por una vez, las explicaciones serán breves: la expresión regular reemplaza cada comienzo de línea ( ^combinado con un /mmodificador) por cuatro espacios: el final.

Dada
fuente
Esto lee la entrada de una línea a la vez, en lugar de una cadena como un todo.
@ ais523 Aproximadamente la mitad de las respuestas, incluidas las dos primeras, leen las entradas exactamente de la misma manera.
Maxim Mikhaylov
@ ais523 Diría que procesa la entrada de una línea a la vez, pero puede leerla como una cadena completa (por ejemplo, si le proporciona <<< "..."). No estas de acuerdo
Dada
@ ais523 después de pensar un poco más al respecto, creo que tienes razón. (He actualizado mi código en consecuencia)
Dada
2

Perl 6 , 11 bytes

*.indent(4)

Intentalo

Expandido:

*\       # 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
fuente
2

sed , 16 10 9 bytes

s/^/    /

Pruébalo en línea!

Ediciones

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

-1 byte thanks to seshoumara.

Maxim Mikhaylov
fuente
Puede llegar a 15 bytes usando la -rbandera (1 byte) para que pueda eliminar las barras invertidas antes de los paréntesis.
Kritixi Lithos
Puede llegar a 13 usando s/.*/ &/(elimine los paréntesis y reemplace \1con &)
Kritixi Lithos
@KritixiLithos ¡Gracias! Funciona incluso sin *.
Maxim Mikhaylov
O simplemente s:^: :, para 9 bytes.
seshoumara
@seshoumara Nunca he visto dos puntos utilizados de esta manera en un script sed ... ¿Sabes qué parte del manual describe esta sintaxis?
Maxim Mikhaylov
2

Java 7, 58 bytes

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

Explicación:

Pruébalo aquí

  • Añadir con cuatro espacios iniciales
  • Replace every new-line for a new-line + four spaces
Kevin Cruijssen
fuente
Siempre estoy triste porque los mecanismos de expresión regular de Java requieren otras bibliotecas en su mayor parte.
Poke
Creo que lo necesitasreplaceAll
Khaled.K
@ Khaled.K ¿Por qué? Ambos .replacey .replaceAllreemplazarán todas las ocurrencias de la Cadena buscada con el reemplazo. .replacese usa para cadenas literales y .replaceAllexpresiones regulares. Como \nno es una expresión regular, .replacepuede usarse sin problemas para reemplazar todas las líneas nuevas con una línea nueva + cuatro espacios, que también puede consultar en el enlace "Probar línea" que proporcioné.
Kevin Cruijssen
2

Brain-Flak , 109103 bytes

-6 gracias a Wheat Wizard

Incluye +1 para -c

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

Pruébalo en línea!

((()()()()()){})        # 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
fuente
@WheatWizard Nice. Necesito comenzar a buscar redundancias como esa. Probablemente me suceda más que el push pop. Esos son simplemente automáticos ahora. Gracias
Riley
1

PHP, 43 bytes

<?="    ".strtr($_GET[0],["\n"=>"\n    "]);
Jörg Hülsermann
fuente
1

Apilado , 13 bytes

'^'4' '*mrepl

Pruébalo en línea!

Explicación

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

MATL , 12 bytes

10&Yb"4Z"@gh

La entrada es una cadena con líneas nuevas. Para ingresar esto, debe concatenar el carácter 10 entre los caracteres normales para representar la nueva línea (los corchetes son concatenación):

['Code' 10 'More code']

Pruébalo en MATL en línea!

Explicación

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
fuente
1

PHP, 16

echo"    $argn";

correr con php -R <code>. -Rejecuta el código dado para cada línea de entrada y $argnse alimenta a la línea de entrada actual. Entonces, esto simplemente imprime cada línea con cuatro espacios adicionales en frente.

Christoph
fuente
1

V , 3 bytes (no competitivos)

4>G

Esta respuesta utiliza una función que he estado planeando agregar por un tiempo, pero que acabo de agregar hoy. Eso hace que esta respuesta no sea competitiva e inválida para ganar. ¡Pero sigue siendo genial mostrar una característica tan útil / competitiva!

Pruébalo en línea!

Explicación:

4>   " Add an indent of 4 to...
  G  "   Every line from the current line (0 by default) to the end of the buffer
DJMcMayhem
fuente
¡Ordenado! Al menos, siéntete orgulloso del hecho de que tu idioma ocupó el primer lugar, incluso de antemano [¡incluso si es un idioma sucio de golf ... nah, jk]!
Papayaman1000
1

Vim, 6 pulsaciones de teclas

<Ctrl-V>G4I <Esc>

Asume que el cursor está al comienzo del archivo, como si abriera el archivo desde la línea de comandos a través de 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

Con un vim configurado para utilizar 4 espacios para el sangrado sería 2 teclas: >G.

daniero
fuente
Estoy bastante seguro de que puede eliminar el ZZal final. Por lo general, las presentaciones de vim están bien simplemente enviando al búfer en lugar de a un archivo.
DJMcMayhem
Muy bien, gracias, me quité ZZentonces.
daniero
1

Japt , 7 6 bytes

Guardado 1 byte gracias a @ETHproductions

miS²²R

Pruébalo en línea!

Explicación:

miS²²R
m       // At each char in the input:
 iS²²   //   Prepend " " repeated 4 times
     R  // Rejoin with newlines  
Oliver
fuente
Buen trabajo. S²²funcionaría tan bien en lugar de Sp4, no es que te ahorre nada en este caso. Hablando de eso, creo que puede hacer miS²²Rpara eliminar la Rbandera (básicamente miS²², pero dividirse en nuevas líneas de antemano y unirse a las nuevas líneas después)
ETHproductions
1

UberGenes , 62 bytes

Tuve que ingresar a este desafío con UberGenes, ya que un programa muy similar (que solo insertó un espacio) fue uno de los primeros programas que escribí en el idioma, y ​​parecía que sería fácil modificarlo para este propósito.

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

Cómo funciona:

=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.)
quintapia
fuente
1

CJam , 11 bytes

Gracias a @ Challenger5 por una corrección

qN/{S4*\N}%

Pruébalo en línea!

Explicació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
Luis Mendo
fuente
1
No funciona en abc\n\ndef. Regresa ....abc\n....defporque %descarta elementos vacíos. Desea utilizar /para dividir en su lugar, porque mantiene los elementos vacíos.
Esolanging Fruit
@ Challenger5 Gracias, corregido!
Luis Mendo
1

J-uby , 17 16 bytes

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

Explicación

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

Esto se traduce directamente a (en Ruby):

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

En realidad , 16 bytes

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

Pruébalo en línea!

Explicación:

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
fuente
1

C, 66 65 bytes

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

Pruébalo en línea!

Steadybox
fuente
Solución ordenada, pero podría ir con s;char*l;f(){while(getline(&l,&s,stdin)+1)printf("____%s",l);}62 bytes
Khaled.K
@ Khaled.K Gracias, pero eso no parece funcionar sin incluir <stdio.h>(debido a stdin).
Steadybox