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 xterm
Umgebung 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:
- Flush STDOUT (schaut dich an Ruby)
- Implementieren Sie
sleep
mit 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).
xterm
,vt102
...?Antworten:
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 Pausealt, 158 Zeichen:
quelle
f("Hello World, 40)
hat bei mir geklappt.Ruby,
939189 ZeichenDer anzuzeigende Text muss als Kommandozeilenargument angegeben werden, z
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:
quelle
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.ruby1.8 "Hello World"
erhalte ich nicht gerade zu meiner Überraschung die Fehlermeldung:ruby1.8: No such file or directory -- Hello World (LoadError)
ruby foo.rb args
C
948380173 ZeichenBEARBEITEN: Viel Code hinzugefügt, implementiert jetzt alle angeforderten Funktionen. Die Konstante
1e8
kann zur Steuerung der Geschwindigkeit angepasst werden. Auf meinem Rechner ist es ziemlich schnell wie es ist.Einige Zeichen können hier sicher gespeichert werden.
l
kann statisch sein (spart Initialisierung),c
kann ein Zeiger werden (ersetzenb+c
).Alte Version (80 Zeichen), mit Teil-Funktionalität:
ein paar Zeichen gespeichert durch Ersetzen
char**t
mitint*t
. Funktioniert gut in 32-Bit (int**t
würde 64-Bit unterstützen).quelle
K & R C -
431416 ZeichenRespektiert 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).In besser lesbarer und kommentierter Form:
quelle
if
durch Bediener. Zum Beispiel -if((s-q)%2)s--;else usleep(1e5);
->s-q&1?s--:usleep(1e5);
(oders-=s-q&1||usleep(1e5);
)' '
s durch numerische Äquivalente zu ersetzen .x==32
mitx-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).Perl 5.13.2, 96
Ich habe viel von der Antwort von @ Kevin Reid gestohlen, insbesondere den
/r
Trick, 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 1
und langsam sein oder weitergeben könnte . Ansonsten ist die einzige eingebaute Möglichkeit, kurz zu schlafen, die ziemlich lange.-MTime::HiRes=sleep
sleep.1
select'','','',.1
Perl, 128Perl, 133quelle
x
und die Blockform vonmap
spart ein paar.JavaScript
180218 ZeichenProduktionsversion:
Ungolfed Version:
Hier ist eine jsFiddle Demo
Hinweis: Wenn Sie versuchen, es zu reproduzieren, stellen Sie sicher, dass sich der Code unter dem Text befindet
quelle
Perl 5.13.2, 115 Zeichen
/r
.Credits:
$"
als Quelle" "
aus genommen ephemient Antwort , die Reduktion von 1 Zeichen.quelle
r
Flagge, beste Ergänzung zur Sprache seitstate
Bash 234
Verwendung:
ungolfed:
quelle
R, 319 Zeichen
Der Philosophie von @Blazer folgend (d ist die Verzögerung in Sekunden):
Verwendung:
quelle
Perl :
144133Um den Schlaf von <1s zu erreichen, müssen Sie als:
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 ;-))
quelle
s/' '/$"/g
unds/shift/pop/
push
Aussage aufgenommen. Ich hatte es nur noch nicht gepostet.Q, 145
Entspricht nicht genau den Anforderungen, da in der letzten Zeile alle Leerzeichen entfernt werden, die sich in der ursprünglichen Eingabezeichenfolge befanden.
Es werden zwei Argumente benötigt, Eingabezeichenfolge und Bildlaufgeschwindigkeit
quelle
PowerShell, 135
Nicht sehr golfen und wahrscheinlich ein schrecklicher Ansatz, aber ich bin krank und kann nicht wirklich denken ...
quelle
J (116)
Ü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:
erlaubt ist, wäre es 12 Zeichen kürzer.
Erläuterung:
s.=>2{ARGV
: Hole den String von der Kommandozeilek.=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öschenecho
: gibt den String auss (...)
: Geben Sie der Funktion den String als linkes Argumentquelle
APL (70)
Nimmt die Eingabe von der Tastatur, ist die Ausgabe im
⎕SM
Fenster (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 das1↓⎕SD
zu50
.Erläuterung:
1↓⎕SD,1↓3⍴⍨⍴D←⍞
: Lesen Sie die Zeichenfolge und speichern Sie inD
. 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 AchtelsekundeP←⍵-{⍵×~×⍺}\×⍵
: 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 Zeile0∨.≠P:∇P
: Wenn es in P ein Element ungleich Null gibt, wiederhole es mit P.quelle
PowerShell , 129 Byte
Probieren Sie es online!
Dieses Skript entfernt im Gegensatz zu Joeys Skript keine Leerzeichen aus den Argumenten .
TIO
zeigt die Ausgabe nicht korrekt an. Mit der Powershell-Konsole erhalten Sie die Laufmarkierung.quelle
05AB1E , 42 Bytes
Probieren Sie es online (ohne Schlaf). HINWEIS: Ich habe 05AB1E nicht lokal installiert, daher bin ich nicht 100% sicher, ob der
\r
Trick funktioniert (theoretisch sollte er jedoch funktionieren). In TIO\r
werden sie stattdessen als Zeilenumbrüche interpretiert. Außerdem verwendet der TIO die ältere Version, da diese.e
in 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:
Sehen Sie diese 05AB1E Spitze von mir (Abschnitt Wie das Wörterbuch benutzen? ) Zu verstehen , warum
“…¢('\r')“
ist"print('\r')"
.quelle
Python, 139 Bytes
Muss anrufen
f('Hello World', 50)
, um zu starten.quelle