Tam anlamıyla CR ve LF al


22

Eski güzel bir Notepad kutlaması olarak , satır başı işlemlerini gerçekleştireceğiz ve satır beslemelerini, bugün (ab-) kullandıklarından ziyade orjinalleri ile anlattıkları gibi ele alacağız.

Yazdırılabilir ASCII plus satır yayınlarından (␊; LF; esc \n; hex 0A; dec 10) ve satırbaşlarından (␍; CR; esc \r; hex 0D; dec 13) oluşan bir dize verildiğinde , Çevrimiçi Olarak yazdırılabilir karakterlerin nasıl gösterileceğini göstermesine neden olun yerleştirilmiş olacaktır bu iki denetim karakterleri anlamıyla götüren bir yazıcıda basılmış ise:

  1. bir satır beslemesinde, bir satır daha aşağı yazdırmaya devam edin
  2. satır başı üzerine sol kenardan yazdırmaya devam et
  3. art arda birden çok satır başı, tek satır başı gibi davranır

Aşırı çekme ile ilgili sorunları olan modern cihazlardan dolayı , girişin başlangıcı haricinde, bir veya daha fazla satır başı dönüşü hareketi, en az bir satır öncesi ve / veya sonraki satır beslemesi olmadan gerçekleşmez. Bununla birlikte, iki satır dönüşü tek bir satır besleme ile ayrılabilir.

Herhangi bir çizginin sağ tarafında ve metnin tamamının altında, en azından girişte verilen beyaz boşluk miktarı korunduğu sürece herhangi bir ek izleyen beyaz boşluk miktarı kabul edilebilir.

Örnekler (kullanarak \nve \rhat besleme ve satırbası)

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 (sondaki boşluklara dikkat edin)

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

exercitation
ullamco laboris

nisi ut aliquip ex

ea commodo sonucu.



28
Önerilen cevap: Not Defteri, 179.712 bayt
Nit

3
@Nit: | not defteri TC değildir
ASCII-sadece

2
TIO'nun uygun bir terminal kullanmaması konusunda utanç, aksi takdirde iyi bir kabuk kazanan olur stty -onlcr;cat.
Toby Speight

1
Satır-dönüş karakterlerini TIO'nun "giriş" alanına girmekte sorun yaşıyorum. Yapıştırırken sadece yutulmuş (veya yeni hatlara dönüştürülmüş) görünüyorlar - tarayıcım hatalı mı, yoksa TIO mu?
Toby Speight

2
@ Adám TIO dışındaki tüm çıktıları yasaklamayın. Bunun yerine, programları belirli terminal türlerini kullanarak veya dosya çıktısıyla sınırlandırın. Veya çıktının yeni satırlarda metinden önce gerekli boşluklara sahip olmasını gerektirir.
mbomb007

Yanıtlar:


6

Kömür , 10 bayt

UTFθ«ι≡ι⸿↑

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

UT

Sağ dolguyu devre dışı bırakın.

Fθ«

Girdi üzerinde döngü.

ι

Mevcut karakteri yazdır. Bu, otomatik olarak kolları \n(Kömür olarak davranır \vbu bağlamda) ama Kömür çevirir \riçine \r\nyüzden ...

≡ι⸿

... kontrol et \r...

... ve eğer öyleyse, tekrar bir satır yukarı gidin.


lBayrağı TIO bağlantınızdan çıkarmamalı mıydınız?
18'de

@ Adám Cevabımı içine herhangi bir saçma sapan yapıştırmama ve sonra suboptimal bir programa bağlanmamı engelleyen şey nedir?
Neil

Anlıyorum. Belki Kömür TIO bağlantısını stderr'e (Debug) çıkarmalı?
23’te

@ Adám bunu sadece @ ASCII'ye önereceğim.
Neil

@Neil sabit, sanırım?
ASCII - sadece

5

Ruby , 24 17 bayt

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

Çevrimiçi deneyin!

TIO'da çalışmıyor, ancak Linux konsolunda çalışıyor.


tr "Sanırım arasındaki boşluğu bırakabilirsiniz .
Kevin Cruijssen

Ah, bu çözümün düşünmüyordu, o olabilir sadece herhangi bir dil tüm değiştirmeye yönelik çalışmalar \niçine s \vLinux konsolunda çalıştırdığınızda.
09

@ Adám Peki ya bazı diller hiçbir şeyi değiştirmiyor ve DOS konsolunda çalışıyor?
mayıs

Orta zorluktaki spesifikasyonu değiştirdiğim için özür dilerim, ancak mücadeleyi daha ilginç ve daha az önemsiz yanıtlara tabi kılmak için, şimdi TIO için uygun çıktılara ihtiyacım var .
09

5
Spesifikasyonu değiştirmek: Adil olduğunu sanmıyorum. ama mecbur kalırsam cevabımı sileceğim.
GB

4

Java 10, 211 207 206 bayt

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

Çevrimiçi deneyin.

Açıklama:

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

Meydan okumadan önceki eski cevap 151 148 bayt değiştirildi :

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

Açıklama:

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'da çalışmıyor, Windows Komut İstemi'nde çalışıyor:

görüntü tanımını buraya girin



3

Python 2 , 150 128 122 104 103 bayt

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

Çevrimiçi deneyin!


Kaydedilen:

  • -1 bayt, Lynn sayesinde

Görünüşe göre l,n,i=[l,l+c,l+' '*i*n+c,n,1,0,0,i,i+1]['\r\n'.find(c)%3::3]çok daha kısa.
Lynn,

3

C (gcc) , 100 94 bayt

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 kodlamasını varsayar ( '\r'==13, '\n'==10); diğer sistemlere uyacak şekilde ayarlayın.

Çevrimiçi deneyin! (Javascript gerektirir)

Okunabilir sürüm

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

cGeçerli sütun pozisyonudur; dyazdırılabilir bir karakterden önce girilmesi gereken boşluk sayısıdır. Her ikisi de işleve girişte sıfır olarak kabul edilir.

Test programı

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 sadece küçük ints, birbirleriyle değiştirilebilir olmalıdır (teoride). Belki gccüstü kapalı bir oyuncu kadrosu yapar
Stan Strum


Bu arada, fikir birliğine göre, global değişkenlerinizi sıfırlamanıza izin verildiğini sanmıyorum c,d. İşleviniz - başka bir temizleme kodu olmadan - birden çok kez çalışabilmelidir. Bu nedenle büyük olasılıkla bir eklemeniz gerekir c=d=0.
Jonathan Frech


Şimdi yeniden kullanılabilir bir fonksiyon.
Toby Speight

2

Python 3 , 101 94 bayt

TFeld'in cevabına dayanarak .

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

Çevrimiçi deneyin!


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

Temiz , 92 91 bayt

-1 Laikoni'ye teşekkürler!

Not: \ in \rLinux CG literal kolları olarak ByteCount gelen atlanırsa \rve \ns.
Not: Windows CG gerektirir \nve \rkaçılır, yani Windows'ta çalışması gerekiyorsa +3.

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

?0

Çevrimiçi deneyin!

? :: Int [Char] -> [Char]İlk ilk argüman olarak 0 olan kısmi bir uygulama . Bu, kaç karakterin geçtiğini izleyen her karakterden aşağıya iner, sayı bir satır başı ile karşılaştığında sıfırlanır ve yeni bir satır ile karşılaştığında, o noktada geçen karakter sayısına eşit boşluklar ekler.


1
Bence ?_[]=[]olabilir ?_ e=e.
Laikoni

@Likonik Haklısın. Yemin ederim, aynı şeyi bir düzine kez daha özlemişim.
Büyük,

1

Haskell , 93 87 bayt

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

Çevrimiçi deneyin!


Oldukça basit bir çözüm. #, bir karakter pozisyonu sayacı (n) tutarken, bir seferde tekrar tekrar bir karakter oluşturan bir infix işlevidir ve yeni bir satırdan (x) sonra ne zaman boşluk ekleneceğini işaretler.


1
Yerine bir infix fonksiyonu tanımlayabilir c, l$ryerine c 0 0rve c _ _ e=e(veya yerine (_#_)e=e) kullanabilirsiniz.
Laikoni

Hep birlikte 87 byte: Çevrimiçi deneyin!
Laikoni

@Laikoni Teşekkürler, bu infix hilesini bu kadar çok parametre ile kullanabileceğinizi bilmiyordum.
aoemica
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.