Dorastając, moim pierwszym systemem gier konsolowych był Atari 2600 i zawsze będę lubił niektóre z gier, które tak lubiłem jako dziecko. Wiele grafik jest nadal niezapomnianych, a może nawet kultowych.
Okazuje się, że te sprity są bardzo uproszczonymi bitmapami o szerokości 8 pikseli i zmiennej wysokości, w których reprezentacją binarną jest układ pikseli.
Na przykład bajty szesnastkowe 0x18, 0x24, 0x18 narysują przybliżony okrąg w taki sposób:
0x18: 00011000
0x24: 00100100
0x18: 00011000
Ponieważ 8 pikseli szerokości tworzy dość małą grafikę (nawet według standardów Atari 2600) często zdarzało się podwojenie lub poczwórne albo wysokości, szerokości lub obu, aby stworzyć większą (choć bardziej blokową i zniekształconą) wersję tego samego obrazu. Zwykle byłyby również odwracane w pionie lub w poziomie zarówno dla duszków graczy, jak i na boiskach. Dobrym tego przykładem jest gra Combat .
Wyzwanie polega na napisaniu kodu wyświetlającego te duszki jako „grafikę” w formie ASCII, w tym możliwość rozciągania lub odwracania ich w pionie, w poziomie lub w obu przypadkach. Musi to być albo pełny program, albo funkcja wywoływalna.
Wkład:
- Tablica bajtów, z których każdy reprezentuje poziome bity dla tej linii.
- Niezerowa wartość całkowita dla każdego kierunku, pozioma i pionowa, reprezentująca współczynnik skalowania dla tego wymiaru.
- Wartość ujemna wskazuje, że wymiar należy również odwrócić wzdłuż jego osi.
Wydajność:
- Reprezentacja ASCII dla STDOUT lub łańcucha rozdzielanego znakiem nowej linii, przy użyciu znaku spacji dla czarnych (0) pikseli i dowolnego wybranego do wydruku, spacji dla białych (1) pikseli.
Dane testowe:
bmp1 = [ 0x06, 0x0F, 0xF3, 0xFE, 0x0E, 0x04, 0x04, 0x1E, 0x3F, 0x7F, 0xE3, 0xC3, 0xC3, 0xC7, 0xFF, 0x3C, 0x08, 0x8F, 0xE1, 0x3F ]
bmp2 = [ 0x07, 0xFD, 0xA7 ]
bmp3 = [ 0x00, 0x8E, 0x84, 0xFF, 0xFF, 0x04, 0x0E, 0x00 ]
bmp4 = [ 0x00, 0xFC, 0xFC, 0x38, 0x3F, 0x38, 0xFC, 0xFC]
Uwaga: Powyższe przykładowe tablice wejściowe bajtów są podane jako szesnastkowe. Jeśli Twoja platforma nie przyjmuje liter szesnastkowych do reprezentacji bajtów, możesz przekonwertować je na natywny bajt literał.
Przykładowe dane wyjściowe:
f( bmp1, 1, 1 ) =>
--------
XX
XXXX
XXXX XX
XXXXXXX
XXX
X
X
XXXX
XXXXXX
XXXXXXX
XXX XX
XX XX
XX XX
XX XXX
XXXXXXXX
XXXX
X
X XXXX
XXX X
XXXXXX
--------
f( bmp1, -2, 1 ) =>
----------------
XXXX
XXXXXXXX
XXXX XXXXXXXX
XXXXXXXXXXXXXX
XXXXXX
XX
XX
XXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXXXX
XXXX XXXXXX
XXXX XXXX
XXXX XXXX
XXXXXX XXXX
XXXXXXXXXXXXXXXX
XXXXXXXX
XX
XXXXXXXX XX
XX XXXXXX
XXXXXXXXXXXX
----------------
f( bmp2, 1, 2 ) =>
--------
XXX
XXX
XXXXXX X
XXXXXX X
X X XXX
X X XXX
--------
f( bmp2, 2, 1 ) =>
----------------
XXXXXX
XXXXXXXXXXXX XX
XX XX XXXXXX
----------------
f( bmp2, -2, -2 ) =>
----------------
XXXXXX XX XX
XXXXXX XX XX
XX XXXXXXXXXXXX
XX XXXXXXXXXXXX
XXXXXX
XXXXXX
----------------
f( bmp3, 1, -1 ) =>
--------
XXX
X
XXXXXXXX
XXXXXXXX
X X
X XXX
--------
f( bmp3, 3, 3 ) =>
------------------------
XXX XXXXXXXXX
XXX XXXXXXXXX
XXX XXXXXXXXX
XXX XXX
XXX XXX
XXX XXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXX
XXX
XXX
XXXXXXXXX
XXXXXXXXX
XXXXXXXXX
------------------------
f( bmp4, -1, -1 ) =>
--------
XXXXXX
XXXXXX
XXX
XXXXXX
XXX
XXXXXX
XXXXXX
--------
f( bmp4, 4, 2 ) =>
--------------------------------
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
--------------------------------
Uwaga: poziome linie powyżej i poniżej mają pokazywać początek i koniec wydruku. Nie są wymagane na wyjściu, jednak wymagane są puste linie (reprezentowane przez wszystkie zera / spacje) na początku i / lub na końcu, jak pokazano.
Uwaga 2: te testowe mapy bitowe zostały zainspirowane i ponownie narysowane / zakodowane na podstawie zrzutów ekranu z gry oznaczonych jako „dozwolony użytek” w Wikipedii.
Zwycięskie kryteria
- To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach na język.
- Standardowe luki są zabronione.
Odpowiedzi:
Python 2 , 117 bajtów
Wypróbuj online!
źródło
05AB1E ,
2726 bajtówPobiera dane wejściowe jako listę 8-bitowych ciągów binarnych, a dane wyjściowe ma
1
postać spacji.-1 bajt dzięki @MagicOctopusUrn .
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
0‹i
...0‹
. Mamy 1-bajtowy>=0
, czylid
. Ale powinniśmy również mieć 1 bajt, aby sprawdzić negatywne imo. Teraz używam tylko0‹
lubd_
.„íR³²‚0‹Ï.V
(pełny kodεε²Ä×}J³Äи0ð:}„íR³²‚0‹Ï.V˜»
), co nie jest poprawą, ale usuwa jedną z tych negatywnych kontroli.εS²Ä×J³Äи²0‹ií]³0‹iR}˜0ð:»
oszczędza bajt. Jeśli możesz wziąć w matrycę 2D, możeszS
całkowicie usunąć dla 25 bajtów.S²Ä×
zamiastε²Ä×}
. Dzięki! Hmm, jeśli wolno nam przyjmować wejścia binarne jako listę zer i jedynek, można zapisać dodatkowy bajt, pomijającS
. Zapyta OP, czy jest to dozwolone. Podoba mi się również„íR³²‚0‹Ï.V
twój komentarz. :)MATL ,
2419 bajtówDane wejściowe to tablica liczb dziesiętnych, skala pozioma, skala pionowa.
Wypróbuj online!
Wyjaśnienie
źródło
Dyalog APL,
464233 bajtówWypróbuj online!
-9 dzięki ngn!
źródło
{' #'[⊃{⌽⍣(0>⍺)⊢(|⍺)/⍉⍵}/⍺,⊂⍉⍵⊤⍨8/2]}
dfn -> program:' #'[⊃{⌽⍣(0>⍺)⊢(|⍺)/⍉⍵}/⎕,⊂⍉⎕⊤⍨8/2]
' #'[⍉⊃{⊖⍣(0>⍺)⍉⍵/⍨|⍺}/⎕,⊂⎕⊤⍨8/2]
. btw, wyniki drugiego testu wydają się być odwrócone w oryginalnym rozwiązaniuProlog (SWI) , 252 bajty
Wypróbuj online!
Wyjaśnienie
źródło
Węgiel drzewny , 28 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Pętla nad listą bajtów.
Odwzoruj na pionowym współczynniku skalowania, mnożąc w ten sposób linie wyjściowe.
Przekształć dane wejściowe w bazę 2, odwróć ją, zamapuj cyfry na spację
X
, a następnie pomnóż każdy znak przez współczynnik skalowania w poziomie.Jeśli współczynnik skalowania w poziomie był dodatni, odbij, aby ponownie uzyskać prawidłowy obraz.
Odbij pionowo, jeśli współczynnik skalowania w pionie był ujemny.
źródło
F
(For
) zamiast¿
(If
) do czeków?else
jest to sugerowane, więc mogę użyćif
tylko tego, jeśli jest to ostatnia instrukcja w bloku.If
tutaj byłoby właściwieIf ... Else If ...
zamiast dwóch luźnychIf
. Hmm, dobrze wiedzieć.C (brzęk) , 120 bajtów
Wypróbuj online!
źródło
Common Lisp , 157 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Tcl , 192 bajty
Wypróbuj online!
źródło
Kod maszynowy 8088, IBM PC DOS,
7771 bajtówZmontowane:
Wymienianie kolejno:
Okazało się, że w ASM jest to bardziej kłopotliwe niż początkowo myślałem. Wiele współbieżnych pętli i wiele rozgałęzień if / else z pewnością może sprawić ból głowy.
Jest to zaimplementowane jako MAKRO, ponieważ umożliwia przekazywanie parametrów podobnych do funkcji do testowania.
Wydajność
Oto program testowy dla DOS, który monituje o współczynnik skalowania X i Y i rysuje na ekranie. Uwaga: zbyt duże przeskalowanie smoka spowoduje przewinięcie poza górną krawędź, ponieważ domyślne okno DOS ma tylko 24 rzędy.
A oto nasz mały smok (kaczka):
Wypróbuj online!
Możesz przetestować na maszynie wirtualnej DOS za pomocą DOSBox lub VirtualConsoles.com, wykonując następujące czynności:
PLANE
,KEY
,TANK
lubDRAGON
.źródło
Perl 5, 105 bajtów
TIO
Jeśli dane wejściowe muszą być szesnastkowe
126 bajtów
źródło
Galaretka , 21 bajtów
Wypróbuj online!
Zakłada, że istnieje najwyżej jeden argument wiersza poleceń.
źródło
APL (Dyalog Extended) , 23 bajty SBCS
metoda dzaima
⎕IO←0
Wypróbuj online!
{
…}/
Zmniejszaj liczbę znaków od prawej do lewej, używając następującej anonimowej lambda:|⍺
wielkość lewego argumentu (współczynnik skalowania)⍵/⍨
użyj tego, aby powielić odpowiedni argument w poziomie⍉
transponować⊖⍣(
…)
Odwróć, jeśli:>⍺
współczynnik skalowania jest mniejszy niż zero⊃
ujawnij (ponieważ uwzględniono redukcję w celu zmniejszenia rangi tensora z 1 do 0)' x'⊇⍨
wybierz elementy z ciągu „x” za pomocą tej macierzyźródło
Rubinowy , 89 bajtów
Wypróbuj online!
źródło
T-SQL, 216 bajtów
Przed uruchomieniem zarządzania MS-SQL Studio, naciśnij CRTL-t, aby wyświetlić dane jako tekst. Wysokość nie może być regulowana, aby przekraczać liczbę elementów na wejściu.
Z powodu okropnej implementacji STRING_AGG zmienna wysokości będzie działać tylko w MSSM. Państwo członkowskie powinno było wprowadzić trzeci opcjonalny parametr, aby uwzględnić kolejność konkatenowanych elementów.
Wersja online obsługuje tylko regulację szerokości. Wysokość spowoduje efektowny wynik z wieloma kształtami.
Ten skrypt nie wyświetla poprawnych kształtów w wersji online, więc dokonałem drobnych korekt, aby to zrekompensować. Wypróbuj online
źródło