Hintergrund
Der Sommer ist in der nördlichen Hemisphäre schon lange vorbei und viele von uns vermissen die Sonne, die Strände, die Wellen des Ozeans ... Diese Herausforderung zielt darauf ab, sie aufzuheitern, indem sie an das Meer erinnert werden.
Die Herausforderung
Hier ist das Meer:
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
** ****** ****** ****** ****** ****
Das Meer besteht aus dem 5-fachen dieses Wellenmusters:
**
****
*****
** **
** **
* *****
Beachten Sie, dass das Muster 16 Zeichen lang ist und das Meer das Fünffache dieses Musters = 80 Zeichen lang ist.
Was Sie über diese Befehlszeile in ein Terminal drucken können:
perl -e 'print " ** \n **** \n ***** \n ** ** \n ** ** \n* *****\n"'
Oder dieses :
perl -e 'print " "x12, "*"x2, " "x2, "\n", " "x8, "*"x4, " "x4, "\n", " "x5, "*"x5, " "x6, "\n", " "x3, "*"x2, " "x3, "*"x2, " "x6, "\n", " "x1, "*"x2, " "x6, "*"x2, " "x5, "\n", "*"x1, " "x10, "*"x5, "\n"'
(Die zweite sollte es Ihnen leichter machen, das genaue Muster zu finden.)
Ihre Aufgabe ist es, das Meer in einem Terminal anzuzeigen und es so aussehen zu lassen, als würden sich die Wellen nach rechts bewegen. Es muss sich mit einer Geschwindigkeit von 1 Zeichen pro 100 ms (= 10-mal pro Sekunde) nach rechts verschieben. Nach der 80. Spalte sollte kein Zeichen gedruckt werden, aber wenn die Welle ganz rechts verschwindet, erscheint links eine neue.
Hier ist ein Beispiel für die Ausgabe:
Zeit = 0,0s
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
** ****** ****** ****** ****** ****
Zeit = 0,1 s
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
*** ****** ****** ****** ****** ***
Zeit = 0,2 s
* ** ** ** ** *
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
**** ****** ****** ****** ****** **
Zeit = 0,3 s
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
***** ****** ****** ****** ****** *
Zeit = 0,4 s
** ** ** ** **
* **** **** **** **** ***
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
****** ****** ****** ****** ******
Natürlich sollte jeder Ausgang den vorherigen ersetzen.
Sie können diesen Code in ein Unix-Terminal ausführen, um zu sehen, wie er mit der Animation aussehen soll:
perl -M5.010 -MTime::HiRes=sleep -E '@arr=([($")x12,($n="*")x2,($")x3],[($")x8,($n)x4,($")x4],[($")x5,($n)x5,($")x6],[($")x3,($n)x2,($")x3,($n)x2,($")x6],[($")x1,($n)x2,($")x6,($n)x2,($")x5],[($n)x1,($")x10,($n)x5]);while(++$j){for$i(0..5){for$k(0..15) {$out[$i][16*$_+$k]=$arr[$i][($k-$j)%16]for 0..4}}say"\e[H",$/,join$/,map{join"",@$_}@out;sleep 0.1}'
(Beachten Sie, dass dieser Code nicht besonders gut funktioniert: Ich habe ihn so kompakt gestaltet, dass er bequem in einem Terminal ausgeführt werden kann.)
Gewinnkriterium
Das ist Codegolf, also gewinnt der kürzeste Code in Byte.
Antworten:
MATL ,
41 bis40 BytesBeispiellauf:
Oder probieren Sie es bei MATL Online! (Die tatsächliche Geschwindigkeit hängt möglicherweise von der Serverauslastung ab.)
Wie es funktioniert
quelle
JavaScript (ES6) + HTML,
151143 + 10 =161153 Bytequelle
a
?a
enthält das binär codierte Wellenmuster und wird bei jedem Frame gedreht. Daher kann es nicht fest codiert werden: Es muss in einer Variablen gespeichert werden.HTML + CSS, 70 +
181175 = 245 BytesNutzt
text-shadow
,rtl
Text und CSS Keyframe - Animationen.quelle
C #
450444425417 Bytes399 ohne
using System.Linq;
aber ich bin mir sicher das wäre schummeln ...Bearbeiten: 25 Bytes dank @Cyoce gespeichert
Golf gespielt:
Ungolfed:
quelle
(a)=>
. Undwhile(true)
kann seinfor(;;)
s
Lambda denke ich, können Sie die{}
undreturn
\r
von demstring.Join
(zumindest unter Windows funktioniert es, nicht getestet es mit Mono obwohl) Sie können auch speichern 1 Byte , indem siep++
in diefor
wie diese Schleifefor(;;p++)
if (p==16)...
) zu entfernen , können Sie sie auch wie folgt in den for-Schleifenkopf einfügenfor(;;p=++p%16)
. Speichern Sie 1 weiteres Byte, indem Siep
in der Schleife deklarieren (for(int p=0;;p=++p%16)
)V,
989773 BytesVielen Dank an @ nmjcman101 für das Speichern von 24 Bytes!
Dies enthält eine Menge nicht druckbarer Dateien. Hier ist ein xxd-Hexdump:
Bearbeiten
Wird
y$
anstelle von verwendet<C-v>$y
Viele Veränderungen
{
und}
um wenige Bytes zu sparenò
anstelle von Registern verwendet, um die Endlosschleife zu erstellen (aus irgendeinem Grund mussò
am Ende ein eingefügt werden, damit dies funktioniert.)*
unten fixiertMini-Erklärung
Ich benutze
<alt-n>
, um Kopien von Zeichenfolgen zu erstellen. Zum Beispiel<alt-5>*
(das sieht aus wieµ5
) macht5
Kopien*
im Einfügemodus. Dies war kürzer als das Kopieren der Zeichenfolge und die Verwendung eines regulären Ausdrucks, um die erforderlichen Ersetzungen vorzunehmen. Nachdem ich eine Welle erstellt habe, füge ich sie ein, um die anderen Wellen zu erstellen. Schließlich schleife ich rekursiv mitò
, um die Endlosschleife zu erstellen (mit einer Verzögerung von100ms
).Gif
Der größte Teil des Codes ist der Erstellung der Welle gewidmet, daher versuche ich immer noch, Golf zu spielen. Beachten Sie, dass dieser Code auf TIO nicht funktioniert, da TIO die Ausgabe erst ausgibt, nachdem der Code ausgeführt wurde. Also hier ein GIF (Entschuldigung für die schlechte Qualität, ich musste eine Website verwenden, um ein
.mov
in ein zu konvertieren.gif
, außerdem>_
ist das Terminal-Symbol auf dem Dock meines Macs immer wieder zu sehen):quelle
5j
(im Kontext von$<C-V>5j
) gerade sein}
, und dasp
nach dem|
sollte ein sein,P
das die Statik*
in der unteren linken Ecke behebt .qm[CODE]@mq@m
am Ende durch nur ersetzenò[CODE]
. Der Code zwischenò
wird (ähnlich wie bei Ihrem Makro) bis zum Ende einer Schleife wiederholt und am Ende eines Programmsò
implizit geschlossen.Batch, 424 Bytes
Einige Zeilen haben nachgestellte Leerzeichen. Erfordert ein Standardterminal mit 80 Spalten. Das Timing ist nicht sehr genau, aber es ist das Beste, was Sie in Batch tun können.
quelle
Schläger
395374373367364351 BytesVerwendet eine externe Bibliothek für Bildschirm Clearing
Edit: 21 Bytes Gespeichert durch nicht definiert ,
w
und inlining die Funktion.Edit2: 1 Byte durch Entfernen eines Leerzeichens gespeichert.
Edit3: 6 Bytes durch Umbenennen
loop
inp
gespeichert, danke @rnso!Edit4: Einfügen eines Teilstrings in den Let, der 3 Bytes speichert.
Edit5: Entfernen
#lang racket
, was im Interpreter nicht benötigt wird.Golf gespielt: 351 Bytes
Scrollen (nicht löschen): 272 Bytes
Ungolfed:
quelle
simplescreenrecorder
mit verwendetavconv
, um mp4 in gif zu konvertieren.rotmul
tatsächlichw
als Parameter aufgenommen wurde.PowerShell 3.0,
183182173 BytesBenötigt PS 3.0 für binäre Shiftoperatoren. Mit Hilfe von AdmBorkBork auf 173 Bytes verkleinert !
quelle
.PadLeft
, bewegen Sie die$o
Erklärung in den[convert]
Anruf, und die Beseitigung der Anführungszeichen um die Zahlen in den-replace
ops.for(){0..5|%{("{0:D16}"-f+[Convert]::ToString(([uint16]$o=$w[$_]),2))*5-replace0,' '-replace1,'*'
+
in der"{0:D16}"-f+[Convert]
? Ohne geht es nicht, aber ich kann nicht fassen, was es macht.[convert]::ToString()
gibt einen String zurück. Das+
erzwingt eine Umwandlung in eine,[int]
so dass-f
der korrekte Parametertyp für die Funktion ausgewählt wirdD16
.+'1'
wie eine gültige arithmetische Operation ohne erste Summierung behandelt wird ,string
inint
das Ergebnis umgewandelt wird und dieses zurückgibt? Großartiger Scott!Bash + Coreutils,
172148 Bytes24 Bytes gespart dank @zeppelin , vielen Dank
Die erste Zeile dekomprimiert das folgende Muster aus 6 aufeinanderfolgenden Wellen:
Dann schiebt die Schleife ein 80 Bytes breites Fenster durch dieses Muster.
quelle
*> <> ,
251250251 Bytes (nicht konkurrierend)Hinweis:
"H;0["
soll27
nachher ascii haben[
.Probieren Sie es hier aus! (Verzögerung auf 0ms setzen)
Ich kann nicht glauben, dass ich es geschafft habe. Dabei werden die Anweisungen
I
und verwendetD
, mit denen der ausgewählte Stapel erhöht oder verringert wird. Dies zeigt, dass es wahrscheinlich möglich ist, dies in einer reinen> <> (minus dem Schlaf) oder einer kompetitiven *> <> Antwort zu tun, obwohl es wahrscheinlich viel schwieriger ist, dies zu tun.Die Online-Interpreter-Version unterscheidet sich lediglich dadurch, dass die Ausgabe mit einem Wagenrücklauf gelöscht wird.
Dies ist nicht miteinander im Wettbewerb , weil das
I
,D
,C
undR
Anweisungen jünger als Herausforderung. Dies ist wahrscheinlich ohne diese Anweisungen möglich, aber es wäre sehr schwer / lang.Bearbeiten: Ich habe es tatsächlich geschafft, ein Byte zu entfernen, aber ich habe auch bemerkt, dass ich die Größe falsch gemessen habe, also habe ich tatsächlich ein Byte gewonnen.
Ich werde mein Bestes tun, um die Schritte zu brechen und zu erklären, was hier passiert ...
Erläuterung
Inhaltsverzeichnis
Initialisierung
Hier bauen wir die 6 Linien, die die Wellen konstruieren. Wir müssen jede Zeichenfolge fünfmal wiederholen, um die richtige Länge zu erhalten.
Wir beginnen mit 6 davon, eine für jede Zeile der Welle:
Und wir betreten die Hauptschleife nach der Initialisierung durch
09.
.Aktuellen Stapel 4 Mal kopieren
Dies ist eine einfache Funktion, die einfach den aktuellen Stapel aufnimmt und ihn viermal kopiert. So würde "a" "aaaaa" werden.
Stapel kopieren
Dadurch wird der aktuelle Stapel kopiert und die Kopie an den aktuellen Stapel angehängt.
Konfiguration
Überspringe die Initiale
<
und kehre die erste Zeile um, um zu werden,l:&0v
da dies die Reihenfolge ist, in der sie ausgeführt wird, nachdem<
sich die Richtung der IP geändert hat.Ab hier wird die Länge als
n
und die0
als bezeichneti
.Schleife
Aufräumen
Hauptschleife
Hier läuft der Code für immer und zeichnet die Wellen zwischen 100 ms Schlafdauer ständig neu.
Konfiguration
Schleife
quelle
PHP, 128 Bytes
Es kann nicht mehr als eine Zeile animiert werden, es wird jedoch ein Bildlauf ausgeführt.
Fügen Sie
,0
dem Array eine leere Zeile zwischen den Iterationen hinzu. Laufen Sie mit-r
.quelle
Mathematica, 213 Bytes
Ich sehe in Mathematica keine andere Möglichkeit, das Wellenmuster zu spielen, als mit einer Liste von Zeichenfolgen für jede Zeile zu beginnen. Ich initialisiere
i
, um zu sein,0
und plane eine Aufgabe, um sie alle0.1
Sekunden zu erhöhen . IchDynamic
zeige das Ergebnis von Folgendem an:StringRepeat
jede Zeile 5 mal.Characters
.RotateRight
jede Liste von Zeichen voni
.Grid
.quelle
C (Unix),
231 bis191 BytesDies funktioniert nur in Unix-Umgebungen. Bitte entschuldigen Sie auch die Tatsache, dass der Schlaf nur Ganzzahlen akzeptiert ... also verzögert er tatsächlich 1 Sekunde zwischen Frames.
Ungolfed-Version:
Golf Version:
quelle
Javascript (ES6),
152147145 Bytesquelle
setInterval(a=>{...},100,6)
und 4 weitere mit speichernf+=" *"[[...][a]&1<<(i+x)%16]
.Perl 6,
140138137123120 BytesAlte Lösungen:
quelle
Python 3,
240239230 Bytes-1 Byte dank @redstarcoder
-9 Bytes dank @PascalvKooten
quelle
print("\x1b[0;H")
funktioniert bei mir auch für -1 byte.' **'
mit' '*13+'**'
und Sie können 1 Zeichen Einzüge in der während haben, keine Notwendigkeit für sie 4 Zeichen zu sein.Schläger 295 Bytes
Ungolfed:
Testen:
Ausgabe:
(Diese Anzeige der GIF-Datei ist langsamer als die tatsächliche Ausgabe).
quelle
Python 2,
207202 BytesIn der Regel bin ich ein C # -Entwickler, daher ist dies möglicherweise noch nicht vollständig erledigt.
quelle
C #, 327 Bytes
Mehr oder weniger eine portierte Version meiner Lösung in Python ...
quelle
Perl, 110 Bytes
Benötigt
-E
keine zusätzlichen Kosten. Dies enthält nicht druckbare Zeichen.Erstellen Sie die obigen Daten mit dem unten stehenden umkehrbaren Hexdump. Führen Sie
xxd -d > sea.pl
ein Linux- oder kompatibles Terminal aus, fügen Sie das Folgende ein, drücken Sie Ctrl+ dund führen Sie dann ausperl -E "$(cat sea.pl)"
.Verwendungszweck
Verwenden Sie zum einfachen Kopieren / Einfügen die folgenden Befehle:
Erläuterung
Eine relativ einfache Lösung, bei der die Welle am Anfang als Zeichenfolge gespeichert wird, die
unpack
in binär umgewandelt wird. Jeder Abschnitt wird verfünffacht,0
s wird in Leerzeichen und1
s in*
s konvertiert . Jetzt haben wir die gesamte Zeichenfolge und geben eineredo
Schleife ein, die die gesamte Zeichenfolge ausgibt. Dann warten wir 0,1 Sekunden und verschieben für jede Zeile in der Zeichenfolge das letzte Zeichen an den Anfang der Zeichenfolge.quelle
Mathematica 171 Bytes
Die Wave selbst besteht aus Daten, daher speichere ich eine komprimierte Version der gesamten Wave in meinem Code. Ich kann eine einzelne Wave viel kompakter speichern, als wenn ich
\fð߀ᣀ恠耟
ihre Binärdarstellung verwende, aber der Aufwand für die Zeichenanzahl beim Dekomprimieren ist zu hoch *.Hier ist der Code:
Hier ist der Code, mit dem ich die komprimierte Version der Wave-Daten erstellt habe:
Hier ist der Code, den ich am liebsten verwendet hätte, um komprimierte, sich wiederholende Binärdaten wie diese Welle zu speichern:
Wie Sie sehen, ist der Aufwand für die Umwandlung der komprimierten Daten in einen String für dieses spezielle Problem zu hoch, obwohl auf diese Weise eine einzelne Wave mit 7 UTF-Zeichen und 15 Byte gespeichert werden kann.
Hier war der Code zum Bestimmen der UTF-Zeichenfolge zum Speichern einer einzelnen Wave (s wie oben).
quelle
Ruby
269217189185 Bytes-28 Bytes dank @manatwork
-5 Bytes dank @ropata
Normal
Golf gespielt
quelle
do … end
→{ … }
und entfernen Sie die Zeilenumbrüche nach{
und vor}
; entferne das Leerzeichen zwischensystem
und seinem Parameter; Entfernen Sie das,
letzte Element des After-Array-Literal..each
→.map
und das Leerzeichen zwischen ihm und seinem Codeblock entfernen; entferne das Feld vorputs
;0..80
→0,80
(dies ist auch ein Fehler, da der Ausdruck eine 81 Zeichen lange Zeichenfolge ergibt);p=p+1==16?0: p+1
→p=-~p%16
.do … end
→ ändert{ … }
, wird dasloop
Schlüsselwort noch benötigt . Dies ist der kürzeste ich: pastebin.com/cg3gxnm4b=' '
(5 Leerzeichen) oben setzen und dann den Ausgabeausdruck auf' '*12+'** ', ' '*8+'**** ',b+'***** '+b,' ** ** '+b,' ** **'+b,'*'+b+b+'*****'
... ändern (aber SE zeigt wiederholte Leerzeichen in diesem Kommentar nicht richtig an!)HTML + JS + jQuery, 10 + 233 = 243 Byte
Das JavaScript verschiebt nur jede Zeile um 1 und ändert den Text alle 100 ms.
quelle