文字通りCRとLFを取る


22

古き良きメモ帳のお祝いとして、キャリッジリターンとラインフィードを、今日使用されている(ab-)ものではなく、本来の意味として扱います。

印刷可能なASCIIと改行(␊; LF; esc \n; hex 0A; dec 10)およびキャリッジリターン(␍; CR; esc\r ;進0D; 12月13日)、原因オンラインそれを試してみてどのように印刷可能な文字を表示しますこれらの2つの制御文字をそのまま使用するプリンターで印刷すると、位置付けられます

  1. 改行時に、さらに1行下に印刷を続けます
  2. 復帰時に左端から印刷を続行します
  3. 複数の連続したキャリッジリターンは、単一のキャリッジリターンのように動作します。

最新のデバイスに問題があるため オーバーストライクにあるため、1つ以上のキャリッジリターンの実行は、入力の先頭を除き、少なくとも1つの前後の改行なしでは発生しません。ただし、2回のキャリッジリターンは、単一の改行で区切ることができます。

少なくとも入力で与えられた空白の量が保存されている限り、行の右側とテキスト全体の下の両方の追加の末尾空白は許容されます。

例(ラインフィードとキャリッジリターンの使用\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

興奮
ウラムコ労働

nisi ut aliquip ex

ea commodoの結果。



28
推奨答え:メモ帳、179712バイト
NIT

3
@Nit:| メモ帳はTCではありません
ASCIIのみ

2
TIOが適切な端末を使用していないことを残念に思うstty -onlcr;cat
トビースパイト

1
TIOの「入力」フィールドに復帰文字を入力するのに問題があります。貼り付けたときに、それらが飲み込まれた(または改行に変換された)ように見えます-それは私のブラウザに障害があるのですか、それともTIOですか?
トビースパイト

2
@AdámTIO以外のすべての出力を禁止しないでください。代わりに、プログラムを特定の端末タイプの使用またはファイル出力に制限します。または、新しい行のテキストの前に必要なスペースを出力に含める必要があります。
mbomb007

回答:


6

、10バイト

UTFθ«ι≡ι⸿↑

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

UT

右パディングを無効にします。

Fθ«

入力をループします。

ι

現在の文字を印刷します。これは自動的に処理します\n\vこのコンテキストではCharcoalが処理します)が、Charcoalはに変換\rされる\r\nため、...

≡ι⸿

...確認してください\r...

...そして、もしそうなら、1行上に戻ります。


lTIOリンクからフラグを削除すべきではありませんか?
アダム

@Adám私の答えに意味不明な言葉を貼り付けてから、次善のプログラムにリンクするのを止めるのは何ですか?
ニール

そうですか。たぶん炭はstderrへのTIOリンクを出力する必要があります(デバッグ)
アダム

@Adámto @ ASCIIのみを推奨します。
ニール

@Neilが修正されたと思いますか?
ASCIIのみ

5

ルビー24 17バイト

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

オンラインでお試しください!

TIOでは機能しませんが、Linuxコンソールでは機能します。


tr "を空けることができると思います。
ケビンCruijssen

ええと、私はこの解決策を考えていませんでした。Linuxコンソールで実行すると、すべて\nの言語がすべての言語に変更されるだけで機能する可能性があり\vます。
アダム

@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コマンドプロンプトでも機能します。

ここに画像の説明を入力してください




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は単なるintsであり、交換可能である必要があります(理論上)。たぶん、gcc暗黙のキャストを行います
スタン・ストラム


ところで、私たちのコンセンサスに従って、あなたはあなたのグローバル変数をリセットすることを許されているとは思いませんc,d。関数は、他のクリーンアップコードなしで、複数回実行できる必要があります。したがって、ほとんどの場合、c=d=0
ジョナサンフレッチ

あなたの興味のために、関連するメタ投稿
ジョナサンフレッチ

今では再利用可能な機能です。
トビースパイト

2

Pythonの3101 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ライコニに感謝!

注: Linux CGはリテラルとsを処理するため、バイトカウントから\in \rは省略されます。注: 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
ライコニ

@ライコニその通りです。私は今までに同じことを何十回も見逃していたと誓います。
18年

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

オンラインでお試しください!


非常に簡単なソリューション。#は、改行(x)の後にスペースを追加するタイミングを示す文字位置カウンター(n)とフラグを保持しながら、一度に1文字ずつ出力を再帰的に作成する中置関数です。


1
の代わりに中置関数を定義でき、and (または)の代わりにc使用します。l$rc 0 0rc _ _ e=e(_#_)e=e
ライコニ


@Laikoniありがとう、私はあなたがその多くのパラメーターでその中置トリックを使用できることに気づかなかった。
アオエミカ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.