创建一个代码块工具


18

正如我希望您知道的那样,在SE网络上使用标记时,在一行文本之前的四个空格的缩进表示它是代码块的一部分。如果不这样做,这是一个示例(.代表一个空格):

....代码
....更多代码

结果是

Code
More code

问题是,将代码复制粘贴到答案中时,需要手动缩进每一行。当使用非高尔夫代码时,这尤其困难,因为它可能已经缩进并可能引起混乱。Ctrl + K事实证明,您只需选择您的代码并点击即可。我一生的时间无缘无故地浪费了...

因此,您的目标是,在给定输入的情况下,在每行之前以四个空格返回它。本着节省复制粘贴时间的精神,您将整个输入作为单个字符串处理(只要您的语言可以解析它)。如果您的语言无法处理字符串中的字符(例如换行符),则可以假定通过该语言支持的其他方法来表示/转义该字符;但是,输出必须在其自己的行上输出每一行(因此,请勿传递....foo\n....bar)。

不允许出现标准漏洞。因为这是,所以最短的答案以字节为单位。祝好运!


3
“您需要手动缩进每一行”(或选择文本并单击按钮:))
Jonathan Allan

11
@JonathanAllan“按钮”吗?当然,您的意思是“键盘快捷键”。(Ctrl + K)
Martin Ender

31
@乔纳森·艾伦...我...我很沮丧。如此多的时间。糟透了。
Papayaman1000

6
虽然我相当有信心Kritixi的V答案不会被打败,但我通常建议您等待一会儿再接受一个答案,因为这么早接受对那些可以用较短答案回答但又不愿意回答的人不利。当时的网站(时区或并非总是在PPCG 24/7上)
HyperNeutrino

2
+1告知人们Ctrl + K
Koishore Roy

Answers:


17

V,4个字节

Î4É 

在线尝试!

(注意尾随空格)

V以Latin1编码,其中编码如下:

00000000: ce34 c920                                .4. 

说明

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

这也是在UTF-8中也是4个字节的解决方案!

VG4>

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

2
希望有人拿起那部电话,因为有人叫了它。
Papayaman1000

替代解决方案:4ñ>G
DJMcMayhem

@DJMcMayhem但是它使用制表符而不是空格来缩进
Kritixi Lithos 17-4-8

在vim中,是的。在V中,没有,这是4个空格
DJMcMayhem

@DJMcMayhem谢谢,这启发了另一个替代解决方案,在UTF-8中只有4个字节!
Kritixi Lithos

9

蜡笔,7字节

`¤q;3xq

在线尝试!

说明

Crayon是一种基于堆栈的语言,旨在创建ASCII艺术。它仍然处于开发的早期阶段,但是它知道以足够少的字节数来完成这一挑战就足够了:

         Implicit: input string is on the stack
`¤       Push a non-breaking space to the stack.
  q;     Draw this at the cursor (0,0 by default) and pop it.
    3x   Move three more spaces to the right.
      q  Draw the input string here (at 4,0).
         Implicit: output the canvas, trimmed to a rectangle

绘制不间断的空间是必要的,因为Crayon会自动将输出修剪为矩形,因此如果没有NBSP,它将仅打印原始输入。


Crayon会让您做相反的事情:输出字符串,然后向左移动四个空格并输出nbsp吗?尽管我不知道Crayon是否会正确地将画布移到正确的位置,但是这样做可能会减少堆栈操作的成本。

@ ais523嗯,这是一个非常好的主意...不幸的是,这需要移动到x = -4,这在当前不是一件容易的事。我真的应该推动已经进行了一个月的这些更改...:P
ETHproductions'Apr 9'17

7

视网膜,8字节

%`^

在线尝试!

第二行有四个空格。替代解决方案在第一行使用m`^%1`1%`。所有这些都匹配每行开头的位置,并用四个空格代替。


我怀疑视网膜的答案会是第一个。
尼尔

嗯,那太快了。
Papayaman1000

@Neil如果不被V(甚至原始Vim)击败,我会感到惊讶。:)
Martin Ender

1
@MartinEnder在这里(V中的4个字节):codegolf.stackexchange.com/a/115870/41805 :)
Kritixi Lithos

7

Cheddar,31个字节

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

确实很简单,但是我发布了,因为它展示了新的函数运算符。

(" ":+)与相同A -> " " + A。(即+op作为" "绑定到LHS 的函数)。

我什至不需要解释


哦,您改变了解析器的工作方式吗?据我所知,:这会引起问题?:
Conor O'Brien

@ ConorO'Brien我有点忘记了我如何解决它,但是我相信因为:没有匹配项?,所以解析器会选择将其视为功能操作。这仍然需要将功能操作包裹在括号中,但是是的
Downgoat

笑脸+1:+)
LarsW

什么@意思
Leaky Nun

6

Python 44  39字节

划掉&nbsp; 44&nbsp; 不再是44 :)

-5字节归功于ovs(避免在队列前添加前缀)

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

在线尝试!


lambda s:' '*4+s.replace('\n','\n ')39字节
ovs '17

@ovs-我看不到...您是说lambda s:' '*4+s.replace('\n','\n ')[1:]40(不起作用)还是其他?
乔纳森·艾伦

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

@ovs嗯,是的,当然(注释四个空格的标记渲染使我震惊,我的回复中也没有注意到它)感谢您的节省!
乔纳森·艾伦,

6

JavaScript,26个字节

感谢@Conor O'Brien打高尔夫球8个字节

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

用/ g替换为正则表达式可替换所有实例。m使正则表达式在字符串^的开头分别对待每一行。

在线尝试!


似乎将输入中的非空白混为asdf一遍又一遍。
Papayaman1000

您应该注意我在TIO中输入的内容
fəˈnɛtɪk

您可以通过一次性x=>x.replace(/^|\n/g,"$&    ")获取第一行随后的行来节省一些字节
ETHproductions'Apr 8'17

1
26个字节:在线尝试!
Conor O'Brien

1
我猜想也可以^起作用;-)
ETHproductions'Apr 8'17

4

Python 2,87 45字节

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

输入为'Line1\nLine2\nLine3...'(需要引号)

感谢@WheatWizard给我一个帮助我打高尔夫球42字节的想法。


我在python上长大。这就是让我认为这有点困难的原因。即使忽略正则表达式,我是如此错误的,事实证明。
Papayaman1000

@ Papayaman1000无论有没有RegEx,这都是一个相当琐碎的挑战,尽管我发现它非常有趣。
HyperNeutrino

2
我会承认,因为我不知道Ctrl + K,所以提出这一挑战的真正原因不是仅仅因为令人费解。
Papayaman1000

@ Papayaman1000哈哈,是的,必须在每行前面按空格四次,这很烦人。特别是由于我通常使用Python,因此我一直都有多行代码(当我过去使用Java时还不错)。最终,我变得懒惰了,并使用文本编辑器将其替换^为``。
HyperNeutrino

1
@WheatWizard感谢您的建议,我打了一下高尔夫球。现在好一点了吗?
HyperNeutrino

4

果冻,8 字节

Ỵṭ€⁶ẋ4¤Y

在线尝试!

怎么样?

Ỵṭ€⁶ẋ4¤Y - Main link: string
Ỵ        - split on newlines
      ¤  - nilad followed by ink(s) as a nilad:
   ⁶     -     a space character
    ẋ4   -     repeated four times
 ṭ€      - tack for €ach
       Y - join with newlines

其他8个字节的变体是:(
Ỵṭ€⁶Yµ4¡在换行符上重复4次拆分,用一个空格隔开);
⁶ḤḤ;ЀỴY(两次加倍就像乘以4,Ѐ映射到正确的参数,因此我们可以串联而不是附加);
及其其他重排。


4

Emacs,5个和弦,5个字节

C-x h M-4 C-x tab

在至少一种常用的键盘输入编码中,这些键和弦中的每一个都是一个字节: 18 68 b4 18 09。Emacs条目往往非常繁琐,因为每个可打印的ASCII字符代表自己,除了作为多字符命令的后继字符(这意味着只有键弦才可以用来发出实际命令)。

我不确定这与Vim(相对于V)相比如何。但是Vim在PPCG上相当普遍,因此我认为编辑战争的另一面也值得关注。

假设I / O是通过缓冲区(相当于vim的常规I / O约定)完成的,或者是从文件中提取并输出到屏幕上的(这是同一件事)。如果改为通过区域进行I / O,这对于某些形式的程序来说是很自然的,则可以删除前两个字符,得分为3个字节;但是,我认为这不符合PPCG规则。

说明

C-x h M-4 C-x tab
C-x h               Specify the entire buffer as the region
      M-4           Give the argument 4 to the next command that runs
          C-x tab   Increase the indentation level of each line by a constant

当然,这里使用的最后一个内置函数对于这一挑战非常有用。其余只是结构。


3

PowerShell,29个 28字节

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

-1感谢fergusq,使用实际的换行符代替`n

"$args"输入作为字符串(使用“ s”进行广播)并-split在换行符上进行输入,然后在其中循环(%{}),并附加四个空格(" "*4)和第($_)行,然后隐式输出。


您可以使用换行符代替`n吗?
fergusq

@fergusq确实可以,更新了。
colsw

假设换行符在Windows上仍为\ r \ n,但仍为两个字节-还是有规则阐明换行符占用多少字节?
poizan42

@ poizan42我不确定是否上面有一个meta帖子,但是我可以只在换行符的默认控制台中运行它,所以没有理由认为它无效。
colsw


2

Röda,21个字节

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

在线尝试!

这是一个匿名函数。输入从流中拉出。

说明:

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

identity()只是拉从标准输入的所有值?
Kritixi Lithos

@KritixiLithos是的。identity从输入流中提取值并将其推入其输出流。与相同push(x) for x
fergusq

2

Perl 5,11 + 1 = 12字节

11个字节的代码+ -p标志。

s/^/    /mg

在线尝试!

一次,简短的解释是:正则表达式将行的每个开头(^/m修饰符组合)替换为四个空格-结尾。


这一次读取输入的是一行,而不是整个字符串。

@ ais523大约一半的答案(包括前两个)以完全相同的方式读取输入。
Maxim Mikhaylov

@ ais523我想说它一次处理输入的一行,但是它可以将它作为一个完整的字符串读取(例如,如果为它提供<<<“ ...”)。你不同意吗?
达达

@ ais523再多考虑一下之后,我认为您是对的。(我已经相应地更新了代码)
Dada


2

sed16 10 9字节

s/^/    /

在线尝试!

编辑

由于使用了Kritixi Lithos,解决方案的大小从16个字节减少到10个字节。

-1字节感谢seshoumara


您可以通过使用-r标志(1个字节)获得15个字节,以便可以删除括号前的反斜杠。
Kritixi Lithos

您可以使用来达到13 s/.*/ &/(删除括号并替换\1&
Kritixi Lithos 17-4-9的

@KritixiLithos谢谢!即使没有也可以使用*
Maxim Mikhaylov

或者简单地s:^: :,为9个字节。
seshoumara

@seshoumara我从未见过冒号在sed脚本中以这种方式使用...您知道手册的哪一部分描述了这种语法?
Maxim Mikhaylov

2

Java 7,58个字节

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

说明:

在这里尝试。

  • 附加四个前导空格
  • 将每个换行替换为换行+四个空格

我为Java的正则表达式机制在大多数情况下需要其他库而感到永远难过。

我认为您需要replaceAll
Khaled.K

@ Khaled.K为什么?这两个.replace.replaceAll的与更换搜索的字符串将取代所有出现。.replace用于文字字符串和正则.replaceAll表达式。由于\n它不是正则表达式,.replace因此可以毫无问题地用换行符+四个空格替换所有换行符,也可以在我提供的“ Try it line”链接中进行检查。
凯文·克鲁伊森

2

Brain-Flak109103字节

-6感谢Wheat Wizard

包括+1的 -c

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

在线尝试!

((()()()()()){})        # 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很好。我需要开始寻找这样的冗余。我可能比推流行音乐更常发生这种情况。这些现在都是自动的。谢谢
赖利




1

MATL,12字节

10&Yb"4Z"@gh

输入是带有换行符的字符串。要输入此内容,您需要将普通字符之间的字符10连接起来以表示换行符(方括号为串联):

['Code' 10 'More code']

在线尝试在MATL!

说明

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

与运行php -R <code>-R为每个输入行运行给定的代码,并$argn馈入当前输入行。因此,这只是在每行前面打印了四个空格。


1

V,3个字节(不竞争)

4>G

这是答案,它使用了我一直计划添加一段时间的功能,但是今天才添加。这使得该答案不具有竞争性,并且无效。但是炫耀这种有用/竞争的功能仍然很酷!

在线尝试!

说明:

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

整齐!至少您对自己的语言甚至在事先就占据了第一的位置感到骄傲(即使这是一种肮脏的高尔夫语言……不,jk)!
Papayaman1000年

1

Vim,6次击键

<Ctrl-V>G4I <Esc>

假设光标位于文件的开头,就像您是通过命令行从命令行打开文件一样 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

将vim配置为使用4个空格进行缩进时,将需要2次击键:>G


我很确定您可以ZZ在末尾删除。通常,vim提交只是输出到缓冲区而不是文件即可。
DJMcMayhem

好的,谢谢,ZZ然后我删除了。
daniero '17

1

Japt7 6字节

@ETHproductions节省了1个字节

miS²²R

在线尝试!

说明:

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

不错的工作。S²²可以代替,也可以正常工作Sp4,而不是在这种情况下为您节省任何费用。说到这一点,我认为您可以miS²²R删除R标志(基本上是miS²²,但是先在换行符处分割,然后再与换行符
合并

1

UberGenes,62个字节

我必须使用UberGenes来应对这一挑战,因为一个非常相似的程序(仅插入一个空格)是我用该语言编写的第一批程序之一,并且看起来很容易为此目的进行修改。

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

怎么运行的:

=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个字节

感谢@ Challenger5的更正

qN/{S4*\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

1
不适用于abc\n\ndef。它返回....abc\n....def是因为%丢弃空元素。您想使用/split代替,因为它保留了空元素。
硕果累累

@ Challenger5谢谢,纠正了!
路易斯·门多

1

J-uby17 16字节

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

说明

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

这直接转换为(在Ruby中):

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

1

实际上,16个字节

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

在线尝试!

说明:

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字节

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

在线尝试!


整洁的解决方案,但您可以使用s;char*l;f(){while(getline(&l,&s,stdin)+1)printf("____%s",l);}62个字节
Khaled.K,2017年

@ Khaled.K谢谢,但是如果不包含<stdio.h>(由于),这似乎不起作用stdin
Steadybox'5
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.