Прийміть CR та LF буквально


22

Як святкування старого доброго блокнота , ми будемо розглядати повернення перевезень та канали ліній як те, що вони спочатку мали на увазі, а не те, що вони використовуються на сьогодні.

Дана рядок , що складається з друку ASCII плюс канали лінії (␊; LF; ESC \n; шестигранною 0A; разл 10) і повернення каретки (␍; CR; ESC \r; шестигранний 0D; реш 13), причина спробувати Інтернет , щоб показати , як друковані символи буде розміщено, якщо надруковано на принтері, який буквально приймає ці два контрольні символи:

  1. на стрічці ліній продовжуйте друкувати один рядок далі вниз
  2. після повернення каретки продовжуйте друкувати з лівого краю
  3. декілька послідовних повернень перевезення ведуть себе як одне повернення перевезення

Зважаючи на те, що сучасні пристрої, що мають проблеми із перевиконанням швидкості , пробіг одного або декількох повернень каретки, крім випадків на початку введення, ніколи не відбуватиметься принаймні одного попереднього та / або наступного подавання рядків. Однак два прогони повернення перевезення можуть бути розділені одним каналом каналу.

Будь-яка кількість додаткового пробілу білого кольору є прийнятною як у правій частині будь-яких рядків, так і під усім текстом, доки принаймні кількість білого простору, зазначеного у вводі, збережена.

Приклади (використання \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 minimal veniam,
     quis nostrud

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

напруження
ullamco Laboris

nisi ut aliquip ex

ea commodo posleat.



28
Віддається відповідь: Блокнот, 179712 байт
Ніт

3
@Nit: | Блокнот не TC
лише ASCII

2
Ганьба, що TIO не використовує належного терміналу, інакше буде приємний переможець оболонки stty -onlcr;cat.
Toby Speight

1
У мене виникають проблеми з введенням символів повернення каретки до поля "введення" TIO. Вони просто здаються, що вони проковтуються (або перетворюються в нові рядки) під час вставки - це винен мій браузер, чи це TIO?
Toby Speight

2
@ Adám Не забороняйте всі виходи, ніж TIO. Замість цього обмежте програми лише використанням певних типів терміналів або виведенням файлів. Або вимагати, щоб у вихідних даних були необхідні пробіли, що передують тексту в нових рядках.
mbomb007

Відповіді:


6

Вугілля деревне , 10 байт

UTFθ«ι≡ι⸿↑

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

UT

Вимкнути правильну підкладку.

Fθ«

Петля над входом.

ι

Друк поточного символу. Це автоматично обробляє \n(які Деревне вугілля лікує як \vв цьому контексті) , але деревне вугілля транслює \rв \r\n, так ...

≡ι⸿

... перевірити наявність \r...

... і якщо так, тоді рухайтеся назад вгору по лінії.


Ви не повинні видалити lпрапор зі свого посилання TIO?
Адам

@ Adám Що мені перешкоджає вставляти будь-яку безглуздість у свою відповідь, а потім посилатися на субоптимальну програму?
Ніл

Розумію. Можливо, вугілля повинно вивести посилання TIO на stderr (налагодження)?
Адам

@ Adám Я пропоную це лише для @ ASCII.
Ніл

@Neil виправлено, я думаю?
ASCII лише

5

Рубі , 24 17 байт

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

Спробуйте в Інтернеті!

Він не працює на TIO, але працює на консолі Linux.


Ви можете упустити простір між tr "я думаю.
Кевін Кройсейсен

Так, я не думав про це рішення, воно може просто працювати на будь-якій мові, щоб змінити всі \ns \vпри запуску в консолі Linux.
Адам

@ Adám Що щодо деяких мов нічого не змінює і працює в консолі DOS?
тш

Мені шкода за те, що я змінив специфікацію в середині виклику, але щоб зробити виклик цікавішим і менш предметом тривіальних відповідей, мені зараз потрібен належний вихід у TIO .
Адам

5
Зміна специфікації: Я не думаю, що це справедливо. але я видалю свою відповідь, якщо доведеться.
ГБ

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.
Джонатан Фрех


Тепер це багаторазова функція.
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

Спробуйте в Інтернеті!


Безумовно

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 дякую Лайконі!

Примітка: \ in \rупущено з рахунку, оскільки 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 з початковим першим аргументом. Це спускається через кожен символ, відслідковуючи кількість пройдених, кількість перезавантажується, коли зустрічає повернення вагона, а коли стикається з новою лінією, додає пробіли, рівні кількості символів, пройдених у цій точці.


1
Я думаю, що ?_[]=[]може бути ?_ e=e.
Лайконі

@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

Спробуйте в Інтернеті!


Досить просте рішення. # - це функція інфіксації, яка рекурсивно створює вихідний символ один за одним, зберігаючи лічильник позицій символів (n) та прапор, коли потрібно додавати пробіли після нового рядка (x).


1
Ви можете визначити функцію інфіксації замість c, використовувати l$rзамість c 0 0rі c _ _ e=e(а точніше (_#_)e=e).
Лайконі


@Laikoni Дякую, я не зрозумів, що ти можеш використовувати цей інфікс-трюк із такою кількістю параметрів.
aoemica
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.