Lấy CR và LF theo nghĩa đen


22

Như một kỷ niệm của Notepad cũ , chúng tôi sẽ coi lợi nhuận vận chuyển và nguồn cấp dữ liệu như ý nghĩa ban đầu, thay vì những gì chúng được sử dụng cho ngày hôm nay.

Đưa ra một chuỗi bao gồm các nguồn cấp dữ liệu dòng ASCII cộng có thể in (␊; LF; esc \n; hex 0A; dec 10) và trả về vận chuyển (; CR; esc \r; hex 0D; dec 13), khiến Try It Online hiển thị cách các ký tự có thể in được sẽ được định vị nếu được in trên máy in có hai ký tự điều khiển theo nghĩa đen:

  1. trên một nguồn cấp dữ liệu, tiếp tục in thêm một dòng xuống
  2. khi trở về xe ngựa tiếp tục in từ cạnh trái
  3. nhiều chuyến xe trở lại hoạt động giống như một chuyến xe ngựa

Do các thiết bị hiện đại gặp vấn đề với overstriking , một hoạt động của một hoặc nhiều kí tự xuống dòng sẽ, ngoại trừ ở phần đầu của đầu vào, không bao giờ xảy ra mà không có ít nhất một trước và / hoặc sau ăn dòng. Tuy nhiên, hai lần trả về vận chuyển có thể được phân tách bằng một nguồn cấp dữ liệu đơn.

Bất kỳ số lượng khoảng trắng kéo dài bổ sung nào đều được chấp nhận, cả ở phía bên phải của bất kỳ dòng nào và bên dưới toàn bộ văn bản, miễn là ít nhất lượng khoảng trắng được cung cấp trong đầu vào được giữ nguyên.

Ví dụ (sử dụng \n\rcho nguồn cấp dữ liệu và trả lại vận chuyển)

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 (chú ý các dấu cách)

et dolore
magna          
aliqua. Ut

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

enim quảng cáo tối thiểu veniam,
     lỗ mũi

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

tập thể dục
ullamco labis

nisi ut aliquip ex

hậu quả của hàng hóa



28
Câu trả lời được đề xuất: Notepad, 179712 byte
Nit

3
@Nit: | notepad không phải là TC
ASCII - chỉ

2
Thật xấu hổ khi TIO không sử dụng một thiết bị đầu cuối thích hợp, nếu không thì một người chiến thắng vỏ đẹp sẽ là stty -onlcr;cat.
Toby Speight

1
Tôi gặp sự cố khi nhập các ký tự trả về vào trường "đầu vào" của TIO. Chúng dường như bị nuốt chửng (hoặc chuyển thành dòng mới) khi dán - đó là trình duyệt của tôi có lỗi hay là TIO?
Toby Speight

2
@ Adám Đừng cấm tất cả các kết quả đầu ra hơn TIO. Thay vào đó, hạn chế các chương trình sử dụng các loại thiết bị đầu cuối nhất định hoặc đầu ra tệp. Hoặc yêu cầu đầu ra có các khoảng trắng cần thiết trước văn bản trên các dòng mới.
mbomb007

Câu trả lời:


6

Than , 10 byte

UTFθ«ι≡ι⸿↑

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

UT

Vô hiệu hóa đệm phải.

Fθ«

Lặp lại đầu vào.

ι

In ký tự hiện tại. Điều này sẽ tự động xử lý \n(mà Char than đối xử như \vtrong bối cảnh này) nhưng Char than dịch \rthành \r\n, vì vậy ...

≡ι⸿

... kiểm tra một \r...

... và nếu vậy thì di chuyển ngược lên một dòng.


Bạn có nên xóa lcờ khỏi liên kết TIO của mình không?
Adám

@ Adám Điều gì để ngăn tôi dán bất kỳ câu nói vô nghĩa nào vào câu trả lời của tôi và sau đó liên kết với một chương trình tối ưu?
Neil

Tôi hiểu rồi. Có lẽ Char than nên xuất liên kết TIO sang stderr (Gỡ lỗi)?
Adám

@ Adám tôi sẽ đề xuất điều đó chỉ với @ ASCII.
Neil

@Neil đã sửa, tôi nghĩ sao?
ASCII - chỉ

5

Ruby , 24 17 byte

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

Hãy thử trực tuyến!

Nó không hoạt động trên TIO, nhưng hoạt động trên bảng điều khiển Linux.


Bạn có thể thả khoảng trống giữa tr "tôi nghĩ.
Kevin Cruijssen

Uh, tôi không nghĩ đến giải pháp này, nó có thể hoạt động đối với bất kỳ ngôn ngữ nào để thay đổi tất cả \nthành \vkhi chạy trong bảng điều khiển Linux.
Adám

@ Adám Điều gì về một số ngôn ngữ không thay đổi gì và hoạt động trong bảng điều khiển DOS?
tsh

Tôi xin lỗi vì đã thay đổi thử thách giữa thông số kỹ thuật, nhưng để làm cho thử thách trở nên thú vị hơn và ít chịu những câu trả lời tầm thường, giờ đây tôi yêu cầu đầu ra thích hợp trên TIO .
Adám

5
Thay đổi thông số: Tôi không nghĩ nó công bằng. nhưng tôi sẽ xóa câu trả lời của tôi nếu tôi phải.
GB

4

Java 10, 211 207 206 byte

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);}

Hãy thử trực tuyến.

Giải trình:

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

Câu trả lời cũ trước khi thử thách được thay đổi 151 148 byte :

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

Giải trình:

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

Không hoạt động trên TIO, không hoạt động trên Windows Command Prompt:

nhập mô tả hình ảnh ở đây



3

Python 2 , 150 128 122 104 103 byte

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

Hãy thử trực tuyến!


Đã lưu:

  • -1 byte, nhờ Lynn

Có vẻ như l,n,i=[l,l+c,l+' '*i*n+c,n,1,0,0,i,i+1]['\r\n'.find(c)%3::3]chỉ là ngắn hơn.
Lynn

3

C (gcc) , 100 94 byte

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);}

Giả sử mã hóa ASCII ( '\r'==13, '\n'==10); điều chỉnh cho phù hợp trên các hệ thống khác.

Hãy thử trực tuyến! (yêu cầu Javascript)

Phiên bản dễ đọc

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

clà vị trí cột hiện tại; dlà số lượng khoảng trắng phải được chèn trước một ký tự có thể in được. Cả hai đều được coi là 0 khi nhập vào hàm.

Chương trình kiểm tra

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 chỉ là ints nhỏ , chúng nên có thể thay thế cho nhau (theo lý thuyết). Có thể gccsẽ thực hiện một dàn diễn viên ngầm
Stan Strum


Nhân tiện, tôi không nghĩ rằng theo sự đồng thuận của chúng tôi, bạn được phép đặt lại các biến toàn cầu của mình c,d. Chức năng của bạn nên - không có mã dọn dẹp khác - có thể chạy nhiều lần. Vì vậy, rất có thể bạn cần phải thêm một c=d=0.
Jonathan Frech

Đối với sự quan tâm của bạn, các bài đăng meta có liên quan .
Jonathan Frech

Bây giờ nó là một chức năng có thể tái sử dụng.
Toby Speight

2

Python 3 , 101 94 byte

Dựa trên câu trả lời của 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

Hãy thử trực tuyến!


Bị đánh cắp

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

Sạch , 92 91 byte

-1 cảm ơn Laikoni!

Lưu ý: \ in \rđược bỏ qua từ bytecount vì Linux CG xử lý bằng chữ \r\ns.
Lưu ý: Windows CG yêu cầu \n\rđược thoát, vì vậy +3 nếu nó phải chạy trên Windows.

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

?0

Hãy thử trực tuyến!

Một ứng dụng một phần ? :: Int [Char] -> [Char]với 0 là đối số đầu tiên ban đầu. Điều này đi xuống qua mỗi nhân vật theo dõi có bao nhiêu lần đi qua, số đếm được đặt lại khi nó gặp trở lại xe ngựa và khi gặp một dòng mới, nó thêm khoảng trắng bằng với số lượng ký tự đi qua tại điểm đó.


1
Tôi nghĩ rằng ?_[]=[]có thể ?_ e=e.
Laikoni

@Laikoni Bạn nói đúng. Tôi thề là tôi đã bỏ lỡ chính xác điều đó hàng chục lần rồi.
Οurous

1

Haskell , 93 87 byte

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

Hãy thử trực tuyến!


Giải pháp khá đơn giản. # là một hàm infix tạo đệ quy một ký tự đầu ra tại một thời điểm trong khi vẫn giữ bộ đếm vị trí ký tự (n) và gắn cờ khi nào cần thêm khoảng trắng sau một dòng mới (x).


1
Bạn có thể xác định hàm infix thay vì c, sử dụng l$rthay vì c 0 0rc _ _ e=e(hoặc đúng hơn (_#_)e=e).
Laikoni

Tất cả cùng nhau 87 byte: Hãy thử trực tuyến!
Laikoni

@Laikoni Cảm ơn bạn, tôi không nhận ra bạn có thể sử dụng thủ thuật infix đó với nhiều tham số đó.
aoemica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.