Ambil CR dan LF secara harfiah

22

Sebagai perayaan Notepad tua yang baik , kami akan memperlakukan carriage return dan line feeds seperti yang mereka maksudkan, dan bukan apa yang mereka (ab-) gunakan untuk hari ini.

Diberikan string yang terdiri dari ASCII yang dapat dicetak ditambah umpan garis (␊; LF; esc \n; hex 0A; dec 10) dan carriage return (␍; CR; esc \r; hex 0D; dec 13), menyebabkan Try It Online untuk menunjukkan bagaimana karakter yang dapat dicetak dicetak akan diposisikan jika dicetak pada printer yang mengambil dua karakter kontrol secara harfiah:

  1. pada umpan baris, lanjutkan mencetak satu baris lebih jauh ke bawah
  2. setelah carriage return melanjutkan pencetakan dari tepi kiri
  3. beberapa carriage return berulang berperilaku seperti pengembalian carriage tunggal

Dikarenakan perangkat modern mengalami masalah dengan overstriking , serangkaian pengembalian carriage satu atau lebih akan, kecuali pada awal input, tidak pernah terjadi tanpa setidaknya satu umpan baris sebelum dan / atau mengikuti. Namun, dua putaran carriage return dapat dipisahkan oleh satu baris feed.

Setiap jumlah ruang putih tambahan tambahan dapat diterima, baik di sisi kanan dari setiap baris dan di bawah seluruh teks, selama setidaknya jumlah ruang putih yang diberikan dalam input dipertahankan.

Contoh (menggunakan \ndan \runtuk umpan baris dan pengembalian carriage)

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 (perhatikan spasi tambahan)

et dolore
magna          
aliqua. Ut

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

enim ad minim veniam,
     quan nostrud

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

latihan
ullamco laboris

nisi ut aliquip ex

Sebagai akibatnya.


Adm
sumber
28
Jawaban yang disarankan: Notepad, 179712 byte
Nit
3
@Nit: | notepad bukan TC
ASCII-satunya
2
Malu bahwa TIO tidak menggunakan terminal yang tepat, jika tidak pemenang shell yang bagus akan stty -onlcr;cat.
Toby Speight
1
Saya mengalami kesulitan memasukkan karakter carriage-return ke bidang "input" TIO. Mereka sepertinya tertelan (atau dikonversi menjadi baris baru) ketika menempel - apakah browser saya salah, atau apakah itu TIO?
Toby Speight
2
@ Adám Jangan melarang semua output selain TIO. Alih-alih membatasi program untuk menggunakan tipe terminal tertentu, atau untuk mengarsipkan output. Atau mengharuskan output memiliki spasi yang diperlukan sebelum teks pada baris baru.
mbomb007

Jawaban:

6

Arang , 10 byte

UTFθ«ι≡ι⸿↑

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

UT

Nonaktifkan bantalan kanan.

Fθ«

Ulangi input.

ι

Cetak karakter saat ini. Ini secara otomatis menangani \n(yang diperlakukan Arang seperti \vdalam konteks ini) tetapi diterjemahkan \rmenjadi \r\n, jadi ...

≡ι⸿

... periksa untuk \r...

... dan jika demikian maka naik kembali ke garis.

Neil
sumber
Bukankah sebaiknya Anda menghapus lbendera dari tautan TIO Anda?
Adám
@ Adám Apa yang harus saya hentikan menempelkan omong kosong ke dalam jawaban saya dan kemudian menautkan ke program suboptimal?
Neil
Saya melihat. Mungkin Charcoal harus menampilkan tautan TIO ke stderr (Debug)?
Adám
@ Adám saya akan menyarankan itu hanya untuk @ ASCII.
Neil
@Nil tetap, saya pikir?
ASCII
5

Ruby , 24 17 byte

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

Cobalah online!

Ini tidak bekerja pada TIO, tetapi bekerja pada konsol Linux.

GB
sumber
Anda dapat menempatkan ruang antara tr "saya pikir.
Kevin Cruijssen
Eh, saya tidak memikirkan solusi ini, mungkin saja berfungsi untuk bahasa apa saja untuk mengubah semua \nmenjadi \vketika dijalankan di konsol Linux.
Adám
@ Adám Bagaimana dengan beberapa bahasa tidak mengubah apa pun dan bekerja di konsol DOS?
tsh
Saya minta maaf karena mengubah spec mid-challenge, tetapi untuk membuat tantangan lebih menarik dan kurang tunduk pada jawaban yang sepele, saya sekarang membutuhkan output yang tepat pada TIO .
Adám
5
Mengubah spec: Saya pikir itu tidak adil. tetapi saya akan menghapus jawaban saya jika perlu.
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);}

Cobalah online.

Penjelasan:

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

Jawaban lama sebelum tantangan diubah 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;}

Penjelasan:

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

Tidak bekerja pada TIO, tidak bekerja pada Windows Command Prompt:

masukkan deskripsi gambar di sini

Kevin Cruijssen
sumber
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

Cobalah online!


Disimpan:

  • -1 byte, terima kasih untuk Lynn
TFeld
sumber
Tampaknya l,n,i=[l,l+c,l+' '*i*n+c,n,1,0,0,i,i+1]['\r\n'.find(c)%3::3]hanya sedikit lebih pendek.
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);}

Asumsikan pengkodean ASCII ( '\r'==13, '\n'==10); sesuaikan dengan sistem lainnya.

Cobalah online! (membutuhkan Javascript)

Versi yang mudah dibaca

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

cadalah posisi kolom saat ini; dadalah jumlah spasi yang harus dimasukkan sebelum karakter yang dapat dicetak. Keduanya dianggap nol pada saat masuk ke fungsi.

Program uji

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]);
}
Toby Speight
sumber
charIni hanya kecil int, mereka harus dipertukarkan (secara teori). Mungkin gccakan melakukan pemeran tersirat
Stan Strum
91 byte .
Jonathan Frech
Ngomong-ngomong, saya tidak berpikir bahwa berdasarkan konsensus kami Anda diizinkan untuk mengatur ulang variabel global Anda c,d. Fungsi Anda harus - tanpa kode pembersihan lainnya - dapat berjalan beberapa kali. Jadi Anda kemungkinan besar perlu menambahkan c=d=0.
Jonathan Frech
Untuk minat Anda, pos meta yang relevan .
Jonathan Frech
Sekarang fungsi yang dapat digunakan kembali.
Toby Speight
2

Python 3 , 101 94 byte

Berdasarkan jawaban 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

Cobalah online!


Tidak disatukan

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)
ovs
sumber
2

Bersih , 92 91 byte

-1 terima kasih kepada Laikoni!

Catatan: \ di \rdihilangkan dari bytecount karena Linux CG menangani literal \rdan \ns.
Catatan: Windows CG membutuhkan \ndan \rmelarikan diri, jadi +3 jika harus dijalankan pada Windows.

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

?0

Cobalah online!

Aplikasi parsial ? :: Int [Char] -> [Char]dengan 0 sebagai argumen pertama awal. Ini turun melalui masing-masing karakter melacak berapa banyak dilalui, hitungan ulang ketika bertemu carriage return dan ketika bertemu garis baru itu menambahkan ruang sama dengan jumlah karakter yang dilalui pada titik itu.

Suram
sumber
1
Saya pikir ?_[]=[]bisa ?_ e=e.
Laikoni
@Laikoni Kamu benar. Aku bersumpah aku telah melewatkan hal yang persis sama selusin kali sekarang.
Kamis
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

Cobalah online!


Solusi yang sangat mudah. # adalah fungsi infix yang secara rekursif menciptakan output satu karakter pada satu waktu sambil menjaga penghitung posisi karakter (n) dan menandai kapan harus menambahkan spasi setelah baris baru (x).

aoemica
sumber
1
Anda dapat mendefinisikan fungsi infiks alih-alih c, menggunakan l$ralih-alih c 0 0rdan c _ _ e=e(atau lebih tepatnya (_#_)e=e).
Laikoni
Secara keseluruhan 87 byte: Cobalah secara online!
Laikoni
@Laikoni Terima kasih, saya tidak menyadari Anda bisa menggunakan trik infix dengan banyak parameter.
aoemica