Animieren Sie den Text in Ihrem Terminal
Das Ziel
Das Ziel ist es, die Zeichenfolge "Hallo Welt" in Ihrer Ausgabe zu "animieren", sodass alle Zeichen nacheinander in Großbuchstaben geschrieben werden.
Ihr Programm kann beendet werden, nachdem jeder Buchstabe groß geschrieben wurde.
Zum Beispiel;
# Iteration 1
Hello world
# Iteration 2
hEllo world
# Iteration 3
heLlo world
# Iteration 4
helLo world
# Iteration 5
hellO world
# Iteration 6 (note: it should capitilize the space char (ie: a break between iteration 5 and iteration 7)
hello world
# Iteration 7
hello World
# Iteration 8
hello wOrld
# Iteration 9
hello woRld
# Iteration 10
hello worLd
# Iteration 11
hello worlD
Die Zeichenfolge sollte nur einmal animiert werden, und zwischen jedem Status sollte eine Verzögerung von 1 Sekunde liegen.
Eingang
Es ist keine Eingabe erforderlich, aber "Hallo Welt" muss die Zeichenfolge sein, die "animiert" ist.
Ausgabe
Der String "Hallo Welt" muss animiert sein. Die Ausgabe muss 1-zeilig sein, um eine Art Wellenanimation zu erstellen. Eine leere nachgestellte neue Zeile ist zulässig. Beispiel gif;
Ich habe das auf einem Metasploit-Youtube-Video gesehen und fand den Effekt ziemlich cool. Dort habe ich das GIF aufgenommen, es ist also ein bisschen träge, aber ich hoffe, es zeigt die Ausgabe in Ordnung
Dies ist Code-Golf . Die niedrigste Byte-Anzahl wird als Sieger gewertet.
Antworten:
Vim 26 Bytes
Erklärung (noch kein .gif):
Zuerst müssen wir den Text "Hallo Welt" eingeben. Das ist ziemlich einfach. Es ist nur:
Zu diesem Zeitpunkt befindet sich der Cursor auf dem 'd' in 'world'. Nächster:
Es gibt auch zwei andere 26-Byte-Versionen, die ich gefunden habe:
quelle
~
das die Schleife durchbricht . Ich glaube, es ist dasl
, was die harte ArbeitPython 2,
989490 Bytes-9-4 Bytes dank @ElPedro -4 Bytes dank @JonathanAllan und @Rodquelle
-u
Argumente übergeben und verwendenprint"\t"+s[:x]+s[x:].title(),;
(beachten Sie das nachstehende Komma) . Und dies wird Ihre Byteanzahl nicht ändern (weil das Argument +2 Bytes hinzufügen würde)python -c 'code here'
. Mit dem Flag wäre der Aufrufpython -uc 'code here'
, der ein Byte anders ist.Commodore 64,
168162137133 BASIC (und tokenized) Bytes verwendetSie müssen BASIC-Schlüsselwortabkürzungen verwenden, um dies in einen echten C64 oder Emulator einzugeben (oder Sie geben das Programm in einen Commodore 128 ein und laden es im C64-Modus zurück, obwohl dies auch auf dem 128 funktionieren sollte). Das
{control+n}
wird erst nach dem Eröffnungszitat funktionieren / angezeigt. Es ist eine Abkürzung fürchr$(14)
und speichert daher einige Bytes und schaltet den Zeichensatz in den Geschäftsmodus oder in Groß- / Kleinschreibung.Ich habe einige Abkürzungen für Sie hinzugefügt, damit Sie. Das
{clear home}
Zeichen wird durch Drücken vonShift
und derCLR/HOME
Taste nach dem öffnenden Anführungszeichen erzeugt.Zur Veranschaulichung kann die uneingeschränkte Auflistung wie folgt eingegeben werden:
Es funktioniert, indem der PETSCII-Zeichensatz in den Geschäftsmodus (Groß- / Kleinschreibung) geschaltet wird und der Hallo-Welt-String in die oberste Zeile des Bildschirms geschrieben wird, der sich am Speicherort $ 0400 befindet. Anschließend wird der Wert an jedem Speicherort für den nächsten übernommen 11 Bytes von dort und erhöhen Sie jeden Wert um 64 (das Äquivalent in Großbuchstaben). Wenn der Zähler j> 0 ist, ruft er in Zeile 2 eine Routine auf, um den vorherigen Speicherplatz wieder um 64 zu verringern.
Zeile 3 ist eine Pause. Außerdem wird ein Leerzeichen an die Positionen $ 0405 und $ 040b geschrieben. Dies ist eine Fehlerbehebung (die möglicherweise entfernt werden könnte, um einige Bytes zu sparen).
quelle
fori=0to1step0
...nexti
im Wesentlichen eine Endlosschleife erzeugt, ähnlich wiewhile(true){...}
in moderneren Sprachen.GO TO
ist verboten, richtig ;-) Man kann die Auflistung leicht selbstCLR
herausfinden, bevor man die verbleibenden freien Bytes mit der kaputtenFRE(0)
FunktionC #
230215193161135134130 BytesEs ist C #, also ist es lange richtig! :-( Aber nach einiger Hilfe und Recherche ist es mir (und anderen wirklich) gelungen, bereits genau 100 Bytes zu entfernen.
Golf gespielt
Ungolfed
Bildschirmfoto
Obwohl es beim Looping viel besser und schneller aussieht.
Aktualisierung
Verlust von 15 Bytes durch Verwendung von Carriage Return,
Clear()
wodurch ich auch die Verwendung vonSystem.Console
irgendwo inline ersetzen konnte .Ersetztes Programm mit Lambda-Einsparung von 23 Bytes dank @devRicher
new string(b)
mitb
undb[i]=char.ToUpper(b[i])
mitb[i]-=' '
mir weitere 26 Bytes gespart!i++
dank @Snowfirei<11
aus meinerfor
Schleife entfernenquelle
class P{static void Main(){ ... }}
zu()=>{ ... }
, um einige Bytes abzuschneiden. PPCG akzeptiert Funktionen als Antworten, daher funktioniert ein Lambda einwandfrei.void g(){ ... }
.char g = string j[x]
) zugreifen , um etwa 50 Bytes zu sparen:()=>{var s="Hello world";for(int i=1;i<11;i++){string h = s;h[i]=char.ToUpper(s[i]);System.Console.Write(h+"\r");System.Threading.Thread.Sleep(1000);}}
b[i++]-=' '
. Das wäre praktisch, denn dann könnten Sie auch die Bedingung in der for-Schleife entfernen und einfach schreibenfor(int i=0;;)
. OP wies in den Kommentaren darauf hin, dass das Programm möglicherweise mit einem Fehler beendet wird, sodass Sie eine IndexOutOfRangeExceptionPowershell,
126119107104 BytesRevisionen (es wird wahrscheinlich viele geben):
Ändern Sie
$s.Length
zu const1110
Restrukturierter String Builder, 1 Join-Anweisung entfernt und
++$s
stattdessen verwendet($s+1)
, um dank @AdmBorkBork einige Bytes zu sparenAdmBorkBork weist darauf hin, dass das zweimalige Verwenden des Strings tatsächlich kürzer ist als das Einkapseln und anschließende
.ToLower()
Einfügen - was viel darüber aussagt, wie wortreich Powershell ist, -3!Im Grunde genommen durchlaufen Sie die Länge der Zeichenkette, bilden ein Array aus drei Teilen, dem Vorkapital-, dem Groß- und dem Nachkapital. Entfernen Sie 32 aus dem mittleren Buchstaben und konvertieren Sie dann zurück in ein Zeichen, um Großbuchstaben zu erhalten. Zum Glück ist dies nicht der Fall verwandle den Raum auch nicht in einen sichtbaren Charakter, ich hoffe, das ist akzeptabel?
quelle
$s
und zu speichern.ToLower()
. -'Hello world';$s='hello world';
CP-1610- Baugruppe, 50 DECLEs = 63 Byte
Dieser Code soll auf einer Intellivision ausgeführt werden .
Ein CP-1610-Opcode wird mit einem 10-Bit-Wert codiert, der als "DECLE" bezeichnet wird. Dieses Programm ist 50 DECLE lang und beginnt bei 4800 US-Dollar und endet bei 4831 US-Dollar.
Ausgabe
quelle
MATL , 30 Bytes
Probieren Sie es bei MATL Online!
quelle
PHP,
767471 BytesVielen Dank an @hd für die Verzögerung von einer vollen Sekunde und keinen Bruchteil davon!
Danke @ user63956 für 2 Bytes und @aross für 3 Bytes.
Laufen Sie mit
-nr
.quelle
sleep(print"$s\r")
.C,
97abgezogen106 Bytesmit maskierten Zeichen als 1 Byte gezählt
Hinweis: Ich habe
die Zeitverzögerung für nichtverknüpftes TIO auskommentiert, da es auf den Abschluss wartet, bevor die Ausgabe angezeigt wird, außerdem Wagenrückläufe nicht erkennt und neue Zeilen einfügt. Wenn Sie unter Windows arbeiten, wird der Energiesparmodus in Millisekunden anstatt in Sekundensleep(1)
angezeigtsleep(1000)
.Anmerkung 2: Ich habe diesen Eintrag für den Moment zurückgezogen, bis die Ausgabefehler behoben wurden.quelle
^C
stoppen. (auch ich bin auf Mac)JavaScript (ES6),
141 139131 Bytes8B dank Apsillers gerettet
Erläuterung
Dadurch wird eine Funktion ohne Argumente erstellt, die die Zeichenfolge
hello world
in ein Array von Zeichen aufteilt und dasd+1
dritte Zeichen in Großbuchstaben schreibt.d
ist ein Zähler, der wie0
folgt beginnt und jedes Mal erhöht wird.Verwendungszweck
quelle
_=>
Sie tun ein komplettes Programm haben (zB wenn Sie es in einer Datei stecken, würde Node.js laufen erfolgreich es bis zur Fertigstellung). Mein Verständnis des Verbots von "Code-Snippets" ist gegen das Schreiben von Code, der implizit eine Eingabe als Variable akzeptiert, wie "wenn wir annehmen, dassi
die Eingabe bereits vorhanden ist, können wir ...", was hier nicht geschieht, da dies ausdrücklich der Fall ist keine Eingabe.Nudel , 22 Bytes
Versuch es:)
Wie es funktioniert
Das Snippet verwendet eine 25-Byte- Version, die sich fortlaufend wiederholt.
quelle
Bash + Coreutils,
9998 Bytesquelle
Perl 6 ,
6561 BytesGIF:
Wie es funktioniert
Die ANSI-Escape-Sequenz
\ec
löscht den Bildschirm.Bei jeder Iteration wird das
i
'te Zeichen der fest codierten Zeichenfolge durch die Version in Großbuchstaben ersetzt.Die
say
Funktion kehrt immer zurückTrue
und wird an die Sleep-Funktion weitergeleitet, die sie als1
Sekunde interpretiert .quelle
Ruby,
8281 Bytes^ H ist ASCII 8 (Rücktaste) und ist nur 1 Byte.
quelle
C 87 Bytes
Kompiliert und läuft unter Linux.
quelle
Mathematica,
130128123110108 BytesErläuterung:
i=1
Drucken Sie von bis 11 vom ersten bis zum (i-1) -ten Zeichen von "Hallo Welt", schreiben Sie die Großbuchstaben ein"hello world"[i]
, und drucken Sie dann den Rest der Zeichenfolge, wobei Sie gleichzeitig die Inkrementierung vornehmeni
.quelle
Java
215212204203 BytesUngolfed:
quelle
interface A
(mit einem Leerzeichen)? Außerdem können Sie den Abstand zwischen,
und entfernenCharacter.toUpperCase
.R ,
106103 BytesNur eine einfache Schleife, mit der die Konsole geleert wird,
cat('\f')
scheint etwas systemabhängig zu sein, aber mir ist kein besserer Weg bekannt.quelle
utf8ToInt
. Dies hat nicht funktioniert, der Platz muss als Sonderfall behandelt werden. Dabei entdeckte ich, dasscat("\014")
es besser zu funktionieren schien als dort, wocat("\f")
es nicht funktionierte. aber nicht bei TIOC, 122 Bytes
Kürzer als C #: D
quelle
i<11
stattdesseni<10
in Ihrer for-SchleifePerl, 75 Bytes
Verwendet den ANSI-Code ESCc, um die Konsole zu löschen und den Cursor bei jeder Iteration nach links oben zu bewegen. Er muss jedoch
\n
am Ende der Ersetzungszeichenfolge stehen, damit nicht die gesamte Animation im Zeilenpuffer verloren geht.Ein erfolgreicher Aufruf von
print
gibt den Wert 1 zurück, der direkt an übergeben werden kannsleep
.quelle
$`
und verwenden$'
, um ein paar Bytes zu sparen(.{$_})(.)(.*)
(das funktioniert in einem Terminal nicht, aber das ist kein Problem). Es erfordert ein wenig Veränderung der Rest des Codes biss aber:"hello world"=~s/./sleep print"\33c$`\U$&\E$'\n"/ger
. (Ich habe fast genau diesen Code geschrieben. Als ich dann nach einer Perl-Antwort gesucht habe, habe ich Ihre gefunden.) Und ein kleines Detail zum bytecount: Sie können ein Byte mit einem Zeilenvorschub speichern, und vielleicht auch eine Art von Wurf\33c
(der letzte ist jedoch nicht so sicher).SmileBASIC,
9071 Bytesquelle
Jelly ,
2421 BytesDies ist ein Link / eine Funktion von Niladic, der / die auf STDOUT gedruckt wird. Es funktioniert nicht als vollständiges Programm.
Der Code kann nicht mit TIO getestet werden. es verwendet Steuerzeichen und TIO hat (noch) keinen Terminal-Emulator.
Wie es funktioniert
quelle
(Strings are cast to Boolean.)
Das ist schlau!C, 122 Bytes
Als Übung habe ich dies geschrieben, um ein optimaleres Ausgabeformat als einige der anderen Antworten bereitzustellen. Dies bedeutet auch, dass der Cursor während der Pausen hinter dem zuletzt großgeschriebenen Buchstaben steht.
(Zeilenumbrüche und Einrückungen sind kosmetisch und nicht Teil der Byteanzahl)
Nun mögen einige Leser bemerken, dass dies einige Massagen erfordert, um auf modernen Maschinen ausgeführt zu werden (die magische Beschwörung ist
-static -Wl,-N
), aber so haben sich echte Implementierungen von C früher verhalten, also denke ich, dass es gültig ist. Es wird außerdem davon ausgegangen, dass der Zeichensatz ASCII ist, und es wird keine abschließende Newline gedruckt.Bonus: Für eine EBCDIC - Version können Sie ersetzen
8
mit22
und64
mit32
, und schalten Sie die Logik fürp[1]
undp[2]
. Um auf einem Nicht-EBCDIC-System zu testen, können Sie mit kompilieren-funsigned-char -fexec-charset=cp037
.Die Ausgabe beträgt 43 Bytes:
Hello world«H‹hE‹eL‹lL‹lO‹o ‹ W‹wO‹oR‹rL‹lD
quelle
Scala, 92 Bytes
Ungolfed
quelle
h(i)toUpper
Batch, 184 Bytes
Seltsamerweise wird die Befehlszeile für
timeout/t>nul 1
beschädigt, wenn keine nachgestellte Zeile vorhanden ist, sodass ich sie nicht am Ende der Datei einfügen kann.quelle
Rubin, 108 Bytes
Zum ersten Mal im ersten Jahr Student. Es ist kein Adler, aber ich bin zumindest ein bisschen stolz.
quelle
Pascal,
187152 BytesNicht gerade die effizienteste oder die kürzeste, funktioniert aber ganz gut!
Getestet und funktioniert mit Free Pascal Compiler 2.6+.
Danke an @manatwork für das Speichern von 35 Bytes!
Ich habe http://www.onlinecompiler.net/pascal verwendet , um die Datei zu kompilieren und unter Windows auszuführen.
Habe bisher kein Problem damit gesehen.
quelle
UpCase
Funktion existiert seit den alten Turbo-Zeiten. (Dort hat es nur gehandhabtChar
, aber in Free Pascal werden auch Strings gehandhabt .)Word
(oderByte
) zu deklarieren ; mache P aconst
so, dass es den Typ vom Initialisierungswert ableitet; Machen Sie dort X zu einer initialisierten Konstante, um ein separatesvar
Schlüsselwort zu entfernen (dieses funktioniert möglicherweise nicht in allen Pascal-Varianten, aber in Free Pascal auf jeden Fall). mitClrScr
in die linke obere Ecke springen; ersetzen , dassif
mit einem einzigen Ausdruck:X:=X*Ord(X<11)+1
. pastebin.com/FfaixkESconst X:Word=1;P='hello world';
und dasconst X:Word=1;P='hello world';
war möglich. Ich habe Pascal auf Turbo Pascal 7 gelernt, was möglicherweise nicht kompatibel ist. Und völlig vergessenupcase
. Vielen Dank!C
12011010496 BytesUngolfed-Version
@Pakk Danke für das Speichern einiger Bytes, tolle Idee. :)
@Pakk @KarlNapf Vielen Dank für Ihre Beiträge.
kann noch gekürzt werden !? :)
quelle
-=
und+=
. Auch eine Zeigervariable könnte das speichern,[]
aber ich bin nicht sicher.char *j,s[]="hello world";
um ein paar Zeichen mehr zu sparen.f(){char*j,s[]="\rhello world";for(j=s;*++j;*j-=32,printf(s),*j+=32,fflush(0),sleep(1));}
89 Bytes.Python 2,
220189179 BytesLösung ohne Verwendung von Strings und
capitalize()
Byteanzahl wie folgt:Und eine etwas längere Variante (191 Zeichen) ohne Zurücksetzen der Groß- / Kleinschreibung:
quelle
C ++,
88125 BytesUngolfed-Version:
Kompiliert mit TDM-GCC auf einem Windows 10-Computer mit Dev-C ++.
Edit: Ich habe die Includes in meiner ersten Version vergessen.
quelle
for
den Wagenrücklauf an den Anfang der Zeichenfolge bewege. Ich werde Ihnen auch helfen: Wennfor(int c=1;;c++)
Sie dies tun , sparen Sie 1 Byte.for(int c=1;;)
und dann eina[c++]-=32;
weiteres Byte speichern.