Kontekst
To Walentynki. Jedyny, którego kiedykolwiek kochałeś, zostawił cię wczoraj dla tego faceta, którego zawsze uważała za „głupiego i nieciekawego” . W drodze do domu utknąłeś w korku, słuchasz starych piosenek w radiu, kołysze cię deszcz padający na przednią szybę. Po chwili w samochodzie czujesz się samotnie w swoim małym mieszkaniu i nie możesz myśleć o czymś innym niż ona. Nie ma światła, a ty patrzysz przez okno, pozwalając, by otaczała cię ciemność. Nie ma z kim porozmawiać, twoi przyjaciele odeszli dawno temu po ostrzeżeniu o tej nowej dziewczynie prześladującej twój umysł. Uruchamiasz komputer, ponieważ to jedyne, co możesz zrobić, otwórz przeglądarkę i umieść nową łamigłówkę programową w stosie wymiany, aby zmienić zdanie.
Wyzwanie
Napisz program w wybranym języku, symulując deszcz, który spadnie na ziemię. Dane wyjściowe mogą składać się ze znaków ASCII lub renderowane 2D / 3D. Kamera jest nieruchoma: patrzysz prosto na ziemię. Twój program musi zawierać animację, taką jak odświeżanie konsoli lub strony za każdym razem, gdy generujesz nową „ramkę”. To musi być realistyczne, wiem, że to trochę subiektywne, ale powiedzmy, że nie można wypełnić całej ziemi tylko jednym dużym spadkiem.
Wynik nie musi być obrazem, ale jeśli używasz tajemniczego języka, lepiej jest podać .gif, aby zilustrować, jak to wygląda w akcji (ale oczywiście nie wpłynie to na twój wynik, jeśli tego nie zrobisz).
Zasady
- Twój wynik to suma użytych bajtów
- -20 punktów, jeśli używasz kolorów
- -50, jeśli uda ci się wytworzyć wiatr
- Najniższy wynik wygrywa
Przykład
Bardzo prosty przykład tego, co należy renderować:
Mam nadzieję, że poradzisz sobie lepiej i spodoba ci się to wyzwanie.
Przepraszamy za mój angielski. Jeśli chcesz poprawić niektóre błędy, edytuj mój post
Tablica wyników
Jeśli Twojego nazwiska nie ma na liście, to dlatego, że próbę uznano za niezgodną z zasadami.
Tobia - APL - 35
j6m8 - Processing.js - 38
The Guy with The Hat - Processing - 42
ace - Processing - 74
kelunik - JS/CSS - 89
Riot - Bash - 91
Michael - JS/jQuery - 105
Florent - HTML/JS - 123
David Carraher - Mathematica - 134
Doorknob - HTML/JS - 150
undergroundmonorail - Python - 175
Gratulacje dla Tobii!
Odpowiedzi:
APL, 105 znaków / bajtów * - 20-50 = 35 punktów
*: Większość implementacji APL obsługuje pewną formę (starszego) jednobajtowego zestawu znaków, który mapuje symbole APL na górne 128 bajtów. Dlatego do celów gry w golfa program, który używa tylko znaków ASCII i symboli APL, może być oceniany jako znaki = bajty.
Przetestowałem to na najnowszej apl.js Nicka na Node.js w terminalu OS X. Ale nie użyłem niczego specyficznego dla jego dialektu, więc powinien działać na każdej nowoczesnej APL, która może być uruchomiona na terminalu ANSI i obsługuje d-funs
{...}
, przypisanie nici(a b)←...
i dojazdy⍨
, takie jak Dyalog dla Linuxa lub Raspberry PI ( z⎕IO←0
)W
␛
wierszu 1 znajduje się dosłowny znak zmiany znaczenia (1 bajt). Możesz wprowadzić go za Ctrl-V Escpomocą terminalu Linux lub Vima, lub podobno Alt-027w Windowsie. Ponadto nie mogłem znaleźć wiarygodnego sposobu na wykrycie rozmiaru terminala, więc możesz chcieć edytować liczbę wierszy i kolumn na końcu ostatniego wiersza.Bronię premii 50 przez to, że każda kropla deszczu przechodzi przez następujące kształty:
⍟∘.
które sprawiają wrażenie lekkiego wiatru w dół, biorąc pod uwagę, że scena jest oglądana z góry. W rzeczywistości, patrząc na gif poniżej, powinieneś odnieść wrażenie, że każda kropla delikatnie przesuwa się w dół i w lewo, zanim zniknie na ziemi.Wersja bez golfa:
Wynik:
APL, inny styl
Poza konkurencją.
Tutaj moim celem było sprawić wrażenie kropli deszczu opadających ukośnie i gromadzących się na ziemi, jednocześnie starając się utrzymać stałą liczbę widocznych kropli (spadających lub rozpryskanych) na stałym poziomie. Sztuką było stworzenie wielu nowych spadających kropli
/
w każdym cyklu i sprawienie, by spadające krople „zmiotły” wszelkie poplamione krople, przez które podróżują.Wynik dziwnie przypomina kod Matrix.
Wyjście
(szarpnięcie co 5s to zapętlenie gif)
źródło
Bash: 111 bajtów - 20 = 91 punktów!
Kontemplacyjna delikatna mżawka w twoim terminalu. Ustaw cyfry 819 i 41 odpowiednio dla różnych wysokości i szerokości.
Przyjemnym bonusem jest sposób, w jaki kursor porusza się po obszarze deszczowym.
Edycja: skrócenie ze 140 bajtów do 129 bajtów dzięki sugestiom @ manatwork. Druga edycja: skrócenie ze 129 bajtów do 111 bajtów dzięki sugestiom @ manatwork i @ Tobia oraz dodatkowej inspiracji - patrz komentarze.
(Uwaga: zrzut ekranu pokazuje poprzednią, mniej golfową wersję kodu, która jest funkcjonalnie identyczna)
źródło
echo
opcje; 2 znaki przy użyciu\e
zamiast\033
; 3 znaki przy użyciu:
zamiasttrue
; 5 znaków przy użyciu arytmetyczną oceny (((…))
)e='echo -ne \e';while :;do for i in {0..19};do for i in {0..40};do ((RANDOM<9))&&$e"[1;36m".||$e[1C;done;$e' ';done;$e[20A;done
.((RANDOM<9))
działa równie dobrze. Możesz także spróbować zmniejszyć kod, łącząc dwa for{0..19}
i{0..40}
w jeden for{0..819}
, używając czegoś takiego jak$((i%41))
wewnątrz.e='printf \e'
jest o 2 znaki krótszy niże='echo -ne \e'
!$e[C
Python, 312 bajtów - 50 (wiatr) = 262
Przykładowe dane wyjściowe (pętla 50 klatek):
Rzeczywisty pakiet zabaw jest znacznie szybszy, niż pozwalają na to gify.
źródło
R=__import__("random").randint
zamiastfrom random...
wiersza.HTML / JS, 170 znaków - 20 = 150 punktów
(sidenote: grałem dalej, przekazując ciąg
setInterval
,with
nazwy zmiennych automatyczny ID ... czuje się tak źle! dreszcze )Po prostu rysuje losowe niebieskie prostokąty.
HTML / JS, 309 znaków - 20-50 = 239 punktów
Teraz z wiatrem!
źródło
<canvas id=c /><script>d=400;with(c)width=height=d,t=getContext('2d');t.fillStyle='blue';setInterval("t.fillRect(Math.random()*d,Math.random()*d,5,5)",50)</script>
AAAHHH! Użyłemwith
! Czuję się brudniejszy niż przekazywanie struny dosetInterval
: pcanvas
nie może się automatycznie zamknąć, ale poza tym działa idealnie! (Również używanie automatycznych nazw zmiennych ID również wydaje się takie brudne: D)onload
. Muszę powiedzieć, że podoba mi się sposób @ Florenta na unikanie duplikatuMath.random()
canvas
w Chrome! Moja odpowiedź została opracowana / przetestowana w tej przeglądarce.JS + jQuery (172-20-50 = 102)
Skopiuj / Wklej ten wiersz w konsoli przeglądarki (zazwyczaj naciśnij klawisz F12):
Animowane deszcz czerwonych serc na Walentynki!
źródło
Matematyka
134 - 20 = 114
2D
3D
Kształt kropli deszczu jest tworzony za pomocą wykresu obrotu wokół osi Z.
Początkowo generowany jest deszcz dla regionu, który rozciąga się znacznie powyżej obszaru wyświetlania. Pojawienie się padającego deszczu uzyskuje się poprzez przesunięcie punktu widzenia w górę wzdłuż osi Z. (Jest to bardziej wydajne niż ponowne obliczanie pozycji każdej kropli deszczu).
Z wiatrem
Zrzuty deszczu powodują wiatr. Ale i tak tu jestem.
Niebieska podłoga właściwie ogranicza obszar widoku {x, y} do interesującego nas obszaru. Są pewne usterki, ale, no cóż,
Z góry
Najbliższe krople deszczu są przycięte, ale przeoczę to.
źródło
HTML / JavaScript,
156123 (143-20)Wersja z adnotacjami:
źródło
Smalltalk (Smalltalk / X)
z losowym wiatrem ;-)
wynik w widoku:
źródło
Przetwarzanie, 94-20 = 74
(Dodano nową linię dla czytelności.)
Kliknij tutaj, aby zobaczyć demo online.
źródło
Grzmotnąć
Nie jestem pewien, czy to powinien być golf golfowy, ponieważ nie ma ścisłych wymagań dotyczących tego, jak powinien wyglądać „deszcz”.
EDYCJA: Jeśli chcesz, aby kamera wyglądała na skierowaną prosto w dół, użyj tego:
źródło
while echo \ / / / / /;do echo / / / / /;done
(lub kilka innych z funkcją rekurencyjną, ale to szybko wysadzi stos). @undergroundmonorail Silny wiatr, przekątna w stosunku do kamery.while echo -e '\e[0;34m / / / / /';do echo / / / / /;done
i dostać go w dół do -13 z bonusami :)Python 2.7: 195-20 = 175
Jestem pewien, że można tu zrobić więcej, ale na teraz mam to:
Prześlę gif wyjścia, gdy będę pamiętać, jak to zrobić.
Działa to na systemie Linux. Wymiana
'clear'
z'cls'
marek to działa na windows, ale potem ANSI kolory nie działają i tracę premię.Mam tablicę 2D ciągów jednoznakowych, zainicjowanych do
. Co 0,05 sekundy wybierana jest jedna z nich losowo na
.
, a ekran jest przerysowany.from random import*
oszczędza dwa znakiimport os,time,random
i używarandom.randint()
dwa razy, chociaż nie jestem przekonany, że i tak to najlepszy sposób na wybranie komórki. Chciałem użyć,random.choice()
ale nie mogłem wymyślić sposobu na obejście niezmiennych ciągów, które nie zmarnowałyby więcej znaków niż uratował.źródło
l=[i[:]for i in[[' ']*100]*50]
, zgodnie z stackoverflow.com/a/6688361/1114687 .l=[[' ']*100]*50
, ale to po prostu tworzy 50 referencji do tej samej 100-elementowej listy, więc szukałem najkrótszego możliwego sposobu obejścia tego i znalazłem odpowiedź Przepełnienie stosu, do której link mam powyżej.132 + 27-20–50 = 89
JavaScript (132)
CSS (27)
Demo: http://jsfiddle.net/kelunik/5WC87/4/embedded/result/
źródło
Przetwarzanie, 62-20 = 42
Generuje niebieskie piksele na białym tle. Demonstracja w bardzo podobnym języku tutaj: https://www.khanacademy.org/cs/rain2/6172053633761280
źródło
Processing.js, 86-20 = 66
... ale także powoli zanika (ziemia naturalnie pochłania deszcz). Punkty za to?
Funkcje bonusowe obejmują między zielonkawym a niebieskawym (to wyraźnie brudny deszcz „miejski”).
Byłem też bardzo zadowolony, że mogłem tutaj skorzystać z hacka JavaScript; Zauważ, że ponieważ jest to przetwarzanie. js , możesz wrzucić takie rzeczy, jak deklaracja bez typu g = 99 lub alias
r
forrandom
(alias międzyjęzykowy!).Wszelkie inne pomysły do zminimalizowania?
Wersja do odczytu:
Całość można obejrzeć tutaj .
... plus inna wersja bez przejścia: 58-20 = 38
Jeśli nie lubisz blaknięcia i nie przeszkadza ci szary brud:
źródło
Tcl / Tk, 139-20 = 119
Ponownie wykorzystując własną odpowiedź http://codegolf.stackexchange.com/a/143018/29325
Musi być uruchomiony w interaktywnej powłoce
Niestety konwersja
expr int(rand()*
naproc
skrypt powoduje, że skrypt ma jeszcze jeden bajt!Aby zatrzymać, wystarczy kliknąć niewysłowiony przycisk „X”.
źródło