Klasyczna przygoda VCS ASCII

21

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 , więc wygrywa najkrótszy kod w bajtach na język.
  • Standardowe luki są zabronione.
640 KB
źródło
6
„Ktoś odbiera mi tę cholerną kaczkę!” - Strong Bad
AdmBorkBork
7
Ironią jest to, że nawet najmądrzejsi gracze w golfa prawdopodobnie nie będą tak sprytni, jak to, co musieli zrobić programiści Atari 2600, jeśli chcieli czegoś bardziej interesującego niż klon Ponga - cały ekran był renderowany pojedynczo, a linia Procesor spędził na tym większość czasu. Mając tylko 128 bajtów pamięci RAM, nie było miejsca na luksus, taki jak bufor ekranowy ... Pięć, które dostałeś, to luksus.
Jeroen Mostert
Czy możemy przyjąć dane wejściowe jako listę 8-bitowych ciągów binarnych lub podobnych formatów, w których bajty są już rozpakowane w bity?
Luis Mendo
@LuisMendo „ Jeśli Twoja platforma nie przyjmuje liter szesnastkowych do reprezentacji bajtów, możesz przekonwertować je na natywny bajt literał.
Kevin Cruijssen
@KevinCruijssen Chodzi o to, że nie wiem, co jest akceptowane jako równoważne . Czy to otwiera drzwi do bezpośredniego wprowadzania mapy bitowej?
Luis Mendo

Odpowiedzi:

5

Python 2 , 117 bajtów

def f(m,w,h):
 for r in m[::cmp(h,0)]:print(''.join(' X'[1<<i&r>0]*abs(w)for i in range(8)[::cmp(0,w)])+'\n')*abs(h),

Wypróbuj online!

TFeld
źródło
5

05AB1E , 27 26 bajtów

εS²Ä×J³Äи²0‹ií]³0‹iR}˜0ð:»

Pobiera dane wejściowe jako listę 8-bitowych ciągów binarnych, a dane wyjściowe ma 1postać spacji.

-1 bajt dzięki @MagicOctopusUrn .

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

ε         # Map the (implicit) input-list to:
 S        #  Convert the binary-String to a list of characters
  ²Ä      #  Take the absolute value of the second input
    ×     #  And repeat each character that many times
     J    #  And then join it back together to a single string again
 ³Ä       #  Take the absolute value of the third input
   и      #  Repeat that string as a list that many times
 ²0i     #  If the second input is negative:
     í    #   Reverse each string in the list
]         # Close both the if-statement and (outer) map
³0i }    # If the third input is negative:
    R     #  Reverse the list of lists
      ˜   # Flatten the list of lists to a list of strings
0ð:       # Replace all 0s with spaces " "
   »      # And join the strings by newlines (which is output implicitly)
Kevin Cruijssen
źródło
Musi być 2-bajter dla 0‹i...
Magic Octopus Urn
@MagicOctopusUrn Rzeczywiście powinien być 1-bajtowy 0‹. Mamy 1-bajtowy >=0, czyli d. Ale powinniśmy również mieć 1 bajt, aby sprawdzić negatywne imo. Teraz używam tylko 0‹lub d_.
Kevin Cruijssen
Wszystko, co mogłem wymyślić, to: „íR³²‚0‹Ï.V(pełny kod εε²Ä×}J³Äи0ð:}„íR³²‚0‹Ï.V˜»), co nie jest poprawą, ale usuwa jedną z tych negatywnych kontroli.
Magic Octopus Urn
1
Ponadto, całkiem pewne, εS²Ä×J³Äи²0‹ií]³0‹iR}˜0ð:»oszczędza bajt. Jeśli możesz wziąć w matrycę 2D, możesz Scałkowicie usunąć dla 25 bajtów.
Magic Octopus Urn
@MagicOctopusUrn Ah oczywiście S²Ä×zamiast ε²Ä×}. Dzięki! Hmm, jeśli wolno nam przyjmować wejścia binarne jako listę zer i jedynek, można zapisać dodatkowy bajt, pomijając S. Zapyta OP, czy jest to dozwolone. Podoba mi się również „íR³²‚0‹Ï.Vtwój komentarz. :)
Kevin Cruijssen
3

MATL , 24 19 bajtów

B,!i|1&Y"2M0<?XP]Zc

Dane wejściowe to tablica liczb dziesiętnych, skala pozioma, skala pionowa.

Wypróbuj online!

Wyjaśnienie

B        % Implicit input: array of numbers. Convert to binary. Gives a zero-one
         % matrix, each row containing the binary expansion of a number
,        % Do twice
  !      %   Transpose
  i      %   Input: number
  |      %   Absolute value
  1&Y"   %   Repeat each row that many times
  2M     %   Push the latest input again
  0<     %   Is it negative?
  ?      %   If so:
    XP   %     Flip vertically
  ]      %   End
  Zc     %   Convert each nonzero into '#'. Zeros are displayed as space
         % Implicit end. Implicit display
Luis Mendo
źródło
3

Dyalog APL, 46 42 33 bajtów

' #'[⍉⊃{⊖⍣(0>⍺)⍉⍵/⍨|⍺}/⎕,⊂⎕⊤⍨8/2]

Wypróbuj online!

-9 dzięki ngn!

dzaima
źródło
każdy -> zmniejsz: {' #'[⊃{⌽⍣(0>⍺)⊢(|⍺)/⍉⍵}/⍺,⊂⍉⍵⊤⍨8/2]}dfn -> program:' #'[⊃{⌽⍣(0>⍺)⊢(|⍺)/⍉⍵}/⎕,⊂⍉⎕⊤⍨8/2]
ngn
krócej: ' #'[⍉⊃{⊖⍣(0>⍺)⍉⍵/⍨|⍺}/⎕,⊂⎕⊤⍨8/2]. btw, wyniki drugiego testu wydają się być odwrócone w oryginalnym rozwiązaniu
ngn
@ngn dzięki! dane wejściowe dla drugiego przykładu powinny zostać odwrócone, aby pasowały do ​​drugiego przypadku testowego w pytaniu.
dzaima
3

Prolog (SWI) , 252 bajty

N+E+R:-N<1,R=[];N-1+E+S,R=[E|S].
N*E*R:-R=E,E=[];N<0,reverse(E,F),-N*F*R;[H|T]=E,N+H+S,N*T*U,append(S,U,R).
N/E/R:-N<1,R=[];(E<N,D=E,F=32;D=E-N,F=35),N/2/D/C,R=[F|C].
[H|T]^X^Y^R:-128/H/A,X*A*B,Y*[[10|B]]*C,append(C,D),(T=[],R=D;T^X^Y^S,append(D,S,R)).

Wypróbuj online!

Wyjaśnienie

N+E+R:-N<1,R=[];N-1+E+S,R=[E|S].   Make `R` a list containing `E` repeated `N` times
       N<1,R=[]                    If `N<1`, let `R` be the empty list
       N-1+E+S                     Else recurse with `N-1`, `E` and `S`
           R=[E|S]                 Let `R` be a new list with `E` as head and `S` as tail
N*E*R:-R=E,E=[];N<0,reverse(E,F),-N*F*R;[H|T]=E,N+H+S,N*T*U,append(S,U,R).
                                   Let `R` be a list
                                   with each element in `E` repeated `N` times
                                   e.g. 2*[3, 6] -> [3, 3, 6, 6]
       R=E,E=[]                    Let `R` be `E` if `E` is the empty list
       N<0,reverse(E,F)            Else if `N<0`, let `F` be the reverse of `E`
           -N*F*R                  Recurse with `-N`, `F` and `R`
       [H|T]=E                     Else let `H` be the head and `T` be the tail of `E`
           N+H+S                   Let `S` be `N+H+S` (our function, not addition)
           N*T*U                   Recurse with `N`, `T` and `U`
           append(S,U,R)           let `R` be the concatenation of `S` and `U`
N/E/R:-N<1,R=[];(E<N,D=E,F=32;D=E-N,F=35),N/2/D/C,R=[F|C].
                                   Make `R` the binary representation of `E`
                                   with `N` as the value of the current bit
                                   where 0 and 1 are space and hash respectively
    N<1,R=[]                       If `N<1` let `R` be the empty list
    (
        E<N,D=E,F=32               If `E<N` the bit isn't set, so `D=E`, `F=space`
        D=E-N,F=35                 Else `D=E-N`, `F=hash`
    )
        N/2/D/C                    Recurse with `N/2`, `D` and `C`
        R=[F|C]                    Let `R` be a new list with `F` as head and `C` as tail
[H|T]^X^Y^R:-128/H/A,X*A*B,Y*[[10|B]]*C,append(C,D),(T=[],R=D;T^X^Y^S,append(D,S,R)).
                                   Make `R` the result,
                                   with inputs being the list `[H|T]`
                                   and the scales `X` and `Y`
   128/H/A                         Let `A` be the binary representation of `H` (8 bits)
   X*A*B                           Let `B` be `A` with each element repeated `X` times
   Y*[[10|B]]*C                    Let `C` be `B` with a newline prepended,
                                   repeated `Y` times
   append(C,D)                     Let `D` be `C` flattened by one level (joining lines)
   (
       T=[],R=D                    If `T` is empty, let `R` be `D` 
       T^X^Y^S                     Else recurse with `T`, `X`, `Y` and `S`
           append(D,S,R)           Let `R` be the concatenation of `D` and `S`
   )
Tylko ASCII
źródło
2

Węgiel drzewny , 28 bajtów

FθE↔ζ⭆⮌↨ι²×§ Xμ↔ηF›η⁰‖F‹ζ⁰‖↓

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

Fθ

Pętla nad listą bajtów.

E↔ζ

Odwzoruj na pionowym współczynniku skalowania, mnożąc w ten sposób linie wyjściowe.

⭆⮌↨ι²×§ Xμ↔η

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.

F›η⁰‖

Jeśli współczynnik skalowania w poziomie był dodatni, odbij, aby ponownie uzyskać prawidłowy obraz.

F‹ζ⁰‖↓

Odbij pionowo, jeśli współczynnik skalowania w pionie był ujemny.

Neil
źródło
Nie żeby to oszczędzało bajty, ale jestem ciekawy: dlaczego użyłeś F( For) zamiast ¿( If) do czeków?
Kevin Cruijssen
1
@KevinCruijssen W zwięzłym trybie Charcoal elsejest to sugerowane, więc mogę użyć iftylko tego, jeśli jest to ostatnia instrukcja w bloku.
Neil
Ach ok, nie wiedziałem o tym. Więc użycie dwóch Iftutaj byłoby właściwie If ... Else If ...zamiast dwóch luźnych If. Hmm, dobrze wiedzieć.
Kevin Cruijssen
2

C (brzęk) , 120 bajtów

k,w,l,_;f(*o,z,x,y){for(w=z*y;w;)for(k=w>0?z*y-w--:++w,_=l=8*x;_;putchar(_?o[k/y]>>(l>0?--l/x:7-++l/x)&1?88:46:10))_=l;}

Wypróbuj online!

AZTECCO
źródło
Zaoszczędziłem 2 bajty dzięki pułapce kota
AZTECCO
2

Common Lisp , 157 bajtów

(lambda(l x y)(dolist(i(if(< y 0)(reverse l)l))(dotimes(j(abs y))(dotimes(n 8)(dotimes(k(abs x))(princ(if(logbitp(if(< x 0)n(- 7 n))i)"#"" "))))(princ"
"))))

Wypróbuj online!

Wyjaśnienie

(lambda(l x y)                           ; Lambda with parameters `l`, `x`, `y`
    (dolist
        (i                               ; For `i` in the list  
            (if(< y 0)(reverse l)l)      ; The reverse of `l` if `y<0` else `l`
        )
        (dotimes(j(abs y))(dotimes(n 8)(dotimes(k(abs x))
                                         ; Do `y` times, for `n` from 0 to 7, do `x` times
        (princ(if(logbitp(if(< x 0)n(- 7 n))i)"#"" "))))
                                         ; If `x<0` and the `n`th bit is 1
                                         ; or `x>0` and the `7-n`th bit is 1
                                         ; print "#", else print " "
        (princ"
")                                       ; After every `y` loop, print a newline
        )
    )
)
Tylko ASCII
źródło
2

Tcl , 192 bajty

proc f {l x y} {lmap i [if $y<0 {lreverse $l} {lindex $l}] {time {lmap n {0 1 2 3 4 5 6 7} {time {puts -nonewline [expr $i&1<<($x<0?$n:7-$n)?{#}:{ }]} [expr abs($x)]};puts {}} [expr abs($y)]}}

Wypróbuj online!

proc f {l x y}                           Define a function `f` with arguments `l`, `x`, `y`
{lmap i                                  For each `i` in
    [if $y<0 {lreverse $l} {lindex $l}]  The reverse of `l` if `y<0` else `l`
    {
        time {                           Do `abs(y)` times
            lmap n {0 1 2 3 4 5 6 7} {   For `n` from 0 to 7
                time {                   Do `abs(x)` times
                    puts -nonewline      Print without newline
                         [expr $i&1<<($x<0?$n:7-$n)?{#}:{ }]
                                         If `x<0` and the `n`th bit is 1 or
                                         `x>0` and the `7-n`th bit is 1
                                         then return "#" else return " "
                } [expr abs($x)]
            };
            puts {}                      Print a newline
        } [expr abs($y)]
    }
}
Tylko ASCII
źródło
2

Kod maszynowy 8088, IBM PC DOS, 77 71 bajtów

Zmontowane:

B402 84FF 7906 FD03 F14E F6DF 518A CFAC 5051 B108 8AF3 84F6 7902 F6DE
518A CEB2 2384 DB79 04D0 C8EB 02D0 C072 02B2 2050 CD21 58E2 FA59 E2E4
B20D CD21 B20A CD21 5958 E2CC 59E2 C5

Wymienianie kolejno:

    PR_BMP  MACRO BMP, SZBMP, ZX, ZY
            LOCAL LOOP_Y, LOOP_Y2, LOOP_X, LOOP_X2, X_POS, X_NEG
B4 02   MOV  AH, 2          ; DOS display char function 
84 FF   TEST ZY, ZY         ; is Y scale negative?
79 06   JNS  LOOP_Y         ; if positive, start Y LOOP
FD      STD                 ; direction flag start from end
03 F1   ADD  BMP, CX        ; advance input byte array to end
4E      DEC  BMP            ; zero adjust index
F6 DF   NEG  ZY             ; make counter positive
     LOOP_Y:    
51      PUSH CX             ; save outer byte loop counter
8A CF   MOV  CL, ZY         ; set up repeat counter (Y scale factor)
AC      LODSB               ; load byte into AL
     LOOP_Y2:
50      PUSH AX             ; save original AL
51      PUSH CX             ; save outer loop
B1 08   MOV  CL, 8          ; loop 8 bits
8A F3   MOV  DH, ZX         ; DH is positive X scale used as counter
84 F6   TEST ZX, ZX         ; is X scale negative?
79 02   JNS  LOOP_X         ; if so, make counter positive
F6 DE   NEG  DH             ; compliment X counter 
    LOOP_X:
51      PUSH CX             ; save bit counter
8A CE   MOV  CL, DH         ; set repeat counter (X scale factor)
B2 23   MOV  DL, '#'        ; by default, display a #
84 DB   TEST ZX, ZX         ; is X scale negative?
79 04   JNS  X_POS          ; if so, rotate left 1 bit
D0 C8   ROR  AL, 1          ; else rotate right LSB into CF
EB 02   JMP  X_NEG          ; jump to examine CF
    X_POS:
D0 C0   ROL  AL, 1          ; rotate left MSB into CF
    X_NEG:
72 02   JC   LOOP_X2        ; is a 1?   
B2 20   MOV  DL, ' '        ; if not, display a space
    LOOP_X2:    
50      PUSH AX             ; save AL (since silly DOS overwrites it)
CD 21   INT  21H            ; display char
58      POP  AX             ; restore AL
E2 FA   LOOP LOOP_X2        ; loop repeat counter
59      POP  CX             ; restore bit counter
E2 E4   LOOP LOOP_X         ; loop bit counter
B2 0D   MOV  DL, 0DH        ; display CRLF
CD 21   INT  21H
B2 0A   MOV  DL, 0AH
CD 21   INT  21H
59      POP  CX             ; restore outer loop
58      POP  AX             ; restore original AL
E2 CC   LOOP LOOP_Y2        ; loop row display
59      POP  CX             ; restore byte counter
E2 C5   LOOP LOOP_Y         ; loop byte counter
    ENDM

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.

wprowadź opis zdjęcia tutaj

A oto nasz mały smok (kaczka):

wprowadź opis zdjęcia tutaj

Wypróbuj online!

Możesz przetestować na maszynie wirtualnej DOS za pomocą DOSBox lub VirtualConsoles.com, wykonując następujące czynności:

  1. Pobierz VCS.ZIP (zawiera wszystkie cztery pliki wykonywalne)
  2. Idź do https://virtualconsoles.com/online-emulators/DOS/
  3. Prześlij pobrany plik ZIP, kliknij przycisk Start
  4. Wpisz PLANE, KEY, TANKlub DRAGON.
640 KB
źródło
1

Perl 5, 105 bajtów

($_,$h,$v)=@F;say for map{$_=reverse if$h<0;y/0/ /;s/./$&x abs$h/eg;($_)x abs$v}$v<0?reverse/\d+/g:/\d+/g

TIO

Jeśli dane wejściowe muszą być szesnastkowe

126 bajtów

Nahuel Fouilleul
źródło
1

Galaretka , 21 bajtów

⁴²+BḊ€⁸m€Ṡ}¥xA}ZʋƒYo⁶

Wypróbuj online!

Zakłada, że ​​istnieje najwyżej jeden argument wiersza poleceń.

Erik the Outgolfer
źródło
1

APL (Dyalog Extended) , 23 bajty SBCS

metoda dzaima

(v,h,B)vhB⎕IO←0

' x'⊇⍨∘⊃{⊖⍣(>⍺)⍉⍵/⍨|⍺}/

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

Adám
źródło
1

Rubinowy , 89 bajtów

->b,w,h{y=h>0?-1:0;(b*h.abs).map{y+=1;[*1+8*w..0,*0...8*w].map{|x|' X'[b[y/h][x/w]]}*''}}

Wypróbuj online!

GB
źródło
1

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.

USE master
DECLARE @ table(v int,i int identity)
INSERT @ values
(0x06),(0x0F),(0xF3),(0xFE),(0x0E),(0x04),
(0x04),(0x1E),(0x3F),(0x7F),(0xE3),(0xC3),
(0xC3),(0xC7),(0xFF),(0x3C),(0x08),(0x8F),
(0xE1),(0x3F)
-- @  = width
-- @h = height
DECLARE @s INT=1,@h INT=1

SELECT iif(@s>0,reverse(x),x)FROM(SELECT
string_agg(replicate(iif(v&n=0,' ','X'),abs(@s)),'')x,i,j
FROM(values(1),(2),(4),(8),(16),(32),(64),(128))x(n)
,@,(SELECT top(abs(@h))i j FROM @)g GROUP BY i,j)f
ORDER BY i*@h

Ten skrypt nie wyświetla poprawnych kształtów w wersji online, więc dokonałem drobnych korekt, aby to zrekompensować. Wypróbuj online

t-clausen.dk
źródło