Laufschrift

13

Nach meinem Einstieg in die verborgene Hallo-Welt dachte ich, es könnte Spaß machen, den zugrunde liegenden Code zu teilen. Aber warum nur den Code anzeigen, machen wir es auch zum Golf!

Herausforderung

Schreiben Sie ein Skript, das eine Zeichenfolge von rechts nach links über das Terminal rollt und sich auf der linken Seite befindet.

Eingang

Nimmt einen String als Argument.

Ergebnis

Druckt den Laufrahmen auf STDOUT. Maximale Breite von ~ 50 Zeichen. Beginnt mit 0 oder 1 Zeichen. Beim Scrollen etwas Platz zwischen den Buchstaben. Hält an, wenn es erledigt ist (kein zusätzlicher Abstand zwischen den Zeichen). Langsames Scrollen, aber nicht zu langsam (<1s pro Iteration).

Beispiel

Ausführen eines Skripts mit arg 'Hello World'

                                                   H

später

                H    e    l    l    o         W    o

später

H    e    l    l    o          W    o    r    l    d

später

Hell    o         W    o    r    l    d

schließlich

Hello World

Probieren Sie für ein laufendes Beispiel meinen Code aus der "Hello World" -Herausforderung aus. Irgendwann werde ich meinen posten. Es ist derzeit 202 Zeichen in Perl. Jetzt, da es einige Wettbewerber gibt, habe ich meine in den Antworten gepostet.

Gewinner

Ich möchte nicht, dass die Beschränkungen absolut sind, deshalb habe ich sie ein wenig vage gelassen. Das kürzeste Drehbuch, das dem Geist meines Originals folgt, wird gewinnen.

Anmerkungen

Dieses Spiel setzt die xtermUmgebung voraus . Sollte sich eine andere Umgebung als nützlich erweisen, werden nur ähnliche Umgebungen verglichen und für jede kann ein separater Gewinner ermittelt werden.

Nachtrag (25. April 2012)

Um einige aufstrebende Probleme anzugehen, fasse ich eine Entscheidung. Ihre Zeichenanzahl muss den Code enthalten, der benötigt wird, um:

  1. Flush STDOUT (schaut dich an Ruby)
  2. Implementieren Sie sleepmit einer Zeitverzögerung von <1s (Looking at you Perl)

Dies kann geschehen, wenn die Befehlszeile zu einem Interpreter wechselt, aber diese Zeichen zählen in der Summe (ohne umgebendes Leerzeichen).

Joel Berger
quelle
Ich bin ein wenig besorgt über Terminalverhalten für diese Art der Sache ... xterm, vt102...?
dmckee --- Ex-Moderator Kätzchen
Ich nehme xterm an, aber ich denke nicht, dass es zu viel ausmacht. Vielleicht verstehe ich Ihre Besorgnis nicht?
Joel Berger
Diese Tricks entstehen normalerweise, indem man sich darauf verlässt, wie verschiedene Terminals einige der nicht druckbaren Zeichen handhaben, und Terminals unterschieden sich darin, was sie tun könnten und welche Sequenzen die Effekte hervorrufen. Für die Reproduzierbarkeit kann es hilfreich sein, eine bestimmte Terminalumgebung zu haben.
dmckee --- Ex-Moderator Kätzchen
1
Es wird Ihnen recht tun, wenn jemand eine wirklich kurze Antwort veröffentlicht, die von einem dunklen Terminal abhängt, für das Sie keinen Emulator haben, aber OK.
dmckee --- Ex-Moderator Kätzchen
ok ich denke ich habe es jetzt Danke für die Gedanken :-)
Joel Berger

Antworten:

5

Python 2 - 146 Zeichen

edit: hat es zu einer Funktion gemacht, anstatt es über stdin einzugeben. Das erste Argument ist die Zeichenfolge, und das zweite Argument gibt die gewünschte Länge an. so wäre die Anrufung f('Hello World', 50). Ich habe es auch viel geschmeidiger gemacht; Als jedes Zeichen "gelandet" war, gab es eine unangenehme Pause

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)

alt, 158 Zeichen:

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)
Blazer
quelle
Unter Verwendung von bash (zumindest in einer neueren Installation von MacOSX und CentOS) sollte der Shell-Befehl zum Löschen des Terminalbildschirms "clear" und nicht "cls" lauten.
Paolo
'cls' für Windows, 'clear' für OSX / Linux-Builds, denke ich
Blazer
Tipps zum Starten des Programms für Benutzer, die sich nicht täglich mit Python beschäftigen, sind hilfreich. Starten Sie Python. Code einfügen, Anruf f("Hello World, 40)hat bei mir geklappt.
Benutzer unbekannt
@user ich ähm. Ich habe dort oben Anruf gestellt?
Blazer
4

Ruby, 93 91 89 Zeichen

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

Der anzuzeigende Text muss als Kommandozeilenargument angegeben werden, z

ruby marquee.rb "Hello World"

für das oben gezeigte Beispiel. Leider kann ich die Animation hier nicht zeigen, so dass Sie den Code selbst ausprobieren müssen.

Vorherige Version:

s=" "*67+[*$*[0].chars]*"   ";(s.size*3/4).times{|j|s[j/3]='';$><<s[16,50]+" \r";sleep 0.1}
Howard
quelle
Beeindruckende Größe. Es ist allerdings nicht sehr flüssig, bin ich das (ich bin im Moment auf einer Maschine mit ziemlich geringem Stromverbrauch) oder funktioniert der Code so?
Joel Berger
Fand es heraus, musste ich einstellen, STDOUT.sync=true;damit es automatisch spült. Das Perl-Äquiv ist $|++. Das sind weitere 17 Zeichen, aber immer noch weit unter meinen. Nun, ich kann nicht Ruby Perl schlagen lassen! Ich werde mich an die Arbeit machen. Schön.
Joel Berger
Wenn ich anrufe, ruby1.8 "Hello World"erhalte ich nicht gerade zu meiner Überraschung die Fehlermeldung:ruby1.8: No such file or directory -- Hello World (LoadError)
Unbekannter Benutzer
@userunknown vielleicht solltest du dort auch den Pfad zur Quelldatei ruby foo.rb args
eintragen
@padde: Ja, das sollte ich. Leider hat Howard seinen Beitrag bearbeitet, ohne mich über seine Änderung zu informieren. Schauen Sie sich die Geschichte an, um meine Frage zu verstehen.
Benutzer unbekannt
3

C 94 83 80 173 Zeichen

BEARBEITEN: Viel Code hinzugefügt, implementiert jetzt alle angeforderten Funktionen. Die Konstante 1e8kann zur Steuerung der Geschwindigkeit angepasst werden. Auf meinem Rechner ist es ziemlich schnell wie es ist.
Einige Zeichen können hier sicher gespeichert werden. lkann statisch sein (spart Initialisierung), ckann ein Zeiger werden (ersetzen 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););
}

Alte Version (80 Zeichen), mit Teil-Funktionalität:
ein paar Zeichen gespeichert durch Ersetzen char**tmit int*t. Funktioniert gut in 32-Bit ( int**twürde 64-Bit unterstützen).

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

K & R C - 431 416 Zeichen

Respektiert den Standard in hohem Maße. Verwendet ncurses und sollte daher weitgehend terminalunabhängig sein. Es gibt ein leichtes Ruckeln, wenn der Text auf die Seite trifft, da einige Tricks gespielt wurden, um das beabsichtigte Leerzeichen in der Zeichenfolge beizubehalten.

Die zu verwendende Zeichenfolge sollte als erstes Argument in der Befehlszeile übergeben werden (und sollte maskiert werden, wenn sie Leerzeichen enthält, insbesondere, wenn sie eine !wie meine Testzeichenfolge ( Hello, World!) enthält).

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

In besser lesbarer und kommentierter Form:

#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 --- Ex-Moderator Kätzchen
quelle
Es gibt viel Potenzial zur Verkürzung, insbesondere durch Ersetzen ifdurch Bediener. Zum Beispiel - if((s-q)%2)s--;else usleep(1e5);-> s-q&1?s--:usleep(1e5);(oder s-=s-q&1||usleep(1e5);)
ugoren
@ugoren: Ja, und ich hatte vergessen, das ' 's durch numerische Äquivalente zu ersetzen .
dmckee --- Ex-Moderator Kätzchen
Noch ein paar Tricks: Ersetzen x==32mit x-32(Bedeutungsumkehrung, also Umkehren, wenn-sonst) oder mitx<33 (unter der Annahme, dass 0..31 nie verwendet wurde). Initialisieren Sie mit Werten, die Sie haben ( for(curs_set(c=0);...). *(s+1)-> s[1]. Entfernen Sie nicht benötigte Zahnspangen (Ersetzen ;durch ,hilft).
Ugoren
2

Perl 5.13.2, 96

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

Ich habe viel von der Antwort von @ Kevin Reid gestohlen, insbesondere den /rTrick, der in neueren Perls verfügbar ist.

Perl, 115

Wie bei der Antwort von @ Joel Berger würde dies viel kürzer, wenn ich die Befehlszeile zum Aktivieren verwenden sleep 1und langsam sein oder weitergeben könnte . Ansonsten ist die einzige eingebaute Möglichkeit, kurz zu schlafen, die ziemlich lange.-MTime::HiRes=sleepsleep.1select'','','',.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}
vergänglich
quelle
Ja, ich habe mich mit meiner eigenen Regel gebissen! Ich wusste nicht, dass in anderen langs ein Schlaf eingebaut werden würde. Na ja.
Joel Berger
Bei einigen Vorschlägen können Sie das Leerzeichen nacheinander entfernen xund die Blockform von mapspart ein paar.
Joel Berger
1

JavaScript 180 218 Zeichen

Produktionsversion:

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

Ungolfed Version:

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

Hier ist eine jsFiddle Demo

Hinweis: Wenn Sie versuchen, es zu reproduzieren, stellen Sie sicher, dass sich der Code unter dem Text befindet

ajax333221
quelle
Ich kann es der Demo nicht entnehmen, "stapelt" es sich auf der linken Seite oder macht es einfach links und zeigt dann die letzte Saite? Howard's funktioniert definitiv, wenn Sie sich nicht sicher sind.
Joel Berger
@JoelBerger die hallo Welt hat 4 Leerzeichen zwischen jedem Buchstaben. Wenn das h das erste Zeichen ist, werden diese Leerzeichen entfernt. Diese Demo ist langsamer. Jsfiddle.net/fYvg7/1
ajax333221
Das ist knapp, aber Sie sollten jedes Leerzeichen einzeln entfernen.
Joel Berger
@JoelBerger Behoben
ajax333221
Nun, ich hasse es, ein Nörgler zu sein, aber ein weiteres Problem: Ihr Problem beginnt mit allen Buchstaben, die angezeigt werden, anstatt sie einzeln rechts einzugeben.
Joel Berger
1

Perl 5.13.2, 115 Zeichen

$_=$"x9 .pop=~y/ /\0/r;s/./    $&/g;print(y/\0/ /r=~/(.{50})/,"\r"),select$.,$.,$.,.02while$|=s/ (\S)/$1 /g;print$/
  • Warnung-sauber.
  • Kann etwas zusammengedrückt werden, indem der Abstand zwischen den Zeichen oder das anfängliche Leerzeichen verringert wird.
  • Benötigt Perl 5.13.2 oder neuer aufgrund der Verwendung von /r.
  • Die Ersetzung von NUL zur Beibehaltung von Leerzeichen ist eindeutig, da POSIX argv nicht NUL-sauber ist. Die Schleifenersetzung verwandelt jedoch alle anderen Whitespaces (eventuell) in nichts.

Credits:

Kevin Reid
quelle
Ich liebe die rFlagge, beste Ergänzung zur Sprache seitstate
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"

Verwendung:

./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"
Benutzer unbekannt
quelle
1

R, 319 Zeichen

Der Philosophie von @Blazer folgend (d ist die Verzögerung in Sekunden):

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

Verwendung:

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

Um den Schlaf von <1s zu erreichen, müssen Sie als:

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

Da ich mich nicht zum Sieger erkläre, werde ich mich nicht darüber streiten, was dort zählt oder nicht (aber Ruby kann das wirklich nicht gewinnen ;-))

Joel Berger
quelle
4 weitere und es passt auf einen Tweet: D
Ajax333221
4 Zeichen hier: s/' '/$"/gunds/shift/pop/
ephemient
Ja, ich hatte diese zusammen mit dem Entfernen der pushAussage aufgenommen. Ich hatte es nur noch nicht gepostet.
Joel Berger
0

Q, 145

Entspricht nicht genau den Anforderungen, da in der letzten Zeile alle Leerzeichen entfernt werden, die sich in der ursprünglichen Eingabezeichenfolge befanden.

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

Es werden zwei Argumente benötigt, Eingabezeichenfolge und Bildlaufgeschwindigkeit

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
quelle
das ist leider ein wichtiger punkt. Ich weiß, dass die Perl-Skripte ohne sie sehr klein werden könnten.
Joel Berger
0

PowerShell, 135

Nicht sehr golfen und wahrscheinlich ein schrecklicher Ansatz, aber ich bin krank und kann nicht wirklich denken ...

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

J (116)

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

Übernimmt die Eingabezeichenfolge in der Befehlszeile, dh jconsole marquee.ijs 'Hello, world!'

Wenn der Bildschirm nicht gelöscht werden muss, dh wie folgt ausgegeben wird:

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

erlaubt ist, wäre es 12 Zeichen kürzer.

Erläuterung:

  • s.=>2{ARGV: Hole den String von der Kommandozeile
  • k.=50,3#~<:#s: Die Anfangsmenge an Leerzeichen, die vor jedem Zeichen hinzugefügt wird, 50 vor dem ersten und 3 vor allen anderen. (ergibt ein Array, '50 3 3 3 ... ')
  • ([-=&0@/:@\:@~:&0): dekrementiert bei einem gegebenen Array das erste Element im Array, das nicht Null ist
  • ^:(i.>:+/k): Diese Funktion wird N-mal angewendet, wobei N 0 bis zur Summe der hinzugefügten Leerzeichen ist. (gibt eine Matrix: 50 3 3 3; 49 3 3 3; 48 3 3 3; ... 0 0 0 1; 0 0 0 0).
  • "1: Führe die folgende Funktion in jeder Zeile der Matrix aus
  • ;@:(([,~#&' '@])@.>): füge die angegebene Anzahl von Leerzeichen vor jedem Zeichen in der Zeichenkette hinzu
  • (50&{.): nimm die ersten 50 Zeichen der Zeichenkette
  • ([[i.@]&2e7): Eine Funktion, die die Liste von 0 bis 2 * 10 ^ 7 generiert und dann wegwirft. Dies dauert ungefähr eine Drittelsekunde auf meinem Computer, dies verursacht die Verzögerung.
  • ((50#LF)&,): Fügen Sie 50 Zeilen vor der Zeichenfolge ein, um den Bildschirm zu löschen
  • echo: gibt den String aus
  • s (...): Geben Sie der Funktion den String als linkes Argument
Marinus
quelle
0

APL (70)

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

Nimmt die Eingabe von der Tastatur, ist die Ausgabe im ⎕SMFenster (was das Terminal wäre, wenn Sie eine textbasierte APL hätten, denke ich). Die Fenstergröße wird automatisch erkannt, wenn Sie wirklich möchten, dass es 50 ist, ändern Sie das 1↓⎕SDzu50 .

Erläuterung:

  • 1↓⎕SD,1↓3⍴⍨⍴D←⍞: Lesen Sie die Zeichenfolge und speichern Sie in D. Generieren Sie einen Vektor, der beschreibt, wie viel Leerzeichen vor den einzelnen Zeichen eingefügt werden sollen. Dabei handelt es sich um die Bildschirmbreite vor dem ersten Zeichen ( 1↓⎕SD) und um 3 vor den anderen Zeichen ( 1↓3⍴⍨⍴D).

  • ⎕DL÷8: Warten Sie eine Achtelsekunde

  • P←⍵-{⍵×~×⍺}\×⍵: subtrahiere im Vektor im rechten Argument 1 von dem am weitesten links stehenden Element ungleich Null und speichere den neuen Vektor in P.
  • ,/D{⍺,⍨⍵⍴⍕⍬}¨P: Geben Sie für jedes Zeichen in D den in P angegebenen Leerraum vor.
  • ⎕SM∘←1,⍨1,⍨: Anzeige auf dem Bildschirm in der linken Spalte der obersten Zeile
  • 0∨.≠P:∇P: Wenn es in P ein Element ungleich Null gibt, wiederhole es mit P.
Marinus
quelle
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}

Probieren Sie es online!

Dieses Skript entfernt im Gegensatz zu Joeys Skript keine Leerzeichen aus den Argumenten .

TIOzeigt die Ausgabe nicht korrekt an. Mit der Powershell-Konsole erhalten Sie die Laufmarkierung.

mazzy
quelle
0

05AB1E , 42 Bytes

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

Probieren Sie es online (ohne Schlaf). HINWEIS: Ich habe 05AB1E nicht lokal installiert, daher bin ich nicht 100% sicher, ob der \rTrick funktioniert (theoretisch sollte er jedoch funktionieren). In TIO \rwerden sie stattdessen als Zeilenumbrüche interpretiert. Außerdem verwendet der TIO die ältere Version, da diese .ein der neuen TIO-Version deaktiviert ist (das Programm ist jedoch sowohl in der älteren als auch in der neuen Version von 05AB1E identisch).

Erläuterung:

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

Sehen Sie diese 05AB1E Spitze von mir (Abschnitt Wie das Wörterbuch benutzen? ) Zu verstehen , warum “…¢('\r')“ist "print('\r')".

Kevin Cruijssen
quelle
0

Python, 139 Bytes

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]

Muss anrufen f('Hello World', 50), um zu starten.

Sunera Avinash
quelle