Сделай мне скролл шатер


15

Вступление

Помните бурные 80-е? Я имею в виду, вы знаете, как 30 лет назад? Нет сотовых телефонов, нет интернета, нет банкоматов, флуоресцентной одежды (что это было ?!) и прокрутки маркиз ! Нет нет нет! Не онлайн, а настоящие, со светодиодной подсветкой.

Скроллинг шатер

Поскольку у меня ностальгическое настроение, я бы хотел, чтобы вы создали прокрутку с прокруткой.

Вызов

Создайте программу, в которой вы можете ввести строку в одну строку. Ваша программа должна создать область прокрутки шириной 80 символов, повторяя текст при необходимости.

правила

  • Пользователь должен иметь возможность вводить строку в вашу программу в качестве ввода. Строка может быть параметром командной строки или строкой, введенной при запуске программы.
  • Ваша программа должна непрерывно печатать строку из ровно 80 (видимых) символов.
  • Строка должна обновляться каждые 0,1 секунды (более или менее; я не буду ее синхронизировать), смещая символы каждую итерацию на одну позицию влево.
  • Строка "вращается". В конце предоставленной пользователем строки должен появиться другой экземпляр строки.
  • Ваша программа должна напечатать вывод в одну строку без перевода строки (используйте «\ r» вместо «\ n»)
  • Ваша программа должна работать до бесконечности , пока пользователь не прервет.
  • Это код-гольф, поэтому выигрывает самый короткий код в байтах.
  • Существует 10% бонус (округленный до следующего целого числа) для печати красным на черном фоне.
  • Применяются стандартные лазейки.

Ссылочная реализация в Python 2.7

Эта программа не игра в гольф, но она обеспечивает эталонную реализацию (и, следовательно, верхний предел размера).

import time,sys
s=raw_input()*99
while 1:
    for i in range(80):
        print s[i:i+80]+'\r',
        sys.stdout.flush()
        time.sleep(0.1)

@ mbomb007 похоже, но не то же самое. Также этот вопрос выглядит так (хорошо для вдохновения), но я думаю, что он отличается в нескольких отношениях. Кроме того, я нашел результаты (длины кода) довольно разочаровывающими. Я действительно думаю, что мы можем сделать лучше!
agtoever

Может быть, как код гольф + популярность конкурса?
SuperJedi224

Должны ли мы ждать ровно 100 мс?
Деннис

1
@ Денис хорошо, более или менее. Это нормально, если вы установите 99 для сохранения символа. Допустим, выполнение других инструкций займет 0,01 сек. :-)
agtoever

1
Что должно произойти, если длина входной строки превышает 80 символов? Ваша эталонная реализация и мой ответ доходят до s [80: 160], а затем возвращаются к s [0 ..], они никогда не печатают конец длинной строки, например, ввод 1 2 3 4 5 6 7 8 9 10 11 ... 300обрезается примерно после 56.
TessellatingHeckler

Ответы:


4

CJam, 31 байт

l80*{Dco_80<o(+es99+{es1$<}g;}h

Ждет ровно 100 мс.

Это будет работать только с официальным интерпретатором Java , поскольку онлайн-интерпретатор показывает вывод только после выхода из программы.

Красный текст на черном фоне возможен в 40 (или 39) байтах, для оценки 36:

0000000: 6c 38 30 2a 7b 22 0d 1b 5b 33 31 3b 34 30 6d 22 6f 5f  l80*{"..[31;40m"o_
0000012: 38 30 3c 6f 28 2b 65 73 39 39 2b 7b 65 73 31 24 3c 7d  80<o(+es99+{es1$<}
0000024: 67 3b 7d 68                                            g;}h

Как это устроено

l80*                             Read a line and repeat it 80 times.
    {                        }h  Do:
     Dco                           Print the character with code point 13.
        _80<o                      Print the first 80 characters of the string.
             (+                    Rotate the string one charcter to the left.
               es99+               Push the current time (ms) plus 99.
                    {     }g       Do:
                     es1$<           Compare the current time with the sum.
                                     Repeat the loop if 99 or less ms have passed.
                            ;      Discard the time stamp.
                                 Repeat the loop.

Я подозреваю, что они не придут короче этого. Поздравляем!
agtoever

Похоже, что ;в объяснении
Ven

@ Ven исправлено, спасибо!
Деннис

9

PowerShell, 118 113 112 108 102 101 99 96 - 10% = 86

Код

$s=(Read-Host)*180;for(){Write-Host($s.substring(($i=++$i%80),80)+"`r")-N -F R -B 0;sleep -m 99}

С оговоркой, что теперь начинается первый цикл со вторым символом; В правилах не говорится, что он должен начинаться с начала строки, а первое включено в целом, так что это нормально для меня. Я получу как-нибудь до 100 символов - edit: спасибо @ConnorLSW за изменения, чтобы получить его ниже 100.

инструкции

  1. Запустите PowerShell (обычная консоль, она не работает в PowerShell ISE)
  2. Вставьте однострочную версию в PoSH, нажмите ввод
  3. Введите сообщение, нажмите Enter
  4. Ctrl-C, чтобы сломать

Выход

Пример вывода PowerShell

Примечания

Более читаемая версия с именами переменных и параметрами, заполненными немного:

$test = (Read-Host) * 180
for () {
    Write-Host ($text.substring(($i=++$i%80), 80)+"`r") -NoNewLine -ForegroundColor Red -BackgroundColor Black
    sleep -Miliseconds 99
}
  • Параметры должны быть достаточно длинными, чтобы быть уникальными, поэтому -F Rдостаточно уникальными, например, для установки Red ForegroundColor.
  • «Черный» должен быть «Бла», чтобы быть уникальным по сравнению с «Синим», но -B 0устанавливает цвет Enum 0, который интерпретируется как «Черный».

Альтернатива, более «правильный» шатер:

Код ссылки не обрабатывает строки длиной более 80 символов, пропуская что-либо в сообщении после ~ 160 символов, и он сбрасывает сбои каждые 99 * len (строковые) символы. например, если ширина знака была 5 символов, он делает это:

   here is my long test input
 0 |here |            
 1  |ere i|          ^^^^ never shown
 2   |re is|
 3    |e is |
 4     | is m|
 0 |here |
 1  |ere i|
    ...

Эта версия индексирует по модулю длину текста вместо ширины знака, поэтому она проходит по всей строке. 106 - 10% = 95 символов

$l=($s=Read-Host).Length;for(){Write-Host(($s*160).substring(($i=++$i%$l),80)+"`r")-N -F R -B 0;sleep -m 99}

Альтернатива: знак, который повторяет, как .gif в вопросе, 118-10% = 106

Потому что это выглядит лучше.

$s=' '*80+(read-host)+' '*80;for(){write-host($s.Substring(($i=++$i%($s.length-80)),80)+"`r")-N -F R -B 0;sleep -m 99}

Пример анимации альтернативного знака


1
Я знаю , что этот ответ довольно старый, но этот вопрос FRONTPAGE прямо сейчас - Blaк 0- Write-Hostбудет интерпретировать цифры к цветам.
Colsw

@ConnorLSW Спасибо, вы получили его ниже 100 символов! И я понятия не имею, почему я пропустил ваш комментарий год назад (!), Кто-то просто проголосовал, и я вернулся, чтобы посмотреть, что это было.
TessellatingHeckler

не беспокойтесь, я думаю, вы также можете изменить, while(1)чтобы for()сохранить несколько байтов :)
colsw

@ConnorLSW, так что вы можете сделать это тоже. (Я мог бы, вероятно, сделать это в большинстве моих гольфов, это не то, о чем я обычно думаю).
TessellatingHeckler

По мере использования for()вы можете сохранить еще один байт, изменив его $s=(Read-Host)*180;for(){наfor($s=(Read-Host)*180){
Clijsters

6

Matlab, 76 байт

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

a=input('');k=1:80;while 1;pause(.1);clc;k=mod(k+1,nnz(a));disp(a(k+1));end

Результат:

введите описание изображения здесь


Хороший трюк с clc. Вы забыли добавить 's'вinput
Луис Mendo

Что ты имеешь в виду? Он отлично работает, как и в версии Matlab, к которой у меня есть доступ (R2010b).
flawr

1
Как и сейчас, вам нужно ввести строку с кавычками. Чтобы ввести содержимое строки напрямую (без qoutes), вам нужноa=input('','s')
Luis Mendo

Теперь я вижу, я не знал об этой функции. Поскольку спецификации не требуют этого, я думаю, что в 'качестве входных данных можно использовать строки с разделителями. Многим языкам нужен разделитель строк, иначе они будут интерпретировать аргумент командной строки в форме предложения (слова, разделенные пробелами) как множественные аргументы в любом случае.
Flawr

4

QBasic, 116 113 байтов - 10% = 105 102

INPUT s$
COLOR 4
1CLS
FOR i=a TO a+79
?MID$(s$,i MOD LEN(s$)+1,1);
NEXT
?
a=a+1
t=TIMER+.1
2ON(TIMER<t)+2GOTO 2,1

Демонстрация шатер

Вот отформатированная версия с некоторыми комментариями:

INPUT s$
COLOR 4   ' 4 is the color code for red (the background's already black)

1 CLS   ' CLear Screen (and mark this as line number 1)

' The variable a represents an offset from the beginning of the string
' As a numeric variable, it is 0 at the beginning of the program
FOR i = a TO a + 79
    ' Print i'th character mod string length (+ 1 because QBasic strings
    ' are 1-indexed)
    PRINT MID$(s$, i MOD LEN(s$) + 1, 1);
NEXT i
PRINT
a = a + 1

' Do a busy-wait for .1 seconds
' (Unfortunately, QBasic's SLEEP command only takes integer values)
' Set t to the time we want to stop waiting, .1 seconds in the future
t = TIMER + .1
' We want to stay on line number 2 while TIMER < t; once that condition is
' no longer true, we want to goto the top of the outer loop (line number 1)
' Since true is -1 and false is 0 in QBasic, adding 2 to the conditional
' gives 1 for true and 2 for false; we can pass these values to the
' ON ... GOTO statement to branch conditionally
2 ON (TIMER < t) + 2 GOTO 2, 1

Пара заметок:

  • Я не знаю, зачем нужен цикл PRINTпосле FOR. CLSследует каждый раз сбрасывать курсор в верхний левый угол. Но на QB64, по крайней мере, если я не добавлю лишнее, выделение PRINTзаканчивается на второй строке вместо первой. Если у кого-нибудь есть QBasic на DosBox или что-то подобное, мне было бы интересно узнать, происходит ли там то же самое или это ошибка QB64.
  • У кода есть небольшая ошибка, потому что он полагается TIMER(количество секунд с полуночи) для задержки. Если код выполняется в полночь, выделение застрянет, потому что TIMERбудет сброшено 0и всегда будет меньше, чем tпосле.

Мой первый язык! IIRC, в любом случае в QB 4.5 точка с запятой в конце напечатанной строки означает, что оператор PRINT не печатает возврат каретки.
bgStack15

@ bgStack15 Мой тоже. : ^ D Проблема на самом деле не с, PRINTа с CLS--after CLS, независимо от того, что было напечатано ранее, следующий PRINTоператор должен выводиться в 1,1; но вместо этого я столкнулся с ситуацией, когда он выдает 2,1.
DLosc 15.09.16

4

Perl, 99 98 байт (-10% = 89)

$|=@_=split('',pop);printf("\e[31m\r%.80s",join('',@_)x80)while select($a,$a,$a,.1)|push@_,shift@_

Принимает его из параметра командной строки.

perl marquee.pl "Welcome to Programming Puzzles & Code Golf "

3

pb , ⌈ (216 + 3) * 0,9⌉ = 198

+3 байта за флаг интерпретатора d=1

c^w[Y=-1]{w[B!0]{>}t[X]<[X-79]w[X!0]{t[T-1]w[T=-1]{t[0]}<}vw[T=0]{^w[B!0]{t[B]^b[T]>v}<[X]^w[B!0]{t[B]vw[B!0]{>}b[T]<[X]^w[B=0]{>}b[0]>}v}}^w[1=1]{<[X-80]w[X!0]{<t[B]vb[T]^}w[B!0]{t[B]<b[T]>>}<[X]<t[B]w[B!0]{>}<b[T]}

Довольно ужасная оценка, но, учитывая, как трудно сделать что-либо на этом языке, может быть и хуже. Отношение этого ответа (байты, используемые для получения красного текста) к (бонус от наличия красного текста) действительно хорошее, весь вывод становится красным только сc в начале!

Время между каждым тактом варьируется в зависимости от длины входной строки, но оно составляет около 0,1 секунды.

Кстати, вывод этой программы выглядит как полный мусор, потому что интерпретатор очень плохой. Каждую миллисекунду он очищает терминал и перерисовывает все, поэтому он становится действительно мерцающим.

С комментариями:

c           # Change paint colour to red

^w[Y=-1]{   # While Y=-1 (arbitrary condition we can break later)

    w[B!0]{>}   # Go to end of input

    t[X]        # Save length of input in T

    # SET T TO MAX(T-79, 0)

    <[X-79]     # Go to (79, -1)

    w[X!0]{     # While X is not 0
        t[T-1]      # Subtract 1 from T
        w[T=-1]{    # If T is now negative
            t[0]        # Set it back to 0
        }
        <         # Move left (position doesn't matter except to end the loop eventually)
    }

    # DONE SETTING T TO MAX(T-79, 0)
    # If T == 0, the string needs to be doubled. Otherwise this part of the program is done

    v           # Move down to break the loop unless this is specifically undone
    w[T=0]{     # While T == 0
        ^w[B!0]{    # For each byte of input
            t[B]^b[T] # Copy it up 1 place
            >v        # Go to the next byte
        }
        <[X]^     # First byte of the copy
        w[B!0]{   # For each byte of the copy
            t[B]      # Save the byte's value
            vw[B!0]{>}# Go to the first empty spot after the original
            b[T]      # Write the saved value
            <[X]^w[B=0]{>} # Go back to the first byte of the copy
            b[0]>     # Erase it and go to the next one
        }
        v       # Back to Y=-1 to reset the loop from the very beginning
    }

}

# After ALL OF THAT nonsense, we're now at (0, 0) and the input string is guaranteed to be
# at least 80 characters long

^
w[1=1]{       # While 1=1 (should hold true until mathematics itself breaks down)
    <[X-80]        # Go to the 81st character
    w[X!0]{        # While X!=0
        <t[B]vb[T]^    # Go left and copy that character down
    }

    w[B!0]{      # For each byte in the string
        t[B]<b[T]>>  # Copy that byte left
    }

    <[X]<t[B]    # Go get the first value (copied to (-1, -1))
    w[B!0]{>}<b[T]# Bring it to the end of the string
}

3

Perl - 120 байт (-10% = 108)

$|=1;$_=<>;chomp;for(;;){print "\e[31m",substr(" "x80 .$_,$p++,80)," \r";select($z,$z,$z,0.1);if($p>length()+80){$p=0}}

Perl Marquee


2

Matlab, ⌈188 * .9⌉ = 170

Это работает в версии Matlab R2014b или выше. Результат показан в окне рисунка.

h=text(.1,.1,repmat(' ',1,80),'fontn','courier','ba','k','co','r');set(1,'pos',[90 90 990 90]);axis off
s=input('','s');n=0;while 1
n=n+1;pause(.1)
h.String=s(mod((0:79)+n,numel(s))+1);end

В следующем примере текст набирается жирным шрифтом для лучшей визуализации (в приведенном выше коде это не делается, поскольку он стоит несколько байтов). Также обратите внимание, что скорость анимации в формате GIF не соответствует требуемой паузе в 0,1 с, но время корректно на фактическом рисунке, показанном при запуске программы.

введите описание изображения здесь


2

SpecBAS, 130 байт (-10% = 117)

Умножает исходную строку на 80 или более символов, а затем обрезает ее до точно 80.

TEXT это команда в SpecBAS, которая работает так же, как PRINT (в этом примере), но сохраняет один символ.

SCALE добавляет несколько дополнительных символов в код, но делает его более привлекательным.

Программа продолжает работать, пока вы не нажмете Esc.

1 INPUT s$: LET s$=s$*CEIL(80/LEN s$)
2 TEXT PAPER 0;INK 2;SCALE 1,2;AT 1,1;s$( TO 80)
3 LET s$=s$(2 TO)+s$(1): PAUSE 5: GO TO 2

введите описание изображения здесь


2

Perl, 63 (70 символов - 10% на бонус)

Не очень отличное решение от других, но я потратил впустую свое время, делая это, поэтому я подумал, что я также опубликую это!

$_=<>;s/
/ /;print"\x0d\x1b[91m",substr"$_"x80,$z++%y///c,80 until`sleep .1`

Полагается на Unix-совместимый терминал для кодов ANSI и вызова coreutils ' sleep. Два \x..символа в приведенном выше являются буквальным переводом строки и escape-символом в соответствии с этим шестнадцатеричным дампом:

0000000: 245f 3d3c 3e3b 732f 0a2f 202f 3b70 7269  $_=<>;s/./ /;pri
0000010: 6e74 220d 1b5b 3931 6d22 2c73 7562 7374  nt"..[91m",subst
0000020: 7222 245f 2278 3830 2c24 7a2b 2b25 792f  r"$_"x80,$z++%y/
0000030: 2f2f 632c 3830 2075 6e74 696c 6073 6c65  //c,80 until`sle
0000040: 6570 202e 3160                           ep .1`

2

Рубин, 79 76 75 байт

t,i=gets.chop*81,0
loop{system'cls'
$><<t[(i=(i+1)%80)..i+79]
sleep 0.1}

Я все еще не специалист по рубину, возможно, я могу сыграть в гольф.

С красным и черным же счетом:

t,i=gets.chop*81,0
loop{system'cls&color 4'
$><<t[(i=(i+1)%80)..i+79]
sleep 0.1}

2

Perl, 84 байта (- 10% = 76)

$_=' 'x80 .pop;$|=print"\b \r\e[31m".substr$_,++$p% length,80until select$z,$z,$z,.1

Это принимает аргумент командной строки, который является текстом в выделении.

Объяснение:

  1. Добавить 80 пробелов к тексту и сохранить в $_
  2. Распечатать Backspace ( \b) и пробел ( ). Это удаляет последний символ из предыдущей печати. Затем распечатайте возврат каретки и цвет.
  3. Вывести 80 символов текста с позиции $p
  4. $p = ($p+1) % length of text
  5. Спать в течение 0,1 сек

2

Баш, 121 байт

A=$(printf ' %.s' {1..80})$1
while :; do
printf "%s \r" "${A:((P++)):80}"
if [ $P == ${#A} ];then
 P=0
fi
sleep 0.1
done

1

Python 3, 96 байт

import time;s=input()*80
while 1:print("\033[2J",end=s[:80],flush=1);s=s[1:]+s[0];time.sleep(.1)

Это будет работать только на терминалах, которые поддерживают escape-последовательности ANSI. Если вы используете Windows, попробуйте ansicon .

Ура для flushключевого слова в Python 3, поэтому нам не нужно делать дорогой sys.stdout.flush()звонок.


1

C, 293 269 ​​байт

(Новые строки добавлены для удобства чтения)

Это берет вход от стандартного входа, завершенного EOF; поэтому лучше всего ввести строку, символ новой строки, а затем EOF (например, Ctrl ^ D).

#include<stdio.h>
#include<string.h>
#define Z '\0'
main(){int i=0,j;char m[80],o[80],n[2];
while(~(j=getchar())&&i<80)j-'\n'?m[i++]=j:0;m[i]=Z;
while(1){for(i=0;m[i]-Z;++i){strcpy(o,&m[i]);
for(j=0;j<i;)*n=m[j++],n[1]=Z,strcat(o,n);
printf("\x1b[40;31m%s\x1b[0m\r",o);}}}

Ungolfed:

#include <stdio.h>
#include <string.h>
#define ANSI_COLOR_SET "\x1b[40;31m"
#define ANSI_COLOR_RESET "\x1b[0m"

int main(void)
{
  int i, j, c;
  char msg[80], out[80], next[2];

  for (i = 0; (c = getchar()) != EOF && i < 80; ++i) {
    if (c != '\n') {
      msg[i] = c;
    }
  }
  msg[i - 1] = '\0';

  while (1) {
    for (i = 0; msg[i] != '\0'; ++i) {
      strcpy(out, &msg[i]);
      for (j = 0; j < i; ++j) {
        next[0] = msg[j];
        next[1] = '\0';
        strcat(out, next);
      }
      printf(ANSI_COLOR_SET "%s\r" ANSI_COLOR_RESET, out);
    }
  }
  return(0);
}

1

SmileBASIC BIG, 79 байтов

COLOR 3INPUT S$@L
CLS
FOR I=0TO 79?S$[(I+O)MOD LEN(S$)];
NEXT
WAIT 6O=O+1GOTO@L

У меня было хорошее графическое решение, почти готовое, когда я понял, что нужно прокручивать по 1 целому персонажу за раз.


1

Желе , 20 19 18 байт

  • -1 байт, заменив первый 80на (= 256), потому что его нужно умножить как минимум на 80
  • -1 байт, изменяя бесконечный цикл на ÇßÇ1¿).

ẋ⁹ḣ80ṙ1;”ÆṄœS.1
Çß

С некоторыми уловками от @Dennis 'ответ здесь . Желе новее, чем вызов, но не специально приспособленный для этого. Предложения по улучшению приветствуются! Если ваша консоль находится в utf-8, запуститеexport LC_ALL=en_US или аналогичную, прежде чем пытаться.

пример

https://gyazo.com/f3594391a6b4d459a9d30bd47cf598b1

объяснение

ẋ⁹ḣ80ṙ1;”ÆṄœS.1         Monadic helper link - Argument: s
ẋ⁹                      Repeat s 256 times.
  ḣ80                   Head. Set {output} to first 80 characters from repeated s.
     ṙ1                 Rotate. Rotates {output} one character to the left.
       ;Ӯ              Concatenate character 0D, the carriage return, to {output}.
          Ṅ             Print and return {output}.
           œS.1         Wait 0.1 seconds before returning {output} from the
                        helper link.

Çß                      Monadic main link - Argument: s
Ç                       Execute helper link with argument s. Replace s by
                        result of helper link.
 ß                      Execute this link with argument s (while true).

0

LOVE2D Lua, 197-10% = 178 байт

f=io.open("t.t"):read().."  "love.graphics.setColor(255,0,0)love.window.setMode(640,14)function love.draw()s=""for i=1,80 do n=i+os.clock()s=s..f:sub(n%#f,n%#f) end love.graphics.print(s,0,0)end

Требуется, чтобы входные данные находились в файле с именем 'tt' в корне, таким образом, 3 дополнительных байта были добавлены к счету.

Действительно базовый по функциональности, просто в цикле for из 80 итераций, добавьте символ с индексом i плюс текущее время в секундах, модулированное длиной текущей строки, давая повторную строку ввода длиной 80 символов, которая сдвигается влево со временем

Я использовал LOVE2D для смеха.


0

Sinclair ZX81 / Timex TS1000 / 1500 BASIC, 110 байтов 182 байта (для листинга)

1 LET A$="I LIKE TO SCROLL IT... HELLO MUM, BY DONKEYSOFT... THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG... STILL SCROLLING... "
2 PRINT AT 0,0;A$(1 TO 80)
3 LET A$=A$(2 TO )+A$(1)
4 GOTO 3

Он работает, печатая первые 32 80 символов строки A$в позиции экрана 0,0 во второй строке, а затем манипулируя строкой от позиции 2 до конца строки в строке 3 (Sinclair ZX81 BASIC индексирует строки от 1, а не от нуля ), поэтому добавляем первый символ в конец и передаем его обратно в A$переменную; тогда есть безусловный цикл обратно к строке 2.


0

Commodore 64, 434 байта

0 A$="I LIKE TO SCROLL IT... SAMPLE SCROLLY ROUTINE FOR CODE-GOLF MADE BY DONKEYS
1 A$=A$+"OFT MMXVII... HELLO MUM... SCROLLING IS FUN, INNIT? GREETZ TO ALL...
2 POKE53280,6:PRINT"{CLEAR}";
3 PRINTLEFT$(A$,40)"{HOME}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}"MID$(A$,41,40)"{HOME}";
4 FORI=0TO99:NEXT:A$=RIGHT$(A$,142)+LEFT$(A$,1):GOTO3

Поскольку для отображения требуется 80 символов, а для C64 по умолчанию используется только 40 символов, то 40 символов прокрутки печатаются в верхней строке области экрана, а остальные 40 печатаются рядом с нижней частью.

Чтобы выяснить, на что {HOME}и другие символы переводятся как PETSCII, вот скриншот, взятый из моего эмулятора:

Commodore 64 прокручивает две строки

Я сделаю полную версию игры в гольф, когда я установлю CBM PRG Studio (или когда я не на обеде на работе).


0

Рубин, 79 77 символов

->(s){t=0;loop{system("clear");puts (s*80)[t..(80+t)];t=(t+1)%80;sleep(0.1)}}

0

PHP, 136 байт

<?php
$s="\e[0;31;40m".substr(str_repeat($argv[1],160),0,160);
while(true){for($i=0;$i<=80;$i++){usleep(100000);echo substr($s,$i)."\r";}}die;
  • Назовите его, php -f marquee.php hello\ worldчтобы выделить строку «Привет, мир».
  • По какой-то причине мне пришлось сделать 160 символов для исходной строки, иначе вывод был бы примерно таким hello worlddddddddddddddddddddddddddddddddddddddd, но он будет проходить только через 80 символов - я надеюсь, что это все равно будет иметь значение.

https://gyazo.com/4c433abf04d71ca7ebb63a0889ca705d

Это был долгий день, наверное, я могу что-то сделать, чтобы улучшить его


0

PHP, 85 байт

for(;;usleep(1e5))echo substr(str_repeat($s=$argv[1],80),$i=++$i%strlen($s),80),"\r";

принимает входные данные из первого аргумента командной строки; бежать с-nr .

Начинает прокрутку со второго символа. Добавьте один байт , чтобы начать с первого символа:
Заменить =++$i%с %=и ;;с ;;$i++,.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.