Marquee cuộn


13

Sau khi tôi tham gia Thế giới Hello bị xáo trộn, tôi nghĩ sẽ rất vui khi chia sẻ mã cơ bản. Nhưng tại sao chỉ hiển thị mã, hãy làm cho nó một golf!

Thử thách

Viết một kịch bản cuộn một chuỗi trên thiết bị đầu cuối, từ phải sang trái, giải quyết ở phía bên trái.

Đầu vào

Lấy một chuỗi làm đối số.

Kết quả

In vùng di chuyển đến STDOUT. Chiều rộng tối đa ~ 50 ký tự. Bắt đầu với 0 hoặc 1 char hiển thị. Một số khoảng trống giữa các chữ cái trong khi cuộn. Dừng khi ổn định (không có khoảng trắng giữa các ký tự từ). Cuộn chậm, nhưng không quá chậm (<1s mỗi lần lặp).

Thí dụ

Chạy script với arg 'Hello World'

                                                   H

một lát sau

                H    e    l    l    o         W    o

một lát sau

H    e    l    l    o          W    o    r    l    d

một lát sau

Hell    o         W    o    r    l    d

cuối cùng

Hello World

Để biết ví dụ đang chạy, hãy thử mã của tôi từ thử thách "Hello World". Cuối cùng tôi sẽ đăng bài của tôi. Nó hiện là 202 ký tự trong Perl. Bây giờ có một số đối thủ cạnh tranh, tôi đã đăng của tôi trong câu trả lời.

Người chiến thắng

Tôi không muốn các hạn chế là tuyệt đối, đó là lý do tại sao tôi để lại một chút mơ hồ. Kịch bản ngắn nhất theo tinh thần ban đầu của tôi sẽ giành chiến thắng.

Ghi chú

Trò chơi này giả định xtermmôi trường. Nếu một môi trường khác tỏ ra hữu ích, chỉ những môi trường tương tự sẽ được so sánh và một người chiến thắng riêng biệt có thể được tuyên bố cho từng môi trường.

Phụ lục (ngày 25 tháng 4 năm 2012)

Để giải quyết một số vấn đề vừa chớm nở, tôi đang đưa ra phán quyết. Số lượng ký tự của bạn phải bao gồm mã cần thiết để:

  1. Flush STDOUT (Nhìn vào bạn Ruby)
  2. Triển khai sleepvới độ trễ thời gian <1s (Nhìn vào bạn Perl)

Điều này có thể được thực hiện khi dòng lệnh chuyển sang một trình thông dịch, nhưng những ký tự đó được tính trong tổng số (sans xung quanh khoảng trắng).


Tôi là một chút lo ngại về những hành vi thiết bị đầu cuối cho các loại hình điều ... xterm, vt102, ...?
dmckee --- ex-moderator mèo con

Tôi đang giả sử xterm, nhưng tôi không nghĩ nó quá quan trọng. Có lẽ tôi không hiểu mối quan tâm của bạn?
Joel Berger

Những thủ thuật này thường được tạo ra bằng cách dựa vào cách các thiết bị đầu cuối khác nhau xử lý một số ký tự không in và các thiết bị đầu cuối khác nhau về những gì chúng có thể làm và trình tự nào tạo ra hiệu ứng. Đối với khả năng tái tạo, có thể tốt khi có một môi trường đầu cuối được chỉ định.
dmckee --- ex-moderator mèo con

1
Nó sẽ phục vụ bạn ngay khi ai đó đăng một câu trả lời thực sự ngắn phụ thuộc vào thiết bị đầu cuối tối nghĩa mà bạn không có trình giả lập, nhưng OK.
dmckee --- ex-moderator mèo con

ok tôi nghĩ rằng tôi có nó bây giờ Cảm ơn những suy nghĩ :-)
Joel Berger

Câu trả lời:


5

trăn 2 - 146 ký tự

chỉnh sửa: làm cho nó một chức năng thay vì đầu vào thông qua stdin. đối số đầu tiên là chuỗi và đối số thứ hai là độ dài bạn muốn. vì vậy cầu nguyện sẽ được f('Hello World', 50). Tôi cũng làm cho nó mượt mà hơn nhiều; Khi mỗi nhân vật 'hạ cánh', có một khoảng lặng khó xử

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)

cũ, 158 ký tự:

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)

Sử dụng bash (ít nhất là trong bản cài đặt MacOSX và CentOS gần đây), lệnh shell được sử dụng để xóa màn hình đầu cuối phải là 'xóa' chứ không phải 'cls'.
Paolo

'cls' cho các cửa sổ, 'xóa' cho các bản dựng OSX / Linux, tôi đoán vậy
Blazer

Tư vấn làm thế nào để bắt đầu chương trình cho những người không giao dịch với trăn hàng ngày, sẽ hữu ích. Bắt đầu trăn. dán mã, gọi f("Hello World, 40)làm việc cho tôi.
người dùng không xác định

@user tôi ừm. Tôi đã đặt lời mời lên đó?
Blazer

4

Ruby, 93 91 89 ký tự

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

Văn bản được hiển thị phải được cung cấp dưới dạng đối số dòng lệnh, vd

ruby marquee.rb "Hello World"

cho ví dụ hiển thị ở trên. Thật không may, tôi không thể hiển thị hình ảnh động ở đây, vì vậy bạn phải tự mình thử mã.

Phiên bản trước:

s=" "*67+[*$*[0].chars]*"   ";(s.size*3/4).times{|j|s[j/3]='';$><<s[16,50]+" \r";sleep 0.1}

Kích thước ấn tượng. Mặc dù nó không được mượt mà lắm, đó là tôi (hiện tại tôi đang sử dụng một cỗ máy công suất thấp) hoặc đó là cách mã hoạt động?
Joel Berger

Tìm ra nó, tôi phải thiết lập STDOUT.sync=true;để nó tự động xóa. Các đẳng thức Perl là $|++. Đó là thêm 17 ký tự, nhưng vẫn còn dưới tôi. Chà, tôi không thể có Ruby đánh bại Perl! Gonna hafta được làm việc. Đẹp một.
Joel Berger

Nếu tôi gọi ruby1.8 "Hello World"tôi nhận được, không chính xác là tôi ngạc nhiên, một lỗi cho biết:ruby1.8: No such file or directory -- Hello World (LoadError)
người dùng không xác định

@userunknown có lẽ bạn cũng nên đặt đường dẫn đến tệp nguồn ở đó: ruby foo.rb args;-)
Patrick Oscarity

@padde: Vâng, tôi nên. Thật không may Howard đã chỉnh sửa bài đăng của mình mà không thông báo cho tôi về sự thay đổi của mình. Có một cái nhìn vào lịch sử để hiểu câu hỏi của tôi.
người dùng không xác định

3

C, 94 83 80 173 ký tự

EDIT: Đã thêm rất nhiều mã, thực hiện tất cả các chức năng được yêu cầu ngay bây giờ. Hằng số 1e8có thể được điều chỉnh để kiểm soát tốc độ. Trên máy của tôi, nó khá nhanh.
Một số nhân vật chắc chắn có thể được lưu ở đây. lcó thể là tĩnh (lưu khởi tạo), ccó thể trở thành một con trỏ (thay thế 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););
}

Phiên bản cũ (80 ký tự), với chức năng một phần:
Đã lưu một vài ký tự bằng cách thay thế char**tbằng int*t. Hoạt động tốt trong 32 bit ( int**tsẽ hỗ trợ 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;);
}

2

K & R C - 431 416 ký tự

Tôn trọng tiêu chuẩn ở mức độ cao. Sử dụng ncurses vì ​​vậy nó sẽ độc lập phần lớn thiết bị đầu cuối. Có một chút nói lắp khi văn bản chạm vào một bên do một số mánh khóe được chơi để bảo toàn khoảng trắng dự định trong chuỗi.

Chuỗi được sử dụng phải được truyền làm đối số đầu tiên trên dòng lệnh (và nên được thoát nếu nó chứa khoảng trắng, vì vậy nếu nó chứa !chuỗi như chuỗi thử nghiệm của tôi ( Hello, World!) đã làm).

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

Trong một hình thức dễ đọc và bình luận hơn:

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

Có rất nhiều tiềm năng để rút ngắn, đặc biệt là bằng cách thay thế ifbằng các nhà khai thác. Ví dụ: if((s-q)%2)s--;else usleep(1e5);-> s-q&1?s--:usleep(1e5);(hoặc s-=s-q&1||usleep(1e5);)
ugoren

@ugoren: Yup, và tôi đã quên thay thế ' 's bằng các số tương đương.
dmckee --- ex-moderator mèo con

Một vài thủ thuật nữa: Thay thế x==32bằng x-32(đảo ngược nghĩa, vì vậy đảo ngược if- x<33other ) hoặc bằng (giả sử 0..31 không bao giờ được sử dụng). Khởi tạo với các giá trị bạn có ( for(curs_set(c=0);...). *(s+1)-> s[1]. Loại bỏ niềng răng không cần thiết (thay thế ;bằng ,sẽ giúp).
ugoren

2

Perl 5.13.2, 96

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

Ăn cắp rất nhiều từ câu trả lời của @ Kevin Reid , đặc biệt là /rthủ thuật có sẵn trong Perls mới hơn.

Perl, 115

Giống như câu trả lời của @ Joel Berger , điều này sẽ trở nên ngắn hơn nhiều nếu tôi có thể sử dụng sleep 1và chậm, hoặc truyền -MTime::HiRes=sleepvào dòng lệnh để kích hoạt sleep.1. Mặt khác, cách tích hợp duy nhất để có được giấc ngủ ngắn select'','','',.1là khá dài.

$|=@_=(($")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}

yeah, tôi tự cắn mình với quy tắc của riêng tôi về điều đó! Tôi đã không nhận ra rằng các lang khác sẽ có một giấc ngủ được xây dựng. Ồ tốt.
Joel Berger

Một số gợi ý, bạn có thể xóa khoảng trống sau mỗi xvà dạng khối mapsẽ tiết kiệm một vài.
Joel Berger

1

JavaScript 180 218 ký tự

Phiên bản sản xuất:

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

Phiên bản Ungolfed:

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

Dưới đây là bản demo jsFiddle

Lưu ý: nếu bạn cố gắng sao chép nó, hãy đảm bảo mã nằm dưới thân máy


Tôi không thể nói từ bản demo, nó "chồng lên" ở bên trái, hay đơn giản là làm cho nó ở bên trái và sau đó hiển thị chuỗi cuối cùng? Howard chắc chắn hoạt động nếu bạn không chắc chắn.
Joel Berger

@JoelBerger thế giới xin chào có 4 khoảng trắng giữa mỗi chữ cái, khi h là ký tự đầu tiên, các khoảng trắng này sẽ bị xóa. Bản demo này chậm hơn jsfiddle.net/fYvg7/1
ajax333221

Điều đó gần, nhưng bạn nên loại bỏ từng không gian riêng lẻ.
Joel Berger

@JoelBerger Đã sửa lỗi
ajax333221

Chà, tôi ghét trở thành một người hay cằn nhằn, nhưng một vấn đề khác: của bạn bắt đầu bằng tất cả các chữ cái hiển thị thay vì nhập từng chữ một ở bên phải.
Joel Berger

1

Perl 5.13.2, 115 ký tự

$_=$"x9 .pop=~y/ /\0/r;s/./    $&/g;print(y/\0/ /r=~/(.{50})/,"\r"),select$.,$.,$.,.02while$|=s/ (\S)/$1 /g;print$/
  • Cảnh báo sạch sẽ.
  • Có thể được nén một chút bằng cách giảm khoảng cách giữa các ký tự hoặc khoảng trắng ban đầu.
  • Yêu cầu Perl 5.13.2 hoặc mới hơn do sử dụng /r.
  • Việc thay thế NUL để bảo toàn không gian là không rõ ràng vì POSIX argv không sạch NUL. Tuy nhiên, sự thay thế vòng lặp sẽ biến bất kỳ khoảng trắng nào khác thành không có gì (cuối cùng).

Tín dụng:


Tôi yêu rcờ, bổ sung tốt nhất cho ngôn ngữ kể từstate
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"

Sử dụng:

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

vô dụng:

#!/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"

1

R, 319 ký tự

Theo triết lý của ví dụ @Blazer (d là độ trễ tính bằng giây):

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

Sử dụng:

f("Hello World",n=20,d=0.2)

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}

Để có được giấc ngủ <1s mặc dù bạn cần chạy như:

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

Vì tôi sẽ không tuyên bố mình là người chiến thắng nên tôi sẽ không tranh cãi về những gì được tính ở đó hay không (nhưng tôi thực sự không thể để Ruby giành được điều này ;-))


Thêm 4 và nó phù hợp với một tweet: D
ajax333221

4 ký tự ngay tại đây: s/' '/$"/gs/shift/pop/
ephemient

vâng, tôi đã bao gồm những điều đó, cùng với việc loại bỏ pushtuyên bố. Tôi chưa đăng nó.
Joel Berger

0

Q, 145

Không đáp ứng chính xác các yêu cầu vì dòng cuối cùng sẽ loại bỏ tất cả các khoảng trắng trong chuỗi đầu vào ban đầu.

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

Phải mất hai đối số, chuỗi đầu vào và tốc độ cuộn

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

Thật không may, đó là một điểm quan trọng. Tôi biết rằng các tập lệnh Perl có thể trở nên rất nhỏ nếu không có nó.
Joel Berger

0

PowerShell, 135

Không chơi gôn và có lẽ là một cách tiếp cận khủng khiếp, nhưng tôi bị bệnh và thực sự không thể nghĩ ...

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}

0

J (116)

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

Lấy chuỗi đầu vào trên dòng lệnh, nghĩa là jconsole marquee.ijs 'Hello, world!'

Nếu không cần xóa màn hình, tức là đầu ra như thế này:

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

được cho phép, nó sẽ ngắn hơn 12 ký tự.

Giải trình:

  • s.=>2{ARGV: lấy chuỗi từ dòng lệnh
  • k.=50,3#~<:#s: số lượng khoảng trắng bắt đầu được thêm vào trước mỗi ký tự, 50 trước ký tự đầu tiên và 3 trước tất cả các khoảng trắng khác. (đưa ra một mảng, '50 3 3 3 ... ')
  • ([-=&0@/:@\:@~:&0): đưa ra một mảng, giảm giá trị mục khác không đầu tiên trong mảng
  • ^:(i.>:+/k): hàm này được áp dụng N lần, trong đó N bằng 0 cho đến tổng số lượng khoảng trắng được thêm vào. (đưa ra một ma trận : 50 3 3 3; 49 3 3 3; 48 3 3 3; ... 0 0 0 1; 0 0 0 0).
  • "1: chạy hàm sau trên mỗi hàng của ma trận
  • ;@:(([,~#&' '@])@.>): thêm số lượng khoảng trắng đã cho trước mỗi ký tự trong chuỗi
  • (50&{.): lấy 50 ký tự đầu tiên của chuỗi
  • ([[i.@]&2e7): một hàm tạo danh sách từ 0 đến 2 * 10 ^ 7, và sau đó ném nó đi. Điều này mất khoảng một phần ba giây trên máy của tôi, điều này gây ra sự chậm trễ.
  • ((50#LF)&,): thêm 50 dòng mới trước chuỗi, để xóa màn hình
  • echo: xuất chuỗi
  • s (...): cung cấp chuỗi dưới dạng đối số bên trái cho hàm

0

APL (70)

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

Lấy đầu vào từ bàn phím, đầu ra nằm trong ⎕SMcửa sổ (sẽ là thiết bị đầu cuối nếu bạn có APL dựa trên văn bản tôi đoán). Kích thước cửa sổ được phát hiện tự động, nếu bạn thực sự muốn nó là 50 thay đổi 1↓⎕SDthành 50.

Giải trình:

  • 1↓⎕SD,1↓3⍴⍨⍴D←⍞: đọc chuỗi và lưu trữ trong D. Tạo một vectơ mô tả khoảng trắng cần thêm trước mỗi ký tự, đó là chiều rộng màn hình trước ký tự đầu tiên ( 1↓⎕SD) và 3 trước các ký tự khác ( 1↓3⍴⍨⍴D).

  • ⎕DL÷8: đợi 1/8 giây

  • P←⍵-{⍵×~×⍺}\×⍵: trong vectơ trong đối số bên phải, trừ 1 từ mục khác không ngoài cùng bên trái và lưu trữ vectơ mới trong P.
  • ,/D{⍺,⍨⍵⍴⍕⍬}¨P: cho mỗi ký tự trong D, tiền tố số lượng khoảng trắng được cho trong P.
  • ⎕SM∘←1,⍨1,⍨: hiển thị trên màn hình, ở cột ngoài cùng bên trái của hàng trên cùng
  • 0∨.≠P:∇P: nếu có phần tử khác 0 trong P, lặp lại với P.

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}

Hãy thử trực tuyến!

Kịch bản này không xóa khoảng trắng khỏi các đối số trái ngược với kịch bản của Joey .

TIOkhông hiển thị đầu ra chính xác. Với bảng điều khiển Powershell, bạn có được cuộn marqueeline.


0

05AB1E , 42 byte

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

Hãy thử trực tuyến (không ngủ). LƯU Ý: Tôi không cài đặt 05AB1E cục bộ, vì vậy tôi không chắc chắn 100% nếu \rmẹo đó hoạt động (tuy nhiên về lý thuyết thì nó sẽ hoạt động). Trong TIO, các \rgiải thích là dòng mới thay thế. Ngoài ra, TIO sử dụng phiên bản kế thừa, vì .ebị vô hiệu hóa trong phiên bản TIO mới (mặc dù chương trình giống nhau ở cả phiên bản mới và 05AB1E).

Giải trình:

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

Xem mẹo 05AB1E này của tôi (phần Làm thế nào để sử dụng từ điển? ) Để hiểu tại sao “…¢('\r')“"print('\r')".


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]

Phải gọi f('Hello World', 50)để bắt đầu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.