Drucken Sie eine kontinuierliche Sinuswelle, die vertikal auf einem Terminal gescrollt wird. Das Programm sollte nicht beendet werden und die Welle kontinuierlich nach unten rollen (außer bis es irgendwie unterbrochen wird). Sie können davon ausgehen, dass ein Überlauf kein Problem darstellt (dh Sie können Endlosschleifen mit inkrementierenden Zählern oder eine Endlosrekursion verwenden).
Die Welle sollte die folgenden Eigenschaften erfüllen:
- Amplitude = 20 Zeichen (Spitzenamplitude)
- Periode = 60 bis 65 Zeilen (inklusive)
- Die Ausgabe sollte nur aus Leerzeichen, Zeilenvorschub und bestehen
|
- Halten Sie nach jeder Ausgabezeile eine Pause von 50 ms ein
Beispielausgabe:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Die obige Ausgabe sollte für immer eingeschaltet bleiben, sofern nichts anderes unterbrochen wird, z. B. SIGINT oder SIGKILL oder das Schließen des Terminalfensters, oder Sie schalten Ihre Maschine aus, oder die Sonne verschluckt die Erde usw.
Kürzester Code gewinnt.
Hinweis. Ich kenne ein ähnliches Problem bei Display Scrolling Waves, aber das ist nicht genau dasselbe. Bei meinem Problem soll die Welle nicht "an Ort und Stelle" gescrollt werden - sondern nur auf einem Terminal ausgegeben werden. Dies ist auch ein Ascii-Art-Problem, verwenden Sie also nicht Mathematica, um es zu zeichnen.
quelle
Antworten:
APL (35)
(Ja, es passt in 35 Bytes, hier ist eine 1-Byte-APL-Codierung )
Erläuterung:
{
...}
1: Rufen Sie die Funktion mit 1 am Anfang auf1○⍵×.1
: nah genug für die Regierungsarbeit ansin(⍵×π÷30)
. (1○
istsin
).-21+⌈20
: auf den Bereich normalisieren1..40
und negieren'|'↑⍨
: Nimm die letztenN
Zeichen aus der Zeichenkette'|'
(was zu einer Zeichenkette mit einem|
am Ende führt⎕←
: Anzeige⌈⎕DL.05
: Warte 50 ms und kehre zurück1
. (⎕DL
Gibt die Zeitspanne zurück, die tatsächlich gewartet wurde und die in der Nähe sein wird0.05
, wobei dieser Wert aufgerundet wird1
).∇⍵+
: füge diese Nummer (1
) hinzu⍵
und starte die Funktion erneut.quelle
{⎕←'|'↑⍨-⌈20×1+1○⍵⋄∇.1+⍵⊣⎕DL.05}0
C,
7473706967 Zeichen67 Zeichen Lösung mit vielen guten Ideen von @ugoren & anderen:
69 Zeichen Lösung mit while-Schleife statt Rekursion:
Annäherung an Perl. :)
quelle
5E4
anstelle von verwenden50000
.usleep()
Prototypen zu zeigen, müssten Sie die 5E4 explizit gießen.printf("%*s\n",j=21+sin(i++*.1)*20,"|")
. Der resultierende Typ ist immer noch int, sodass es sich um ein gültiges Feldbreitenargument handelt.Mathematica
121 104 80 6764quelle
x=20*sin(pi*y/30)+20
oder etwas Ähnliches.Do[Spacer[70*Sin[n*Pi/32]+70]~Print~"|";[email protected],{n,18!}]
1 == 1
um0 < 1
1 Zeichen zu verringern.Perl, 48 (68)
GNU-Schlafversion: 48
Plattformübergreifend: 68
Die Verwendung des Time :: HiRes-Moduls mithilfe der Shell-Sleep-Funktion wurde entfernt. Verkürztes Inkrement gemäß Ruby-Beispiel. Verkürzt mit $ "und $ 0, um Hinweise aus Primos Arbeit zu sehen. Danke für Hinweise, Primo.
quelle
test.pl
und ausgeführtperl ./test.pl
, die Wartezeit stimmt jedoch nicht mit der Spezifikation überein. Auch die Amplitude der Welle ist zu klein. (Diese Amplitude bezieht sich auf die Länge zwischen dem Peak und der Gleichgewichtsposition.)man sleep
→unsigned int sleep(unsigned int seconds);
. Es wird keinen Fehler machen, aber das tatsächliche Ruheintervall ist Null. Einige Vorschläge, um Ihre$d
zu verkürzen : Wechseln Sie zu$_
und verwenden Sie(25+20*sin)
und ändern Sie die\n
für eine wörtliche Newline.man 1 sleep
auf einer GNU / Linux-Bash-Shell sagt uns, dassUnlike most implementations that require NUMBER be an integer, here NUMBER may be an arbitrary floating point number.
Perl - 64 (oder 60) Bytes
Im Folgenden wird ein Windows-spezifischer Shell-Befehl verwendet:
Der folgende Befehl verwendet einen GNU / Linux-spezifischen Shell-Befehl:
Beide bei 64 Bytes.
Beachten Sie, dass dies keine Sinuswelle ist, sondern eine quadratische Interpolation. Verschworen gegen eine tatsächliche Sünde:
Bei der erforderlichen Granularität sind diese visuell nicht unterscheidbar.
Wenn die Ästhetik nicht so wichtig ist, biete ich eine 60-Byte- Alternative mit einer Periodenlänge von 62, einer maximalen Amplitude von ~ 20,02 und leichten Asymmetrien an:
quelle
Rubin 56
quelle
p
fügt um jede Zeile doppelte Anführungszeichen ein und ändert die "Zeichnung".Befunge 98 -
103100Beifall für ein Programm, das dies in einer Sprache ohne trigonometrische Fähigkeiten tut; das erste Programm in der Tat. Die zweite Zeile ist einfach Daten; Das Zeichen, das dem ASCII-Wert der Sünde entspricht und zu einem Leerzeichen hinzugefügt wird.
BEARBEITEN: Ich habe 3 Zeichen gespart, indem ich das Leerzeichen nicht abgezogen habe. Die Sinuskurve wird um 32 Einheiten nach rechts verschoben (was gültig ist).
Befunge hat auch keinen Schlafbefehl oder ähnliches. Es wäre schön, einen Fingerabdruck zu finden, aber ich konnte keinen finden, also
ff*:*8*
drückt8*225**2
(405000
) undkz
führt so oft ein Noop aus (naja, so oft + 1). Auf der Windows-Kommandozeile mit Pyfunge sind es ungefähr 50 Millisekunden, also sage ich, dass ich gut bin. Hinweis: Wenn jemand einen guten Fingerabdruck dafür kennt, lassen Sie es mich bitte wissen.Der letzte Teil des Codes prüft einfach, ob der Zähler (für die Datenzeile) hinter den Daten liegt. Wenn dies der Fall ist, wird der Zähler auf 0 zurückgesetzt.
Ich habe dies verwendet , um die Daten zu generieren.
Taylor-Reihe
Obwohl diese Version 105 Zeichen enthält, musste ich sie nur einfügen:
Ich habe versucht, mein Programm zu verkürzen, und habe mich dazu entschlossen, in der Taylor-Reihe nach Cosinus zu suchen (Sinus ist schwerer zu berechnen). Ich habe zu geändert
x
,pi * x / 30
um die hier angeforderte Periode abzugleichen, und dann mit multipliziert20
, um die Amplitude abzugleichen. Ich habe einige Vereinfachungen vorgenommen (angepasste Faktoren für das Abbrechen, ohne den Wert der Funktion wesentlich zu verändern). Dann habe ich es umgesetzt. Leider handelt es sich nicht um eine kürzere Implementierung.prüft, ob die Werte der Taylor-Reihe ungenau werden (ungefähr
x = 15
). Wenn ja, dann berechne ich die Taylor-Reihe fürx - 30
anstattx
.Ist meine Implementierung der Taylor-Reihe um
x = 0
, wannx
ist der Wert auf dem Stapel.Negiert den Wert der Taylor-Reihe, wenn die Taylor-Reihe angepasst werden muss.
mache die Cosinuswelle positiv; Andernfalls würde der Druckvorgang nicht funktionieren.
druckt die Welle
notdürftig 50 Millisekunden warten, dann inkrementieren
x
Ist der
x
Wert größer als 45, ändern Sie ihn auf -14 (erneut Taylor Series Error Adjustment).quelle
Python,
108,93,90,8988Jetzt mit unendlichem Scrollen :)
Edit: ok, 90. Genug?
Bearbeiten: Bearbeiten: Nein, 89.
Edit: Edit: Edit: 88 danke an boothby .
quelle
a=0.
->a=0
bekommt man auf 88PHP, 59 Zeichen
quelle
echo ...;
anstelle von verwendenfwrite(STDOUT,...);
.<?for(;;)echo~str_pad(ƒõ,22+20*sin($a+=.1),ß,usleep(5e4));
~ƒõ
ist nur eine Abkürzung für"|\n"
.C64 BASIC, 64 PETSCII-Zeichen
Auf einem PAL C64
For i=0 to 2:next i
werden ca. 0,05 Sekunden, damit die Verzögerungszeit eingehalten wird.quelle
Javascript
887678 ZeichenBasierend auf Kendall Freys Code.
quelle
i
, sodass anstelle einer Welle eine gerade Linie gedruckt wird.C - 86 + 3 Zeichen
Danke Shiona und Josh für die Bearbeitung
i; main (j) {für (j = 0; j ++ <20 + sin (i / 10.) * 20;) Putchar (32); Puts ("|"); Usleep (50000); i ++; main () ;}float i; main (j) {für (j = 0; j ++ <20 + sin (i) * 20;) putchar (32); puts ("|"); usleep (50000); i + =. 1; main ( );}Zusammengestellt mit der
-lm
Flagge, nehme ich an, dass ich 3 Zeichen hinzufügen mussquelle
i;main(j){for(j=0;j++<20+sin(i/10.0)*20;)putchar(32);puts("|");usleep(50000);i++;main();}
printf("%*s\n",(int)(21+sin(i++/10.)*20),"|")
j=0
:i;main(j){for(;j++<21+sin(i/10.)*20;)putchar(32);puts("|");usleep(50000);i++;main(1);}
. Dies setzt voraus, dass das Programm mit 0 Argumenten aufgerufen wird.Ti-Basic, 33 Bytes
Die folgenden Einschränkungen bestehen :
Aufgrund der Bildschirmbegrenzung von 16x8 hat diese Sinuswelle nur eine Amplitude von 7 (Periode von 60 bleibt erhalten)
Aufgrund des Fehlens einer einfachen Möglichkeit, auf das
|
Zeichen zuzugreifen ,!
wird stattdessen verwendetAufgrund des Fehlens eines genauen Systemzeitgebers wird die Verzögerung nicht implementiert. Die Laufgeschwindigkeit scheint jedoch ungefähr korrekt zu sein.
quelle
JavaScript - 88
Ich bin sicher, jemand kann sich etwas einfallen lassen, das eigentlich klug ist.
quelle
J -
103,58,5754Vielen Dank an die tollen Jungs vom IRC
In Worten von rechts nach links heißt es: Ausgehend von 0 unendlich oft: sin, addiere 1, multipliziere mit 20, füge 1 hinzu (so wird es zu einem Array von 2 Elementen), kopiere zwei Bytes '|' entsprechend ausdrucken, 0.05s warten und 0.1 addieren
Anstelle der Endlosschleife können wir auch die Rekursion verwenden. Sie würde 2 Zeichen speichern, aber auch nach einigen Iterationen einen Stapelfehler erzeugen
Wo
$:
ist ein rekursiver Aufruf.quelle
(+2*(%20)6!:3@[2:1!:2~' |'#~1,~[:<.20*1+1&o.)^:_]0
. Die Rekursionsversion spart diesmal nur 1 Zeichen,$:@(+2*(%20)6!:3@[2:1!:2~' |'#~1,~[:<.20*1+1&o.)0
obwohl sie länger zu dauern scheint, bevor der Tiefpunkt erreicht wird.Haskell - 75
Leider konnte ich das Programm nicht dazu bringen, 50 ms anzuhalten, ohne meine Zeichenanzahl zu verdoppeln, sodass es nur die Konsole überflutet, aber die Sinuswelle erzeugt.
Hier ist der vollständige Code mit Pause (138 Zeichen mit Zeilenumbrüchen):
quelle
20+20*sin x
zu qualifizieren.Perl 6: 46 Zeichen
Erstellen Sie einen unendlichen faulen Bereich, indem Sie die
0,0.1 ... *
Schleife darüber ziehen. Gibtsay
zurück,Bool::True
was als 1 multipliziert wird. Auf diese Weise kann ich es in einer einzigen Anweisung belassen.quelle
sleep
und.05
muss getrennt werden. Aber ich frage mich, ob der Abstand zwischensay
und' '
obligatorisch ist?say' '
Man kann verwenden,say(' ')
aber das ist 1fugly Javascript - 77
und wenn wir es in Firefox - 73 tun
und wenn wir böse sind - 67
quelle
Scala,
92,8987quelle
(20+20*math.sin(i*.1))
reduziert es um 1 Zeichen, vorausgesetzt, dies ist eine gültige Syntax (ich habe keine Erfahrung mit Scala)Python 3, 103
Blöder Frikk'n importiert ...
Anstelle von "sleep" wird bei dieser Implementierung die CPU geschliffen, da es mit Python einfacher ist, eine Gleitkomma-CPU-Uhr als eine Wanduhr zu erhalten. Dieser Ansatz wird Friols nicht schlagen , aber es macht Spaß, also lasse ich es.
quelle
C #
[152] Charaktere
Ich konnte die existierende C # -Antwort nicht auf "Ausführen" bekommen und konnte nicht abstimmen, weil ich nicht genug Reputation habe
Es fehlten ein paar
{
und ein)
nach der For-Loop-Deklaration.Ich nehme an, dass die Abweichung im Aussehen der Welle, wenn sie ausgeführt wird, auf die Art und Weise zurückzuführen ist, wie wir versuchen, diese Welle anzuzeigen.
Wenn der Namespace und die Methodendeklaration nicht gezählt werden, sind dies [104] Zeichen für die Arbeitsversion
quelle
VB
[236][178]Ich bin mir nicht sicher, wie du die Tabs zählen würdest. Ich habe die Zählung nur von Notepadd ++ übernommen, bevor ich sie hier eingefügt habe. Zeilenumbrüche sind obligatorisch, wahrscheinlich, warum niemand sie gerne zum Code-Golfen verwendet.
quelle
C #
Die magische Linie [91] Charaktere
Arbeitsprogramm unten. [148] Charaktere
quelle
using System;class P{static void Main(){for(var i=0d;;Console.Write("{0,"+(int)(40+20*Math.Sin(i+=.1))+"}\n",'|'))Thread.Sleep(50);}}
Threading.Thread.Sleep(50)
ich etwas falsch mache.Bash + bc (um zu rechnen), 80
quelle
TI-BASIC, 30 Bytes
Geringe Größenverbesserung gegenüber der anderen Antwort auf Kosten einer gewissen Genauigkeit. Beachten Sie, dass TI-Basic technisch die | Charakter, aber Sie müssen es über den Computer übertragen oder ein Assembler-Programm verwenden, um darauf zuzugreifen.
quelle
.03π
kann das sein.1
, was immer noch im geforderten Intervall liegt.Julia - 68
Edit: Danke an ML und Ass.
Nun, es kann nicht mit APL konkurrieren, aber hier ist mein Versuch.
Ausgabe:
quelle
.05
anstelle von0.05
in zu verwendensleep
?i=0;while 0<1;println(" "^int(20sin(.1i)+20)*"|");i+=1;sleep(.05)end
———sin(i/10)*20
entspricht20sin(.1i)
MATLAB, 81 Bytes
Ich habe die Tatsache missbraucht, dass
i
immer in MATLAB initialisiert wird, was bedeutete, dass ich dasfprintf
in diewhile
Anweisung einfügen konnte, ohne esi
zuerst zu initialisieren . Dies bedeutet, dass das Programm zuerst eine leere Zeile ausgibt, aber ich denke, dass dies in der Spezifikation nicht verboten ist.Außerdem wird die Tatsache missbraucht, dass Matlab die meisten ASCII-Steuerzeichen ignoriert und statt NULL ein Leerzeichen ausgibt (auch für die erste leere Zeile).
quelle
F # -
90797776Hier ist eine Lösung mit Rekursion
Es könnte wahrscheinlich weiter verbessert werden.
quelle
AutoHotkey 176
Führen Sie das Skript aus. Es öffnet Notepad und druckt die Zeichen. Drücken Sie jederzeit die Esc-Taste, um das Menü zu verlassen.
quelle
Clojure, 121
Kurzfassung:
Hübsche Version:
Zeitraum ist 64.
Tippe dies in
lein repl
die Datei oder speichere es in der Dateisin.clj
undlein exec sin.clj
starte es mit (benötigt ein Lein-Exec-Plugin).quelle