从字面上看CR和LF


22

为了庆祝好旧的记事本,我们将把回车符和换行符视为它们的原始含义,而不是它们今天所使用的含义。

鉴于由可打印的ASCII加换行符的字符串(␊; LF; ESC \n;十六进制0A; 12月10日)和回车(␍; CR; ESC \r;十六进制0D; 12月13日),在线试用说明如何使用可打印字符如果在使用字面意义上的那两个控制字符的打印机上进行打印,将被定位

  1. 换行后,继续向下打印一行
  2. 回车后,继续从左侧打印
  3. 多个连续的回车符的行为类似于单个回车符

由于现代设备存在过行程问题,除非输入至少在输入之前和/或之后,否则不会发生一次或多次回车,除非在输入开始时。但是,两次回车可以通过换行分隔。

只要至少保留输入中给定的空白量,无论在任何行的右侧还是在整个文本下方,任何数量的附加尾随空白都是可以接受的。

示例(将\n\r用于换行和回车)

Lorem ipsum dolor sit amet,

Lorem ipsum dolor sit amet,

consectetur adipiscing\nelit, sed

consectetur adipiscing
                      elit, sed

do eiusmod\r\ntempor incididunt\n\n ut labore

do eiusmod
tempor incididunt

                  ut labore

et dolore\n\rmagna \r\r\naliqua. Ut (注意尾随空格)

et dolore
magna          
aliqua. Ut

\nenim ad minim veniam,\n\r quis nostrud

enim ad minim veniam,
     quis nostrud

\rexercitation\r\n\rullamco laboris\n\r\nnisi ut aliquip ex\n\n\rea commodo consequat.\n\n

锻炼
厄拉莫科实验室

前新闻

com commodo结果。



28
建议答案:记事本,179712字节
Nit

3
@尼特:| 记事本不是TC
仅使用ASCII

2
TIO没有使用适当的终端可耻,否则将是一个不错的shell赢家stty -onlcr;cat
Toby Speight,

1
我无法在TIO的“输入”字段中输入回车符。粘贴时它们似乎只是被吞没了(或转换为换行符)-是我的浏览器出错了,还是TIO?
Toby Speight

2
@Adám除了TIO,不要禁止所有输出。而是将程序限制为使用某些终端类型或文件输出。或要求输出在新行上的文本之前具有必要的空格。
mbomb007 '18

Answers:


6

木炭,10字节

UTFθ«ι≡ι⸿↑

在线尝试!链接是详细版本的代码。说明:

UT

禁用右填充。

Fθ«

循环输入。

ι

打印当前字符。这会自动处理\n\v在这种情况下,木炭将其视为),但木炭会转换\r\r\n,因此...

≡ι⸿

...检查\r...

...,如果是的话,然后往回移上一行。


您不应该l从TIO链接中删除该标志吗?
亚当

@Adám是什么阻止我将任何胡言乱语粘贴到答案中,然后链接到次优程序?
尼尔,

我懂了。也许木炭应该将TIO链接输出到stderr(调试)?
亚当

@Adám我建议仅使用@ASCII。
尼尔,

@Neil固定,我想吗?
仅限ASCII

5

红宝石24 17字节

->s{s.tr $/,"\v"}

在线尝试!

它不适用于TIO,但适用于Linux控制台。


您可以在tr "我认为之间留出空间。
凯文·克鲁伊森

嗯,我没有想到这个解决方案,当它在Linux控制台中运行时,它可能只适用于任何语言将所有\ns 更改为\v
阿达姆(Adám)'18年

@Adám某些语言什么都不会改变并且可以在DOS控制台中工作?
tsh

对于在中段挑战期间更改规格感到很抱歉,但是为了使挑战更有趣并且更少受到琐碎的回答,我现在需要在TIO上输出适当的信息。
阿达姆(Adám)'18年

5
更改规格:我认为这不公平。但如有必要,我将删除答案。
GB

4

Java的10,211个 207 206字节

s->{var a=s.replace("\r\n","\n\r").split("(?<=\n)");int i=0,p=0,j;for(var x:a){for(j=x.charAt(0)<14?0:p;j-->0;x=" "+x);j=(a[i++]=x.replace("\r","")).length()-1;p=x.matches("\\s+")?p:j;}return"".join("",a);}

在线尝试。

说明:

s->{                      // Method with String as both parameter and return-type
  var a=s.replace("\r\n","\n\r")
                          //  Replace all "\r\n" with "\n\r"
        .split("(?<=\n)");//  Create String-array split by "\n",
                          //  without removing the trailing "\n" delimiter
  int i=0,                //  Index integer
      p=0,                //  Previous line-length, starting at 0
      j;                  //  Temp integer
  for(var x:a){           //  Loop over the String-array
    for(j=x.charAt(0)<14?0//   If the current line starts with either '\r' or '\n':
        0                 //    Prepend no spaces
       :                  //   Else:
        p;j-->0;x=" "+x); //    Prepand `p` amount of spaces for the current item
    j=(a[i++]=x.replace("\r",""))
                          //   Remove all "\r" from the current line
       .length()-1;       //   Set `j` to the current line-length (minus the trailing '\n')
    p=x.matches("\\s+")?  //   If the current line only contains '\r', '\n' and/or spaces:
       p                  //    Leave `p` unchanged
      :                   //   Else:
       j;}                //    Change `p` to this line-length minus 1
  return"".join("",a);}   //  Return the String-array joined together

更改挑战之前的旧答案151 148个字节

s->{String a[]=s.replace("\r\n","\n\r").split("(?<=\n)"),r="";int p=0,i;for(var x:a){for(i=p;i-->0;r+=" ");i=x.length()-1;p=i<1?p:i;r+=x;}return r;}

说明:

s->{                            // Method with String as both parameter and return-type
  String a[]=s.replace("\r\n","\n\r") 
                                //  Replace all "\r\n" with "\n\r"
              .split("(?<=\n)"),//  Create String-array split by "\n",
                                //  without removing the trailing "\n" delimiter
         r="";                  //  Result-String, starting empty
  int p=0,                      //  Previous line-length, starting at 0
      i;                        //  Index (and temp) integer
  for(var x:a){                 //  Loop over the String-array
    for(i=p;i-->0;r+=" ");      //   Append `p` amount of spaces to the result
    i=x.length()-1;p=i<1?p:j;   //   If the current line is not empty:
                                //    Replace `p` with the length of this current line
    r+=x;}                      //   Append the current item
  return r;}                    //  Return the result-String

在TIO上不起作用,在Windows命令提示符下起作用:

在此处输入图片说明



3

Python 2中150个 128 122 104 103字节

def f(s):
 i=n=0;l=''
 for c in s:l,n,i=[l,l+c,l+' '*i*n+c,n,1,0,0,i,i+1]['\r\n'.find(c)%3::3]
 print l

在线尝试!


已保存:

  • -1字节,感谢Lynn

似乎l,n,i=[l,l+c,l+' '*i*n+c,n,1,0,0,i,i+1]['\r\n'.find(c)%3::3]只是短短一点。
林恩

3

C(gcc)100 94字节

b,c,d;f(char*s){for(b=13;b;b=*s++)b==13?c=d=0:b-10?d=!printf("%*c",++d,b),++c:putchar(b,d=c);}

假设ASCII编码('\r'==13'\n'==10); 进行调整以适合其他系统。

在线尝试!(需要Javascript)

可读版本

int c = 0;
int d = 0;

f(char*s)
{
    for (;*s;++s) {
        switch (*s) {
        case'\r':
            c = d = 0;
            break;
        case'\n':
            d = c;
            putchar(*s);
            break;
        default:
            printf("%*s%c", d, "", *s);
            d = 0;
            ++c;
        }
    }
}

c是当前列位置;d是在可打印字符之前必须插入的空格数。假定在函数输入时两者均为零。

测试程序

int main(int argc, char **argv)
{
    char s[1024];
    if (argc <= 1)
        while (fgets(s, sizeof s, stdin))
               f(s);
    else
        for (int i = 1;  i < argc;  ++i)
            f(argv[i]);
}

chars很小int,它们应该是可互换的(理论上)。也许gcc会进行隐式转换
Stan Strum


顺便说一句,我认为按照我们的共识,您不可以重置全局变量c,d。您的函数-无需其他清除代码-应该能够多次运行。因此,您很可能需要添加一个c=d=0
乔纳森·弗雷希

为了您的利益,请参阅相关的元文章
乔纳森·弗雷希

现在,它是一个可重用的功能。
Toby Speight '18

2

Python 3中101个 94字节

基于TFeld的答案

def f(s):
 i=n=0
 for c in s:k='\r\n'.find(c);a=k&1;print(end=-k*' '*i*n+c*a);n=k>0;i=i*a-k//2

在线尝试!


不打高尔夫球

def f(s):
  i=0  # position of the cursor
  n=0  # was the last character LF?
  for c in s:        # iterate over the input
    k='\r\n'.find(c) # k := 0 for CR, 1 for LF and -1 for every other character
    a=k&1            # as (-1)&1 == (1)&1 == 1, this is a := abs(k)
    print(end=-k*' '*i*n+c*a) # If c is a normal character (k == -1) and the last character was LF, 
                              # print leading spaces. If c is not CR, print it
    n=k>0            # n := True if c is LF, False otherwise
    i=i*a-k//2       # If c is either a newline or a printable character (a == 1),
                     # keep the cursor's position and increment it for a printable character ((-1)//2 == -1)

2

干净92个 91字节

-1感谢Laikoni!

注意: 因为Linux CG处理文字和s \\r所以从字节数中省略了in 。注意: Windows CG需要且已转义,因此如果必须在Windows上运行,则+3。\r\n
\n\r

import StdEnv
?n['\r':t]= ?0t
?n['
':t]=['
':spaces n]++ ?n t
?n[h:t]=[h: ?(n+1)t]
?_ e=e

?0

在线尝试!

? :: Int [Char] -> [Char]使用0作为初始第一个参数的部分应用。这会通过每个字符进行跟踪,记录遍历的数量,遇到回车符时计数将重置,遇到换行符时它将添加等于该点遍历的字符数的空格。


1
我认为?_[]=[]可以?_ e=e
莱科尼

@Laikoni你是对的。我发誓我到目前为止已经错过了十多次相同的事情。
Οurous

1

Haskell93 87字节

l=0#0
(n#x)(t:r)|t=='\n'=t:(n#1)r|t=='\r'=l$r|m<-n+1=(' '<$[1..n*x])++t:(m#0)r
(_#_)e=e

在线尝试!


非常简单的解决方案。#是一个固定函数,它一次递归地创建一个输出字符,同时保留一个字符位置计数器(n)并标记何时在换行符(x)之后添加空格。


1
您可以定义一个中缀函数来代替c,使用l$r代替c 0 0rc _ _ e=e(或宁可(_#_)e=e)。
拉科尼

总共87个字节:在线尝试!
拉科尼

@Laikoni谢谢,我没有意识到您可以使用带有这么多参数的中缀技巧。
aoemica
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.