Przewijany namiot

13

Po wejściu do Obfuscated Hello World pomyślałem, że fajnie byłoby dzielić się kodem źródłowym. Ale po prostu pokaż kod, zróbmy z niego golfa!

Wyzwanie

Napisz skrypt, który przewija ciąg znaków przez terminal, od prawej do lewej, osiadając po lewej stronie.

Wejście

Bierze ciąg jako argument.

Wynik

Drukuje przewijaną markizę na STDOUT. Maksymalna szerokość ~ 50 znaków. Zaczyna się od pokazania 0 lub 1 znaków. Odstęp między literami podczas przewijania. Zatrzymuje się po ustaleniu (bez dodatkowego odstępu między znakami słów). Powolne przewijanie, ale niezbyt wolne (<1 s na iterację).

Przykład

Uruchamianie skryptu z arg 'Hello World'

                                                   H

później

                H    e    l    l    o         W    o

później

H    e    l    l    o          W    o    r    l    d

później

Hell    o         W    o    r    l    d

Wreszcie

Hello World

Na bieżący przykład wypróbuj mój kod z wyzwania „Hello World”. W końcu opublikuję moje. Obecnie w Perlu jest 202 znaków. Teraz, kiedy jest kilku konkurentów, zamieściłem mój w odpowiedziach.

Zwycięzca

Nie chcę, aby ograniczenia były bezwzględne, dlatego zostawiłem je trochę niejasne. Zwycięży najkrótszy scenariusz zgodny z duchem mojego oryginału.

Notatki

Ta gra zakłada xtermśrodowisko. Jeśli inne środowisko okaże się przydatne, zostaną porównane tylko podobne środowiska i dla każdego z nich może zostać ogłoszony osobny zwycięzca.

Dodatek (25 kwietnia 2012 r.)

Aby rozwiązać kilka problemów, podejmuję decyzję. Twoja liczba znaków musi zawierać kod potrzebny do:

  1. Flush STDOUT (Patrzy na ciebie Ruby)
  2. Implementuj sleepz opóźnieniem <1s (Looking at you Perl)

Można tego dokonać, gdy linia poleceń przełącza się na interpreter, ale znaki te są liczone łącznie (bez otaczania białych znaków).

Joel Berger
źródło
Jestem zaniepokojony zachowań terminali dla tego typu rzeczy ... Mały xterm, vt102...?
dmckee --- były moderator kociak
Zakładam Xterm, ale nie sądzę, żeby to miało zbyt duże znaczenie. Może nie rozumiem twojej troski?
Joel Berger
Te sztuczki są zwykle tworzone na podstawie sposobu, w jaki różne terminale obsługują niektóre znaki niedrukowalne, a terminale różnią się tym, co mogą zrobić i jakie sekwencje dały efekty. Aby zapewnić powtarzalność, dobrze jest mieć określone środowisko terminalowe.
dmckee --- były moderator kociąt
1
Będzie ci dobrze, jeśli ktoś opublikuje naprawdę krótką odpowiedź, która zależy od niejasnego terminala, dla którego nie masz emulatora, ale OK.
dmckee --- były moderator kociak
ok myślę, że mam to teraz. Dzięki za przemyślenia :-)
Joel Berger

Odpowiedzi:

5

python 2 - 146 znaków

edit: uczyniło ją funkcją zamiast wprowadzania przez stdin. pierwszy argument to ciąg znaków, a drugi argument to długość, jaką chcesz. więc wywołanie byłoby f('Hello World', 50). Sprawiłem, że stało się to znacznie płynniejsze; kiedy każda postać „wylądowała”, nastąpiła niezręczna pauza

import os,time
def f(x,n):
 y=' '*n+'  '.join(x);z=0
 while y:w=y[0]==x[z];y=y[1+w:];z+=w;os.system('cls');print((x[:z]+y)[:n]);time.sleep(0.1)

stare, 158 znaków:

import os,time,sys
x=' '.join(sys.argv[1:])
y=' '*50+'  '.join(x)
z=0
while y:z+=y[0]==x[z];y=y[1:];os.system('cls');print((x[:z]+y)[:50]);time.sleep(0.1)
marynarka
źródło
Używając bash (przynajmniej w ostatniej instalacji MacOSX i CentOS), polecenie powłoki użyte do wyczyszczenia ekranu terminala powinno być „wyczyść”, a nie „cls”.
Paolo
„cls” dla systemu Windows, „wyczyść” dla kompilacji OSX / Linux, jak sądzę
Blazer
Pomocna byłaby porada, jak uruchomić program dla osób, które nie mają do czynienia z pythonem na co dzień. Uruchom python. wklej kod, zadzwoń f("Hello World, 40)zadziałało dla mnie.
użytkownik nieznany
@ użytkownik I um. Umieściłem tam wywołanie?
Blazer
4

Ruby, 93 91 89 znaków

u="\1";s=u*50+[*$*[0].chars]*(u*3);$><<s.tr(u," ")[0,50]+" \r"while s.sub!u,""*sleep(0.1)

Tekst do wyświetlenia musi być podany jako argument wiersza poleceń, np

ruby marquee.rb "Hello World"

dla przykładu pokazanego powyżej. Niestety nie mogę tutaj wyświetlić animacji, więc musisz sam wypróbować kod.

Poprzednia wersja:

s=" "*67+[*$*[0].chars]*"   ";(s.size*3/4).times{|j|s[j/3]='';$><<s[16,50]+" \r";sleep 0.1}
Howard
źródło
Imponujący rozmiar. Nie jest to jednak zbyt płynne, czy to ja (jestem w tej chwili na dość małej maszynie), czy tak działa kod?
Joel Berger
Zrozumiałem, musiałem STDOUT.sync=true;tak ustawić , aby automatycznie się wypłukiwał. Równanie Perla to $|++. To dodatkowe 17 znaków, ale wciąż znacznie poniżej moich. Nie mogę pozwolić, żeby Ruby pokonała Perla! Muszę zacząć działać. Niezłe.
Joel Berger
Jeśli zadzwonię ruby1.8 "Hello World", nie jest dla mnie zaskoczeniem błąd, mówiąc:ruby1.8: No such file or directory -- Hello World (LoadError)
użytkownik nieznany
@ userunknown być może powinieneś tam również umieścić ścieżkę do pliku źródłowego: ruby foo.rb args;-)
Patrick Oscity
@padde: Tak, powinienem. Niestety Howard zredagował swój post nie informując mnie o swojej zmianie. Spójrz na historię, aby zrozumieć moje pytanie.
użytkownik nieznany
3

C, 94 83 80 173 znaków

EDYCJA: Dodano dużo kodu, teraz implementuje wszystkie wymagane funkcje. Stałą 1e8można dostosować, aby kontrolować prędkość. Na mojej maszynie jest dość szybki.
Niektóre postacie z pewnością można tu zapisać. lmoże być statyczny (zapisuje inicjalizację), cmoże stać się wskaźnikiem (zamienia b+c).

char b[99],c=1;
main(a,t,w,i,l)char**t;{
    for(l=0;b[l++]=*t[1]++;b[l++]=32);
    for(w=80;i--||
        printf("\033[F\033[K%*.*s\n",w-=l<a,a++,b,i=1e8)>l+6||
        b[++c]&&memmove(b+c-1,b+c,l););
}

Stara wersja (80 znaków), z częściową funkcjonalność:
Zapisane parę znaków zastępując char**tz int*t. Działa dobrze w wersji 32-bitowej ( int**tobsługuje 64-bit).

main(i,t,w)
    int*t;
{
    for(w=80;i--||printf("\033[F\033[K%*s\n",w,t[1],i=1e8)*--w;);
}
ugoren
źródło
2

K&R C - 431 416 znaków

W wysokim stopniu przestrzega normy. Używa ncurses, więc powinna być w dużej mierze niezależna od terminali. Występuje niewielkie jąkanie, gdy tekst uderza w bok z powodu pewnych sztuczek, które zachowały zamierzoną spację w łańcuchu.

Ciąg znaków, który ma być użyty, powinien zostać przekazany jako pierwszy argument w wierszu poleceń (i powinien być poprzedzony znakiem ucieczki, jeśli zawiera spacje, a tym bardziej, jeśli zawiera znak taki !jak mój ciąg testowy ( Hello, World!)).

#include <ncurses.h>
#include <unistd.h>
#define T usleep(1e5),S(l)
#define U mvprintw(23,0,"%s",l),refresh()
char l[63],*p,*q,r;
S(char*s){r=0;if(*s==32)q=s++;else{for(;*s-32||*(s+1)-32;s++); 
for(q=s;*s==32;s++);(s-q)&1?s--:usleep(1e5);}
for(r=0;*s;*q++=*s++){*s-32?r=1:0;}return r;}
main(int c,char**v){initscr();curs_set(0);for(c=0;c<62;l[c++]=32);
for(p=*++v;*p;){l[52]=*p++;U;T;U;T;U;T;}for(;T;U);getch();endwin();}

W bardziej czytelnej i skomentowanej formie:

#include <ncurses.h>
#include <unistd.h>

char l[63] /* take advantage of 0 initialization */,
  *p,*q, r;

/* Remove the first unwanted space. Unwanted means at the begining of
 * the line, all of even length blocks between non-spaces, and
 * all-bu-one of odd length blocks between non-spaces.
 *
 * Return true if the removed space occurs before a non-space character.
 */
S/*lide marquee*/(char*s){
  r=0; /* initialize the return value */
  if(*s==' '){
    q=s++;
  } else {
    /* Find the start of first block of contiguous spaces */
    for(;*s-' '||*(s+1)-' ';s++); 
    for(q=s;*s==' ';s++); /* q holds the start, s finds it's end */
    /* if this block is even length remove all, if odd, all but one */
    if( (s-q)%2 )s--; else usleep(1e5);
  }
  /* copy from s to q all the way to the end */
  for(r=0;*s;*q++=*s++){ 
    if(*s-' ')r=1; /* note if we pass a non-space */
  } 
  return r;
}

main(int c,char**v){
  initscr();curs_set(0); /* setup ncurses with invisible cursor */
  for(c=0;c<62;l[c++]=' '); /* initialize l */
  for(p=*++v;*p;){ /* load the message into the marque, skipping space */
    l[52]=*p++;
    mvprintw(23,0,"%s",l),
    refresh();
    usleep(1e5),
    S(l);
    usleep(1e5),
    S(l);
    usleep(1e5),
    S(l);
  }
  for(;usleep(1e5),S(l);mvprintw(23,0,"%s",l),refresh()); /* keeping sliding until we're done. */
  getch();
  endwin();
}
dmckee --- były kot moderator
źródło
Istnieje wiele możliwości skrócenia, zwłaszcza poprzez zastąpienie przez ifoperatorów. Na przykład - if((s-q)%2)s--;else usleep(1e5);-> s-q&1?s--:usleep(1e5);(lub s-=s-q&1||usleep(1e5);)
ugoren
@ugoren: Tak, i zapomniałem zastąpić ' 's odpowiednikami liczbowymi.
dmckee --- były moderator kociak
Jeszcze kilka sztuczki: Wymienić x==32z x-32(odwraca znaczenie, więc odwrotna if-else) lub z x<33(zakładając 0..31 nigdy nie używany). Zainicjuj za pomocą wartości, które masz ( for(curs_set(c=0);...). *(s+1)-> s[1]. Usuń niepotrzebne aparaty ortodontyczne (zastąpienie ;go ,pomoże).
ugoren
2

Perl 5.13.2, 96

$_=join$;x4,$;x46,split//,pop;print substr(s/$;/ /gr,0,50)." \r"while$|=s/$;//+select'','','',.1

Kradnąc dużo z odpowiedzi @ Kevina Reida , zwłaszcza /rsztuczka dostępna w nowszych Perlach.

Perl, 115

Podobnie jak odpowiedź @ Joela Bergera , stałbym się znacznie krótszy, gdybym mógł użyć sleep 1i być powolnym lub przekazać -MTime::HiRes=sleepwiersz poleceń, aby włączyć sleep.1. W przeciwnym razie jedynym wbudowanym sposobem na uzyskanie krótkich snów select'','','',.1jest dość długi.

$|=@_=(($")x45,map{($")x4,$_}split//,pop);for(0..$#_){print@_," \r";splice@_,($_-=45)<0?0:$_/4,1;select'','','',.1}

Perl, 128

$_=$"x9 .pop;s/./    $&/g;$.=-46;$\=" \r";while($|=/./g){print substr($_,0,50);pos=++$.<0?0:$./4;s/\G.//;select'','','',.1}print

Perl, 133

$|=@_=split//,pop;for$i(reverse-$#_..50){for(@_){print$"x($j||$i),$_;($i+=$j=($i++>0)*4)>50&&last}print"    \r";$j=select'','','',.1}
efemeryczny
źródło
tak, ugryzłem się w tę zasadę! Nie zdawałem sobie sprawy, że inne języki będą miały wbudowaną zasnę. No cóż.
Joel Berger
kilka sugestii, możesz usunąć spację po każdym, xa blokowa forma mapuratuje kilka.
Joel Berger
1

JavaScript 180 218 znaków

Wersja produkcyjna:

function f(){i--&&(i>50?h=h.substr(1):h=h.replace(" ",i==16?"&nbsp;":""),document.body.innerHTML="<pre>"+h.substr(0,50)+"</pre>",setTimeout(f,99))}h=(new Array(50)).join(" ")+"HelloWorld".split("").join("   "),i=80,f()

Wersja bez golfa:

h=new Array(50).join(" ")+("HelloWorld".split("").join("   "));
i=80;

function f(){
        if(i--){
            if(i>50){
                h=h.substr(1);
            }else{
                h=h.replace(" ",(i==16)?"&nbsp;":"");
            }
            document.body.innerHTML="<pre>"+h.substr(0,50)+"</pre>";
            setTimeout(f,99);
        }
}
f();​

Oto demo jsFiddle

Uwaga: jeśli spróbujesz go odtworzyć, upewnij się, że kod znajduje się pod treścią

ajax333221
źródło
Nie mogę powiedzieć z wersji demo, czy „układa się” po lewej stronie, czy po prostu robi to w lewo, a następnie pokazuje ostatni ciąg? Howard zdecydowanie działa, jeśli nie jesteś pewien.
Joel Berger
@JoelBerger hello world ma 4 spacje między każdą literą, gdy h jest pierwszym znakiem, spacje te są usuwane. Ta wersja demonstracyjna jest wolniejsza jsfiddle.net/fYvg7/1
ajax333221
To blisko, ale powinieneś usunąć każdą przestrzeń osobno.
Joel Berger
@JelBerger Naprawiono
ajax333221
Cóż, nienawidzę być głupkiem, ale jest jeszcze jeden problem: twój zaczyna się od wyświetlania wszystkich liter, zamiast wchodzenia jeden po drugim po prawej stronie.
Joel Berger
1

Perl 5.13.2, 115 znaków

$_=$"x9 .pop=~y/ /\0/r;s/./    $&/g;print(y/\0/ /r=~/(.{50})/,"\r"),select$.,$.,$.,.02while$|=s/ (\S)/$1 /g;print$/
  • Ostrzegawczy.
  • Można go trochę wycisnąć, zmniejszając odstęp między znakami lub początkową spację.
  • Wymaga Perla 5.13.2 lub nowszego ze względu na użycie /r.
  • Podstawienie na NUL w celu zachowania spacji jest jednoznaczne, ponieważ POSIX argv nie jest NUL-clean. Jednak podstawienie pętli zmieni dowolne inne białe znaki w nicość (ostatecznie).

Kredyty:

Kevin Reid
źródło
Uwielbiam rflagę, najlepszy dodatek do języka od tego czasustate
Joel Berger,
1

bash 234

w=$1
p(){
i=$1
s=$2
p=$((50+s*3-i))
((p<s+1)) && p=$((s+1));
((p<50)) && echo -en "[20;"${p}H$3"  ";
}
clear
for i in {0..99}
do
for s in $(seq 0 ${#w})
do
p $i $s ${w:s:1} 
done
sleep .1
echo -en "[20;1H  "
done
echo -en "\b\b$w\n"

Stosowanie:

./marquee.sh "Hello, fine marquee world"

bez golfa:

#!/bin/bash
w=$1
p(){
    #si String index
    it=$1
    #it=iteration
    si=$2
    pos=$((50+(si*3)-it))
    ((pos<si+1 )) && pos=$((si+1));
    ((pos<50)) && echo -en "[20;"${pos}H$3"  ";
}
clear
for it in {0..99}
do
    for si in $(seq 0 ${#w})
    do
        p $it $si ${w:si:1} 
    done
    sleep .1
    echo -en "[20;1H   "
done
echo -en "[22;1H"
nieznany użytkownik
źródło
1

R, 319 znaków

Zgodnie z filozofią z przykładu @Blazer (d to opóźnienie w sekundach):

f=function(x,n=50,d=0.2){
    s=strsplit(x,"")[[1]];i=1;l=length
    while (i<(n+l(s)-1)){
        if(i<=l(s))cat(rep(" ", n-i),s[1:i])
        else if((i<=n)&&(i>l(s)))cat(rep(" ", n-i),s[1:l(s)])
        else cat(paste(s[1:(i-n+1)],collapse=""),s[(i-n+2):l(s)])
        Sys.sleep(d);system("clear");i=i+1
    }
    cat(paste(s[1:l(s)],collapse=""))
}

Stosowanie:

f("Hello World",n=20,d=0.2)
Paolo
źródło
1

Perl : 144 133

$|=@s=(($")x50,map{$_,($")x4}@i=split//,pop);{$n=0;$s[$n]ne$_?last:$n++for@i;splice@s,$n,1;print"\r",@s[0..50];sleep.1;$n!=@i&&redo}

Aby uzyskać sen <1s, musisz uruchomić jako:

perl -MTime::HiRes=sleep scriptname 'string to print'

Ponieważ nie ogłoszę się zwycięzcą, nie będę się kłócił o to, co się tam liczy, czy nie (ale naprawdę nie mogę wygrać tego Ruby ;-))

Joel Berger
źródło
4 więcej i zmieści się w
tweecie
4 znaki tutaj: s/' '/$"/gis/shift/pop/
ephemient
tak, uwzględniłem je wraz z usunięciem pushoświadczenia. Po prostu jeszcze tego nie opublikowałem.
Joel Berger
0

Q, 145

Nie do końca spełnia wymagania, ponieważ ostatni wiersz usuwa wszystkie spacje, które były w oryginalnym ciągu wejściowym.

{c:2_'((!)(#)a)_'a:((l:3*(#)x)#" "),\(1_(,/)b,'x,'b:" ");{(-1 x;);system"sleep ",($)y}'[-1_c,(l-1)$d(!:)[d]except\(&)(^)d:((!)(#)q)!q:last c;y];}

Wymaga dwóch argumentów, ciągu wejściowego i prędkości przewijania

q){c:2_'((!)(#)a)_'a:((l:3*(#)x)#" "),\(1_(,/)b,'x,'b:" ");{(-1 x;);system"sleep ",($)y}'[-1_c,(l-1)$d(!:)[d]except\(&)(^)d:((!)(#)q)!q:last c;y];}["hello";0.05]
             h
            h
           h
          h  e
         h  e
        h  e
       h  e  l
      h  e  l
     h  e  l
    h  e  l  l
   h  e  l  l
  h  e  l  l
 h  e  l  l  o
h  e  l  l  o
h e  l  l  o
he  l  l  o
he l  l  o
hel  l  o
hel l  o
hell  o
hell o
hello
tartin
źródło
niestety to ważny punkt. Wiem, że skrypty Perla mogą stać się bardzo małe bez tego.
Joel Berger
0

PowerShell, 135

Niezbyt gra w golfa i prawdopodobnie okropne podejście, ale jestem chory i nie mogę tak naprawdę myśleć ...

for($x="`r"+' '*50;$y-ne$x){$y=$x
write-host($x=$x-replace' ([^ ])','$1 ')-n
if(!($t++%5)){$x=$x-replace'.$',"$args"[$i++]}sleep -m 99}
Joey
źródło
0

J (116)

s(echo@((50#LF)&,)@([[i.@]&2e7)@(50&{.)@;@:(([,~#&' '@])&.>))"1([-=&0@/:@\:@:~:&0)^:(i.>:+/k)k=.50,3#~<:#s=.>2{ARGV

Pobiera ciąg wejściowy w wierszu polecenia, tj jconsole marquee.ijs 'Hello, world!'

Jeśli nie trzeba wyczyścić ekranu, tzn. Wydrukować tak:

H  e  l  l  o
H e  l  l  o
He  l  l  o
He l  l  o
...

jest dozwolone, będzie on krótszy o 12 znaków.

Wyjaśnienie:

  • s.=>2{ARGV: pobierz ciąg z wiersza poleceń
  • k.=50,3#~<:#s: początkowa ilość białych znaków dodawana przed każdą postacią, 50 przed pierwszą i 3 przed wszystkimi pozostałymi. (daje tablicę „50 3 3 3 ...”)
  • ([-=&0@/:@\:@~:&0): biorąc pod uwagę tablicę, zmniejsza pierwszy niezerowy element w tablicy
  • ^:(i.>:+/k): ta funkcja była stosowana N razy, gdzie N wynosi 0 do sumy dodanej białej spacji. (daje macierz: 50 3 3 3; 49 3 3 3; 48 3 3 3; ... 0 0 0 1; 0 0 0 0).
  • "1: uruchom następującą funkcję w każdym rzędzie macierzy
  • ;@:(([,~#&' '@])@.>): dodaj określoną liczbę spacji przed każdym znakiem w ciągu
  • (50&{.): weź pierwsze 50 znaków ciągu
  • ([[i.@]&2e7): funkcja, która generuje listę od 0 do 2 * 10 ^ 7, a następnie ją wyrzuca. Na moim komputerze zajmuje to około jednej trzeciej sekundy, co powoduje opóźnienie.
  • ((50#LF)&,): dodaj 50 znaków przed ciągiem, aby wyczyścić ekran
  • echo: wypisuje ciąg
  • s (...): podaj ciąg jako lewy argument funkcji
marinus
źródło
0

APL (70)

{⎕SM∘←1,⍨1,⍨,/D{⍺,⍨⍵⍴⍕⍬}¨P←⍵-{⍵×~×⍺}\×⍵⊣⎕DL÷8⋄0∨.≠P:∇P}1↓⎕SD,1↓3⍴⍨⍴D←⍞

Pobiera dane z klawiatury, dane wyjściowe znajdują się w ⎕SMoknie (który, jak sądzę, byłby terminalem, gdybyś miał tekstowy APL). Rozmiar okna jest wykrywany automatycznie, jeśli naprawdę ma to być 50 Zmiana 1↓⎕SDcelu 50.

Wyjaśnienie:

  • 1↓⎕SD,1↓3⍴⍨⍴D←⍞: przeczytaj ciąg i zapisz w D. Wygeneruj wektor opisujący, ile białych znaków należy dodać przed każdym znakiem, czyli szerokość ekranu przed pierwszym znakiem ( 1↓⎕SD) i 3 przed pozostałymi ( 1↓3⍴⍨⍴D).

  • ⎕DL÷8: poczekaj 1/8 sekundy

  • P←⍵-{⍵×~×⍺}\×⍵: w wektorze w prawym argumencie odejmij 1 od skrajnie lewego niezerowego elementu i zapisz nowy wektor w P.
  • ,/D{⍺,⍨⍵⍴⍕⍬}¨P: dla każdego znaku w D poprzedza ilość białych znaków podanych w P.
  • ⎕SM∘←1,⍨1,⍨: wyświetla się na ekranie, w lewej kolumnie w górnym rzędzie
  • 0∨.≠P:∇P: jeśli w P jest element niezerowy, powtórz z P.
marinus
źródło
0

PowerShell , 129 bajtów

for($x=' '*52+(($args|% t*y)-join' '*4);$x-match'  '){write-host "`r$(-join($x=$x-replace'(?<!  .*)  ')[0..50])  "-n
sleep -m 99}

Wypróbuj online!

Ten skrypt nie usuwa spacji z argumentów, w przeciwieństwie do skryptu Joeya .

TIOnie wyświetla poprawnie wyniku. Dzięki konsoli Powershell otrzymujesz przewijaną linię znaków.

mazzy
źródło
0

05AB1E , 42 bajty

ð¶:S3úJ46ú[D50£¶ð:D?IQ#ðõ.;“…¢('\r')“.eт.W

Wypróbuj online (bez snu). UWAGA: Nie mam zainstalowanego 05AB1E lokalnie, więc nie jestem w 100% pewien, czy lewica \rdziała (teoretycznie powinna jednak działać). W TIO \rsą one interpretowane jako znaki nowej linii. Ponadto TIO wykorzystuje starszą wersję, ponieważ .ejest wyłączona w nowej wersji TIO (program jest taki sam zarówno w starszej, jak i nowej wersji 05AB1E).

Wyjaśnienie:

ð¶:            # Replace all spaces in the (implicit) input-string with newlines
   S           # Split the string to a list of characters
    3ú         # Pad each character with 3 leading spaces
      J        # Join the characters together again
       46ú     # And pad the entire string with an additional 46 leading spaces
[              # Now start an infinite loop:
 D             #  Duplicate the string
  50£          #  And leave only the first 50 characters of this copy as substring
     ¶ð:       #  Replace the newlines back to spaces
        D?     #  Duplicate the string, and print it without trailing newline
 IQ            #  If the current string is equal to the input:
   #           #   Stop the infinite loop
 ðõ.;          #  Replace the first space with an empty string to remove it
 “…¢('\r')“    #  Push dictionary string "print('\r')"
           .e  #  Evaluate it as Python code
 т.W           #  Sleep for 100 ms

Zobacz moją wskazówkę 05AB1E (sekcja Jak korzystać ze słownika? ), Aby zrozumieć, dlaczego tak “…¢('\r')“jest "print('\r')".

Kevin Cruijssen
źródło
0

Python, 139 bajtów

import os;P='\n'
def f(x,w):
 v=k=P*w+P.join(x);o=str.replace
 while v!=x:os.system('sleep 1;clear');k=o(k,P,'',1);v=o(k,P,' ');print v[:w]

Musi zadzwonić, f('Hello World', 50)aby rozpocząć.

Sunera Avinash
źródło