Wprowadzenie
Atari ST był dość popularny komputer osobisty od połowy lat 80-tych do początku lat 90-era, zasilany przez Motorola 68000 mikroprocesor. Na tym komputerze domyślnym zachowaniem systemu operacyjnego w przypadku nieprzechwyconych wyjątków procesora było wyświetlanie rzędu bomb na ekranie, jak pokazano na poniższym obrazku:
Źródło: https://commons.wikimedia.org/wiki/File:Row_of_bombs.png
Uwaga: W zależności od wersji systemu operacyjnego grafika bomby może się nieznacznie różnić. Ale weźmy to jako odniesienie.
Liczba bomb zależy od wektora wyjątku, z których najczęstszymi są:
- (008 $) Błąd autobusu: 2 bomby
- (00c $) Błąd adresu: 3 bomby
- (010 USD) Nielegalna instrukcja: 4 bomby
Cel
Twoim celem jest napisanie programu lub funkcji, która drukuje lub generuje sztukę ASCII takich bomb Atari ST.
Wejście
Liczba całkowita reprezentująca liczbę bomb do wyświetlenia. Twój kod musi obsługiwać najczęstsze wartości: 2, 3 i 4. Wspieranie mniejszej i / lub większej liczby bomb jest w porządku, ale nie jest ani wymagane, ani nie podlega premii.
Wynik
Oryginalna bomba składa się z kafelka 16 x 16 pikseli, reprezentowanego tutaj zarówno w ASCII, jak i binarnie:
....##.......... 0000110000000000
.#.#..#......... 0101001000000000
.......#........ 0000000100000000
#..#....#....... 1001000010000000
..#...#####..... 0010001111100000
......#####..... 0000001111100000
....#########... 0000111111111000
...###########.. 0001111111111100
...###########.. 0001111111111100
..#############. 0011111111111110
..########.####. 0011111111011110
...#######.###.. 0001111111011100
...######.####.. 0001111110111100
....#########... 0000111111111000
.....#######.... 0000011111110000
.......###...... 0000000111000000
W tym wyzwaniu każda bomba ASCII musi zostać rozciągnięta do dwukrotności swojej pierwotnej szerokości w celu lepszego renderowania. Dlatego będzie się składał z 16 wierszy po 32 znaki, przy użyciu ##
pikseli „ON” i dwóch spacji dla pikseli „OFF”. Wszystkie płytki bombowe muszą być ułożone obok siebie. Wiodące miejsca są zabronione. Końcowe spacje są również zabronione, z wyjątkiem tych, które faktycznie są częścią płytki bomby (tj. 31. i 32. kolumna), które muszą być obecne. Możesz dołączyć nie więcej niż jeden wiodący podział linii i nie więcej niż jeden końcowy podział linii.
Przykład
Poniżej przedstawiono dane wyjściowe dla dwóch bomb, w których obowiązkowe przerwy w linii są oznaczone jako, \n
a tolerowane dodatkowe przerwy w linii są oznaczone jako (\n)
:
(\n)
#### #### \n
## ## ## ## ## ## \n
## ## \n
## ## ## ## ## ## \n
## ########## ## ########## \n
########## ########## \n
################## ################## \n
###################### ###################### \n
###################### ###################### \n
########################## ########################## \n
################ ######## ################ ######## \n
############## ###### ############## ###### \n
############ ######## ############ ######## \n
################## ################## \n
############## ############## \n
###### ###### (\n)
(Oczywiście inne formaty podziału linii, takie jak \r
lub, \r\n
mogą być również używane).
Zasady
To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w bajtach. Standardowe luki są zabronione.
Odpowiedzi:
Galaretka ,
4344 bajty+1 bajt - zapomniałem podwoić znaki (nie żeby nikt tego nie zauważył!)
TryItOnline
W jaki sposób?
Przygotowanie miało na celu skompresowanie danych jako kodowanie całego obrazu oryginalnego:
1
s (spacja) lub0
s (skrót) na obrazie, ignorując nowe linie - daje listę[4,2,11,1,1,...]
:;[0,15]
;v
, z indeksemi
w odwrotnej kolejności i zsumuj16**i*v
=19468823747267181273462257760938030726282593096816512166437
);[5,119,249,42,...]
:;¥vẏ)X;ndĊɓ¡ẹ3ċi}Ịɲ¡P
Teraz kod ocenia tę liczbę, mapuje
1
s i0
s do spacji i znaków skrótu *, podwaja każdy z nich, dzieli się na linie i powtarza każdą odpowiednią liczbę razy.* faktycznie implementacja jest wykonywana modulo 2 w celu zapisania bajtów, więc spacje są nieparzyste, a hasze są parzyste:
źródło
05AB1E ,
57555350 bajtówWykorzystuje kodowanie CP-1252 .
Wypróbuj online!
Wyjaśnienie
Ponieważ obraz wyjściowy składa się tylko z 2 znaków, możemy go przedstawić jako liczbę binarną.
Możemy zignorować znaki nowej linii, ponieważ każda linia ma tę samą długość.
Możemy zignorować ostatni znak każdego wiersza, ponieważ jest taki sam dla wszystkich wierszy.
Używamy cieńszego obrazu, ponieważ zajmuje on mniej miejsca i możemy z łatwością powielić każdą postać później.
Używając 1 do reprezentowania spacji i 0 do reprezentowania # otrzymujemy liczbę binarną:
111100111111111101011011111111111111101111111011011110111111110111000001111111111000001111111100000000011111000000000001111000000000001110000000000000110000000010000111000000010001111000000100001111100000000011111110000000111111111100011111
Następnie przekształcamy to w base-10, a następnie kompresujemy do base 214, maksymalnej bazy w 05AB1E. Wynikiem tego jest:
Mięso programu składa się z następujących elementów:
źródło
Pyth,
575654535150 bajtówKod zawiera znaki niedrukowalne, więc oto odwracalny
xxd
zrzut heksowy.Wypróbuj online.
źródło
JavaScript (ES6),
159154140136 bajtówZaoszczędzono wiele bajtów dzięki @Hedi i @Arnauld
To 104 znaki, ale (niestety) 136 bajtów UTF-8. Ciąg został wygenerowany za pomocą tego fragmentu:
Pokaż fragment kodu
Używanie
.replace
zamiast[...string].map
jest równie długie:Jak to działa
Ponieważ każdy wiersz nieprzetworzonych danych może być reprezentowany jako 16-bitowa liczba, możemy zapisać cały plik w ciągu 16 znaków. Algorytm kompresji zajmuje każdy wiersz binarny, odwraca ją i odwraca go (od każdego wiersza w oryginalnym kończy się w 0 , każdy wiersz w wersji zmodyfikowanej teraz rozpoczyna się z 1 ), a następnie zamienia ją w char, a Łączy wynikających znaków .
Aby go zdekompresować, musimy wyodrębnić kod znaków i przekształcić jego reprezentację binarną w ciąg skrótów i spacji. Można to zrobić za pomocą funkcji rekurencyjnej, na przykład:
f
wielokrotnie bierze ostatni bitq
, wybierając dwie spacje, jeśli jest to 1 lub dwa hasze, jeśli wynosi 0, a następnie łączy to z wynikiem działaniaf
w pozostałej częściq
. Jest to uruchamianex.charCodeAt()
, zamieniając kod znakowy na prawidłowy ciąg spacji i skrótów.(Wcześniej było o wiele więcej dramatu, ale technika oszczędzania 4 bajtów usunęła to wszystko.)
Następnie możemy po prostu powtórzyć ciąg znaków
n
i dodać nowy wiersz. Jest to najkrótsza metoda dekompresyjna, jaką znalazłem, ale możesz zaproponować wszelkie możliwie krótsze metody.Inne próby kompresji ciągu:
Pierwszy z nich ma 153 bajty, więc żaden z nich nie zbliża się do 136 ...
źródło
+x?'##':' '
zamiast" #"[x].repeat(2)
x.charCodeAt()
zamiast konwertować je na binarne? (Myślę, że zaoszczędziłoby to około 8 bajtów.)Plik MS-DOS .COM, 84 bajty
DOBRZE. Tylko dla zabawy, bo nie mogę pobić 50 bajtów ...
Próbowałem pod DOSbox, a także pod MS-DOS 6.22 na maszynie wirtualnej.
W DOSboksie program działa dobrze, jednak w prawdziwym MS-DOS dane wyjściowe nie będą wyświetlane poprawnie, ponieważ DOS wymaga CR-LF zamiast LF na końcu linii.
(Jednak dane wyjściowe są prawidłowe.)
Wariant 88-bajtowy używałby CR-LF na końcu linii.
Oto plik:
Kod asemblera (w składni AT&T) wygląda następująco:
--- Edytować ---
Zapomniałem wspomnieć: Program należy uruchomić za pomocą następującego wiersza polecenia:
Nazwa pliku COM + dokładnie jeden znak spacji + Liczba bomb (1-9)
źródło
objdump -dw
wyjście jest dobrym sposobem na pokazanie surowego pliku binarnego, ponieważ widzisz, które bajty są instrukcją. Zrobiłem to dla odpowiedzi na gcd i adler32 . (Oprócz skomentowanego kodu źródłowego, aby ludzie mogli sami spróbować).Python,
223179 bajtówDrugie podejście:
Wypróbuj na repl.it!
Zamiast tworzyć listę ciągów w locie, istnieje zakodowany na stałe ciąg szesnastkowy, który jest indeksowany i konwertowany na binarny; następnie każda cyfra binarna jest zamieniana na jedną
' '
lub'#'
, która jest duplikowana i łączona razem ... itd.Pierwsze podejście:
Wypróbuj na repl.it!
Zawiera ona zakodowaną listę ciągów każdego wiersza (nie wliczając spacji końcowych) utworzonych przez duplikowanie jednego
' '
lub'##'
kilku razy. Dla każdego z tych ciągów są one wypełniane spacjami do długości 32 znaków,n
razy zduplikowane , a następnie łączone nowymi liniami.źródło
'\n'
. Więclambda n:print(*(''.join(2*' #'[int(d)]for d in bin(int('0c0052000100908023e003e00ff81ffc1ffc3ffe3fde1fdc1fbc0ff807f001c0'[i:i+4],16))[2:].zfill(16))*n for i in range(0,64,4)))
. Nie musisz też liczyć bajtów potrzebnych do przypisania lambdzie nazwy. Twój wynik może wynosić 176.C,
250240208188 bajtówPrzejdź do korzystania z funkcji.
Testuj w ten sposób.
main(c,v)char**v; { f(atoi(v[1])); }
źródło
0x
./// ,
539532 + nie. bajtów bombPierwsza odpowiedź ///, wyświetlająca 4 bomby. Końcowe cztery 1 można zastąpić dowolną reprezentacją liczby bomb, które chcesz wydrukować (11 za 2, 111 za 3)
Wypróbuj online!
Jeśli dane wejściowe muszą być dziesiętne, następujący
kodma555548 bajtów (gdzie ostatnią cyfrę można zmienić na 1, 2, 3 lub 4):Wypróbuj online!
Najważniejszą części kodu są następujące:
| oznacza //
ABCDEFGHIJKLMNOP oznacza odpowiednio każdą linię bomby
S oznacza 2 spacje
s oznacza 4 spacje
* oznacza 6 spacji
q oznacza 8 spacji
T oznacza ## (2)
t oznacza #### (4)
^ oznacza ##### # (6)
r oznacza ######## (8)
i oznacza ################ (16)
Większość kodu upewnia się, że bomby są wydrukowane obok siebie, a nie jedna na drugiej.
źródło
CJam , 66 bajtów
Wypróbuj online! (zwróć uwagę, że w kodzie jest kilka znaków niedrukowalnych).
Bomba jest zakodowana jako liczba binarna za pomocą 1 dla spacji (spacja wiodąca jako 1 gwarantuje, że nie musimy wypełniać reprezentacji binarnych), transponowana, a następnie przekształcona w ciąg w bazie 136 (co dało najkrótszy ciąg bez szerokich znaków). Kroki te mogą być odtwarzane z tutaj .
Ta odpowiedź następnie odwraca kodowanie, a główną sztuczką jest powtórzenie bomby przed transpozycją, skutecznie łącząc każdą linię bomby na raz. Znaki w każdym wierszu można następnie podwoić, wstawiając nowe wiersze dla ostatecznego wyniku.
źródło
PHP,
138104 + 32 = 136 bajtówNigdy nie myślałem, że
file
to binarnie bezpieczne. Chciałbym tylko znaleźć bardziej interesujący sposób przechowywania danych; ale nic nie próbowałem pokonać surowego pliku binarnego.0
2 spacje,1
z##
,powtórz
$argv[1]
czasy, wydrukuj wynik + nowa liniaBiegnij z
-r
dane binarne w pliku
b
:kod do wygenerowania pliku:
źródło
\n
.MATL ,
6463605958 bajtówWypróbuj online!
Wyjaśnienie
Kod wykorzystuje wstępnie skompresowaną wersję macierzy binarnej 16 × 16. Wstępne kompresowanie (nie jest częścią programu) składało się z dwóch etapów:
Skompresowany ciąg znaków,
jest dekompresowany z bazy 94 do bazy 16:
Otrzymany wektor długości przebiegu plus 1 jest mnożony przez 2:
wykonać rozciąganie w poziomie.
Wektor przebiegów zawiera 49 wartości. Pierwotne liczby, które należy powtórzyć dla tych długości, powinny wynosić
[0 1 0 1 ... 0]
(49 wpisów). Ale zamiast tego krótsze jest użycie wektora[1 2 ... 49]
, który będzie równie ważny dzięki modułowemu indeksowaniu. Tak więc dekodowanie długości przebiegu jestWygenerowany wektor containis te przebiegi
1
,2
...49
, w sumie 512 zgłoszeń. Przekształca się to w matrycę 16 × 32:i użyte jako modułowe indeksy w sznurku
' #'
do wytworzenia jednej bomby:Wreszcie, powtarzanie w poziomie przez współczynnik podany przez dane wejściowe daje pożądany rezultat:
źródło
Python 2: 143 bajty
Jest w ideone
(Zdałem sobie sprawę, że bezpośrednie kodowanie oryginalnej bomby w bazie 36 stworzyło krótszy kod w Pythonie).
Ciąg został utworzony przez traktowanie spacji jako 1s, a skrótów jako 0, a następnie konwersję do bazy 36. Następnie program konwertuje z powrotem na binarny i kroi na długości 16 (z przesunięciem 2 dla „0b” z przodu Pythona ciąg binarny), konwertuje na podwójne spacje i podwójne skróty, łączy je, powtarza
n
czasy ciągów i drukuje.Poprzedni: Python 2,
169 166163 bajtówJest w ideone
Prawie port mojej galaretki .
źródło
Python 2.7,
144141 bajtówBomba jest zapisana dwójkowo z 1 dla spacji, wiodąca 1 eliminuje potrzebę wypełniania reprezentacji binarnych. Bomba jest transponowana (podobnie jak w mojej odpowiedzi CJam ) i przechowywana w bazie 36.
Program dekoduje bombę na dane binarne i iteruje bity o krok 16 efektywnie po transpozycji (co oszczędza bajty przed pocięciem danej linii). Powstała linia jest konkatenowana, bity są zastępowane podwójnymi
lub
#
i łączone w pojedynczy ciąg.źródło
O
z jakiegoś powodu ...C (gcc) ,
216 204 183 165134 bajtówWypróbuj online!
Napisany jako samodzielny program (
201 183151 bajtów)Wypróbuj online!
Powoduje to awarię, jeśli nie podano parametru wiersza polecenia.
źródło
Partia, 415 bajtów
Uwaga: linia
set s=
kończy się 5 spacjami. Akceptuje liczbę jako parametr wiersza polecenia. Po prostu zapętla się przez każdą linię bomby (bardzo lekko ściśnięta przez usunięcie serii 5 identycznych znaków), a następnie powtarza bombę tyle razy, ile jest to pożądane, zanim ostatecznie powiela każdą postać.źródło
Python 2,
206205203199191188186184160 bajtówSpojrzałem na Hex na listę numerów, ale nie wydawało się, by oszczędzało wystarczająco dużo, aby było warte wysiłku. Miałem nadzieję, że uda mi się zagrać w golfa w dół, ale wydaje mi się, że udało mi się osiągnąć tak daleko, jak to możliwe dzięki temu podejściu. Wszelkie dodatkowe wskazówki z wdzięcznością otrzymane.
EDYTOWAĆ
-1, zmieniając
e==1
nae>0
. Zawsze o tym zapominam.-2, ignorując długość ciągu binarnego, poprzedzając 7 0 i biorąc tylko ostatnie 16 elementów. Działa, ponieważ nigdy nie ma więcej niż 7 wiodących zer.
-4, ponieważ teraz, gdy straciłem drugie odniesienie do zmiennej b, mogę użyć
bin(y)[2:]
bezpośrednio w funkcji mapy, biorąc ją poniżej magicznej 200 :-)-8 za pomocą przypisania plasterków na drugiej liście. Nauczyłem się dziś czegoś nowego.
-3 dzięki dzięki @Jonathan
-2 przy użyciu
c=d=([0]*7+map(int,bin(y)[2:]))[-16:]
zamiastc=d;
-2 ponownie dzięki @Jonathan
-24 dzięki dzięki @Linus
Wynik
źródło
" #"[e>0]*2
zadziała(...)
mogą iść (RE: na mój poprzedni komentarz).for y in ...:print"".join(" #"[e>0]*2for e in(([0]*7+map(int,bin(y)[2:]))[-16:]))*z
RProgN ,
210193 bajtówZapisano niektóre bajty, zmieniając 0 = '' 1 = '##' na 1 = '' 0 = '', co oznacza, że nie muszę dodawać dodatkowych zer. Oznacza to również, że teraz ciąg B64, który zwykł mówić „MAFIA”, nie jest smutny.
Wyjaśnienie
Dość długi, rozszerzenie, drukowanie i taki skompresowany ciąg ma 105 bajtów. Może być nieco bardziej golfowy, ale przynajmniej działa.
Dane wejściowe są domyślnie na stosie, stos jest domyślnie drukowany.
Wynik
Spróbuj!
źródło
PHP,
144140139138136 bajtówUwaga: używa kodowania Windows-1252
Uruchom tak:
Lub używając kodowania IBM-850 (135 bajtów i ładniejszy wynik):
Wyjaśnienie
Nie robi to żadnych binarnych rzeczy i nie wymaga zewnętrznego pliku.
Każda 16-bitowa liczba jest odwracana, a następnie kodowana jako liczba podstawowa 36, w
0
razie potrzeby dopełniana wiodącym , więc co 16 bitów daje 3 bajty. Łączenie tych wyników w01c02203k07d1j81j46b4cmwcmwpa4ohobugc8o6b434w0ow
. Kod odwraca proces, więc bomby są drukowane poprawnieN
razy.Poprawki
$j
do zera na granicach linii za pomocą%=
. Pozbywa się to nawiasów$argn
źródło
GCC C 129 bajtów
ISO8859 / ASCII
W jednej linii:
Biegnij z:
Skompiluj źródło jako ISO8859-x (ASCII).
NB óÿÿþÿoÜüðààÀÀ! ÀCàCðøþ? powinien zawierać niewidoczne kody ASCII, ale został uszkodzony z powodu sposobu, w jaki StackExchange prezentuje swoją zawartość. Link do ideone do prawidłowego kodowania testowego można znaleźć alternatywnie Oryginalny ciąg ASCII znajduje się pod adresem : https://github.com/claydonkey/AtariBombs/blob/master/ISO8859_REPR2.txt
Wyjaśnienie
Najpierw konwersja reprezentacji szesnastkowej bomb [f3 ff ad ff fe ff 6f 7f dc 1f fc 1f f0 07 e0 03 e0 03 c0 01 c0 21 c0 43 e0 43 f0 07 f8 0f fe 3f] na UTF-8 (w Wersja UTF-8 kompilator przechowuje ciąg znaków jako Wide Char Array - 2 lub 4 bajty dla każdego znaku w czasie wykonywania, ale ma to charakter akademicki. Podczas gdy znaki UTF-8 byłyby przechowywane jako 2-4 bajty, wszystkie te wartości mieszczą się w ISO-8859-1 (ASCII), a zatem wymagają tylko 1 bajtu. Można również bezpiecznie przechowywać jako ISO-8859-x (nie ma wartości 0x8_ lub 0x9_). Dlatego tekst zużywa 32 bajty w ISO-8859, a procedura zużywa łącznie 135 bajtów.
(NB szerokie znaki są przechowywane jako 16-bitowa liczba całkowita w systemie Windows i 32-bitowa w systemie Linux, ale znowu nie ma to znaczenia dla wykonywanego zadania)
Uwaga: Nie wszystkie znaki są wyświetlane (znaki kontrolne poniżej 0x20). Są one jednak obecne. Większość stron internetowych to utf-8 / 8859/1253 ( https://w3techs.com/technologies/overview/character_encoding/all ), więc uważam, że jest to uzasadnione
(przesunięcie wszystkich wartości poniżej 0x20 na ASCII do wydruku powinno to naprawić).UTF-8
Oto wersja bliższa oryginalnemu wpisowi ze źródłem kodowanym w UTF-8. To zużywa 173 bajtów. Sam łańcuch jest 50 bajtami źródła. Procedura jest również dłuższa, ponieważ bajty ASCII są teraz przechowywane z dopełnianiem zer dla 16-bitowych / 32-bitowych znaków szerokich i należy je przesunąć zamiast rzutować na uint16_t jak wyżej. Tak utrzymywałem, ponieważ można to zweryfikować za pomocą ideonu, który wykorzystuje kodowanie UTF-8.
Biegnij z:
Jeśli możesz ustawić wartość domyślną na 16-bitową liczbę całkowitą w swoim kompilatorze, możesz pominąć deklarację typu wchar_t dla Wide Char. Ideone nie narzeka, więc uważam, że warto iść.
Wypróbuj na ideone
źródło
Haskell, 155 bajtów
W funkcji typu
Int -> String
:Bezpośrednie drukowanie do IO będzie kosztowało 5 bajtów (lub 6, jeśli wolimy zwracać
IO ()
niżIO [()]
):źródło
C, 175 bajtów
konkatenuje każdy x do siebie i powoduje przepełnienie p, aby zakończyć każdą linię.
źródło
Java, 228 bajtów
źródło
n->{String s="";for(int x,r=0;r<16*n;s+=(++r%n<1?"\n":""))for(x=16;x-->0;)s+=((new int[]{1536,10496,128,18496,4592,496,2044,4094,4094,8191,8175,4078,4062,2044,1016,224}[r/n])&(1<<x))<1?" ":"##";return s;}
( 205 bajtów ) Oprócz użycia lambda Java 8 zmniejszyłem więcej bajtów, zmieniając: pozycjęx=16
(i zmieniłemwhile
nafor
); 2x==0
do<1
; zwracanies
zamiast drukowania (import jest również częścią liczby bajtów btw ..);--x>=0
dox-->0
. Świetna odpowiedź, więc +1!J, 89 bajtów
Koduje ciąg jako liczbę podstawową 95, zwiększa każdą cyfrę o
32
, a następnie reprezentuje ją jako ciąg ascii.Wyjaśnienie
Składa się z dwóch głównych części. Istnieje konstrukcja bomby i faktyczne powtórzenie. Na razie określmy bombę jako
b
. Następnie kod wygląda następująco:Po wywołaniu z wejściem
k
odpowiada to:b
jest bombą w pudełku, więck#b
wykonujek
powtórzeniab
,;
spłaszcza ją pionowo i|:
transponuje wynik. (Sama bombab
jest transponowana).Oto bomba:
Poniższy ciąg jest ciągiem zakodowanym w formacie base-95 z przesunięciem
32
, dzięki czemu wszystkie znaki mieszczą się w zakresie ASCII i na szczęście nie ma żadnych znaków'
ucieczki.3 u:
pobiera kody znaków ciągu,32x-~
czyni każdą liczbę rozszerzonąx
i odejmuje32
od niej;95#.
konwertuje na liczbę podstawową 95 i2#.inv
konwertuje ją na tablicę cyfr binarnych. Dodałem interlinię1
do pliku binarnego, aby stała się liczbą całkowitą, więc go zdejmuję}.
. Kształtuję tablicę w stół 16x16, a16 16$
następnie transponuję ją za pomocą|:
. (Możliwy golf na później: transponuj dosłownie zakodowany ciąg znaków.)2#
Powielają każdy znak pod względem szerokości. Pozostaje nam tabela0
s i1
s.' #'{~
mapy0
s do' '
i1
do'#'
. W ten sposób zostaje nam nasza bomba.Przypadek testowy
źródło
BaCon ,
229227195 bajtówWkład w BASIC dla nostalgii. Zmienna „a” określa liczbę bomb.
Wyjście :
źródło
Haskell,
191181 bajtówźródło
C (Atari TOS 2.06 US),
129 124 117113 bajtówUżywa to mapy bitowej bomb z TOS ROM, która nieco różni się od tej w pytaniu. W przypadku innych wersji TOS musisz dostosować adres wskazany przez
*a
. Zauważ, że niektóre romy emulatorów nie zawierają mapy bitowej bomb!Jeśli nie podasz argumentu wiersza poleceń, może zostać wyświetlonych kilka bomb bitmapowych o wysokiej rozdzielczości :-)
źródło
C ++ 11, 252 bajtów
źródło
SmileBASIC, 127 bajtów
(Zrzut ekranu wersji bez podwojonych znaków)
SB ma kwadratową czcionkę, więc podwojenie znaków wygląda źle (i nie mieści się na ekranie)
Znaki spoza ASCII zostały zastąpione przez
x
.Wartości szesnastkowe:
0008,0002,0610,1F8A,3FC1,7FC1,7FF2,FFF4,FFF8,EFF0,73F0,7FC0,3FC0,1F80,0600
Ponieważ SB zapisuje pliki w UTF-8, niektóre z nich liczą się jako 2 lub 3 bajty.
źródło
FOR K=1TO N
zINPUT N
, myślę, że wyświetla liczbę bomb podanych na wejściu. Jednak muszę powiedzieć, że pomimo kwadratowej czcionki, uważam, że znaki powinny być nadal podwajane, aby zachować zgodność z wymaganiami (aby uniknąć przewagi nad innymi odpowiedziami). Możesz zachować obecną dla ładniejszego rozwiązania, ale myślę, że nadal powinieneś dodać poprawne rozwiązanie. Po dodaniu tego będę głosować za kreatywne wykorzystanie znaków UTF-8!Ruby 2.x (lambda) - 157 bajtów
Prawdopodobnie można grać w golfa dalej, ale podoba mi się ta wersja:
Podobny pomysł jak w wersji (wersjach) Pythona: rozbić ciąg szesnastkowo kodowanych bomb na sekcje po 4 znaki, przekonwertować na binarne, tłumaczyć
1
na#
i0
na, podwoić każdy znak i wydrukować wynikową tablicę.
Zauważ, że put służy do wydrukowania tablicy. Spowoduje to wydrukowanie tablicy po jednej linii na element.
źródło
Excel VBA, 204 bajty
Anonimowa funkcja okna natychmiastowego VBE, która pobiera dane wejściowe z zakresu
[A1]
i dane wyjściowe do obiektu ActiveSheetWynik
źródło