to a-ja!
Dzisiejsze zadanie jest proste: napisać program lub funkcję wyświetlającą bezczynną małą duszkę Mario z Super Mario Bros na NES na niebieskim tle.
Każdy wpis jest ważny, o ile wyświetla te 12 * 16 pikseli w dowolnym miejscu ekranu / okna / przeglądarki.
(EDYCJA: wyświetlany obraz można przeskalować, jeśli Twój język nie potrafi tworzyć grafiki pikselowej. Możesz również wyświetlać grafikę ASCII lub grafikę HTML, ale używając odpowiednich kolorów.)
Obraz (powiększony 400%):
Musisz użyć następujących kolorów:
- niebieski: # 6B8CFF
- czerwony: # B13425
- zielony / brązowy: # 6A6B04
- pomarańczowy: # E39D25
Najkrótszy program (pod względem liczby znaków) wygrywa!
Obowiązują standardowe luki (zwłaszcza nie jest dozwolone połączenie sieciowe), ale dozwolone jest stałe kodowanie i wyświetlanie pliku obrazu w programie. (wpisy wykorzystujące tę sztuczkę będą oceniane osobno)
No to ruszamy!
Aktualny ranking
Najkrótsza odpowiedź przy użyciu samego kodu:
- Mathematica, 141. https://codegolf.stackexchange.com/a/39916/10732 (autor: Martin Büttner)
- Bash, 158. https://codegolf.stackexchange.com/a/40002/10732 (autor: hpsMouse)
- ...
Najkrótsza odpowiedź przy użyciu jakiegoś zakodowanego obrazu:
- HTML, 102b. https://codegolf.stackexchange.com/a/39923/10732 (autor: xem i NiettheDarkAbsol)
- PHP, 131b. https://codegolf.stackexchange.com/a/39926/10732 (autor NiettheDarkAbsol)
- ...
Odpowiedzi:
HTML / JS,
206158153102102
Zastosowana sztuczka: zapisz skompresowany plik GIF jako plik HTML i dodaj <img src = #> na końcu
Dzięki temu wpisowi: https://codegolf.stackexchange.com/a/39926/10732 autor: @NiettheDarkAbsol
Demo: http://meuziere.free.fr/mario/gif.html
Starsza wersja:
153
Zastosowana sztuczka: zapisz skompresowany plik PNG jako plik HTML i dodaj <img src = #> na końcu
158
Zastosowana sztuczka: ustawianie przyciętego dataURI skompresowanego PNG jako SRC znacznika IMG i pakowanie całości w znaki Unicode.
Wykonaj to w konsoli JS:
206
Rozpakowane (206b):
Próbny
Narzędzia użyte:
źródło
Mathematica,
412292252212163148143141 znakówUżywa to notacji doczepnej
^A
dla znaku kontrolnego w punkcie kodowym1
. W Mathematica mogę dosłownie osadzić postać, chociaż prowadzi to do różnego rodzaju brzydoty podczas kopiowania. W każdym razie powyższe jest o 2 znaki krótsze niż moja poprzednia wersja, i dostałem je dla postaci, używając base-4 zamiast base-5 do kodowania wskaźników palety kolorów. W tej chwili nie mogę zadać sobie trudu, aby naprawić wyjaśnienie i zrzut ekranu poniżej, więc zostawiam cię tutaj z oryginalną wersją mojej podstawowej wersji 5:Koduję piksele w znakach Unicode (tak, aby liczyć według znaków!).
Oto jak to wygląda w Mathematica:
Oto jak to działa:
Najpierw definiujemy funkcję,
f
która zamienia ciągi Unicode (przekazane jako pierwszy argument#
) na listy liczb całkowitych. Najpierw otrzymujemy kody znaków. Można je interpretować jako cyfry numeru podstawowego 65536. A następnie konwertujemy tę liczbę na inną bazę, przekazaną jako drugi argument#2
.Teraz zróbmy to dla dłuższego ciągu Unicode.
ToCharacterCode
daje tę listę:Traktując to jako bazę 65536:
I konwersja do bazy 5:
Są to wskaźniki kolorów pikseli w kolejności niebieski, czerwony, zielony, pomarańczowy. Używamy ich do indeksowania do tej listy liczb, która jest paletą kolorów.
Teraz paleta kolorów. To
"넴╫賿橫ӣ鴥"
. Korzystamy z powyższych wskaźników, aby wybrać prawidłowy ciąg. Następnie ponownie stosujemy naszą funkcję, ale przy użyciu bazy 256. Daje to listę 12 liczb całkowitych:Używamy
;;
indeksowania zasięgu, aby wyciągnąć odpowiedni wycinek dla bieżącego koloru.Na koniec używamy tylko
Partition
do podzielenia tego na rzędy12
i do karmieniaImage
. Voilà!Edycja: Z pakowaniem Unicode RLE nie było już tego warte. Usunięcie go uratowało 50 znaków.
Edycja: Oczywiście bez RLE nie ma też potrzeby przechodzenia do bazy 16.
Edycja: A skoro już nad tym pracujemy, dlaczego nie spakować także palety kolorów Unicode? (Mam przeczucie, że mogę zaoszczędzić trochę więcej, czyniąc całą paletę kolorów również jednym ciągiem i używając
Partition
tam też. Spróbuję tego później.)Edycja: Tak, to straciło kolejne 5 bajtów.
źródło
Java:
398377Po prostu rysuje duszka, rozpakowując int dla każdej kolumny. Pokazane w pełnym programie:
Obowiązkowy zrzut ekranu:
źródło
import java.awt.*
.Kod maszynowy x86, 102 bajty
Jak to działa: obraz jest zapisywany jako obraz 2-bitowy przy użyciu palety. Każdy wiersz obrazu jest przechowywany jako 3 bajty, a następnie jeden 1 bajt palety kolorów. Dzięki temu dane mogą być ładowane jako pojedynczy DWORD. Dwanaście pikseli jest wysyłanych przez maskowanie najniższych 2 bitów wartości, zapisywanie ich w pamięci wideo, a następnie przesunięcie w prawo dwóch bitów. Po wyprowadzeniu pikseli dla wiersza bajt palety jest zapisywany na palecie VGA. Po zakończeniu rysowania obrazu program wchodzi w nieskończoną pętlę.
Kod asemblera do wygenerowania pliku binarnego:
Plik binarny zakodowany w formacie Base-64, zapisz go jako Mario.com, aby go uruchomić: sBPNEMQHvigBgcc0AWatZpOxDInYJAOqZsHrAuL1k7rJA + 6EwHXiwxUAVSwFAEANpb5XCbm / fxq5 / v4j6b9qPqQQAQWQQAQWQQA
Przykładowe dane wyjściowe:
źródło
GIF - 93 bajty
Zakodowanie obrazu jest teraz najwyraźniej w porządku, więc ... tak? :RE
Jak widać w Notepad ++
Jako PHP - 131 bajtów
źródło
Bash + ImageMagick:
350331321 znaków(Paleta bezczelnie skradziony od Martina Büttner „s odpowiedzi ).
Przykładowe dane wyjściowe:
Aby sprawdzić go łatwo dodać
-scale 120
doconvert
„s parametry, aby uzyskać wersji 10x skalowany:źródło
s/185 191 127 185 254 254/1{85,91,27,85} 254{,}/
;s/do/{/
;s/done/}/
{
..}
. Dziękuję, @grawity.Układ Octo / XO , 70 bajtów
Octo jest językiem asemblera wysokiego poziomu, który kompiluje się w bajtowe instrukcje dla maszyny wirtualnej CHIP-8 . Octo zapewnia niestandardowe rozszerzenia o nazwie „XO-Chip” do podstawowego kodu bajtowego CHIP-8, w tym możliwość rysowania 4-bitowych map bitowych za pomocą nakładanych płaszczyzn bitowych.
Skompilowane bajty są następujące:
Uruchom tutaj w przeglądarce: http://johnearnest.github.io/Octo/index.html?gist=33aa37d4717a425ccd4f
Prawdopodobnie lepiej jest zobaczyć język asemblera Octo, który tworzy ten kod bajtowy:
Program główny to trzy dwubajtowe instrukcje. Ustaw rejestr indeksu pamięci
i
na początku segmentu danych, wybierz płaszczyznę rysunkową 3 (3 jest maską bitową; oznacza to, że chcesz rysować w trybie 4 kolorów za pomocą obu płaszczyzn bitowych), a następnie narysuj duszka w pozycji xiy podanej przez rejestrv0
(zainicjowany na zero). Ostatnie 0 oznacza rozmiar duszka, który w zestawach instrukcji SuperChip i XO-Chip narysuje duszka 16x16. W trybie 4 kolorów po mapie bitowej dla pierwszej płaszczyzny natychmiast następuje mapa bitowa dla drugiej płaszczyzny.Aby zobaczyć, jak działają płaszczyzny, rozważ ten zmodyfikowany program, który przewija jedną płaszczyznę w prawo po narysowaniu mario:
Jeśli ci się to podoba, możesz polubić jedno z moich innych rozwiązań napisanych z Octo. W październiku faktycznie odbywa się jam gry oparty na tym narzędziu.
źródło
Groovy
417386Zabawa jak diabli, ale z okropną liczbą znaków. Potrzebny GroovyFX
bez golfa:
źródło
grep()
zamiasttoList()
HTML / JS,
427408264256239226 znakówObfuscatweet,
271270264256239226 znakówZa pomocą obfuscatweet udało się skrócić to do <250: D
Poniżej znajduje się kod.
Zastosowana sztuczka: przekonwertowany obraz na base4 Ciąg kolorowych kafelków, przekonwertowany na ciąg szesnastkowy. Indeks podstawy 4 oznacza kolor (0 = niebieski, 1 = CZERWONY itp.) CSS z wbudowanym p jest używany, ponieważ div potrzebuje rozszerzenia treści (również p jest krótszy). Ponieważ CSS musi zaczynać się od litery, „A” jest poprzedzane znacznikami CSS.
Wypełnienie z CSS daje piksele. Żadne z tych znaków nie korzysta ze znaków Unicode, których i tak nie znam, choć prawdopodobnie w takim przypadku byłby poniżej 300. Względną zaletą korzystania z wypełnienia jest to, że możesz, tak jak w tym przypadku, wysadzić obraz do rozmiaru, jaki chcesz mieć dla każdego piksela. Użyłem 9 pikseli, ale jeśli wydasz dodatkową postać, możesz uzyskać do 99 pikseli na reprezentowany piksel.
CSS,
127119118114100130 znakówZmiana z
p
narp
usuwa potrzebędisplay:inline
, kosztuje +1 char, -15! znaki!Usunąłem wszystkie kolory i umieściłem w tablicy w znakach JS -87. Potem właśnie usunąłem wszystkie css
JS,
300289280275329325 znakówPróbowałem wyciąć jak najwięcej z tego prostego JS przetwarzającego ciąg heksadecymalny, ale biorąc pod uwagę, że to moja pierwsza próba, oto jak daleko posunąłem się wykorzystując tylko to, co wiem. Pisanie HTML zostało skrócone o funkcję, która dodaje tagi, a klasy używają wartości podstawowej 4 do określenia koloru do wyświetlenia.
Używając dodatkowego skrótu, zastąpiłem charAt nawiasami [] i usunąłem klasę A0 i ustawiłem niebieski jako domyślny kolor dla p, oszczędzając dodatkowe 10 znaków. Dodatkowy koszt używania
rp
tagów jest równoważony ogromną stratą w CSS.Dodatkowe przesunięcie od usunięcia podkładki while loop do dodania „000” dla przypadku użycia i wycięcia z niego -12.
Dodano dodatkowe JS dla kolorów, a następnie włóż tam wypełnienie. Zauważyłem błąd w wypełnieniu, który wymaga 2 dodatkowych znaków do naprawy. Kompaktował kilka pętli
Plik HTML,
430429419399366342 znakówPróbny
źródło
MATLAB,
194193 bajtówKod:
A wynik:
Zasadniczo przekonwertowałem obraz Mario, aby każdy piksel był liczbą 2-bitową. Następnie zakodowałem to w bazie 32, która jest łańcuchem pokazanym w kodzie. Ten ciąg jest najpierw przekształcany do formatu 5 x 16 (każdy rząd (12 pikseli) liczb 2-bitowych został zakodowany w bazie 32), a następnie ponownie przekonwertowany na bazę 10. Wynik jest ponownie konwertowany, tym razem na bazę 4, co daje tablicę 12 x 16 2-bitowe liczby. Liczby te wykreślono za pomocą
imagesc()
. Następnie kolory są przypisywane zacolormap()
pomocą niestandardowej mapy kolorów wymaganych wartości szesnastkowych.Zabawne jest to, że jedna trzecia użytych bajtów polega na tym, aby MATLAB ustawił prawidłowe kolory po wydrukowaniu. Kod koloru ma prawie taką samą liczbę bajtów jak cały ciąg base32 !.
Bez korekty koloru (usuń
colormap()
wywołanie), jest to 135 bajtów, i jest to wynik domyślnej mapy kolorów w MATLAB R2013a:źródło
JavaScript /
CSS/ HTML446430407353328316Grałem tak dużo, jak mogłem i skończyłem z jakimś brudnym HTML / JS, ale cokolwiek ... to działa.
Edycja : To jest to ... Skończyłem.
Edytuj Poważnie zrobione tym razem.
JavaScript
JSFiddle
źródło
*{line-height:1}
pomoże a.<div></div>
jest krótszy niżdocument.createElement('div')
. A JSFiddle nie lubidocument.write
i%12?"":"<br>"
.Matlab -
449/332305 bajtówczęściowa kompresja + Korzystanie z dolnej symetrii obrazu:
- Wersja częściowo skompresowana (332 bajty):
Wersja w pełni nieskompresowana (449 bajtów):
Wyjście w obu przypadkach (oczywiście powiększone na ekranie, prawdziwe to 12x16pix):
źródło
C, 4999 bajtów
To absolutnie nie może konkurować z niektórymi odpowiedziami tutaj, ale pomyślałem, że dam szansę C odpowiedzi. Kod jest jedną długą linią, więc tutaj jest link do wklejania. Jeśli wolisz, oto kodowanie gzippowane w formacie base64:
H4sICAzFGFYCA21hcmlvLmMA3Zc9DsIwDIXv0qndUqchkXwUurAgdYiFEEyIu4NYaZBI7PzNT3Lsz4mf408bjdPjct3odh6HVeujdgg4K4vzohCM8esdjHOpkrVoALUtIrBX8y1R04DKNCGZmTp85CVdAHifYuxO3mElIlju6xaRICOgCo4pD64PoiTzHnkZcHYnRhAYcEEpFznxB1mXP4TdS/KeVGYPZbmVaQHlnRVZFi65OkhoGodq+RHrby4xsTj8i6RmapXrPvfa0Q8ZWZY1/UPbSiC7Z2bYA7r0zla57Xmo8sOEzxdNYIXFhxMAAA==
Godne uwagi jest to, że nie wymaga uruchamiania zewnętrznych bibliotek.
Wymaga terminala xterm, Konsole lub GNOME, ponieważ używa rozszerzenia RGB do kodów zmiany koloru ANSI w celu uzyskania prawidłowych kolorów (ANSI nie definiuje koloru pomarańczowego). Z oczywistych powodów ideone nie będzie działać. Można go uruchomić w systemie Windows pod Cygwinem, który używa xterm (tak właśnie to przetestowałem). MSYS może działać; Nie jestem pewny.
Dane wyjściowe na mojej maszynie (xterm):
źródło
Excel VBA,
310307295 bajtówAnonimowa funkcja VBE Immediates Window, która wysyła Mario do obiektu Activesheet w komórkach
A1:L16
Pomoc
Sub
rutynowa aWersja bez golfa
-3 bajty do usuwania białych znaków -12 bajtów do używania
[...]
notacjiRange(...)
zamiast notacji; zmiana z kolorów szesnastkowych na intWynik
źródło
Bash 346
czysty bash z sekwencjami ucieczki podobnymi do VT100 (przepraszam, że nie ma pomarańczy w tej palecie)
źródło
Pyth, 83 bajty
Oświadczenie: To nie jest zwycięski kandydat, ponieważ niektóre funkcje językowe zostały utworzone po opublikowaniu pytania.
Oto zrzut heksowy:
Możesz również pobrać program tutaj i uruchomić go
Spowoduje to utworzenie pliku
o.png
:Wyjaśnienie:
Istnieją tylko 4 różne kolory, dlatego potrzebuję tylko 2 bitów, aby zapisać kolor każdego piksela.
źródło
Przetwarzanie 2 - 359 znaków
Widziałem to wyzwanie i od razu pomyślałem o funkcji Processing pixel []. Miałem nadzieję, że będzie krótszy, ale nadal jestem dość zadowolony z wyniku, biorąc pod uwagę, że to moja pierwsza próba gry w golfa kodowego.
bez golfa:
możesz pobrać przetwarzanie tutaj
źródło
JavaScript 515
właśnie go uruchomiłem, wciąż muszę wejść i pograć w golfa
źródło
div
litery składające się na wiersze domyślnie wstawionym znacznikiem. Nie testowałem tego, ale używaniea
powinno działać. Możesz także użyćbackground
zamiastbackground-color
.Perl - Ungolfed 927
Będę musiał zagrać w golfa później. Pierwszy raz próbuję
Image::Magick
.Na pewno mamy ich mnóstwo, ale oto moje:
źródło
Bash do druku:
179158 bajtówZainspirowany odpowiedzią user2485710 .
Musisz dostroić terminal, aby dokładnie pasował do kolorów.
źródło
-D
do dekodowania i-d
do debugowania .Tcl 298
Jest to obraz 2-bitowy na piksel w podstawie 64. Piksele są odwzorowywane na kody specjalne Ansi.
źródło
JavaScript - 256 znaków (161 obfusc-a-tweetowany)
Metoda:
Aby określić optymalną kolejność dla cyklu kolorów, uruchomiłem algorytm kompresji w stosunku do surowych danych dla każdej z 24 permutacji [R, G, B, O] i wybrałem tę, która daje najkrótszą wydajność (126 było najlepsze, najmniej optymalne było około 150-coś)
ETA odkryło to dopiero po przeczytaniu innych odpowiedzi za pomocą obfusca-tweet ...
Dalsze pomysły - Wypróbuj 3-bitowy zakres danych 0–6, z rzadkim 7,8,9, zyskując 4 dodatkowe: 60000N. - sprawdzaj permutacje cyklu kolorów we wszystkich kierunkach i prędkościach innych niż poziomo jeden piksel na raz. - wypróbuj wiele przejść renderowania, aby kolory można było układać warstwami.
źródło
JavaScript,
253240238236Źródło Obfuscatweet ed -
253240238236Unobfuscated -
395370365361Dzięki @compass za
<p>
sztuczki z tagami i @xem za 2 (5) znaków.Próbny
Konwertuje dane z bazy 36 i konwertuje na bazę 4.
źródło
padding:9
robi coś bez jednostki po tym. Możesz również użyć elementu jednoliterowego, takiego jaka
lubq
który jest domyślnie wbudowany, zamiastp
.document.write
do zmiennej (powinniśmy użyćdocument.write.bind(document)
), najlepsze było przypisaniedocument
do zmiennej.JavaScript ES6 (HTML + CSS), 199
30731953630Za pomocą Obfusc-a-tweet :
Spowoduje to wyświetlenie duszka bez użycia żadnych obrazów lub wielu elementów; po prostu niewłaściwie wykorzystuje
box-shadow
właściwość CSS do utworzenia każdego piksela. Wypróbuj na http://jsbin.com/pozohiyezo/ . Ta nieobjawiona wersja ma 307 znaków :To jest oryginalna wersja HTML o zwykłej wanilii. Zobacz to w akcji na http://jsfiddle.net/gfeLn1ey/1/ .
źródło
JavaScript,
256 lub 245252 lub 241256
Smutne jest przesłonięcie 256, ale 245 jest możliwe, jeśli używa się znaków niedrukowalnych:
Wystąpił problem z przesłaniem rozwiązania ze znakami niedrukowalnymi. Argumentem
btoa
musi być wynikatob("ij6n56kcraqlaqasasjaqbsasibtdlstlb2cmc2b2cid5dra2q3q2au7u55rj4j4kclcidld")
dodania 1 symbolu długości dla ucieczki odwrotnego ukośnika.Skróć oba rozwiązania o 4 symbole: nie potrzebujemy nowych do tworzenia tablicy.
252
241
W tej wersji nie jest wymagane ucieczka. W
btoa
„s argument jest wynikiematob("k6n56kcraqlaqasasjaqbsasibtdlstlb2cmc2b2cid5dra2q3q2au7u55rj4j4kclbaidld")
źródło
Perl,
266260257249245 bajtówUżywa podejścia podobnego do rozwiązania bash użytkownika 2485710 do zapisywania danych wyjściowych w stylu VT100. Usuwa jawną literę N dla nowej linii, wstawiając nową linię co 12 „vt100 pikseli”, 12 * 7 = 84.
źródło
SmileBASIC,
147136 znakówWyjście (przycięte):
Zamieniłem wszystkie znaki w ciągach danych na
x
„s”, oto kody znaków (w UCS-2):P$
(Paleta):FF6B,8CFF,FFB1,3425,FF6A,6B04,FFE3,D925
Dane obrazu:
0000,83F8,0A80,A3FA,8BE4,A5EA,BEA5,A55A,7EE5,0575,BFF5,0156,BFF5,0156,BBA5,0575,3AF4,A55A,3BC4,A5EA,0BC4,A3FA,0300,83F8
Paleta jest przechowywana w postaci ciągu, każdy kolor (32 bity) jest przechowywany w dwóch znakach (16 bitów każdy). Dane obrazu (2 bity na piksel) są przechowywane w innym ciągu (8 pikseli na znak)
Na szczęście wyzwanie jest oceniane w postaci znaków, ponieważ plik ten jest znacznie większy, jeśli jest zapisany w UTF-8.
źródło
05AB1E , 87 bajtów ( niekonkurencyjny )
Wypróbuj online!
Wyjścia:
Ponieważ 05AB1E nie może tworzyć kolorów ani grafik jakiegokolwiek rodzaju ... Jeśli nie jest to dopuszczalne, usunę je.
źródło
Bash + 05AB1E
Sinclair BASIC - 573 bajtów
OK, więc Spectrum nie może pokazywać kolorów RGB zgodnie ze specyfikacją, więc użyłem najbliższego możliwego.
Łańcuch ma kolor (1 = niebieski, 2 = czerwony itp.), A następnie litera reprezentująca liczbę powtórzeń tego bloku (przyjmując wartość ASCII minus 96, aby otrzymać 1,2,3 itd.). Liczba bez litery po prostu rysuje jeden blok.
"\::"
w wierszu 60 opisano sposób wprowadzania grafiki w edytorze tekstu przed przekształceniem go w plik TAP w celu załadowania do emulatora Fuse. (Pokazuje się na ekranie jako jednolita grafika blokowa).Każde słowo kluczowe jest jednym bajtem w Sinclair BASIC, zawiera licznik polecenia PEEK po jego wygenerowaniu.
źródło
Perl -
399171 bajtówZapisuje plik gif na standardowe wyjście.
źródło