Créer un outil de bloc de code

18

Lorsque vous utilisez le balisage, comme sur le réseau SE, une indentation de quatre espaces avant une ligne de texte le désigne comme faisant partie d'un bloc de code, comme j'espère que vous le savez. Si vous ne le faites pas, voici un exemple (avec .représentation d'un espace):

.... Code
.... Plus de code

résulte en

Code
More code

Le problème est que lorsque vous copiez-collez du code dans une réponse, vous devez indenter manuellement chaque ligne. Cela est particulièrement difficile lorsque vous travaillez avec du code non golfé, car il est probablement déjà en retrait et peut provoquer de la confusion. Vous pouvez simplement sélectionner votre code et frapper Ctrl + K, il s'avère. Des heures de ma vie perdues sans raison de côté ...

Donc, votre objectif est, étant donné une entrée, de le renvoyer avec quatre espaces avant chaque ligne. Dans un souci d'économie de temps de copier-coller, vous devez traiter l'intégralité de l'entrée en une seule chaîne (tant que votre langue peut l'analyser). Si votre langue n'est pas en mesure de traiter un caractère (comme les sauts de ligne) dans les chaînes, vous pouvez supposer qu'il est indiqué / échappé par une autre méthode prise en charge par la langue; cependant, la sortie doit sortir chaque ligne sur sa propre ligne (donc ne pas passer quelque chose comme ....foo\n....bar).

Les échappatoires standard ne sont pas autorisées. Comme il s'agit de , la réponse la plus courte en octets l'emporte. Bonne chance!

Papayaman1000
la source
3
"vous devez mettre en retrait chaque ligne manuellement" (ou sélectionnez le texte et cliquez sur le bouton :))
Jonathan Allan
11
@JonathanAllan "Button"? Vous voulez sûrement dire "raccourci clavier". (Ctrl + K)
Martin Ender
31
@JonathanAllan ... Je ... je suis très contrarié. TELLEMENT DE TEMPS. PERDU.
Papayaman1000
6
Bien que je sois assez confiant que la réponse V de Kritixi ne sera pas battue, je recommanderais généralement d'attendre un peu plus longtemps avant d'accepter une réponse, car accepter si tôt pose un inconvénient aux personnes qui pourraient répondre avec une réponse plus courte mais qui n'étaient pas sur le site à l'époque (fuseaux horaires ou tout simplement pas toujours sur PPCG 24/7)
HyperNeutrino
2
+1 pour informer les gens surCtrl + K
Koishore Roy

Réponses:

17

V , 4 octets

Î4É 

Essayez-le en ligne!

(Notez l'espace de fin)

V est codé en Latin1, où cela est codé comme suit:

00000000: ce34 c920                                .4. 

Explication

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

Voici une solution qui fait également 4 octets en UTF-8!

VG4>

VG          " Select everything
   >        " Indent
  4         " 4 times (with spaces)
Kritixi Lithos
la source
2
J'espère que quelqu'un décroche ce téléphone, parce que wow quelqu'un l'a appelé.
Papayaman1000
Solution alternative:4ñ>G
DJMcMayhem
@DJMcMayhem Mais il utilise des tabulations pour mettre en retrait au lieu d'espaces
Kritixi Lithos
En vim, oui. En V, non, c'est 4 espaces
DJMcMayhem
@DJMcMayhem Merci, cela a inspiré une autre solution alternative qui n'est que de 4 octets en UTF-8!
Kritixi Lithos
9

Crayon , 7 octets

`¤q;3xq

Essayez-le en ligne!

Explication

Crayon est un langage basé sur la pile conçu pour créer de l'art ASCII. Il est encore aux premiers stades de développement, mais il en sait juste assez pour terminer ce défi avec un nombre d'octets plutôt faible:

         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

Le dessin de l'espace insécable est nécessaire car Crayon découpe automatiquement la sortie en rectangle, donc sans le NBSP, il imprimerait simplement l'entrée d'origine.

ETHproductions
la source
Crayon vous laisserait-il faire le contraire: sortir la chaîne, puis déplacer quatre espaces vers la gauche et sortir un nbsp? Cela coûtera probablement moins cher dans la manipulation de la pile, bien que je ne sais pas si Crayon déplacerait correctement la toile au bon endroit.
@ ais523 Hmm, c'est une très bonne idée ... malheureusement, cela nécessiterait de passer à x = -4, ce qui n'est pas une tâche facile pour le moment. Je devrais vraiment pousser ces changements sur lesquels je travaille depuis un mois ...: P
ETHproductions
7

Rétine , 8 octets

%`^

Essayez-le en ligne!

Il y a quatre espaces sur la deuxième ligne. Les solutions alternatives utilisent soit m`^ou %1`soit 1%`en première ligne. Tous ces éléments correspondent à la position au début de chaque ligne et la remplacent par quatre espaces.

Martin Ender
la source
Je soupçonnais qu'une réponse Retina serait la première.
Neil
Eh bien, c'était rapide.
Papayaman1000
@Neil Je serai surpris si cela ne se fait pas battre par V (ou même Vim brut). :)
Martin Ender
1
@MartinEnder Voilà (4 octets en V): codegolf.stackexchange.com/a/115870/41805 :)
Kritixi Lithos
7

Cheddar, 31 octets

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

Vraiment simplement, mais j'ai posté car ça montre les nouveaux opérateurs fonctionnels.

(" ":+)est le même que A -> " " + A. (c'est-à-dire +op en fonction avec " "lié à LHS).

Je ne pense même pas avoir besoin d'explication

Downgoat
la source
Oh, avez-vous changé le fonctionnement de l'analyseur? D'après ce dont je me souviens, :cela causerait des problèmes?:
Conor O'Brien
@ ConorO'Brien J'ai un peu oublié comment je l'ai corrigé mais je crois que parce qu'il n'y a :pas de correspondance ?, l'analyseur choisira de le traiter comme un op fonctionnel. Cela nécessite toujours que l'op fonctionnel soit enveloppé dans des parens mais oui
Downgoat
+1 pour smiley:+)
LarsW
Que veut @dire?
Leaky Nun
6

Python ,  44  39 octets

Biffé & nbsp; 44 & nbsp; n'a plus 44 ans :)

-5 octets grâce aux ovs (éviter la mise en file d'attente avec un préfixe)

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

Essayez-le en ligne!

Jonathan Allan
la source
lambda s:' '*4+s.replace('\n','\n ')pour 39 octets
ovs
@ovs - Je ne le vois pas ... tu veux dire lambda s:' '*4+s.replace('\n','\n ')[1:]pour 40 (qui ne fonctionne pas) ou autre chose?
Jonathan Allan
1
Just lambda s:' '*4+s.replace('\n','\n<4 spaces>') TIO
ovs
@ovs Ah oui, bien sûr (le rendu de démarque de quatre espaces m'a jeté et je ne l'ai pas remarqué dans ma réponse non plus) merci pour la sauvegarde!
Jonathan Allan, le
6

JavaScript, 26 octets

Merci @Conor O'Brien d'avoir joué au golf sur 8 octets

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

Remplacer par une expression régulière avec / g remplace toutes les instances. m fait que l'expression régulière traite chaque ligne séparément pour le début de la chaîne ^.

Essayez-le en ligne!

fəˈnɛtɪk
la source
Il semble mélanger les espaces non blancs dans l'entrée en asdfrépétant encore et encore.
Papayaman1000
Vous devriez noter ce que j'avais mis comme entrée dans TIO
fəˈnɛtɪk
Vous pouvez enregistrer quelques octets en faisant x=>x.replace(/^|\n/g,"$&    ")pour obtenir la première ligne et les lignes suivantes en une seule fois
ETHproductions
1
26 octets: essayez-le en ligne!
Conor O'Brien
1
Ou ^ ça marche aussi je suppose ;-)
ETHproductions
4

Python 2, 87 45 octets

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

L'entrée est prise comme 'Line1\nLine2\nLine3...'(Citations nécessaires)

Merci à @WheatWizard de m'avoir donné une idée qui m'a aidé à jouer au golf 42 octets.

HyperNeutrino
la source
J'ai grandi sur python. C'est ce qui m'a fait penser que ce serait un peu difficile. Même en ignorant RegEx, j'avais tellement tort, se révèle.
Papayaman1000
@ Papayaman1000 C'est un défi assez banal, avec et sans RegEx, bien que je trouve cela très intéressant.
HyperNeutrino
2
Je dois admettre, comme je ne le savais pas Ctrl + K, que les vraies raisons de ce défi proposé étaient ... moins que de simples énigmes.
Papayaman1000
@ Papayaman1000 Haha, oui, c'était assez ennuyeux de devoir appuyer sur l'espace 4 fois devant chaque ligne. Surtout que j'utilise habituellement Python et que j'ai donc plusieurs lignes tout le temps (ce n'est pas si mal quand j'utilisais Java). Finalement, je suis devenu paresseux et j'ai utilisé mon éditeur de texte pour le remplacer ^par ``.
HyperNeutrino
1
@WheatWizard Merci pour la suggestion, je l'ai un peu minimisée. Est-ce un peu mieux maintenant?
HyperNeutrino
4

Gelée , 8 octets

Ỵṭ€⁶ẋ4¤Y

Essayez-le en ligne!

Comment?

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

Quelques autres variantes de 8 octets sont:
Ỵṭ€⁶Yµ4¡(4 répétitions de split sur les nouvelles lignes, clouent un seul espace);
⁶ḤḤ;ЀỴY(doubler deux fois, c'est comme multiplier par 4, Ѐmappe sur le bon argument, donc nous pouvons concaténer au lieu de clouer);
et autres réarrangements de ceux-ci.

Jonathan Allan
la source
4

Emacs, 5 clés, 5 octets

C-x h M-4 C-x tab

Dans au moins un codage couramment utilisé pour la saisie au clavier, chacun de ces accords est un octet unique: 18 68 b4 18 09 . Les entrées Emacs ont tendance à être très lourdes, car chaque caractère ASCII imprimable se distingue par lui-même, sauf en tant que caractère ultérieur d'une commande à plusieurs caractères (ce qui signifie que seuls les accords peuvent être utilisés pour donner des commandes réelles).

Je ne sais pas comment cela se compare à Vim (par opposition à V). Mais Vim est assez couramment utilisé sur PPCG, et j'ai donc pensé que l'autre côté des guerres de l'éditeur méritait également son temps sous les projecteurs.

Cela suppose que les E / S sont effectuées via le tampon (l'équivalent des conventions d'E / S normales pour vim), ou extraites d'un fichier et sorties sur l'écran (ce qui revient au même). Si vous effectuez des E / S via la région à la place, ce qui est naturel pour certaines formes de programme, vous pouvez supprimer les deux premiers caractères, pour un score de 3 octets; cependant, je ne pense pas que cela soit conforme aux règles du PPCG.

Explication

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

Le dernier builtin utilisé ici est, bien sûr, incroyablement utile pour ce défi; le reste n'est que structure.


la source
3

PowerShell, 29 28 octets

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

-1 Merci à fergusq, en utilisant une nouvelle ligne réelle au lieu du `n

prend l' "$args"entrée sous forme de chaîne (transtypée à l'aide de "s) et la -splitplace sur une nouvelle ligne, puis la boucle ( %{}) à travers elle, en ajoutant quatre espaces ( " "*4) et la ligne ( $_) puis la renvoie implicitement.

colsw
la source
Pouvez-vous utiliser un caractère de nouvelle ligne au lieu de `n?
fergusq
@fergusq en effet je peux, mis à jour.
colsw
Vraisemblablement, le caractère de nouvelle ligne est \ r \ n sur des fenêtres qui sont toujours de deux octets - ou existe-t-il des règles précisant le nombre d'octets qu'un caractère de nouvelle ligne prend?
poizan42
@ poizan42 Je ne sais pas s'il y a une méta-publication dessus, mais je peux l'exécuter dans la console par défaut avec juste la nouvelle ligne donc il n'y a aucune raison de la considérer comme invalide.
colsw
3

Pyth, 10 octets

jm+*4\ d.z

Essayez!

Si l'entrée en tant que liste de lignes était autorisée, je pourrais le faire en 7 octets:

jm+*4\ 

Essayez ça

solutions plus longues:

12 octets:

+*4d:Eb+b*4d

12 octets:

+*4dj+b*4d.z

13 octets:

t:E"^|
"+b*4d
KarlKastor
la source
Je suis descendu à 9:jbm*4\ .z
applaudir
J'ai oublié le d, oups. Votre réponse de 10 octets est ce que j'allais faire, de toute façon
applaudissez
2

Röda , 21 octets

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

Essayez-le en ligne!

Il s'agit d'une fonction anonyme. L'entrée est extraite du flux.

Explication:

{
    (_/"\n") |        /* Splits the input at newlines */
    ["    ".._.."\n"] /* For each line, prints four spaces before the line */
}
fergusq
la source
identity()Tirez -vous simplement toutes les valeurs de STDIN?
Kritixi Lithos
@KritixiLithos Oui. identityextrait les valeurs du flux d'entrée et les pousse vers son flux de sortie. Il est identique à push(x) for x.
fergusq
2

Perl 5 , 11 + 1 = 12 octets

11 octets de code + -pindicateur.

s/^/    /mg

Essayez-le en ligne!

Pour une fois, les explications seront courtes: l'expression régulière remplace chaque début de ligne ( ^combiné avec le /mmodificateur) par quatre espaces - la fin.

Dada
la source
Cela lit l'entrée une ligne à la fois, plutôt qu'une chaîne dans son ensemble.
@ ais523 Environ la moitié des réponses, y compris les deux premières, lisent les informations de la même manière.
Maxim Mikhaylov
@ ais523 Je dirais qu'il traite l'entrée une ligne à la fois, mais il peut la lire comme une chaîne entière (si vous la fournissez avec <<< "..." par exemple). Tu n'es pas d'accord?
Dada
@ ais523 après y avoir réfléchi un peu plus, je pense que vous avez raison. (J'ai mis à jour mon code en conséquence)
Dada
2

Perl 6 , 11 octets

*.indent(4)

Essayez-le

Étendu:

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

sed , 16 10 9 octets

s/^/    /

Essayez-le en ligne!

Modifications

Réduction de la taille de la solution de 16 à 10 octets grâce à Kritixi Lithos .

-1 octet grâce à seshoumara .

Maxim Mikhaylov
la source
Vous pouvez obtenir jusqu'à 15 octets en utilisant l' -rindicateur (1 octet) afin de pouvoir supprimer les barres obliques inverses avant les parenthèses.
Kritixi Lithos
Vous pouvez vous rendre à 13 en utilisant s/.*/ &/(supprimer les parenthèses et remplacer \1par &)
Kritixi Lithos
@KritixiLithos Merci! Cela fonctionne même sans *.
Maxim Mikhaylov
Ou tout simplement s:^: :, pour 9 octets.
seshoumara
@seshoumara Je n'ai jamais vu de deux points utilisés de cette façon dans un script sed ... Savez-vous quelle partie du manuel décrit cette syntaxe?
Maxim Mikhaylov
2

Java 7, 58 octets

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

Explication:

Essayez-le ici.

  • Ajouter avec quatre espaces principaux
  • Remplacez chaque nouvelle ligne par une nouvelle ligne + quatre espaces
Kevin Cruijssen
la source
Je suis toujours triste que les mécanismes regex de Java nécessitent la plupart du temps d'autres bibliothèques.
Poke
Je pense que vous avez besoinreplaceAll
Khaled.K
@ Khaled.K Pourquoi? Les deux .replaceet .replaceAllremplaceront toutes les occurrences de la chaîne recherchée par le remplacement. .replaceest utilisé pour les chaînes littérales et .replaceAllpour les expressions rationnelles. Puisqu'il \nne s'agit pas d'une expression régulière, .replacepeut être utilisé sans problème pour remplacer tous les retours à la ligne par un retour à la ligne + quatre espaces, que vous pouvez également consulter dans le lien "Essayez-le" que j'ai fourni.
Kevin Cruijssen
2

Brain-Flak , 109103 octets

-6 grâce à Wheat Wizard

Comprend +1 pour -c

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

Essayez-le en ligne!

((()()()()()){})        # 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
la source
... et deux octets de plus
Post Rock Garf Hunter
@WheatWizard Nice. Je dois commencer à chercher des licenciements comme ça. Cela m'arrive probablement plus que la push pop. Ce ne sont que automatiques maintenant. Merci
Riley
1

PHP, 43 octets

<?="    ".strtr($_GET[0],["\n"=>"\n    "]);
Jörg Hülsermann
la source
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
Conor O'Brien
la source
1

Octave, 17 bytes

@(s)["    "';s']'

Try it online!

rahnema1
la source
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
Luis Mendo
la source
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.

Christoph
la source
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
DJMcMayhem
la source
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
la source
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
la source
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
la source
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
la source
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
la source
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
la source
1

C, 66 65 bytes

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

Try it online!

Steadybox
la source
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