การเลื่อนตัวอักษรวิ่ง


13

ต่อไปนี้การเข้าสู่โลกที่ยุ่งเหยิงของฉันฉันคิดว่าการแชร์รหัสอ้างอิง แต่ทำไมเพียงแค่แสดงรหัสให้มันทำให้กอล์ฟด้วย!

ท้าทาย

เขียนสคริปต์ที่เลื่อนสตริงข้ามเทอร์มินัลจากขวาไปซ้ายปักหลักที่ด้านซ้าย

อินพุต

รับค่าสตริงเป็นอาร์กิวเมนต์

ผลลัพธ์

พิมพ์ตัวเลื่อนปะรำไปที่ STDOUT ความกว้างสูงสุด ~ 50 ตัวอักษร เริ่มต้นด้วยการแสดงอักขระ 0 หรือ 1 ช่องว่างระหว่างตัวอักษรบางส่วนในขณะที่เลื่อน หยุดเมื่อถูกตัดสิน (ไม่มีช่องว่างพิเศษระหว่างตัวอักษรคำ) เลื่อนช้า แต่ไม่ช้าเกินไป (<1 วินาทีต่อการทำซ้ำ)

ตัวอย่าง

กำลังเรียกใช้สคริปต์ด้วย arg 'Hello World'

                                                   H

ต่อมา

                H    e    l    l    o         W    o

ต่อมา

H    e    l    l    o          W    o    r    l    d

ต่อมา

Hell    o         W    o    r    l    d

ในที่สุด

Hello World

สำหรับตัวอย่างการใช้งานลองใช้รหัสของฉันจากการท้าทาย "Hello World" ในที่สุดฉันจะโพสต์ของฉัน ปัจจุบันคือ 202 chars ใน Perl ตอนนี้มีคู่แข่งบ้างฉันโพสต์คำตอบแล้ว

ผู้ชนะ

ฉันไม่ต้องการให้ข้อ จำกัด สัมบูรณ์นั่นคือสาเหตุที่ทำให้ฉันคลุมเครือเล็กน้อย สคริปต์ที่สั้นที่สุดซึ่งตามจิตวิญญาณดั้งเดิมของฉันจะเป็นผู้ชนะ

หมายเหตุ

เกมนี้ถือว่าเป็นxtermสภาพแวดล้อม หากสภาพแวดล้อมอื่นพิสูจน์ว่ามีประโยชน์จะเปรียบเทียบสภาพแวดล้อมที่คล้ายกันเท่านั้นและอาจมีการประกาศผู้ชนะแยกต่างหากสำหรับแต่ละคน

ภาคผนวก (25 เมษายน 2555)

เพื่อแก้ไขปัญหาเรื่องการออกรุ่นฉันกำลังพิจารณาคดี จำนวนตัวอักษรของคุณจะต้องมีรหัสที่จำเป็นสำหรับ:

  1. Flush STDOUT (มองที่คุณทับทิม)
  2. ใช้งานsleepกับการหน่วงเวลา <1 วินาที (มองคุณ Perl)

สิ่งนี้อาจทำได้เมื่อบรรทัดคำสั่งสลับไปที่ล่าม แต่ตัวอักษรเหล่านั้นนับรวมทั้งหมด (sans ล้อมรอบช่องว่าง)


ฉันเล็ก ๆ น้อย ๆ ความกังวลเกี่ยวกับพฤติกรรมขั้วชนิดของสิ่งนี้ ... xterm, vt102... ?
dmckee --- ผู้ดูแลอดีตลูกแมว

ฉันถือว่า xterm แต่ฉันไม่คิดว่ามันสำคัญมาก บางทีฉันไม่เข้าใจข้อกังวลของคุณ?
Joel Berger

เทคนิคเหล่านี้มักจะผลิตโดยอาศัยวิธีที่เทอร์มินัลต่างๆจัดการกับตัวละครที่ไม่ได้พิมพ์และเทอร์มินัลก็แตกต่างกันในสิ่งที่พวกเขาสามารถทำได้ สำหรับการทำซ้ำมันอาจจะดีที่จะมีสภาพแวดล้อมขั้วที่ระบุ
dmckee --- ผู้ดูแลอดีตลูกแมว

1
มันจะให้บริการคุณที่ถูกต้องคือการโพสต์ใครสักคนจริงๆคำตอบสั้น ๆ ที่ขึ้นอยู่กับขั้วชัดเจนว่าคุณไม่ได้มีโปรแกรมจำลองสำหรับ แต่ตกลง
dmckee --- ผู้ดูแลอดีตลูกแมว

ตกลงฉันคิดว่าฉันมีตอนนี้ ขอบคุณสำหรับความคิด :-)
Joel Berger

คำตอบ:


5

หลาม 2 - 146 ตัวอักษร

แก้ไข: ทำให้ฟังก์ชั่นแทนการป้อนข้อมูลผ่าน stdin อาร์กิวเมนต์แรกคือสตริงและอาร์กิวเมนต์ที่สองคือความยาวที่คุณต้องการให้เป็น f('Hello World', 50)ดังนั้นการภาวนาจะเป็น ฉันทำให้มันนุ่มนวลขึ้นมาก เมื่อตัวละครแต่ละตัว 'ลงจอด' มีการหยุดชั่วคราวที่น่าอึดอัดใจ

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)

เก่า, 158 ตัวอักษร:

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)

การใช้ bash (อย่างน้อยในการติดตั้งล่าสุดของ MacOSX และ CentOS) คำสั่งเชลล์ที่ใช้เพื่อล้างหน้าจอเทอร์มินัลควรเป็น 'clear' ไม่ใช่ 'cls'
เปาโล

'cls' สำหรับ windows 'clear' สำหรับ OSX / Linux builds ฉันเดาว่า
Blazer

คำแนะนำวิธีการเริ่มโปรแกรมสำหรับผู้ที่ไม่ได้ทำงานกับหลามในชีวิตประจำวันจะมีประโยชน์ เริ่มต้นหลาม วางรหัสโทรf("Hello World, 40)ทำงานให้ฉัน
ผู้ใช้ที่ไม่รู้จัก

@ ผู้ใช้ฉันอืม ฉันขอร้องที่นั่นหรือไม่
Blazer

4

Ruby, 93 91 89 ตัวอักษร

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

ข้อความที่จะแสดงจะต้องได้รับเป็นอาร์กิวเมนต์บรรทัดคำสั่งเช่น

ruby marquee.rb "Hello World"

สำหรับตัวอย่างที่แสดงด้านบน น่าเสียดายที่ฉันไม่สามารถแสดงภาพเคลื่อนไหวได้ที่นี่ดังนั้นคุณต้องลองใช้รหัสด้วยตัวเอง

รุ่นก่อนหน้า:

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

ขนาดที่น่าประทับใจ มันไม่ได้ราบรื่นมากเลยใช่ไหม (ฉันอยู่ในเครื่องที่ใช้พลังงานต่ำมากในตอนนี้) หรือว่ามันทำงานอย่างไร
Joel Berger

คิดออกฉันต้องตั้งค่าSTDOUT.sync=true;เพื่อให้ autoflushes equiv Perl $|++คือ นั่นเป็นอีก 17 ตัวอักษร แต่ก็ยังต่ำกว่าของฉัน ฉันไม่มีทับทิมเต้น Perl! Hafta จะทำงาน ทำได้ดีนี่.
Joel Berger

ถ้าฉันโทรหาruby1.8 "Hello World"ฉันจะได้รับไม่ใช่ความประหลาดใจของฉันอย่างแน่นอนข้อผิดพลาดที่บอกว่า:ruby1.8: No such file or directory -- Hello World (LoadError)
ผู้ใช้ที่ไม่รู้จัก

@userunknown บางทีคุณควรใส่พา ธ ไปยังซอร์สไฟล์ด้วย: ruby foo.rb args;-)
Patrick Oscity

@padde: ใช่ฉันควร น่าเสียดายที่ Howard แก้ไขโพสต์ของเขาโดยไม่แจ้งให้ฉันทราบเกี่ยวกับการเปลี่ยนแปลงของเขา ดูประวัติเพื่อทำความเข้าใจคำถามของฉัน
ผู้ใช้ที่ไม่รู้จัก

3

C, 94 83 80 173 ตัวอักษร

แก้ไข: เพิ่มรหัสจำนวนมากใช้ฟังก์ชั่นที่ร้องขอทั้งหมดในขณะนี้ ค่าคงที่1e8สามารถปรับแต่งเพื่อควบคุมความเร็ว บนเครื่องของฉันมันค่อนข้างเร็วเหมือนเดิม
ตัวละครบางตัวสามารถบันทึกที่นี่ได้อย่างแน่นอน lสามารถคงที่ (บันทึกการเริ่มต้น), cสามารถกลายเป็นตัวชี้ (แทนที่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););
}

รุ่นเก่า (80 ตัวอักษร) ด้วยฟังก์ชันการทำงานบางส่วน:
บันทึกคู่ของตัวอักษรโดยการแทนที่ด้วยchar**t int*tทำงานได้ดีใน 32- บิต ( int**tรองรับ 64- บิต)

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 ตัวอักษร

เคารพมาตรฐานในระดับสูง ใช้ ncurses ดังนั้นควรเป็นเทอร์มินัลอิสระส่วนใหญ่ มีการพูดติดอ่างเล็กน้อยเมื่อข้อความกระทบด้านข้างเนื่องจากเล่นกลอุบายเพื่อรักษาช่องว่างที่ต้องการในสายอักขระ

สตริงที่จะใช้ควรถูกส่งผ่านเป็นอาร์กิวเมนต์แรกในบรรทัดคำสั่ง (และควรหลีกเลี่ยงหากมีช่องว่างมากกว่าดังนั้นถ้ามันมี!สตริงการทดสอบของฉัน ( 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();}

ในรูปแบบที่อ่านได้และแสดงความคิดเห็นเพิ่มเติม:

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

มีศักยภาพในการตัดทอนจำนวนมากโดยเฉพาะการแทนที่ifด้วยตัวดำเนินการ ตัวอย่างเช่น - if((s-q)%2)s--;else usleep(1e5);-> s-q&1?s--:usleep(1e5);(หรือs-=s-q&1||usleep(1e5);)
ugoren

@ugoren: ใช่แล้วฉันลืมแทนที่' 's ด้วยตัวเลขที่เทียบเท่า
dmckee --- ผู้ดูแลอดีตแมว

เคล็ดลับเพิ่มเติมเล็กน้อย: แทนที่x==32ด้วยx-32(ย้อนกลับความหมายดังนั้นย้อนกลับถ้าอื่น) หรือด้วยx<33(สมมติว่าไม่เคยใช้ 0..31) เริ่มต้นด้วยค่าที่คุณมี ( for(curs_set(c=0);...) ->*(s+1) s[1]ลบวงเล็บปีกกาที่ไม่ต้องการ (แทนที่;ด้วย,จะช่วย)
ugoren

2

Perl 5.13.2, 96

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

ขโมยคำตอบจำนวนมากจาก @ Kevin Reidโดยเฉพาะ/rเคล็ดลับที่มีอยู่ใน Perls รุ่นใหม่

Perl, 115

ชอบ @ โจเอลเบอร์เกอร์คำตอบของเรื่องนี้จะกลายเป็นสั้นมากถ้าฉันสามารถใช้sleep 1และจะช้าหรือผ่านในบรรทัดคำสั่งเพื่อเปิดใช้งาน-MTime::HiRes=sleep sleep.1มิฉะนั้นวิธีเดียวที่จะได้รับการนอนหลับระยะสั้นในตัวselect'','','',.1นั้นค่อนข้างยาว

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

ใช่ฉันกัดตัวเองด้วยกฎของตัวเองในหนึ่ง! ฉันไม่ได้ตระหนักว่าภาษาอื่น ๆ จะมีการสร้างการนอนหลับอยู่ดีดี
Joel Berger

คำแนะนำบางอย่างคุณสามารถลบพื้นที่ออกหลังจากแต่ละแบบxและรูปแบบบล็อกของmapจะบันทึกไม่กี่
Joel Berger

1

JavaScript 180 218 ตัวอักษร

เวอร์ชันการผลิต:

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

เวอร์ชันที่ไม่ถูกปรับแต่ง:

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

นี่คือตัวอย่างjsFiddle

หมายเหตุ:หากคุณพยายามทำซ้ำตรวจสอบให้แน่ใจว่ารหัสอยู่ใต้เนื้อหา


ฉันไม่สามารถบอกได้จากการสาธิตว่า "กองซ้อน" ทางด้านซ้ายหรือทำไปทางซ้ายแล้วแสดงสตริงสุดท้ายหรือไม่ แน่นอนว่าฮาวเวิร์ดใช้ได้ถ้าคุณไม่แน่ใจ
Joel Berger

@ JoelBerger สวัสดีโลกมี 4 ช่องว่างระหว่างตัวอักษรแต่ละตัวเมื่อ h คือตัวอักษรตัวแรกช่องว่างเหล่านี้จะถูกลบออก การสาธิตนี้ช้ากว่าjsfiddle.net/fYvg7/1
ajax333221

ใกล้แล้ว แต่คุณควรลบทีละช่อง
Joel Berger

@JoelBerger แก้ไข
ajax333221

ฉันเกลียดการเป็นคนจู้จี้ แต่ปัญหาอีกอย่างหนึ่ง: คุณเริ่มต้นด้วยตัวอักษรทั้งหมดที่แสดงแทนที่จะป้อนทีละตัวทางด้านขวา
Joel Berger

1

Perl 5.13.2, 115 ตัวอักษร

$_=$"x9 .pop=~y/ /\0/r;s/./    $&/g;print(y/\0/ /r=~/(.{50})/,"\r"),select$.,$.,$.,.02while$|=s/ (\S)/$1 /g;print$/
  • คำเตือนการทำความสะอาด
  • สามารถบีบเล็กน้อยโดยลดช่องว่างระหว่างตัวละครหรือช่องว่างเริ่มต้น
  • ต้อง Perl 5.13.2 /rหรือใหม่กว่าเนื่องจากการใช้
  • การแทนที่ NUL เพื่อรักษาพื้นที่ว่างนั้นไม่น่าสงสัยเนื่องจาก POSIX argv ไม่ได้เป็น NUL-clean อย่างไรก็ตามการแทนที่ลูปจะทำให้ช่องว่างอื่น ๆ กลายเป็นสิ่งใด (ในที่สุด)

เครดิต:


ฉันชอบrธงชาตินอกจากภาษาที่ดีที่สุดตั้งแต่state
Joel Berger

1

ทุบตี 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"

การใช้งาน:

./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"

1

R, 319 ตัวอักษร

การปฏิบัติตามปรัชญาของตัวอย่าง @Blazer (d คือความล่าช้าเป็นวินาที):

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

การใช้งาน:

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}

เพื่อให้ได้สลีป <1 วินาทีแม้ว่าคุณจะต้องทำงานเป็น:

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

เนื่องจากฉันจะไม่ประกาศตัวเองว่าเป็นผู้ชนะฉันจะไม่เถียงตัวเองในสิ่งที่นับที่นั่นหรือไม่ (แต่จริงๆฉันไม่สามารถชนะทับทิมนี้ ;-))


เพิ่มอีก 4 รายการและเหมาะกับทวีต: D
ajax333221

4 ตัวอักษรตรงนี้: s/' '/$"/gและs/shift/pop/
ephemient

ใช่ฉันรวมสิ่งเหล่านั้นไว้พร้อมกับลบpushข้อความ ฉันเพิ่งยังไม่ได้โพสต์
Joel Berger

0

Q 145

ไม่เป็นไปตามข้อกำหนดอย่างแน่นอนเพราะบรรทัดสุดท้ายจะลบช่องว่างทั้งหมดที่อยู่ในสายอักขระเริ่มต้น

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

มันต้องใช้สองข้อโต้แย้งสายป้อนและความเร็วในการเลื่อน

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

น่าเสียดายที่เป็นจุดสำคัญ ฉันรู้ว่าสคริปต์ Perl อาจมีขนาดเล็กมากหากไม่มีมัน
Joel Berger

0

PowerShell, 135

ไม่มากนักกอล์ฟและอาจเป็นวิธีที่น่ากลัว แต่ฉันป่วยและไม่สามารถคิด ...

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

รับสตริงอินพุตบนบรรทัดรับคำสั่งเช่น jconsole marquee.ijs 'Hello, world!'

หากไม่จำเป็นต้องล้างหน้าจอเช่นเอาท์พุทแบบนี้:

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

ได้รับอนุญาตมันจะสั้นกว่า 12 ตัวอักษร

คำอธิบาย:

  • s.=>2{ARGV: รับสตริงจากบรรทัดคำสั่ง
  • k.=50,3#~<:#s: จำนวนช่องว่างเริ่มต้นที่เพิ่มก่อนอักขระแต่ละตัว 50 ก่อนหน้าแรกและ 3 ก่อนหน้าทั้งหมด (ให้อาร์เรย์ '50 3 3 3 ... ')
  • ([-=&0@/:@\:@~:&0): ได้รับอาร์เรย์ลดรายการที่ไม่ใช่ศูนย์แรกในอาร์เรย์
  • ^:(i.>:+/k): ฟังก์ชั่นนี้ใช้ N ครั้งโดยที่ N เท่ากับ 0 ถึงผลรวมของจำนวนช่องว่างที่เพิ่มเข้ามา 50 3 3 3; 49 3 3 3; 48 3 3 3; ... 0 0 0 1; 0 0 0 0)(ให้เมทริกซ์:
  • "1: เรียกใช้ฟังก์ชันต่อไปนี้ในแต่ละแถวของเมทริกซ์
  • ;@:(([,~#&' '@])@.>): เพิ่มจำนวนช่องว่างที่กำหนดก่อนอักขระแต่ละตัวในสตริง
  • (50&{.): ใช้อักขระ 50 ตัวแรกของสตริง
  • ([[i.@]&2e7): ฟังก์ชั่นที่สร้างรายการจาก 0 ถึง 2 * 10 ^ 7 แล้วโยนทิ้ง การดำเนินการนี้ใช้เวลาประมาณหนึ่งในสามวินาทีในเครื่องของฉันซึ่งทำให้เกิดความล่าช้า
  • ((50#LF)&,): เพิ่ม 50 บรรทัดใหม่ก่อนที่สตริงเพื่อล้างหน้าจอ
  • echo: เอาท์พุทสตริง
  • s (...): ให้สตริงเป็นอาร์กิวเมนต์ซ้ายไปยังฟังก์ชัน

0

APL (70)

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

รับอินพุตจากแป้นพิมพ์เอาต์พุตอยู่ใน⎕SMหน้าต่าง (ซึ่งจะเป็นเทอร์มินัลหากคุณมี APL แบบข้อความที่ฉันเดา) ขนาดของหน้าต่างจะถูกตรวจสอบโดยอัตโนมัติถ้าคุณอยากให้มันเป็น 50 เปลี่ยนแปลงไป1↓⎕SD50

คำอธิบาย:

  • 1↓⎕SD,1↓3⍴⍨⍴D←⍞: Dอ่านสตริงและเก็บใน สร้างเวกเตอร์ที่อธิบายจำนวนช่องว่างที่จะเพิ่มต่อหน้าอักขระแต่ละตัวซึ่งเป็นความกว้างของหน้าจอก่อนอักขระตัวแรก ( 1↓⎕SD) และ 3 ก่อนอื่น ๆ ( 1↓3⍴⍨⍴D)

  • ⎕DL÷8: รอ 1 / 8th ของวินาที

  • P←⍵-{⍵×~×⍺}\×⍵: ในเวกเตอร์ในอาร์กิวเมนต์ที่ถูกต้องลบ 1 จากรายการที่ไม่ใช่ศูนย์ซ้ายสุดแล้วเก็บเวกเตอร์ใหม่ใน P
  • ,/D{⍺,⍨⍵⍴⍕⍬}¨P: สำหรับอักขระแต่ละตัวใน D นำหน้าจำนวนช่องว่างที่กำหนดใน P
  • ⎕SM∘←1,⍨1,⍨: แสดงบนหน้าจอในคอลัมน์ซ้ายสุดของแถวบนสุด
  • 0∨.≠P:∇P: หากมีองค์ประกอบที่ไม่ใช่ศูนย์ใน P ให้ทำซ้ำด้วย P

0

PowerShellขนาด 129 ไบต์

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

ลองออนไลน์!

สคริปต์นี้ไม่ได้ลบช่องว่างจากการขัดแย้งในทางตรงกันข้ามเพื่อสคริปต์ของโจอี้

TIOแสดงผลลัพธ์ไม่ถูกต้อง ด้วยคอนโซล Powershell คุณจะได้รับ marqueeline ที่เลื่อนได้


0

05AB1E , 42 ไบต์

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

ลองออนไลน์ (โดยไม่ต้องนอนหลับ) หมายเหตุ: ฉันไม่ได้ติดตั้ง 05AB1E ไว้ภายในเครื่องดังนั้นฉันจึงไม่แน่ใจ 100% ว่า\rเคล็ดลับใช้งานได้หรือไม่ ใน TIO \rนั้นแปลว่าบรรทัดใหม่แทน นอกจากนี้ TIO ยังใช้รุ่นดั้งเดิมเนื่องจาก.eถูกปิดใช้งานในรุ่น TIO ใหม่ (โปรแกรมเหมือนกันทั้งในรุ่นดั้งเดิมและรุ่นใหม่ของ 05AB1E)

คำอธิบาย:

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

ดู 05AB1E นี้เคล็ดลับของฉัน (ส่วนวิธีการใช้พจนานุกรม? )จะเข้าใจว่าทำไมเป็น“…¢('\r')“"print('\r')"


0

Python ขนาด 139 ไบต์

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]

มีการเรียกf('Hello World', 50)เพื่อเริ่มต้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.