Drukuj falę sinusoidalną (pionowo)


42

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.


1
Amplituda szczytowa, amplituda międzyszczytowa czy amplituda pierwiastka kwadratowego?
DavidC

Szczytowa amplituda.
ace_HongKongIndependence

1
Czy można narysować falę tylko | s bez spacji?
Gelatin

1
Wszystkie odpowiedzi są jeszcze nieprawidłowe. Zatrzymują się także dla SIGKILL nie tylko dla SIGINT.
Max Ried

1
@Max Ried dobrze, zmienię to na „powinno trwać wiecznie, chyba że zostanie inaczej przerwane”.
ace_HongKongIndependence

Odpowiedzi:


12

APL (35)

(Tak, mieści się w 35 bajtach, oto 1-bajtowe kodowanie APL )

{∇⍵+⌈⎕DL.05⊣⎕←'|'↑⍨-21+⌈20×1○⍵×.1}1

Wyjaśnienie:

  • {... }1: wywołaj funkcję z 1 na początku
  • 1○⍵×.1: wystarczająco blisko, by rząd mógł to zrobić sin(⍵×π÷30). ( 1○jest sin).
  • -21+⌈20: normalizuj do zakresu 1..40i neguj
  • '|'↑⍨: weź ostatnie Nznaki z ciągu '|'(co daje ciąg spacji z |na końcu
  • ⎕←: display
  • ⌈⎕DL.05: poczekaj 50 ms i wróć 1. ( ⎕DLzwraca czas, który faktycznie czekał, który będzie bliski 0.05, zaokrąglenie tej wartości w górę daje 1).
  • ∇⍵+: dodaj ten numer ( 1) i ponownie uruchom funkcję.

2
Cholera ... Myślałem, że funkcje trygonometryczne plus opóźnienie czasowe was
wykluczą

2
Oto 33 znak:{⎕←'|'↑⍨-⌈20×1+1○⍵⋄∇.1+⍵⊣⎕DL.05}0
Tobia

3
@ace LOL. Powinieneś sprawdzić APL, to nie jest nowy język. Jest bardzo stary i jest używany w dużych systemach od dziesięcioleci. Jest dość wyjątkowy w porównaniu z czymkolwiek innym. Symbole IMHO sprawiają, że jest znacznie bardziej czytelny, że pochodne tylko ASCII (J)
Tobia

22

DO, 74 73 70 69 67 znaków

67 postaci z wieloma dobrymi pomysłami @ugoren i innych:

i;main(j){main(poll(printf("%*c|\n",j=21+sin(i++*.1)*20,0),0,50));}

69-znakowe rozwiązanie z pętlą while zamiast rekurencji:

i;main(j){while(printf("%*c|\n",j=21+sin(i++*.1)*20,0))poll(0,0,50);}

Zbliża się terytorium perla. :)


1
Zostało to zainspirowane własną odpowiedzią C na @ ace.
treamur

2
Myślę, że możesz użyć 5E4zamiast 50000.
musiphil

2
Myślę, że możesz użyć * .1 zamiast / 10.
moala

1
@musiphil, myślałem również o użyciu 5E4, ale okazuje się, że to nie działa: bez pokazywania usleep()prototypu kompilatora musiałbyś jawnie zarzucić 5E4.
treamur

2
Można wyciąć dwa kolejne znaki przesuwając przypisanie do j do printf, tak: printf("%*s\n",j=21+sin(i++*.1)*20,"|"). Wynikowy typ jest nadal int, więc jest to prawidłowy argument szerokości pola.
Art.

12

Mathematica 121 104 80 67 64

n=1;While[0<1,Spacer[70 Sin[n Pi/32]+70]~Print~"|";Pause@.05; n++]

sinus


pytanie mówi, żeby nie używać matematyki do kreślenia. czy to jakoś się różni?
Malachi

13
@Malachi Tak. To używa matematyki do jej obliczenia, tak jak każda inna odpowiedź. Używanie matematyki do kreślenia oznaczałoby mówienie matematyce do kreślenia x=20*sin(pi*y/30)+20lub czegoś podobnego.
Justin

ok rozumiem, co mówisz, dziękuję za wyjaśnienie
Malachi

1
A oto wersja 58 Do[Spacer[70*Sin[n*Pi/32]+70]~Print~"|";Pause@.05,{n,18!}]
znaków

1
Nie jestem użytkownikiem Mathematica, ale myślę, że możesz zmienić 1 == 1na, 0 < 1aby zmniejszyć 1 znak.
KPCh

11

Perl, 48 (68)

Wersja uśpienia GNU: 48

print$"x(25+20*sin).'|
';$_+=.1;`sleep .05`;do$0

Międzyplatformowy: 68

use Time::HiRes"sleep";print$"x(25+20*sin).'|
';$_+=.1;sleep.05;do$0

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.


Zapisałem to jako plik test.pli uruchomiłem perl ./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.)
ace_HongKongIndependence

Myślę, że gdybym zmienił przyrost z .105 na .1, pobiłbym ruby ​​przy 56 znakach!
KevinColyer

@primo - mój sen uśpienia robi czasy krótsze niż 1 sekunda ...
KevinColyer

man sleepunsigned int sleep(unsigned int seconds);. Nie spowoduje to błędu, ale rzeczywisty przedział uśpienia wynosi zero. Kilka propozycji skrócenia twojego: zmień $dna $_, a następnie użyj (25+20*sin)i zmień \nna dosłowny znak nowej linii.
primo

2
@primo man 1 sleepw 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.
ace_HongKongIndependence

11

Perl - 64 (lub 60) bajtów

Następujące polecenie korzysta z polecenia powłoki specyficznego dla systemu Windows:

`sleep/m50`,print$"x(20.5-$_*(32-abs)/12.8),'|
'for-32..31;do$0

W poniższym przykładzie użyto polecenia powłoki specyficznego dla GNU / Linux:

`sleep .05`,print$"x(20.5-$_*(32-abs)/12.8),'|
'for-32..31;do$0

Oba mają 64 bajty.

  • Okres wynosi 64 lata.
  • Maksymalna amplituda wynosi dokładnie 20.
  • Krzywa jest idealnie symetryczna.
  • Każdy okres jest identyczny.
                    |
                      |
                         |
                           |
                             |
                               |
                                |
                                  |
                                   |
                                    |
                                     |
                                      |
                                       |
                                       |
                                        |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                   |
                                  |
                                |
                               |
                             |
                           |
                         |
                      |
                    |
                  |
               |
             |
           |
         |
        |
      |
     |
    |
   |
  |
 |
 |
|
|
|
|
|
 |
 |
  |
   |
    |
     |
      |
        |
         |
           |
             |
               |
                  |
                    |
                      |
                         |
                           |
                             |
                               |
                                |
                                  |
                                   |
                                    |
                                     |
                                      |
                                       |
                                       |
                                        |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                   |
                                  |
                                |
                               |
                             |
                           |
                         |
                      |
                    |
                  |
               |
             |
           |
         |
        |
      |
     |
    |
   |
  |
 |
 |
|
|
|
|
|
 |
 |
  |
   |
    |
     |
      |
        |
         |
           |
             |
               |
                  |
                    |

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:

`sleep/m50`,print$"x(20-$_*(31-abs)/12),'|
'for-31..30;do$0

To nie jest fala sinusoidalna; to po prostu parabolas (jeśli dobrze odczytam twój kod). (Jeśli możesz to przedstawić za pomocą fali sinusoidalnej, bardzo chciałbym zobaczyć tę funkcję).
Justin

Sinus jest formułą, jeśli powielasz formułę, nadal jest to fala sinusoidalna. i jest to prawdopodobnie wariant Sine w pewnym sensie.
Malachi

8

Rubin 56

i=0
loop{puts" "*(20*Math.sin(i+=0.1)+20)+?|;sleep 0.05}

Czy dozwolone jest zastępowanie putów p?
Slicedpan

1
@Slicedpan Myślę, że nie zrobię tego, ponieważ jest to wyzwanie, aby coś narysować. pdoda podwójne cudzysłowy wokół każdej linii i zmieni „rysowanie”.
daniero

7

Befunge 98 - 103 100

:1g:02p' \k:02gk,'|,a,$ff*:*8*kz1+:'<\`*
468:<=?ABDEFGGGHGGGFEDBA?=<:86420.,+)'&$#"!!! !!!"#$&')+,.02

Pozdrawiam 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*naciska 8*225**2( 405000) i kzuruchamia 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ć:

:::f`!4*jf2*-:::*:*9*\:*aa*:*:01p*-01g9*/a2*+\$\f`!4*j01-*b2*+:01p' \k:01gk,$'|,a,ff*:*8*kz1+:f3*`!3*j$e-

Próbowałem skrócić mój program i zdecydowałem się przyjrzeć serii Taylor dla cosinusa (sinus jest trudniejszy do obliczenia). Zmieniłem, xaby pi * x / 30dopasować do wymaganego tutaj okresu, a następnie pomnożyłem przez, 20aby 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.

:f`!4*jf2*-

sprawdza, czy wartości szeregu Taylora stają się niedokładne (około x = 15). Jeśli tak, to x - 30zamiast tego obliczam serię Taylor x.

:::*:*9*\:*aa*:*:01p*-01g9*/a2*+

to moja implementacja serii Taylor w x = 0, kiedy xjest wartością na stosie.

\$\f`!4*j01-* 

neguje wartość szeregu Taylora, jeśli szereg Taylora wymagał korekty.

b2*+

uczynić falę cosinus dodatnią; w przeciwnym razie drukowanie nie działałoby.

:01p' \k:01gk,$'|,a,

drukuje falę

ff*:*8*kz1+

prowizoryczny odczekaj 50 milisekund, a następnie zwiększaj x

:f3*`!3*j$e-

Jeśli xjest większy niż 45, zmień go na -14 (ponownie, regulacja błędu serii Taylor).


To jest dokładnie taka odpowiedź, na którą czekam, mam nadzieję, że możesz
zagrać w

1
Tam! Z powodzeniem zmniejszyłem długość kodu o -5 znaków! I wciąż jest miejsce na ulepszenia!
Justin

@Quincunx moje rozwiązanie perla również nie korzysta z żadnych wbudowanych funkcji trig;)
primo

6

Pyton, 108,93,90,89, 88

import math,time
a=0
while 1:print" "*int(20+20*math.sin(a))+"|";time.sleep(.05);a+=.1

Teraz z nieskończonym przewijaniem :)

Edycja: ok, 90. Wystarczy?

Edycja: Edycja: nie, 89.

Edycja: Edycja: Edycja: 88 dzięki boothby .


Przepraszam, jeśli nie wyjaśniłem pytania - twój program nie powinien się zakończyć i powinien ciągle przewijać falę w dół (z wyjątkiem SIGINT)
ace_HongKongIndependence

1
a=0.-> a=0
przenosi

5

PHP, 59 znaków

<?for(;;usleep(5e4))echo str_pad('',22+20*sin($a+=.1)).~ƒõ;

1
Możesz zaoszczędzić sobie trochę bajtów, używając echo ...;zamiast fwrite(STDOUT,...);.
primo

W każdym razie ma to sens, gdy dzwonisz z linii poleceń. 10 znaków zapisanych - dzięki primo.
Alex Barrett

1
58:<?for(;;)echo~str_pad(ƒõ,22+20*sin($a+=.1),ß,usleep(5e4));
primo

Bardzo dobrze. Nie będę edytować mojej odpowiedzi z tymi zmianami, powinieneś opublikować jako własną.
Alex Barrett

1
@ace musi być zapisany z kodowaniem ansi. ideone automatycznie konwertuje wszystko do utf-8, co psuje się. ~ƒõjest po prostu skrótem "|\n".
primo

4

C64 BASIC, 64 znaki PETSCII

wprowadź opis zdjęcia tutaj

W systemie PAL C64 For i=0 to 2:next icykle trwają ok. 0,05 sekundy, więc czas opóźnienia jest przestrzegany.


3

JavaScript 88 76 78 znaków

setInterval('console.log(Array(Math.sin(i++/10)*20+21|0).join(" ")+"|")',i=50)

Na podstawie kodu Kendall Frey.


Nigdy nie inicjujesz i, więc drukuje linię prostą zamiast fali.
gilly3

Mój błąd ... Prawdopodobnie zadziałało, ponieważ uruchomiłem skrypt Kendalla już w mojej konsoli, więc zostałem zainicjowany już dla mnie.
joeytje50

3

C - 86 + 3 znaków

Dzięki Shiona i Josh za edycję

i;main(j){for(;j++<21+sin(i*.1)*20;)putchar(32);puts("|");usleep(50000);i++;main(1);}

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 -lmflagą, zakładam, że muszę dodać 3 znaki


1
Czy zadziałałoby, gdybyś zrobił int i po prostu podzielił go przez 10,0 (lub 9,9, aby uratować znak?) W ramach wezwania do sin ()? i;main(j){for(j=0;j++<20+sin(i/10.0)*20;)putchar(32);puts("|");usleep(50000);i++;main();}
shiona

Możesz zmniejszyć rozmiar do około 76 znaków, używając printf () w celu zastąpienia pętli for:printf("%*s\n",(int)(21+sin(i++/10.)*20),"|")
treamur

1
Hmm ... Czułbym się naprawdę winny, gdybym użył tego pomysłu w swojej odpowiedzi, szczególnie gdy to moje własne pytanie ... Czy zastanowiłbyś się nad odpowiedzią samemu?
ace_HongKongIndependence

Ok zrobi sie. Dzięki. :)
treamur

1
Można zgolić dwóch kolejnych znaków, jeśli usunąć 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.
Josh

3

Ti-Basic, 33 bajty

While 1:Output(8,int(7sin(X)+8),"!":Disp "":π/30+X→X:End

Istnieją następujące zastrzeżenia :

  1. Ze względu na ograniczenie ekranu 16 x 8 ta fala sinusoidalna ma tylko amplitudę 7 (okres 60 jest nadal utrzymywany)

  2. Ze względu na brak łatwego dostępu do |znaku, !zamiast niego jest używany

  3. Z powodu braku dokładnego timera systemowego opóźnienie nie jest realizowane. Prędkość biegu wydaje się jednak w przybliżeniu poprawna.


1
Heh, ponieważ TI-BASIC jest liczony jako jedno- / dwubajtowe tokeny, w rzeczywistości jest to 33 bajty (a nie „56 znaków”), więc powinien wygrać wyzwanie!
MI Wright,

Z wyjątkiem kwestii amplitudy ...
lirtosiast

Cóż, tak, ale bajki są w porządku.
MI Wright,

2

JavaScript - 88

setInterval(function(){console.log(Array(Math.sin(i++/10)*20+21|0).join(" ")+"|")},i=50)

Jestem pewien, że ktoś może wymyślić coś naprawdę sprytnego.


2

J - 103,58,57, 54

Dzięki wspaniałym facetom z IRC

(0.1&+[6!:3@]&0.05[2:1!:2~' |'#~1,~[:<.20*1+1&o.)^:_]0

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

($:+&0.1[6!:3@]&0.05[2:1!:2~' |'#~1,~[:<.20*1+1&o.)0  

Gdzie $:jest połączenie rekurencyjne.


Czy miałbyś coś przeciwko dodaniu małego wyjaśnienia, aby osoby niezaznajomione ze składnią J (jak ja) mogły również zrozumieć twoją odpowiedź?
ace_HongKongIndependence

Jest to możliwe, aby skrócić do 50 znaków przez rozdrażnienie o strukturze z pociągu: (+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.)0choć wydaje się, że trwa dłużej, zanim się wyczerpie.
algorytmshark

2

Haskell - 75

main=putStr$concat["|\n"++take(floor$20+20*sin x)(repeat ' ')|x<-[0,0.1..]]

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):

import GHC.Conc
import Control.Monad
main=mapM_(\a->putStr a>>threadDelay 50000)(["|\n"++take(floor$20+20*sin x)(repeat ' ')|x<-[0,0.1..]])

2
Wstrzymanie było jednym z wymagań. Czy możesz również opublikować kod z pauzą?
Justin

Ok, opublikowałem to. Chciałbym, aby Haskell pozwolił ci wstrzymać kod bez importowania.
Zaq

Przez amplitudę rozumiem amplitudę szczytową, tj. Dwukrotność amplitudy bieżącego programu. Zamiast tego możesz go zmienić, aby 20+20*sin xsię zakwalifikować.
ace_HongKongIndependence

Oh, pewnie. Chyba źle zinterpretowałem tę część pytania.
Zaq

2

Perl 6: 46 znaków

sleep .05*say ' 'x(25+20*.sin),'|'for 0,.1...*

Stwórz nieskończony, leniwy zakres, używając 0,0.1 ... *pętli. sayzwraca Bool::Trueliczbę, która jest pomnożona jako 1, w ten sposób mogę zachować ją w pojedynczej instrukcji.


Rozumiem dlaczego sleepi .05muszę się rozdzielić. Ale zastanawiam się, czy przestrzeń między sayi ' 'jest obowiązkowa?
Matthias

Tak: s Daje błąd „2 terminy z rzędu” dla say' 'One można użyć, say(' ')ale w tym przypadku jest to 1 znak dodatkowy ...
Ayiko

1
@Matthias: W Perlu 6 listy nie muszą przyjmować argumentów, mieć spacji po nich lub używać nawiasów. Nie jest to język przeznaczony do golfa kodowego, w przeciwieństwie do Perla 5 (ale zawiera wiele fajnych wbudowanych funkcji, więc jest użyteczny).
Konrad Borowski

@xfix Dziękujemy za wyjaśnienie. Podoba mi się ten język, ale nie przyjrzałem się mu dokładnie, ponieważ wciąż nie mogę go używać w projekcie roboczym. Zawsze jednak planuję napisać kilka skryptów w Perlu 6. @ Ayiko, doceniam twoje posty z Perla 6 :-)
Matthias

2

fugly Javascript - 77

i=setInterval("console.log(Array(Math.sin(i+=.1)*20+20|0).join(' ')+'|')",50)

a jeśli zrobimy to w przeglądarce Firefox - 73

i=setInterval("console.log(' '.repeat(Math.sin(i+=.1)*20+20|0)+'|');",50)

a jeśli jesteśmy okropni - 67

i=setInterval("throw(' '.repeat(Math.sin(i+=.1)*20+20|0)+'|');",50)

1

Scala, 92,89, 87

def f(i:Int){println(" "*(20+20*math.sin(i*.1)).toInt+"|");Thread sleep 50;f(i+1)};f(1)

(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ą)
ace_HongKongIndependence

Dzięki, ale właśnie to odkryłem :)
ValarDohaeris

1

Python 3, 103

Głupi frikk'n import ...

import time,math
t=0
while 1:t+=(.05+t<time.clock())and(print(' '*int(20+20*math.cos(t*1.9))+'|')or.05)

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.


1

DO#

[152] Znaki

namespace System{class P{static void Main(){for(var i=0d;;){Console.Write("{0,"+(int)(40+20*Math.Sin(i+=.1))+"}\n",'|');Threading.Thread.Sleep(50);}}}}

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

for(var i=0d;;){Console.Write("{0,"+(int)(40+20*Math.Sin(i+=.1))+"}\n",'|');Threading.Thread.Sleep(50);}

Druga odpowiedź w języku C # działa na gmcs. Na początku się nie kompiluje, ale myślę, że dzieje się tak, ponieważ w kodzie źródłowym jest jakiś znak, który nie może zostać wydrukowany. Po wpisaniu go ponownie w pustym pliku kompilacja się powiodła.
ace_HongKongIndependence

Kompilatory mogą być wybredne, co?
Malachi

1

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.

Module Module1
Sub Main()
Dim i
While True
Console.WriteLine("{0:" & (40 + 20 * Math.Sin(i = i + 0.1)) & "}", "|")
Threading.Thread.Sleep(50)
End While
End Sub
End Module

1

DO#

The Magic Line [91] Postacie

for(var i=0d;;Console.Write("{0,"+(int)(40+20*Math.Sin(i+=.1))+"}\n",'|'))Thread.Sleep(50);

Program roboczy poniżej. [148] Postacie

namespace System{class P{static void Main(){for(var i=0d;;Console.Write("{0,"+(int)(40+20*Math.Sin(i+=.1))+"}\n",'|'))Threading.Thread.Sleep(50);}}}

Przepraszam, jeśli nie wyjaśniłem pytania - twój program nie powinien się zakończyć i powinien ciągle przewijać falę w dół (z wyjątkiem SIGINT). Dodaj także liczbę znaków.
ace_HongKongIndependence

Przepraszam, zapomniałem o tym kawałku. Naprawiono teraz.
John ClearZ

Myślę, że możesz stracić „Thread.Sleep” i zmienić „float” na var :) 117 znaków. - Niestety nie widziałem czasu oczekiwania. Teraz 133 znaki. 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);}}
Medeni Baykal

1
Nie mogę zmusić go do kompilacji w VS2010, Threading.Thread.Sleep(50)czy robię coś źle?
Malachi

1
Udało mi się go uruchomić, ale musiałem dodać kilka wsporników i średników i nie wygląda to tak samo w każdym okresie
Malachi

1

Bash + bc (do wykonania matematyki), 80

$ for((;;i++)){ printf "%$(bc -l<<<"a=20*s($i/10);scale=0;a/1+20")s|
";sleep .05;}
                |
                 |
                   |
                     |
                       |
                         |
                           |
                            |
                              |
                               |
                                |
                                 |
                                  |
                                   |
                                   |
                                   |
                                   |
                                   |
                                   |

1

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.

While 1
Output(8,int(8+7sin(Ans)),":
Disp "
.03π+Ans
End

Woah, nie widziałem, ile lat miało to wyzwanie! Chciałem spróbować jeszcze bardziej zagrać w golfa (co jest zdecydowanie możliwe), ale naprawdę nie jest tego warte ...
MI Wright,

Nawiasem mówiąc, .03πmoże być .1, który wciąż znajduje się w wymaganym przedziale czasowym.
lirtosiast

Niezły chwyt, dzięki! Czy widzisz sposób, w jaki mógłbym zagrać w komendę wyjściową? Ponadto, ponieważ mam CSE, mógłbym uzyskać odpowiednią amplitudę (ekran 26 znaków) kosztem kilku bajtów.
MI Wright,

Nie, polecenie wyjściowe wygląda dobrze - szkoda, że ​​Disp potrzebuje cytatu. Amplituda powinna w rzeczywistości wynosić 20 znaków, co czyni wymaganą szerokość ekranu 39. Tak więc działałoby to tylko na ekranie wykresu i nie ma na to krótkiej drogi.
lirtosiast

1

Julia - 68

Edycja: dzięki ML i asowi.

i=0;while 0<1;println(" "^int(20sin(.1i)+20)*"|");i+=1;sleep(.05)end

Cóż, nie może konkurować z APL, ale oto moja próba.

Wynik:

                    |
                      |
                        |
                          |
                            |
                              |
                               |
                                 |
                                  |
                                    |
                                     |
                                      |
                                       |
                                       |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                   |
                                  |
                                |
                              |
                             |
                           |
                         |
                       |
                     |
                   |
                 |
               |
             |
           |
         |
        |
      |
     |
    |
   |
  |
 |
|
|
|
|
|
 |
 |
  |
   |
     |
      |
       |
         |
           |
             |
              |
                |
                  |
                    |
                      |
                        |
                          |
                            |
                              |
                                |
                                 |
                                   |
                                    |
                                     |
                                      |
                                       |
                                       |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                   |
                                 |
                                |
                              |
                            |
                          |
                        |
                      |
                    |
                  |
                 |
               |
             |
           |
         |
       |
      |
     |
   |
  |
  |
 |
|
|
|
|
|
 |
  |
  |
    |
     |
      |
        |
         |
           |
             |
               |
                 |
                   |
                     |
                       |
                         |
                           |
                            |
                              |
                                |
                                 |
                                   |
                                    |
                                     |
                                      |
                                       |
                                       |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                  |
                                 |
                               |
                              |
                            |
                          |
                        |
                      |
                    |
                  |
                |
              |
            |
           |
         |
       |
      |
    |
   |
  |
 |
 |
|
|
|
|
|
 |
  |
   |
    |
     |
      |
        |
          |
           |
             |
               |
                 |
                   |
                     |
                       |
                         |
                           |
                             |
                              |
                                |
                                  |
                                   |
                                    |
                                     |
                                      |
                                       |
                                        |
                                        |
                                        |
                                        |
                                        |
                                       |
                                       |
                                      |
                                     |
                                    |
                                  |
                                 |
                               |
                             |
                            |
                          |
                        |
                      |
                    |
                  |
                |
              |
            |
          |
         |
       |
      |
    |
   |
  |
 |
 |
|
|
|
|
 |
 |
  |
   |
    |
     |
       |
        |
          |
            |
             |
               |
                 |
                   |
                     |
                       |
                         |
                           |
                             |
                               |
                                |
                                  |
                                   |
                                    |
                                      |
                                      |
                                       |
                                        |
                                        |
                                        |
                                        |
                                        |
                                       |
                                      |
                                      |
                                     |
                                   |
                                  |
                                |
                               |
                             |
                           |
                         |
                       |
                     |
                   |

1
Nie znam Julii, ale czy można używać .05zamiast 0.05w sleep?
ace_HongKongIndependence

Aktualnie tak! Dzięki
KPCh,

Obetnij do 68 znaków : i=0;while 0<1;println(" "^int(20sin(.1i)+20)*"|");i+=1;sleep(.05)end——— sin(i/10)*20równa się20sin(.1i)
ML

Nie znam Julii, ale czy zamiast tego możesz użyć pętli for iterującej wszystkie liczby naturalne?
lirtosiast

1

MATLAB, 81 bajtów

t=0;while(fprintf('%s\n',i))i=[];t=t+1;i(fix(21+20*sind(t*6)))='|';pause(.05);end

I nadużywany fakt, że izawsze jest zainicjowany w MATLAB-ie, co oznaczało, że mogę umieścić fprintfw whilerachunku bez inicjowania ipierwszy. 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).


„Nadużyłem faktu, że zawsze mam inicjalizację w MATLAB, co oznaczało, że mogłem umieścić fprintf w instrukcji while bez inicjowania i”. Naprawdę sprytne! +1!
Stewie Griffin,

0

F # - 90 79 77 76

Oto rozwiązanie wykorzystujące rekurencję

let rec f x=printfn"%*c"(int(20.*sin x)+21)'|';Thread.Sleep 50;f(x+0.1)
f 0.

Prawdopodobnie można by go jeszcze ulepszyć.


Nie wiedząc nic o F #, zakładam, że Thread.Sleep oczekuje wartości w ms, więc możesz pozbyć się jednego z
zer

@ValarDohaeris Masz rację. Źle odczytałem wymagania.
pswg

0

AutoHotkey 176

SetKeyDelay,-1
run Notepad.exe
WinWaitActive, ahk_class Notepad
p:=0
loop
{
sleep 50
p+=Mod(Floor(A_index/40),2)?-1:1,t:=""
loop % p
t .= " "
sendinput % t "|`n"
}
esc::Exitapp

Uruchom skrypt. Otwiera Notatnik i drukuje znaki. Naciśnij klawisz Esc w dowolnym momencie, aby wyjść.


0

Clojure, 121

Krótka wersja:

(loop[a 0](println(clojure.string/join(repeat(int(+ 20 (* 20 (Math/sin a)))) " ")) \|)(Thread/sleep 50)(recur(+ a 0.1)))

Ładna wersja:

(loop [a 0]
  (println (clojure.string/join (repeat (int (+ 20 (* 20 (Math/sin a)))) " ")) \|)    
  (Thread/sleep 50)
  (recur(+ a 0.1)))

Okres wynosi 64 lata.

Wpisz to lein repllub zapisz w pliku sin.clji uruchom z lein exec sin.clj(wymaga wtyczki lein-exec).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.