Зробіть мені прокрутку


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
@Dennis добре, більш-менш. Це нормально, якщо встановити його на 99, щоб зберегти знак. Скажімо, виконання інших інструкцій займе 0,01 сек. :-)
квітня 15:15

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

Схоже, що ;в поясненні не вирівнюється
Вен

@ Виправлено, дякую!
Денніс

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 символів якось - редагуйте: дякую @ConnorLSW за правки, щоб отримати його нижче 100.

Інструкції

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

Вихідні дані

PowerShell marquee example output

Примітки

Більш читабельна версія з іменами змінних та параметрами заповнена трохи:

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

Альтернативні, більш "правильні" схеми:

Код посилань не обробляє струни довжиною більше 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}

Alternative sign example animation


1
Я знаю, що ця відповідь є досить старою, але це питання є головним на сьогоднішній день - Blaдо 0- Write-Hostбуде інтерпретувати числа до кольорів.
colsw

@ConnorLSW Спасибі, ви отримали це нижче 100 символів! І я поняття не маю, чому я пропустив твій коментар рік тому (!), Хтось просто схвалив, і я повернувся подивитися, що це.
TessellatingHeckler

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

@ConnorLSW, щоб ви могли, зробили це теж. (Я, мабуть, міг би це зробити в більшості своїх гольфів, це не те, про що я думаю нормально).
TesselilingHeckler

Під час використання for()ви можете зберегти ще один байт, змінивши $s=(Read-Host)*180;for(){наfor($s=(Read-Host)*180){
Clijsters

6

Матлаб, 76 байт

Я думаю, що тут приємно - це те, що ви можете мати вектори як індекси масиву. Це повертає вектор відповідних записів масиву, що дозволяє дуже легко додавати даний рядок незалежно від довжини.

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

Результат:

enter image description here


Гарний трюк с clc. Ви забули додати 's'вinput
Луїс Mendo

Що ти маєш на увазі? Це прекрасно працює, як і у версії Matlab, до якої я маю доступ (R2010b).
flawr

1
Як зараз, вам потрібно ввести рядок з лапки. Для прямого введення рядкового вмісту (без питань) вам потрібноa=input('','s')
Луїс Мендо,

Тепер я бачу, я не знав про цю особливість. Оскільки специфікації цього не вимагають, я думаю, що нормально вимагати 'введення введення обмежених рядків. Для багатьох мов потрібен роздільник рядків, інакше вони б інтерпретували аргумент командного рядка у вигляді речення (слова, розділені пробілами) як численні аргументи.
недолік

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

Marquee demonstration

Ось відформатована версія з деякими коментарями:

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згодом CLS, незалежно від того, що було надруковано раніше, наступне PRINTтвердження має виводитись на 1,1; але натомість я наткнувся на ситуацію, коли вона виводиться на рівні 2,1.
DLosc

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

Матлаб, ⌈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 с, але час відповідає правильній цифрі, показаній за допомогою програми.

enter image description here


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

enter image description here


2

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

Не дуже інше рішення для інших, але я витратив свій час, роблячи це, тому я подумав, що опублікую це також!

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

Покладається на сумісний з Unix термінал для ANSI-кодів та виклику coreutils ' sleep. Дві \x..символи у вищезазначеному - це фактично лінійна подача рядків та знаків втечі відповідно до цього шестигранного дампа:

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

bash, 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)

Це буде працювати лише на терміналах, які підтримують послідовності виходу 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);}}}

Безголівки:

#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 додаткові байти були додані до оцінки.

Дійсно базовий у функціональності, просто в циклі для 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$змінної; тоді є безумовний цикл назад до другого рядка.


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 прокручується по двох рядках

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


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.