รับ CR และ LF อย่างแท้จริง


22

ในฐานะที่เป็นการเฉลิมฉลองของNotepad เก่าที่ดีเราจะปฏิบัติต่อการรับคืนและการป้อนบรรทัดตามที่พวกเขาต้องการในตอนแรกมากกว่าที่จะใช้ในปัจจุบัน

รับสตริงที่ประกอบด้วย ASCII ที่พิมพ์ได้รวมกับตัวดึงข้อมูลบรรทัด (␊; LF; esc \n; hex 0A; dec 10) และการขึ้นบรรทัดใหม่ (␍; CR; esc \r; hex 0D; Dec 13) ทำให้ลองออนไลน์เพื่อแสดงว่าอักขระที่พิมพ์ได้ จะอยู่ในตำแหน่งหากพิมพ์บนเครื่องพิมพ์ซึ่งใช้อักขระควบคุมสองตัวนั้น:

  1. ป้อนบรรทัดต่อไปให้พิมพ์บรรทัดเดียวต่อไป
  2. บนแคร่ตลับหมึกพิมพ์ให้ดำเนินการพิมพ์ต่อจากขอบซ้าย
  3. การรับคืนที่ต่อเนื่องหลายครั้งจะทำตัวเหมือนการรับคืนแบบเดียว

เนื่องจากอุปกรณ์ที่ทันสมัยมีปัญหากับoverstriking , การทำงานของหนึ่งหรือมากกว่าของผลตอบแทนการขนส่งจะยกเว้นสำหรับจุดเริ่มต้นของการป้อนข้อมูลที่ไม่เคยเกิดขึ้นโดยไม่ต้องมีอย่างน้อยหนึ่งก่อนหน้านี้และ / หรือต่อไปนี้อาหารเส้น อย่างไรก็ตามการขึ้นบรรทัดใหม่สองครั้งอาจถูกคั่นด้วยฟีดบรรทัดเดียว

จำนวนพื้นที่สีขาวต่อท้ายเพิ่มเติมสามารถใช้ได้ทั้งทางด้านขวาของบรรทัดใด ๆ และด้านล่างของข้อความทั้งหมดตราบใดที่จำนวนของพื้นที่สีขาวที่กำหนดในอินพุตถูกเก็บรักษาไว้

ตัวอย่าง (การใช้\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

ถ้าต้องการดูรายละเอียดน้อยที่สุด
     ออกจาก nostrud

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

exercitation
แรงงาน ullamco

ค้างไว้ที่ aliquip ex

ส่งผลให้สินค้าโภคภัณฑ์



28
คำตอบที่แนะนำ: Notepad, 179712 bytes
Nit

3
@Nit: | notepad ไม่ใช่ TC
ASCII- เท่านั้น

2
ความอัปยศที่ TIO stty -onlcr;catไม่ได้ใช้ขั้วที่เหมาะสมมิฉะนั้นผู้ชนะเปลือกที่ดีจะ
Toby Speight

1
ฉันมีปัญหาในการป้อนอักขระ carriage-return ลงในฟิลด์ "อินพุต" ของ TIO ดูเหมือนว่าพวกเขาจะถูกกลืนหายไป (หรือแปลงเป็นบรรทัดใหม่) เมื่อวาง - เบราว์เซอร์ของฉันมีข้อบกพร่องหรือเป็น TIO หรือไม่
Toby Speight

2
@ Adámอย่าห้ามเอาต์พุตทั้งหมดกว่า TIO แทนที่จะ จำกัด โปรแกรมให้ใช้เทอร์มินัลบางประเภทหรือส่งไฟล์ออกแทน หรือต้องการเอาต์พุตที่มีช่องว่างที่จำเป็นนำหน้าข้อความในบรรทัดใหม่
mbomb007

คำตอบ:


6

ถ่าน 10 ไบต์

UTFθ«ι≡ι⸿↑

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

UT

ปิดใช้งานช่องว่างด้านขวา

Fθ«

วนซ้ำอินพุต

ι

พิมพ์ตัวละครปัจจุบัน สิ่งนี้จะจัดการโดยอัตโนมัติ\n(ซึ่ง Charcoal ปฏิบัติเช่นเดียวกับ\vในบริบทนี้) แต่ Charcoal แปล\rเป็น\r\nดังนั้น ...

≡ι⸿

... ตรวจสอบ\r...

... และถ้าเป็นเช่นนั้นให้ย้ายกลับบรรทัด


คุณไม่ควรลบการlตั้งค่าสถานะออกจากลิงค์ TIO ของคุณ?
อดัม

@ Adámฉันจะหยุดวางคำซึ่งพูดพล่อยๆใด ๆ ลงในคำตอบของฉันแล้วเชื่อมโยงไปยังโปรแกรมที่ไม่ดี?
Neil

ฉันเห็น. บางที Charcoal ควรส่งลิงก์ TIO ไปยัง stderr (Debug) หรือไม่
อดัม

@ Adámฉันจะแนะนำให้ใช้กับ @ ASCII เท่านั้น
Neil

@ คงที่ฉันคิดว่า?
ASCII- เท่านั้น

5

Ruby , 24 17 ไบต์

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

ลองออนไลน์!

มันไม่ทำงานบน TIO แต่ทำงานบนคอนโซล Linux


คุณสามารถวางช่องว่างระหว่างtr "ฉันคิด
Kevin Cruijssen

เอ่อฉันไม่คิดว่าจะแก้ปัญหานี้มันอาจทำงานได้สำหรับภาษาใด ๆ ที่จะเปลี่ยนทั้งหมด\nเป็น\vเมื่อทำงานในคอนโซล Linux
อดัม

@ Adámแล้วภาษาอะไรบ้างที่ไม่เปลี่ยนแปลงและใช้งานได้ในคอนโซล DOS?
tsh

ฉันขอโทษสำหรับการเปลี่ยนกลางท้าทายข้อมูลจำเพาะ แต่เพื่อให้ความท้าทายที่น่าสนใจมากขึ้นและอาจมีน้อยที่จะตอบเล็กน้อยตอนนี้ผมจำเป็นต้องมีการส่งออกที่เหมาะสมใน TIO
อดัม

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:

enter image description here



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]จะสั้นลงเพียงเล็กน้อย
Lynn

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

91 ไบต์
Jonathan Frech

c,dโดยวิธีการที่ผมไม่คิดว่าต่อฉันทามติของเราท่านจะได้รับอนุญาตให้ตั้งค่าตัวแปรทั่วโลกของคุณ ฟังก์ชั่นของคุณควร - โดยไม่มีรหัสการล้างข้อมูลอื่น - สามารถรันได้หลายครั้ง c=d=0ดังนั้นคุณส่วนใหญ่มีแนวโน้มความต้องการที่จะเพิ่ม
Jonathan Frech

สำหรับความสนใจของคุณโพสต์เมตาที่เกี่ยวข้อง
Jonathan Frech

ตอนนี้มันเป็นฟังก์ชั่นที่ใช้ซ้ำได้
Toby Speight

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

ลองออนไลน์!


Ungolfed

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!

หมายเหตุ: \ in \rถูกตัดออกจาก bytecount เนื่องจาก Linux CG จัดการตามตัวอักษร\rและ\ns
หมายเหตุ: Windows CG ต้องการ\nและ\rหนีออกมาดังนั้น +3 หากต้องใช้กับ Windows

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 เป็นอาร์กิวเมนต์แรกเริ่มต้น สิ่งนี้จะสืบผ่านตัวละครแต่ละตัวที่ติดตามว่ามีการสัญจรไปมากี่ครั้งการนับจะรีเซ็ตเมื่อพบการขึ้นบรรทัดใหม่และเมื่อพบ newline จะเพิ่มช่องว่างเท่ากับจำนวนอักขระที่เข้าไปในจุดนั้น


1
ผมคิดว่าอาจจะเป็น?_[]=[] ?_ e=e
Laikoni

@Laikoni คุณพูดถูก ฉันสาบานได้ว่าฉันพลาดสิ่งเดียวกันไปหลายสิบครั้งแล้ว
Οurous

1

Haskell , 93 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

ลองออนไลน์!


ทางออกที่ตรงไปตรงมาสวย # เป็นฟังก์ชั่น infix ที่สร้างเอาท์พุทครั้งละหนึ่งตัวอักษรในขณะที่รักษาตัวนับตำแหน่งตัวอักษร (n) และตั้งค่าสถานะสำหรับเมื่อต้องการเพิ่มช่องว่างหลังจากขึ้นบรรทัดใหม่ (x)


1
คุณสามารถกำหนดฟังก์ชั่นมัดแทนการcใช้l$rแทนc 0 0rและc _ _ e=e(หรือมากกว่า(_#_)e=e)
Laikoni

รวมกัน 87 ไบต์: ลองออนไลน์!
Laikoni

@Laikoni ขอขอบคุณฉันไม่ได้ตระหนักว่าคุณสามารถใช้เคล็ดลับมัดที่กับพารามิเตอร์มากมาย
aoemica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.