Menggulir Marquee

13

Setelah entri saya ke Hello World yang dikaburkan, saya pikir mungkin menyenangkan untuk membagikan kode yang mendasarinya. Tapi mengapa hanya menunjukkan kodenya, mari kita membuatnya menjadi golf juga!

Tantangan

Tulis skrip yang menggulirkan string melintasi terminal, dari kanan ke kiri, menetap di sisi kiri.

Memasukkan

Mengambil string sebagai argumen.

Hasil

Mencetak tenda bergulir ke STDOUT. Lebar maks ~ 50 karakter. Mulai dengan 0 atau 1 karakter yang ditampilkan. Beberapa spasi antar huruf saat menggulir. Berhenti ketika diselesaikan (tidak memiliki ruang ekstra di antara karakter kata). Gulir lambat, tetapi tidak terlalu lambat (<1 per iterasi).

Contoh

Menjalankan skrip dengan arg 'Hello World'

                                                   H

kemudian

                H    e    l    l    o         W    o

kemudian

H    e    l    l    o          W    o    r    l    d

kemudian

Hell    o         W    o    r    l    d

akhirnya

Hello World

Untuk contoh yang sedang berjalan, coba kode saya dari tantangan "Hello World". Akhirnya saya akan memposting milik saya. Saat ini adalah 202 karakter di Perl. Sekarang ada beberapa pesaing, saya telah memposting milik saya di jawaban.

Pemenang

Saya tidak ingin pembatasan menjadi absolut, itu sebabnya saya meninggalkannya sedikit kabur. Naskah terpendek yang mengikuti semangat orisinal saya akan menang.

Catatan

Game ini mengasumsikan xterm lingkungan. Jika lingkungan lain terbukti bermanfaat, hanya lingkungan yang serupa yang akan dibandingkan dan pemenang yang terpisah dapat dinyatakan untuk masing-masing

Adendum (25 April 2012)

Untuk mengatasi beberapa masalah pemula, saya membuat keputusan. Hitungan karakter Anda harus menyertakan kode yang diperlukan untuk:

  1. Flush STDOUT (Melihat Anda Ruby)
  2. Laksanakan sleepdengan penundaan waktu <1s (Melihat Anda Perl)

Ini dapat dilakukan ketika baris perintah beralih ke juru bahasa, tetapi karakter-karakter tersebut dihitung dalam total (tanpa spasi di sekitar).

Joel Berger
sumber
Aku sedikit khawatir tentang perilaku terminal untuk hal semacam ini ... xterm, vt102, ...?
dmckee --- ex-moderator kitten
Saya berasumsi xterm, tapi saya pikir itu tidak terlalu penting. Mungkin saya tidak mengerti kekhawatiran Anda?
Joel Berger
Trik-trik ini biasanya dihasilkan dengan mengandalkan cara berbagai terminal menangani beberapa karakter non-cetak, dan terminal berbeda dalam hal apa yang dapat mereka lakukan dan urutan apa yang menghasilkan efek. Untuk reproduktifitas mungkin baik untuk memiliki lingkungan terminal yang ditentukan.
dmckee --- ex-moderator kitten
1
Ini akan membantu Anda benar adalah seseorang memposting jawaban yang sangat singkat yang tergantung pada terminal tidak jelas yang Anda tidak punya emulator, tapi OK.
dmckee --- ex-moderator kitten
ok saya pikir saya memilikinya sekarang. Terima kasih atas pemikirannya :-)
Joel Berger

Jawaban:

5

python 2 - 146 karakter

sunting: menjadikannya fungsi alih-alih input melalui stdin. Argumen pertama adalah string, dan argumen kedua adalah panjang yang Anda inginkan. jadi doa akan menjadi f('Hello World', 50). Saya juga membuatnya lebih halus; ketika setiap karakter 'mendarat' ada jeda canggung

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)

tua, 158 karakter:

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)
Jaket
sumber
Menggunakan bash (setidaknya dalam instalasi terbaru MacOSX dan CentOS), perintah shell yang digunakan untuk menghapus layar terminal harus 'jelas' bukan 'cls'.
Paolo
'cls' for windows, 'clear' untuk OSX / Linux builds, saya kira
Blazer
Saran cara memulai program bagi mereka yang tidak berurusan dengan python setiap hari, akan sangat membantu. Mulai python. rekatkan kode, panggilan f("Hello World, 40)berhasil untuk saya.
pengguna tidak dikenal
@ pengguna, saya um. Saya memang berdoa di sana?
Blazer
4

Ruby, 93 91 89 karakter

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

Teks yang akan ditampilkan harus diberikan sebagai argumen baris perintah, misalnya

ruby marquee.rb "Hello World"

untuk contoh yang ditunjukkan di atas. Sayangnya saya tidak dapat menampilkan animasi di sini, jadi Anda harus mencoba sendiri kodenya.

Versi sebelumnya:

s=" "*67+[*$*[0].chars]*"   ";(s.size*3/4).times{|j|s[j/3]='';$><<s[16,50]+" \r";sleep 0.1}
Howard
sumber
Ukuran yang mengesankan. Ini tidak terlalu mulus, apakah itu saya (saya sedang menggunakan mesin berdaya rendah pada saat ini) atau apakah itu cara kerjanya?
Joel Berger
Mencari tahu, saya harus mengatur STDOUT.sync=true;sehingga autoflushes. The Equiv Perl adalah $|++. Itu tambahan 17 karakter, tapi masih jauh di bawah milikku. Yah aku tidak bisa membiarkan Ruby mengalahkan Perl! Akan mulai bekerja. Bagus
Joel Berger
Jika saya menelepon ruby1.8 "Hello World"saya dapat, tidak mengejutkan saya, ada kesalahan yang mengatakan:ruby1.8: No such file or directory -- Hello World (LoadError)
pengguna tidak diketahui
@userunknown mungkin Anda harus meletakkan path ke file sumber di sana juga: ruby foo.rb args;-)
Patrick Oscity
@ Padde: Ya, saya harus. Sayangnya Howard mengedit posnya tanpa memberi tahu saya tentang perubahannya. Lihat sejarah untuk memahami pertanyaan saya.
pengguna tidak diketahui
3

C, 94 83 80 173 karakter

EDIT: Menambahkan banyak kode, mengimplementasikan semua fungsi yang diminta sekarang. Konstanta 1e8dapat diubah untuk mengontrol kecepatan. Di mesin saya, ini cukup cepat.
Beberapa karakter pasti dapat disimpan di sini. lbisa statis (menyimpan inisialisasi), cbisa menjadi pointer (ganti 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););
}

Versi lama (80 karakter), dengan fungsi sebagian:
Menyimpan beberapa karakter dengan mengganti char**tdengan int*t. Bekerja dengan baik dalam 32-bit ( int**takan mendukung 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
sumber
2

K&R C - 431 416 karakter

Menghormati standar sampai tingkat yang tinggi. Menggunakan ncurses sehingga sebagian besar terminal harus independen. Ada sedikit kegagapan ketika teks menyentuh sisi karena beberapa tipu muslihat dimainkan untuk mempertahankan spasi yang diinginkan dalam string.

String yang digunakan harus diteruskan sebagai argumen pertama pada baris perintah (dan harus diloloskan jika mengandung spasi, terlebih lagi jika berisi !string seperti yang saya uji ( Hello, World!) lakukan).

#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();}

Dalam bentuk yang lebih mudah dibaca dan dikomentari:

#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 --- mantan kucing moderator
sumber
Ada banyak potensi pemendekan, terutama dengan mengganti ifdengan operator. Misalnya - if((s-q)%2)s--;else usleep(1e5);-> s-q&1?s--:usleep(1e5);(atau s-=s-q&1||usleep(1e5);)
ugoren
@ugoren: Yup, dan saya lupa mengganti ' 's dengan angka yang ekuivalen.
dmckee --- ex-moderator kitten
Beberapa trik lagi: Ganti x==32dengan x-32(membalikkan makna, jadi balik jika-lain), atau dengan x<33( dengan asumsi 0..31 tidak pernah digunakan). Inisialisasi dengan nilai yang Anda miliki ( for(curs_set(c=0);...). *(s+1)-> s[1]. Hapus kawat gigi yang tidak dibutuhkan (mengganti ;dengan ,akan membantu).
ugoren
2

Perl 5.13.2, 96

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

Mencuri banyak dari jawaban @ Kevin Reid , terutama /rtrik yang tersedia di Perls yang lebih baru.

Perl, 115

Seperti jawaban @ Joel Berger , ini akan menjadi jauh lebih pendek jika saya bisa menggunakan sleep 1dan lambat, atau meneruskan -MTime::HiRes=sleepbaris perintah untuk mengaktifkan sleep.1. Kalau tidak, satu-satunya cara built-in untuk tidur singkat adalah select'','','',.1yang cukup panjang.

$|=@_=(($")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}
singkat
sumber
ya, saya menggigit diri sendiri dengan aturan saya sendiri untuk yang itu! Saya tidak menyadari bahwa langs lain akan memiliki ruang tidur. Oh, well.
Joel Berger
beberapa saran, Anda dapat menghapus ruang setelah masing x- masing dan bentuk blok mapakan menghemat beberapa.
Joel Berger
1

JavaScript 180 218 karakter

Versi produksi:

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()

Versi Tidak Serigala:

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();​

Ini Demo jsFiddle

Catatan: jika Anda mencoba mereproduksinya, pastikan kodenya di bawah tubuh

ajax333221
sumber
Saya tidak tahu dari demo, apakah itu "menumpuk" di sisi kiri, atau hanya membuatnya ke kiri dan kemudian menunjukkan string terakhir? Howard pasti bekerja jika Anda tidak yakin.
Joel Berger
@ JoelBerger the hello world memiliki 4 spasi di antara setiap huruf, ketika h adalah karakter pertama, spasi ini akan dihapus. Demo ini lebih lambat jsfiddle.net/fYvg7/1
ajax333221
Itu dekat, tetapi Anda harus menghapus setiap ruang secara individual.
Joel Berger
@JoelBerger Tetap
ajax333221
Yah saya benci menjadi cerewet, tetapi satu masalah lain: Anda mulai dengan semua huruf yang ditampilkan daripada memasukkan satu-per-satu di sebelah kanan.
Joel Berger
1

Perl 5.13.2, 115 karakter

$_=$"x9 .pop=~y/ /\0/r;s/./    $&/g;print(y/\0/ /r=~/(.{50})/,"\r"),select$.,$.,$.,.02while$|=s/ (\S)/$1 /g;print$/
  • Peringatan-bersih.
  • Dapat diperas sedikit dengan mengurangi ruang antara karakter atau spasi awal.
  • Membutuhkan Perl 5.13.2 atau lebih baru karena penggunaan /r.
  • Substitusi ke NUL untuk menghemat ruang tidak ambigu karena POSIX argv tidak bersih-NUL. Namun, pergantian loop akan mengubah spasi putih lainnya menjadi tidak ada (akhirnya).

Kredit:

Kevin Reid
sumber
Saya suka rbendera, tambahan terbaik untuk bahasa sejakstate
Joel Berger
1

pesta 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"

Pemakaian:

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

ungolfed:

#!/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"
Pengguna tidak diketahui
sumber
1

R, 319 karakter

Mengikuti filosofi contoh @Blazer (d adalah penundaan dalam detik):

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=""))
}

Pemakaian:

f("Hello World",n=20,d=0.2)
Paolo
sumber
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}

Untuk dapat tidur <1s meskipun Anda harus menjalankan sebagai:

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

Karena saya tidak akan menyatakan diri saya sebagai pemenang, saya tidak akan berdebat sendiri tentang apa yang diperhitungkan di sana atau tidak (tapi saya benar-benar tidak bisa membuat Ruby memenangkan ini ;-))

Joel Berger
sumber
4 lebih banyak dan itu cocok untuk tweet: D
ajax333221
4 karakter di sini: s/' '/$"/gdans/shift/pop/
ephemient
ya, saya sudah memasukkan itu, bersama dengan menghapus pushpernyataan itu. Saya hanya belum mempostingnya.
Joel Berger
0

Q, 145

Tidak persis memenuhi persyaratan karena baris terakhir menghapus semua spasi yang ada di string input asli.

{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];}

Dibutuhkan dua argumen, string input dan kecepatan gulir

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
tmartin
sumber
sayangnya itu poin penting. Saya tahu bahwa skrip Perl dapat menjadi sangat kecil tanpa itu.
Joel Berger
0

PowerShell, 135

Tidak terlalu bermain golf dan mungkin pendekatan yang mengerikan, tapi saya sakit dan tidak bisa berpikir ...

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
sumber
0

J (116)

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

Mengambil string input pada baris perintah, yaitu jconsole marquee.ijs 'Hello, world!'

Jika tidak perlu menghapus layar, yaitu output seperti ini:

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

diizinkan, itu akan menjadi 12 karakter lebih pendek.

Penjelasan:

  • s.=>2{ARGV: dapatkan string dari baris perintah
  • k.=50,3#~<:#s: jumlah awal spasi yang ditambahkan sebelum setiap karakter, 50 sebelum yang pertama dan 3 sebelum yang lainnya. (memberikan array, '50 3 3 3 ... ')
  • ([-=&0@/:@\:@~:&0): diberikan array, mengurangi item bukan nol pertama dalam array
  • ^:(i.>:+/k): fungsi ini diterapkan N kali, di mana N adalah 0 hingga jumlah jumlah spasi yang ditambahkan. (memberikan matriks:50 3 3 3; 49 3 3 3; 48 3 3 3; ... 0 0 0 1; 0 0 0 0) .
  • "1: jalankan fungsi berikut pada setiap baris matriks
  • ;@:(([,~#&' '@])@.>): tambahkan jumlah spasi yang diberikan sebelum setiap karakter dalam string
  • (50&{.): ambil 50 karakter pertama dari string
  • ([[i.@]&2e7): fungsi yang menghasilkan daftar dari 0 hingga 2 * 10 ^ 7, dan kemudian membuangnya. Ini membutuhkan sekitar sepertiga detik di mesin saya, ini menyebabkan penundaan.
  • ((50#LF)&,): tambahkan 50 baris baru sebelum string, untuk menghapus layar
  • echo: output string
  • s (...): berikan string sebagai argumen kiri ke fungsi
marinus
sumber
0

APL (70)

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

Mengambil input dari keyboard, hasilnya ada di ⎕SMjendela (yang akan menjadi terminal jika Anda memiliki APL berbasis teks saya kira). Ukuran jendela terdeteksi secara otomatis, jika Anda benar-benar ingin menjadi 50 perubahan 1↓⎕SDuntuk50 .

Penjelasan:

  • 1↓⎕SD,1↓3⍴⍨⍴D←⍞: baca string dan simpan di D. Hasilkan vektor yang menjelaskan berapa banyak spasi yang harus ditambahkan sebelum setiap karakter, yang merupakan lebar layar sebelum karakter pertama (1↓⎕SD ), dan 3 sebelum yang lain ( 1↓3⍴⍨⍴D).

  • ⎕DL÷8: tunggu 1/8 detik

  • P←⍵-{⍵×~×⍺}\×⍵: dalam vektor di argumen kanan, kurangi 1 dari item bukan nol paling kiri, dan simpan vektor baru di P.
  • ,/D{⍺,⍨⍵⍴⍕⍬}¨P: untuk setiap karakter dalam D, awali jumlah spasi yang diberikan dalam P.
  • ⎕SM∘←1,⍨1,⍨: tampilan di layar, di kolom paling kiri dari baris atas
  • 0∨.≠P:∇P: jika ada elemen bukan nol di P, ulangi dengan P.
marinus
sumber
0

PowerShell , 129 byte

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

Cobalah online!

Skrip ini tidak menghapus spasi dari argumen yang berbeda dengan skrip Joey .

TIOtidak menampilkan output dengan benar. Dengan konsol Powershell, Anda mendapatkan garis gulir yang bergulir.

mazzy
sumber
0

05AB1E , 42 byte

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

Cobalah online (tanpa tidur). CATATAN: Saya tidak menginstal 05AB1E secara lokal, jadi saya tidak 100% yakin jika \rtriknya berhasil (secara teori seharusnya berhasil). Dalam TIO, \rmereka ditafsirkan sebagai baris baru. Juga, TIO menggunakan versi lama, karena.e dinonaktifkan di versi TIO baru (programnya sama di versi legacy dan baru 05AB1E, meskipun).

Penjelasan:

ð¶:            # 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

Lihat ini ujung 05AB1E saya (bagian Cara menggunakan kamus? ) Untuk memahami mengapa “…¢('\r')“adalah "print('\r')".

Kevin Cruijssen
sumber
0

Python, 139 byte

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]

Harus menelepon f('Hello World', 50)untuk memulai.

Sunera Avinash
sumber