tło
Oto wyzwanie związane z Halloween.
Jak mogłeś zobaczyć z mojego ostatniego wyzwania , podoba mi się to, co nazywam animacjami sztuki ascii, to nie tylko narysowanie wzoru, ale narysowanie wzoru, który postępuje. Ten pomysł przyszedł mi do głowy po tym, jak kilka lat temu zostałem poproszony o ożywienie (raczej nudnej) prezentacji, sprawiając, że przypadkowe nietoperze ascii latały po ekranie w Halloween. Nie trzeba dodawać, że należycie się zobowiązałem (płacono mi za to), ale sprawiło, że pomyślałem, że w życiu jest coś więcej niż przypadkowe nietoperze. Zainspirowany tym chciałbym zaproponować to wyzwanie.
Wyzwanie
Spraw, aby nietoperz latał wokół Księżyca.
Oto nietoperz:
^o^
Oto księżyc:
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
Musisz pokazać każdy etap lotu nietoperzy (patrz dane wyjściowe).
Wkład
Żaden
Wydajność
^o^
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
mmm^o^
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
mmm
mmmmmmm^o^
mmmmmmmmm
mmmmmmm
mmm
mmm
mmmmmmm
mmmmmmmmm^o^
mmmmmmm
mmm
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm^o^
mmm
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm^o^
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
^o^
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
^o^mmm
mmm
mmmmmmm
mmmmmmmmm
^o^mmmmmmm
mmm
mmm
mmmmmmm
^o^mmmmmmmmm
mmmmmmm
mmm
mmm
^o^mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
^o^mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
^o^
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
Zasady
- Brak odczytu z zewnętrznych plików lub stron internetowych
- Możesz przesłać pełny program lub funkcję
- Dodatkowe spacje i / lub znaki nowej linii są dla mnie w porządku
- Standardowe luki zakazane jak zwykle
- Nietoperz musi skończyć z powrotem na szczycie księżyca
- Jeśli chcesz, możesz wyczyścić ekran między ramkami, ale nie jest to wymagane. Wyjście, jak pokazano powyżej, jest w porządku
- Ponieważ jest to kod golfowy, zwycięzca otrzyma odpowiedź o najniższej liczbie bajtów, chociaż jakakolwiek odpowiedź jest mile widziana
Próba
Odwołaj się do implementacji w całkowicie nie golfowym Pythonie 2 (620 bajtów, ale tylko po to, aby udowodnić, że da się to zrobić. Może później zagrać w golfa).
b='^o^'
m=[' ',
' mmm ',
' mmmmmmm ',
' mmmmmmmmm ',
' mmmmmmm ',
' mmm ',
' ']
p=[(9,12),(12,15),(14,17),(15,18),(14,17),(12,15),(9,12),(6,9),(4,7),(3,6),(4,7),(6,9),(9,12)]
d=0
for z in range(7):
x=map(str,m[z])
c="".join(x[:p[z][0]]) + b + "".join(x[p[z][1]:])+"\n"
print "\n".join(m[:z]) + "\n" + c+"\n".join(m[z+1:])
for z in range(6)[::-1]:
x=map(str,m[z])
c="".join(x[:p[z+6][0]]) + b + "".join(x[p[z+6][1]:])+"\n"
print "\n".join(m[:z]) + "\n" + c+"\n".join(m[z+1:])
Wynik
Chociaż @Jonathan oczywiście wygrywa pod względem liczby bajtów z Jelly, oznaczę odpowiedź Brainfuck z @Oyarsa jako odpowiedź zaakceptowaną wyłącznie dlatego, że uważam, że każdy, kto może zrobić coś takiego w tak szalonym języku, zasługuje na +15 powtórzeń, bez względu na to ile bajtów to zajmuje. Nie dlatego, że mam problem z językami golfa. Jeśli masz jakiekolwiek wątpliwości, zobacz moją odpowiedź na pytanie dotyczące tego meta . Wielkie dzięki i szacunek dla wszystkich, którzy przyczynili się w jakimkolwiek języku.
Odpowiedzi:
Brainfuck, 690 bajtów
To mój pierwszy raz w golfa, więc jestem pewien, że jest jeszcze wiele do zrobienia
Wypróbuj online
Ungolfed niektóre dla czytelności:
Chciałem wykorzystać fakt, że dodając nowy wiersz na początku, każdy etap można odczytać w obu kierunkach, aby uzyskać dwa różne etapy, ale nie mogłem znaleźć dobrego sposobu na zrobienie tego bez wygenerowania pełnych sześciu i półetapów od razu.
źródło
05AB1E ,
696260 bajtówZaoszczędzono 2 bajty dzięki Adnan .
Wypróbuj online!
Wyjaśnienie
3ð×…^o^)U
przechowuje listę[" ","^o^"]
w X do późniejszego wykorzystania.13FNV
Pętle ciągu 13 etapach [0 .. 12] i zapisuje bieżący indeks iteracji Y .0379730v
zapętla się nad rzędami każdego etapu,gdzie N jest indeksem wiersza, a y jest bieżącą liczbą m .
Zaczynamy od dodania
floor(5/(y+1))-(y==0)
spacji do każdego wiersza za pomocąð5y>;ï-y_+×
.Następnie określamy, czy przed m powinien być nietoperz, czy 3 spacje .
Jeśli
(-N-Y)%12 == 0
to prawda, dodajemy nietoperza, w przeciwnym razie 3 spacje.To wyrażenie (
N(Y-12%_Xè
) umieści nietoperze etapami0,6-12
.Następnie kładziemy y M z
'my×
.Teraz określamy, czy po m ma być nietoperz, czy 3 spacje .
Kod
NY-12%_y&Xè
umieści nietoperza, jeśli((N-Y)%12 == 0) and y!=0
to prawda, w przeciwnym razie 3 spacje.To umieści nietoperze na scenach
1-5
.Na koniec łączymy cały rząd na sznurku i wydrukować z nowej linii:
J,
.źródło
3ð×…^o^)
zamiast" ^o^"2ä
powinien zapisać dwa bajty.3ð×
.JavaScript (ES6),
109144140138 bajtówWersja animowana
Pokaż fragment kodu
źródło
HTML + JS,
153149 bajtówEdycja: Zaoszczędź sporo bajtów dzięki @RickHitchcock. Nudna wersja, która po prostu zwraca 13 ciągów wielowierszowych w tablicy, ma
132131 bajtów:źródło
setInterval
, który zawsze jest taki sam w mojej przeglądarce, ale może się różnić w przypadku innych przeglądarek.innerHTML
zamiasttextContent
. I kolejny bajt, zmieniającrepeat(+c)
narepeat(c)
.1000
może zostać1e3
.)Galaretka ,
76 6958 bajtówTryItOnline
W jaki sposób?
źródło
Python 2,
146 144138 bajtów-2 bajty dzięki @Willem (użyj zmiennej
c
zamiast zapętlać przezmap
)repl.it
'6643466'
to liczba spacji przed księżycem (6 na pustych pierwszej i ostatniej linii, ponieważ nietoperz tam pojedzie).'0379730'
jest liczbą'm'
s na Księżycu w każdej linii.zip
Rozpakowuje te znaki doa
ib
i sprawia, że księżyc na niebiem
, z 3 spacje na każdej linii.Ostatnia linia następnie przemierza pozycje nietoperza na Księżycu i jest efektywna:
ale krotka pozycji jest zakodowana jako porządek znaków drukowalnych, z dodanym 23 (ponieważ 9 nie jest drukowalne). Wynika to jako
" -;L[hrbQ@2' "
ic=ord(b)-23
służy do wyodrębnienia wartości.źródło
for b in" -;L[hrbQ@2' ":c=ord(b)-23;print(m[:c-3]+'^o^'+m[c:])
Autovim ,
8581 bajtówBrak animacji, prawdopodobnie nadal grywalnej ... Nadal nieźle jak na nowy dzieciak na bloku! (autovim)
Aby uruchomić:
Wyjaśnienie
Krótko mówiąc, rysujemy księżyc, kopiujemy go i wklejamy 12 razy, i używamy dwóch makr: jednego, aby dołączyć nietoperza do pierwszych 7 księżyców, a drugiego, aby poprzedzić ostatnie 6.
źródło
PHP, 167 bajtów
Zrobiłem mały program w PHP:
Oto bardziej szczegółowa wersja:
To jest mój pierwszy codegolf, jeśli masz jakieś sugestie, cieszę się, że słyszę :)
źródło
Python 2, 112 bajtów
Wydrukuj zdjęcie. Każda linia składa się z trzech części
m
dla księżycaCzęści te są połączone i wyśrodkowane w pudełku o rozmiarze 15 w celu uzyskania odstępów. Aby uniknąć przesunięcia nietoperzy przez środek, brakujący nietoperz ma trzy pola o tej samej długości. W przypadku nietoperzy na księżycu lub poniżej księżyca lewy otwór paska jest pomijany, a prawy otwór jest zajęty.
Istnieje 91 linii: 7-liniowy obraz dla każdego z 13 zdjęć. Są one liczone za pomocą divmod: jak się
k
liczy od0
do91
,(k/7, k%7)
idziePrzyjmowanie pierwszej wartości
k/7
za zdjęcie i drugiej wartościr=k%7
jako numerem wiersza na obrazie, liczy się to najpierw według obrazu, a następnie według numeru wiersza na każdym zdjęciu, oba indeksowane 0.Liczba
m
księżyców zmienia się wraz z numerem rzędur=k%7
jako[0,3,7,9,7,3,0]
. Zamiast indeksowania do tego formuła była krótsza. Dogodnym stopniem swobody jest to, że0
mogą mieć dowolną wartość ujemną, ponieważ nadal daje pusty ciąg po pomnożenium
. Grzebanie w paraboli i dzielenie podłogi dało formułęr*(6-r)*8/5-5
.Teraz patrzymy na to, czy narysować nietoperza, czy puste miejsce po obu stronach. Tablica
b=[' ','^o^']
zawiera opcje.Nietoperz w rzędzie 0 na zdjęciu 0 (u góry), w rzędzie 1 na zdjęciu 1 (po prawej), w rzędzie 6 na zdjęciu 6 (u góry). Łatwo więc sprawdzić, czy numer wiersza i obrazu jest równy,
k/7==r
. Ale potrzebujemy również obrazu 12, aby wyglądał jak obrazek 0, więc najpierw wybieramy numer zdjęcia modulo 12.Po lewej jest podobnie. Nietoperz pojawia się po lewej stronie w rzędach
r=5,4,3,2,1
na zdjęciach7,8,9,10,11
. Sprawdzamy więc, czy liczba wiersza i obrazu wynosi 12. 12. Upewnijmy się również, że nie narysujemy nic poza trzema spacjami w rzędach0
i6
- odpowiednie miejsce na nietoperza narysuje nietoperza i nie wolno nam zepsuć jego centrowania.źródło
DO#,
615582337 bajtówTo moja pierwsza (wciąż zdecydowanie zbyt czytelna) próba jednego z nich, dlatego chętnie przyjmę wszelkie sugestie, aby zgolić kilkaset bajtów! Na początku mojej listy jest teraz krótszy sposób na utworzenie tablicy księżyców.
Niegolfowany (zawiera pętlę!)
Edytować:
Wyjęto 21 bajtów, usuwając końcowe spacje w deklaracji tablicy. Zamiast siatki o szerokości 15 znaków, każdy rząd jest wystarczająco szeroki, aby zmieścił się nietoperz. Usunięto kolejne 12 dla niepotrzebnych argumentów string [] w
Main()
deklaracji.Edycja 2:
Przepisałem większość logiki, usuwając 245 bajtów! Obejmuje sugerowane zmiany w komentarzach. Dzięki!
Z komentarzy zmieniono to w funkcję
M()
zamiast poprzedniejMain()
metody - więc teraz trzeba to wywołać zewnętrznie.źródło
new string[]
zm
i po prostu wstawiającstring[]m={...}
.var
w miejscach takich jakstring[]w=(string[])m.Clone();
-var w=(strin[])m.Clone();
Python 2,
299300290270 bajtówGrał w golfa do 270, mając nieco więcej doświadczenia w golfa.
Referencyjna implementacja zmniejszona o
321320330 bajtów. Nie ładna ani elegancka. Po prostu używa łańcucha brute force i krojenia listy. Fajnie było jednak odliczyć bajt, ale myślę, że podejście było całkowicie niewłaściwe na początku dla poważnego konkurenta.Nie oczekuję, że ta odpowiedź zostanie potraktowana poważnie, więc proszę, nie wyrażajcie negatywnych opinii. Powiedziałem w pytaniu, że spróbuję zagrać w golfa implementację referencyjną i to jest dokładnie to. Właśnie wysłano dla zabawy.
Wypróbuj online!
źródło
Rubin,
164156 bajtówBardzo prosty program. Można pracować nad więcej. Proszę zostawić wskazówki w komentarzach.
źródło
base64
izlib
w możliwie najkrótszy sposób i dodać je do liczby bajtów?puts
isay
? Nie znam Ruby./// , 205 bajtów
Wypróbuj online!
Tylko gdybym nie potrzebował ton tylnych spacji ...
źródło
Świnka, 223 bajtów
Korzysta z Mumpów pamięci podręcznej InterSystems - pozwala na nawiasy klamrowe wokół pętli, dzięki czemu jest przydatny dla zagnieżdżonych pętli w jednej linii.
Prawdopodobnie można by grać w golfa więcej i mogę z tym grać, kiedy będę miał więcej czasu. Dodaj kolejne 9 bajtów, a będzie animowane [[z powodu dodania „H 1 W #” ->, który zatrzymuje się na sekundę i czyści ekran:
Oto niepoznana / objaśniona wersja (wersji animowanej) z prawidłowymi instrukcjami „do” i pętlami kropkowymi:
Próbowałem wykonać jazz „kompresuj, a następnie koduj Base-64”, aby zobaczyć, co się stanie, ale zakodowany ciąg skończył się nieco dłużej niż sam program! To, a systemowe odwołania Cache'a do kompresji i kodowania base64 są dość długie ... na przykład, oto systemowe wywołanie dekodowania base64: $ System.Encryption.Base64Decode (STRING)
Ta metoda „nadęje” program ponad 300 znaków, myślę ...
źródło