Wydrukuj ciągłą falę sinusoidalną przewijaną pionowo na terminalu. Program nie powinien się kończyć i powinien stale przewijać falę w dół (chyba że zostanie w jakiś sposób przerwany). Możesz założyć, że przepełnienie nie stanowi problemu (tzn. Możesz używać nieskończonych pętli z licznikami rosnącymi lub nieskończoną rekurencją).
Fala powinna spełniać następujące właściwości:
- Amplituda = 20 znaków (amplituda szczytowa)
- Okres = od 60 do 65 linii (włącznie)
- Dane wyjściowe powinny składać się tylko ze spacji, nowej linii i
|
- Po każdym wierszu wyjścia zatrzymaj się na 50 ms
Przykładowe dane wyjściowe:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Powyższe dane wyjściowe powinny trwać wiecznie, chyba że zostanie to w inny sposób przerwane, np. SIGINT lub SIGKILL, lub zamknięcie okna terminala, albo wyłączysz maszynę, albo Słońce pochłonie Ziemię itp.
Najkrótszy kod wygrywa.
Uwaga. Zdaję sobie sprawę z podobnego problemu z przewijanymi falami wyświetlania, ale nie jest to dokładnie to samo. W moim problemie fala nie powinna być przewijana „na miejscu” - wystarczy wyprowadzić ją na terminal. Jest to także problem ascii-art, więc nie używaj Mathematiki do jego kreślenia.
źródło
Odpowiedzi:
APL (35)
(Tak, mieści się w 35 bajtach, oto 1-bajtowe kodowanie APL )
Wyjaśnienie:
{
...}
1: wywołaj funkcję z 1 na początku1○⍵×.1
: wystarczająco blisko, by rząd mógł to zrobićsin(⍵×π÷30)
. (1○
jestsin
).-21+⌈20
: normalizuj do zakresu1..40
i neguj'|'↑⍨
: weź ostatnieN
znaki z ciągu'|'
(co daje ciąg spacji z|
na końcu⎕←
: display⌈⎕DL.05
: poczekaj 50 ms i wróć1
. (⎕DL
zwraca czas, który faktycznie czekał, który będzie bliski0.05
, zaokrąglenie tej wartości w górę daje1
).∇⍵+
: dodaj ten numer (1
)⍵
i ponownie uruchom funkcję.źródło
{⎕←'|'↑⍨-⌈20×1+1○⍵⋄∇.1+⍵⊣⎕DL.05}0
DO,
7473706967 znaków67 postaci z wieloma dobrymi pomysłami @ugoren i innych:
69-znakowe rozwiązanie z pętlą while zamiast rekurencji:
Zbliża się terytorium perla. :)
źródło
5E4
zamiast50000
.usleep()
prototypu kompilatora musiałbyś jawnie zarzucić 5E4.printf("%*s\n",j=21+sin(i++*.1)*20,"|")
. Wynikowy typ jest nadal int, więc jest to prawidłowy argument szerokości pola.Mathematica
121 104 80 6764źródło
x=20*sin(pi*y/30)+20
lub czegoś podobnego.Do[Spacer[70*Sin[n*Pi/32]+70]~Print~"|";[email protected],{n,18!}]
1 == 1
na,0 < 1
aby zmniejszyć 1 znak.Perl, 48 (68)
Wersja uśpienia GNU: 48
Międzyplatformowy: 68
Usunięto użycie modułu Time :: HiRes przy użyciu funkcji uśpienia powłoki. Skrócony przyrost według przykładu Rubiego. Skrócono za pomocą $ ”i 0 $, widząc wskazówki z pracy Primo. Dziękujemy za wskazówki Primo.
źródło
test.pl
i uruchomiłemperl ./test.pl
, jednak czas oczekiwania nie zgadza się ze specyfikacją. Ponadto amplituda fali jest zbyt mała. (Ta amplituda odnosi się do długości między szczytem a pozycją równowagi.)man sleep
→unsigned int sleep(unsigned int seconds);
. Nie spowoduje to błędu, ale rzeczywisty przedział uśpienia wynosi zero. Kilka propozycji skrócenia twojego: zmień$d
na$_
, a następnie użyj(25+20*sin)
i zmień\n
na dosłowny znak nowej linii.man 1 sleep
w powłoce bash GNU / Linux mówi nam, żeUnlike most implementations that require NUMBER be an integer, here NUMBER may be an arbitrary floating point number.
Perl - 64 (lub 60) bajtów
Następujące polecenie korzysta z polecenia powłoki specyficznego dla systemu Windows:
W poniższym przykładzie użyto polecenia powłoki specyficznego dla GNU / Linux:
Oba mają 64 bajty.
Zauważ, że nie jest to dokładnie fala sinusoidalna, ale raczej interpolacja kwadratowa. Spiskowane przeciwko faktycznemu grzechowi:
Przy wymaganej szczegółowości są one wizualnie nie do odróżnienia.
Jeśli estetyka nie jest tak ważna, oferuję 60-bajtową alternatywę o długości okresu 62, maksymalnej amplitudzie ~ 20,02 i niewielkich asymetriach:
źródło
Rubin 56
źródło
p
doda podwójne cudzysłowy wokół każdej linii i zmieni „rysowanie”.Befunge 98 -
103100Pozdrawiam program, który to robi, w języku bez możliwości trygonometrycznych; pierwszy program w rzeczywistości. Druga linia to po prostu dane; znak odpowiadający wartości ascii grzechu, dodany do znaku spacji.
EDYCJA: Zapisałem 3 znaki, nie odejmując miejsca; sinusoida jest tłumaczona o 32 jednostki w prawo (co jest ważne).
Befunge również nie ma polecenia snu ani czegoś podobnego. Byłoby miło znaleźć odcisk palca, ale nie mogłem go znaleźć, więc
ff*:*8*
naciska8*225**2
(405000
) ikz
uruchamia noop tyle razy (cóż, tyle razy + 1). W linii poleceń Windows z pyfunge okazuje się, że to około 50 milisekund, więc mówię, że jestem dobry. Uwaga: jeśli ktoś zna dobry odcisk palca, daj mi znać.Ostatnia część kodu po prostu sprawdza, czy licznik (dla linii danych) znajduje się poza danymi, jeśli tak, licznik jest resetowany do zera.
Użyłem tego do wygenerowania danych.
Taylor Series
Chociaż ta wersja ma 105 znaków, musiałem ją tylko dołączyć:
Próbowałem skrócić mój program i zdecydowałem się przyjrzeć serii Taylor dla cosinusa (sinus jest trudniejszy do obliczenia). Zmieniłem,
x
abypi * x / 30
dopasować do wymaganego tutaj okresu, a następnie pomnożyłem przez,20
aby dopasować amplitudę. Poczyniłem pewne uproszczenia (skorygowałem współczynniki anulowania, nie zmieniając znacząco wartości funkcji). Potem to zaimplementowałem. Niestety nie jest to krótsza implementacja.sprawdza, czy wartości szeregu Taylora stają się niedokładne (około
x = 15
). Jeśli tak, tox - 30
zamiast tego obliczam serię Taylorx
.to moja implementacja serii Taylor w
x = 0
, kiedyx
jest wartością na stosie.neguje wartość szeregu Taylora, jeśli szereg Taylora wymagał korekty.
uczynić falę cosinus dodatnią; w przeciwnym razie drukowanie nie działałoby.
drukuje falę
prowizoryczny odczekaj 50 milisekund, a następnie zwiększaj
x
Jeśli
x
jest większy niż 45, zmień go na -14 (ponownie, regulacja błędu serii Taylor).źródło
Pyton,
108,93,90,89, 88Teraz z nieskończonym przewijaniem :)
Edycja: ok, 90. Wystarczy?
Edycja: Edycja: nie, 89.
Edycja: Edycja: Edycja: 88 dzięki boothby .
źródło
a=0.
->a=0
PHP, 59 znaków
źródło
echo ...;
zamiastfwrite(STDOUT,...);
.<?for(;;)echo~str_pad(ƒõ,22+20*sin($a+=.1),ß,usleep(5e4));
~ƒõ
jest po prostu skrótem"|\n"
.C64 BASIC, 64 znaki PETSCII
W systemie PAL C64
For i=0 to 2:next i
cykle trwają ok. 0,05 sekundy, więc czas opóźnienia jest przestrzegany.źródło
JavaScript
887678 znakówNa podstawie kodu Kendall Frey.
źródło
i
, więc drukuje linię prostą zamiast fali.C - 86 + 3 znaków
Dzięki Shiona i Josh za edycję
i; main (j) {for (j = 0; j ++ <20 + sin (i / 10.) * 20;) putchar (32); puts ("|"); usleep (50000); i ++; main () ;}float i; main (j) {for (j = 0; j ++ <20 + sin (i) * 20;) putchar (32); puts ("|"); usleep (50000); i + =. 1; main ( );}Skompilowany z
-lm
flagą, zakładam, że muszę dodać 3 znakiźródło
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);}
. Opiera się to na założeniu, że program jest wywoływany z 0 argumentami.Ti-Basic, 33 bajty
Istnieją następujące zastrzeżenia :
Ze względu na ograniczenie ekranu 16 x 8 ta fala sinusoidalna ma tylko amplitudę 7 (okres 60 jest nadal utrzymywany)
Ze względu na brak łatwego dostępu do
|
znaku,!
zamiast niego jest używanyZ powodu braku dokładnego timera systemowego opóźnienie nie jest realizowane. Prędkość biegu wydaje się jednak w przybliżeniu poprawna.
źródło
JavaScript - 88
Jestem pewien, że ktoś może wymyślić coś naprawdę sprytnego.
źródło
J -
103,58,57, 54Dzięki wspaniałym facetom z IRC
W słowach od prawej do lewej brzmi: zaczynając od 0 nieskończonych czasów: sin, dodaj 1, pomnóż przez 20, piętro, dołącz 1 (tak, że stanie się tablicą 2 elementów), skopiuj dwa bajty „|” odpowiednio, wydrukuj go, poczekaj 0,05s i dodaj 0,1
Zamiast nieskończonej pętli możemy użyć rekurencji, uratowałby 2 znaki, ale po pewnej liczbie iteracji spowoduje również błąd stosu
Gdzie
$:
jest połączenie rekurencyjne.źródło
(+2*(%20)6!:3@[2:1!:2~' |'#~1,~[:<.20*1+1&o.)^:_]0
. Tym razem wersja rekurencyjna oszczędza tylko 1 znak,$:@(+2*(%20)6!:3@[2:1!:2~' |'#~1,~[:<.20*1+1&o.)0
choć wydaje się, że trwa dłużej, zanim się wyczerpie.Haskell - 75
Niestety, nie mogłem zmusić programu do wstrzymania 50 ms bez podwojenia mojej liczby znaków, więc po prostu zalewa konsolę, ale generuje falę sinusoidalną.
Oto pełny kod z pauzą (138 znaków z nowymi liniami):
źródło
20+20*sin x
się zakwalifikować.Perl 6: 46 znaków
Stwórz nieskończony, leniwy zakres, używając
0,0.1 ... *
pętli.say
zwracaBool::True
liczbę, która jest pomnożona jako 1, w ten sposób mogę zachować ją w pojedynczej instrukcji.źródło
sleep
i.05
muszę się rozdzielić. Ale zastanawiam się, czy przestrzeń międzysay
i' '
jest obowiązkowa?say' '
One można użyć,say(' ')
ale w tym przypadku jest to 1 znak dodatkowy ...fugly Javascript - 77
a jeśli zrobimy to w przeglądarce Firefox - 73
a jeśli jesteśmy okropni - 67
źródło
Scala,
92,89, 87źródło
(20+20*math.sin(i*.1))
zmniejsza go o 1 znak, zakładając, że jest to poprawna składnia (nie mam doświadczenia ze Scalą)Python 3, 103
Głupi frikk'n import ...
Zamiast „uśpienia” ta implementacja miesza w procesorze, ponieważ python ułatwia uzyskanie zmiennoprzecinkowego zegara procesora niż zegara ściennego. To podejście nie przebije frioli , ale jest fajne, więc zostawiam to.
źródło
DO#
[152] Znaki
Nie mogłem uzyskać istniejącej odpowiedzi w języku C # na Run i nie mogłem głosować, ponieważ nie mam wystarczającej reputacji
brakowało kilku
{
i brakowało)
po deklaracji For Loop.Myślę, że wariancja w wyglądzie fali podczas jej przebiegu wynika z tego, w jaki sposób próbujemy wyświetlić tę falę.
jeśli nie liczymy przestrzeni nazw i deklaracji metody, wówczas będzie to [104] znaków dla działającej wersji
źródło
VB
[236][178]nie jestem pewien, jak byś policzył zakładki, właśnie wziąłem obliczenie z Notepadd ++, zanim wkleiłem tutaj. nowe linie są obowiązkowe, prawdopodobnie dlatego nikt nie lubi używać go do gry w golfa.
źródło
DO#
The Magic Line [91] Postacie
Program roboczy poniżej. [148] Postacie
źródło
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)
czy robię coś źle?Bash + bc (do wykonania matematyki), 80
źródło
TI-BASIC, 30 bajtów
Małe ulepszenie w stosunku do drugiej odpowiedzi, kosztem pewnej dokładności. Zauważ, że TI-Basic technicznie ma | postać, ale musisz przenieść ją przez komputer lub użyć programu asemblera, aby uzyskać do niej dostęp.
źródło
.03π
może być.1
, który wciąż znajduje się w wymaganym przedziale czasowym.Julia - 68
Edycja: dzięki ML i asowi.
Cóż, nie może konkurować z APL, ale oto moja próba.
Wynik:
źródło
.05
zamiast0.05
wsleep
?i=0;while 0<1;println(" "^int(20sin(.1i)+20)*"|");i+=1;sleep(.05)end
———sin(i/10)*20
równa się20sin(.1i)
MATLAB, 81 bajtów
I nadużywany fakt, że
i
zawsze jest zainicjowany w MATLAB-ie, co oznaczało, że mogę umieścićfprintf
wwhile
rachunku bez inicjowaniai
pierwszy. Oznacza to, że program najpierw wyświetla pusty wiersz, ale myślę, że nie jest to zabronione w specyfikacji.Ponadto narusza to fakt, że Matlab zignoruje większość znaków kontrolnych ASCII, wypisując spację zamiast NULL (również dla pierwszego pustego wiersza).
źródło
F # -
90797776Oto rozwiązanie wykorzystujące rekurencję
Prawdopodobnie można by go jeszcze ulepszyć.
źródło
AutoHotkey 176
Uruchom skrypt. Otwiera Notatnik i drukuje znaki. Naciśnij klawisz Esc w dowolnym momencie, aby wyjść.
źródło
Clojure, 121
Krótka wersja:
Ładna wersja:
Okres wynosi 64 lata.
Wpisz to
lein repl
lub zapisz w plikusin.clj
i uruchom zlein exec sin.clj
(wymaga wtyczki lein-exec).źródło