tło
Lato na półkuli północnej się kończy, a wielu z nas tęskni za słońcem, plażami, falami oceanu ... To wyzwanie ma na celu rozweselić ich, przypominając im o morzu.
Wyzwanie
Oto morze:
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
** ****** ****** ****** ****** ****
Morze składa się z 5 razy tego wzoru fali:
**
****
*****
** **
** **
* *****
Pamiętaj, że wzór ma 16 znaków, a morze ma 5 razy więcej niż 80 znaków.
Które możesz wydrukować na terminalu za pomocą tego wiersza poleceń:
perl -e 'print " ** \n **** \n ***** \n ** ** \n ** ** \n* *****\n"'
Albo ten :
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"'
(Drugi powinien ułatwić uzyskanie dokładnego wzoru)
Twoim zadaniem jest wyświetlanie morza w terminalu i wyglądanie, jakby fale poruszały się w prawo: musi przesuwać się w prawo z prędkością 1 znaku na każde 100 ms (= 10 razy co sekundę). Po 80. kolumnie nie należy drukować żadnego znaku, ale gdy zniknie prawa fala, po lewej pojawia się nowa.
Oto przykład wyniku:
czas = 0,0 s
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
** ****** ****** ****** ****** ****
czas = 0,1s
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
*** ****** ****** ****** ****** ***
czas = 0,2 s
* ** ** ** ** *
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
**** ****** ****** ****** ****** **
czas = 0,3 s
** ** ** ** **
**** **** **** **** ****
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
***** ****** ****** ****** ****** *
czas = 0,4 s
** ** ** ** **
* **** **** **** **** ***
***** ***** ***** ***** *****
** ** ** ** ** ** ** ** ** **
** ** ** ** ** ** ** ** ** **
****** ****** ****** ****** ******
Oczywiście każde wyjście powinno zastąpić poprzednie.
Możesz uruchomić ten kod w terminalu unix, aby zobaczyć, jak powinien wyglądać z animacją:
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}'
(Należy pamiętać, że ten kod nie jest zbyt dobrze golfowany: właśnie uczyniłem go wystarczająco kompaktowym, aby można go było uruchomić w terminalu.)
Kryterium wygranej
To jest codegolf, więc wygrywa najkrótszy kod w bajtach.
Odpowiedzi:
MATL ,
4140 bajtówPrzykładowy przebieg:
Lub spróbuj w MATL Online! (rzeczywista prędkość może zależeć od obciążenia serwera).
Jak to działa
źródło
JavaScript (ES6) + HTML,
151143 + 10 =161153 bajtówźródło
a
?a
przechowuje wzorzec fali kodowany binarnie i jest obracany na każdej ramce. Tak więc nie można go zakodować na stałe: musi być przechowywany w zmiennej.HTML + CSS, 70 +
181175 = 245 bajtówPosługuje
text-shadow
,rtl
tekstowych i CSS klatek kluczowych animacji.źródło
C #
450444425417 bajtów399 bez,
using System.Linq;
ale jestem pewien, że to byłoby oszustwo ...Edycja: Zapisano 25 bajtów dzięki @Cyoce
Gra w golfa:
Nie golfowany:
źródło
(a)=>
. Iwhile(true)
może byćfor(;;)
s
lambda myślę, że można usunąć{}
ireturn
\r
zstring.Join
(przynajmniej w systemie Windows to działa, ale nie przetestowałem go za pomocą Mono). Możesz również zapisać 1 bajt, umieszczającp++
wfor
pętli w ten sposóbfor(;;p++)
if (p==16)...
), możesz również umieścić ją w nagłówku pętli for w ten sposóbfor(;;p=++p%16)
. Oszczędź jeszcze 1 bajt, deklarującp
w pętli (for(int p=0;;p=++p%16)
)V,
989773 bajtówDzięki @ nmjcman101 za oszczędność 24 bajtów!
Zawiera wiele materiałów niedrukowalnych, więc oto zrzut heksowy xxd:
Edytować
Używany
y$
zamiast<C-v>$y
Wiele zmian
{
i}
aby zaoszczędzić kilka bajtówò
zamiast rejestrów do tworzenia nieskończonej pętli (z jakiegoś powodu muszę dołączyćò
na końcu, aby to działało)*
na doleMini objaśnienie
Używam
<alt-n>
do tworzenia kopii ciągów. Na przykład<alt-5>*
(tak wyglądaµ5
) wykonuje5
kopie*
w trybie wstawiania. Okazało się, że jest to krótsze niż kopiowanie ciągu i używanie wyrażenia regularnego do wykonania niezbędnych zamian. Po utworzeniu jednej fali wklejam ją, aby utworzyć inne fale. Na koniec zapętlam rekurencyjnie, używającò
pętli nieskończonej (z opóźnieniem100ms
).Gif
Większość kodu jest poświęcona tworzeniu fali, więc wciąż próbuję to zagrać w golfa. Zauważ, że ten kod nie będzie działał na TIO, ponieważ TIO wysyła dane wyjściowe dopiero po zakończeniu wykonywania kodu. Oto gif (przepraszam za niską jakość, musiałem użyć strony internetowej, aby przekonwertować
.mov
na a.gif
, a także>_
, który pojawia się po prawej stronie, to ikona terminala w stacji dokującej mojego Maca):źródło
5j
(w kontekście$<C-V>5j
) może po prostu być}
, ap
po nim|
powinno być to,P
co naprawi statyczne*
w lewym dolnym rogu.qm[CODE]@mq@m
na końcu na justò[CODE]
. Kod międzyò
będzie się zapętlał do momentu złamania (podobnie jak twoje makro), a na końcu programuò
zostanie domyślnie zamknięty.Partia, 424 bajty
Niektóre linie mają końcowe spacje. Wymaga standardowego terminala 80-kolumnowego. Czas nie jest bardzo dokładny, ale jest najlepszy, co możesz zrobić w partii.
źródło
Rakieta
395374373367364351 bajtówUżywa zewnętrznej biblioteki do czyszczenia ekranu.
Edycja: Zapisano 21 bajtów, nie definiując
w
i nie wstawiając funkcji.Edycja2: Zapisano 1 bajt, usuwając spację.
Edit3: Zapisano 6 bajtów, zmieniając nazwę
loop
nap
, dzięki @rnso!Edycja4: Umieszczanie podłańcucha w let, oszczędzając 3 bajty.
Edycja5: Usuń
#lang racket
, która nie jest potrzebna w tłumaczu .Gra w golfa: 351 bajtów
Przewijanie (bez czyszczenia): 272 bajtów
Nie golfowany:
źródło
simplescreenrecorder
zavconv
do konwersji MP4 na gif.rotmul
faktycznymw
przyjęciu jako parametr.PowerShell 3.0,
183182173 bajtówWymaga PS 3.0 dla operatorów zmiany binarnej. Zmniejszony do 173 bajtów z pomocą AdmBorkBork !
źródło
.PadLeft
przenieś$o
deklarację do[convert]
wywołania i wyeliminuj cudzysłowy wokół liczb w-replace
operacjach. Sprowadza Cię do 175 -for(){0..5|%{("{0:D16}"-f+[Convert]::ToString(([uint16]$o=$w[$_]),2))*5-replace0,' '-replace1,'*'
+
w"{0:D16}"-f+[Convert]
? Bez niego to nie działa, ale nie mogę sobie wyobrazić, co robi.[convert]::ToString()
Zwraca ciąg znaków. Te+
siły oddanych do[int]
tak, że-f
odbiera odpowiedni typ parametru dlaD16
do pracy.+'1'
jak ważnej operacji arytmetycznej bez uprzedniego do składnika, odlewystring
doint
i zwraca wynik? Świetny Scott!Bash + coreutils,
172148 bajtów24 bajty zapisane dzięki @zeppelin , wielkie dzięki
Pierwsza linia dekompresuje następujący wzór złożony z 6 kolejnych fal:
Następnie pętla przesuwa okno o szerokości 80 bajtów przez ten wzór.
źródło
*> <> ,
251250251 bajtów (niekonkurujące)Uwaga:
"H;0["
ma mieć ASCII27
po[
.Wypróbuj tutaj! (ustaw opóźnienie na 0ms)
Nie mogę uwierzyć, że udało mi się to zrobić. Korzysta z instrukcji
I
iD
, które zwiększają lub zmniejszają wybrany stos. To pokazuje, że prawdopodobnie można to zrobić w czystej> <> (bez snu) lub w konkurencyjnej *> <> odpowiedzi, choć prawdopodobnie jest to o wiele trudniejsze.Wersja tłumacza online różni się po prostu, aby usunąć dane wyjściowe za pomocą znaku powrotu karetki.
To nie konkurują, ponieważ
I
,D
,C
orazR
instrukcje są młodsze niż wyzwanie. Jest to prawdopodobnie możliwe bez tych instrukcji, ale byłoby to bardzo trudne / długie.Edycja: Naprawdę udało mi się usunąć bajt, ale zauważyłem również, że źle zmierzyłem rozmiar, więc faktycznie uzyskałem bajt.
Zrobię co w mojej mocy, aby podzielić kroki i wyjaśnić, co się tutaj dzieje ...
Wyjaśnienie
Spis treści
Inicjalizacja
Tutaj budujemy 6 linii, które tworzą fale. Musimy powtórzyć każdy ciąg 5 razy, aby mieć prawidłową długość.
Zaczynamy od 6 z nich, po jednym dla każdej linii fali:
I po inicjalizacji wchodzimy do głównej pętli
09.
.Skopiuj bieżący stos 4 razy
Jest to prosta funkcja, która po prostu pobiera bieżący stos i kopiuje go 4 razy. Zatem „a” stałoby się „aaaaa”.
Kopiuj stos
Spowoduje to skopiowanie bieżącego stosu, dołączając kopię do bieżącego stosu.
Ustawiać
Pominie początkową
<
i odwróci pierwszą linię, aby stała sięl:&0v
w takiej kolejności, w jakiej jest wykonywana po<
zmianie kierunku adresu IP.Odtąd długość będzie określana jako
n
i0
jakoi
.Pętla
Sprzątać
Główna pętla
Tutaj kod działa wiecznie, nieustannie przerysowując fale pomiędzy 100 ms snu.
Ustawiać
Pętla
źródło
PHP, 128 bajtów
Nie można animować więcej niż jednej linii, ale przewija się.
Dodaj
,0
do tablicy pustą linię między iteracjami. Uruchom z-r
.źródło
Mathematica, 213 bajtów
Nie widzę żadnego sposobu gry w golfa na fali w Mathematica oprócz rozpoczęcia od listy ciągów dla każdej linii. Inicjuję
i
się0
i planuję zadanie, aby zwiększać je co0.1
sekundę. IDynamic
sojusznikiem wyświetli wynik z następujących powodów:StringRepeat
każda linia 5 razy.Characters
.RotateRight
każda lista znaków wedługi
.Grid
.źródło
C (unix),
231191 bajtówDziała to tylko w środowiskach unix. Proszę również usprawiedliwić fakt, że tryb uśpienia akceptuje tylko liczby całkowite ... więc w rzeczywistości opóźnia 1 sekundę między ramkami.
Wersja bez golfa:
Wersja golfowa:
źródło
JavaScript (ES6),
152147145 bajtówźródło
setInterval(a=>{...},100,6)
i 4 kolejnef+=" *"[[...][a]&1<<(i+x)%16]
.Perl 6,
140138137123120 120 bajtówStare rozwiązania:
źródło
Python 3,
240239230 bajtów-1 bajt dzięki @redstarcoder
-9 bajtów dzięki @PascalvKooten
źródło
print("\x1b[0;H")
działa również dla mnie dla -1 bajtów.' **'
ze' '*13+'**'
można mieć 1 wcięcia postać w czasie, nie ma potrzeby, aby była ona 4 znaków.Rakieta 295 bajtów
Nie golfowany:
Testowanie:
Wynik:
(Wyświetlanie pliku gif jest wolniejsze niż rzeczywiste wyjście).
źródło
Python 2,
207202 bajtówZwykle jestem programistą C #, więc to może nie być jeszcze gra w golfa ...
źródło
C #, 327 bajtów
Mniej więcej przeniesiona wersja mojego rozwiązania w Pythonie ...
źródło
Perl, 110 bajtów
Wymaga
-E
bez dodatkowych kosztów. Zawiera znaki niedrukowalne.Utwórz powyższe dane za pomocą poniższego odwracalnego zrzutu heksadecymalnego. Uruchom
xxd -d > sea.pl
w Linuksie lub kompatybilnym terminalu, wklej poniżej i naciśnij Ctrl+ d, a następnie uruchomperl -E "$(cat sea.pl)"
.Stosowanie
Aby ułatwić kopiowanie / wklejanie, skorzystaj z poniższych:
Wyjaśnienie
Dość proste rozwiązanie, które przechowuje falę na początku jako ciąg znaków, który jest
unpack
edytowany do postaci binarnej, każda sekcja jest pięciokrotna,0
s są konwertowane na spacje, a1
s są konwertowane na*
s. Teraz mamy cały ciąg, więc wchodzimy wredo
pętlę, która wypisuje cały ciąg, a następnie czekamy .1 sekundy i dla każdej linii w ciągu przesuwamy ostatni znak na początek łańcucha.źródło
Mathematica 171 bajtów
Sama fala to dane, więc przechowuję skompresowaną wersję całej fali w moim kodzie. Mogę zapisać pojedynczą falę o wiele bardziej zwartą, niż
\fð߀ᣀ恠耟
przy użyciu jej reprezentacji binarnej, ale narzut związany z rozpakowywaniem jest zbyt wysoki *.Oto kod:
Oto kod, którego użyłem do stworzenia skompresowanej wersji danych fali:
Oto kod, którego wolałbym używać do przechowywania skompresowanych powtarzających się danych binarnych, takich jak ta fala:
Jak widać, narzut związany z zamianą skompresowanych danych z powrotem na ciąg jest zbyt kosztowny dla tego konkretnego problemu, chociaż w ten sposób można zapisać jedną falę z 7 znakami UTF i 15 bajtami.
Oto kod określający sekwencję znaków UTF do przechowywania pojedynczej fali (jak wyżej).
źródło
Rubinowy
269217189185 bajtów-28 Bajtów dzięki @manatwork
-5 bajtów dzięki @ropata
Normalna
Grał w golfa
źródło
do … end
→{ … }
i usuń nowe linie po{
i przed}
; usuń spację międzysystem
i jej parametr; usuń,
ostatni element literału po tablicy;.each
→.map
i usuń spację między nim a jego blokiem kodu; usuń przestrzeń przedputs
;0..80
→0,80
(jest to również błąd, ponieważ wyrażenie powoduje, że łańcuch składa się z 81 znaków);p=p+1==16?0: p+1
→p=-~p%16
.do … end
→ słowo kluczowe{ … }
wciąż jest potrzebneloop
. To jest najkrótszy, jaki dostaję: pastebin.com/cg3gxnm4b=' '
(5 pustych spacji) u góry, a następnie zmieniając wyrażenie wyjściowe na' '*12+'** ', ' '*8+'**** ',b+'***** '+b,' ** ** '+b,' ** **'+b,'*'+b+b+'*****'
... (ale SE nie wyświetla poprawnie powtarzających się spacji w tym komentarzu!)HTML + JS + jQuery, 10 + 233 = 243 bajty
JavaScript przesuwa każdy wiersz o 1 i zmienia tekst co 100 ms.
źródło