Petualangan VCS ASCII Klasik

21

Tumbuh dewasa, sistem game konsol pertama saya adalah Atari 2600 dan saya akan selalu memiliki cinta untuk beberapa game yang sangat saya nikmati sebagai seorang anak. Banyak gambar yang masih berkesan, bahkan mungkin ikon.

Ternyata sprite ini adalah bitmap yang sangat sederhana, lebar 8 piksel dengan tinggi variabel di mana representasi biner adalah susunan piksel.

Misalnya, byte heksa 0x18, 0x24, 0x18 akan menggambar lingkaran kasar seperti:

0x18: 00011000
0x24: 00100100
0x18: 00011000

Karena lebar 8 piksel menghasilkan grafik yang cukup kecil (bahkan menurut standar Atari 2600), adalah umum untuk menggandakan atau melipatgandakan tinggi, lebar, atau keduanya untuk membuat versi gambar yang sama lebih besar (meskipun lebih gumpal dan terdistorsi). Mereka umumnya juga dibalik secara vertikal atau horizontal untuk sprite dan playfield pemain. Game Combat adalah contoh yang bagus untuk ini.

Tantangannya adalah, menulis kode untuk menampilkan sprite ini sebagai "grafik" dalam bentuk ASCII termasuk kemampuan untuk merentangkan atau membalikkannya secara vertikal, horizontal atau keduanya. Ini harus dalam bentuk program lengkap, atau fungsi yang dapat dipanggil.

Memasukkan:

  • Array byte, masing-masing mewakili bit horizontal untuk garis itu.
  • Nilai integer non-nol untuk setiap arah, horizontal dan vertikal mewakili faktor penskalaan untuk dimensi itu.
  • Nilai negatif menunjukkan bahwa dimensi juga harus dibalik sepanjang porosnya.

Keluaran:

  • Representasi ASCII ke STDOUT atau string yang dipisahkan baris baru, menggunakan karakter spasi untuk piksel hitam (0) dan karakter non-spasi cetak yang dapat dicetak pilihan Anda untuk piksel putih (1).

Data uji:

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]

Catatan: Di atas contoh, array input byte disediakan sebagai hex. Jika platform Anda tidak menerima hex literal untuk representasi byte, Anda dapat mengonversinya menjadi literal setara-byte asli.

Contoh Output:

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        
--------------------------------

Catatan: garis horizontal di atas dan di bawah ini menunjukkan awal dan akhir output. Mereka tidak diperlukan dalam output, namun baris kosong (diwakili oleh semua nol / spasi) pada awal dan / atau akhir diperlukan, seperti yang ditunjukkan.

Catatan 2: bitmap uji ini terinspirasi oleh dan digambar ulang / dikodekan berdasarkan tangkapan layar gim yang ditandai sebagai "penggunaan wajar" di Wikipedia.

Kriteria Menang

  • Ini adalah , jadi kode terpendek dalam byte per bahasa menang.
  • Celah standar dilarang.
640KB
sumber
6
"Seseorang mengambil bebek sialan ini dariku!" - Strong Bad
AdmBorkBork
7
Ironisnya adalah bahwa bahkan golf paling pintar di sini mungkin tidak akan sepintar apa yang harus dilakukan oleh programmer untuk Atari 2600 jika mereka menginginkan sesuatu yang lebih menarik daripada klon Pong - seluruh layar diberikan satu baris pada satu waktu dan CPU menghabiskan sebagian besar waktunya untuk melakukan itu. Dengan hanya 128 byte RAM, tidak ada ruang untuk kemewahan seperti penyangga layar ... Kelima seluruh sprite yang Anda dapatkan adalah kemewahan.
Jeroen Mostert
Bisakah kita mengambil input sebagai daftar string biner 8-bit, atau format serupa di mana byte sudah dibongkar menjadi bit?
Luis Mendo
@LuisMendo " Jika platform Anda tidak menerima hex literal untuk representasi byte, Anda dapat mengonversinya menjadi literal yang setara dengan byte asli. "
Kevin Cruijssen
@KevinCruijssen Itulah intinya, saya tidak tahu apa yang diterima sebagai setara . Apakah itu membuka pintu untuk memasukkan bitmap secara langsung?
Luis Mendo

Jawaban:

5

Python 2 , 117 byte

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),

Cobalah online!

TFeld
sumber
5

05AB1E , 27 26 byte

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

Mengambil input sebagai daftar string biner 8-bit, dan output dengan 1karakter non-space.

-1 byte terima kasih kepada @MagicOctopusUrn .

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

ε         # 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
sumber
Harus ada 2-byter untuk 0‹i...
Magic Octopus Mm
@ MagicOctopusUrn Seharusnya memang ada 1-byte untuk 0‹.. Kita memang punya 1-byter >=0, yaitu d. Tetapi kita juga harus memiliki 1-byter untuk memeriksa imo negatif. Sekarang saya hanya menggunakan 0‹atau d_.
Kevin Cruijssen
Yang bisa saya pikirkan adalah: „íR³²‚0‹Ï.V(kode lengkap εε²Ä×}J³Äи0ð:}„íR³²‚0‹Ï.V˜») yang bukan merupakan peningkatan, tetapi menyingkirkan salah satu dari cek negatif itu.
Guci Gurita Ajaib
1
Juga, cukup yakin εS²Ä×J³Äи²0‹ií]³0‹iR}˜0ð:»menghemat satu byte. Jika Anda dapat mengambil dalam array 2D, Anda dapat menghapus Sseluruhnya untuk 25 byte.
Magic Gurita Guci
@MagicOctopusUrn Ah tentu saja, S²Ä×bukan ε²Ä×}. Terima kasih! Hmm, jika kita diizinkan untuk mengambil input biner sebagai daftar 0s dan 1s byte tambahan dapat disimpan dengan menghilangkan S. Akan menanyakan OP apakah ini diizinkan. Saya suka Anda „íR³²‚0‹Ï.Vdi komentar Anda yang lain juga. :)
Kevin Cruijssen
3

MATL , 24 19 byte

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

Input adalah array angka desimal, skala horizontal, skala vertikal.

Cobalah online!

Penjelasan

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
sumber
3

Dyalog APL, 46 42 33 byte

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

Cobalah online!

-9 terima kasih kepada ngn!

dzaima
sumber
masing -> perkecil: {' #'[⊃{⌽⍣(0>⍺)⊢(|⍺)/⍉⍵}/⍺,⊂⍉⍵⊤⍨8/2]}dfn -> program:' #'[⊃{⌽⍣(0>⍺)⊢(|⍺)/⍉⍵}/⎕,⊂⍉⎕⊤⍨8/2]
ngn
pendek: ' #'[⍉⊃{⊖⍣(0>⍺)⍉⍵/⍨|⍺}/⎕,⊂⎕⊤⍨8/2]. btw, output untuk tes kedua tampaknya terbalik dalam solusi asli Anda
ngn
@ ngn terima kasih! input untuk contoh ke-2 seharusnya dibalik agar sesuai dengan test-case ke-2 dalam pertanyaan.
dzaima
3

Prolog (SWI) , 252 byte

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)).

Cobalah online!

Penjelasan

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`
   )
Khusus ASCII
sumber
2

Arang , 28 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

Fθ

Ulangi daftar byte.

E↔ζ

Peta di atas faktor penskalaan vertikal, sehingga melipatgandakan garis keluaran.

⭆⮌↨ι²×§ Xμ↔η

Konversikan input ke basis 2, balikkan, petakan digit ke spasi dan X, kemudian gandakan setiap karakter dengan faktor penskalaan horizontal.

F›η⁰‖

Jika faktor penskalaan horizontal positif, refleksikan untuk mendapatkan gambar dengan cara yang benar lagi.

F‹ζ⁰‖↓

Refleksikan secara vertikal jika faktor penskalaan vertikal negatif.

Neil
sumber
Bukan berarti itu akan menghemat byte, tapi saya hanya ingin tahu: mengapa Anda menggunakan F( For) bukannya ¿( If) untuk cek?
Kevin Cruijssen
1
@KevinCruijssen Dalam mode ringkas Arang, elseini tersirat sehingga satu-satunya waktu yang dapat saya gunakan ifadalah jika itu adalah pernyataan terakhir di blok.
Neil
Ah ok, tidak tahu tentang itu. Jadi menggunakan dua di Ifsini sebenarnya akan menjadi If ... Else If ...dua bukan longgar If. Hmm, senang tahu.
Kevin Cruijssen
2

C (dentang) , 120 byte

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;}

Cobalah online!

AZTECCO
sumber
Disimpan 2 byte berkat ceilingcat
AZTECCO
2

Common Lisp , 157 byte

(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"
"))))

Cobalah online!

Penjelasan

(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
        )
    )
)
Khusus ASCII
sumber
2

Tcl , 192 byte

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)]}}

Cobalah 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)]
    }
}
Khusus ASCII
sumber
2

8088 kode mesin, IBM PC DOS, 77 71 byte

Dirakit:

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

Daftar:

    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

Ini ternyata menjadi lebih doozy di ASM daripada yang saya pikir sebelumnya. Beberapa loop bersamaan dan banyak jika / bercabang tentu bisa membuat Anda sakit kepala.

Ini diimplementasikan sebagai MACRO karena memungkinkan melewati parameter seperti fungsi untuk pengujian.

Keluaran

Berikut ini adalah program uji untuk DOS yang meminta faktor penskalaan X dan Y dan menarik ke layar. Catatan, terlalu banyak menskala naga akan menggulir melewati bagian atas karena jendela DOS default hanya 24 baris.

masukkan deskripsi gambar di sini

Dan inilah naga kecil kita (bebek):

masukkan deskripsi gambar di sini

Cobalah secara Online!

Anda dapat menguji dalam DOS VM menggunakan DOSBox atau VirtualConsoles.com dengan langkah-langkah berikut:

  1. Unduh VCS.ZIP (berisi keempat executable)
  2. Pergi ke https://virtualconsoles.com/online-emulators/DOS/
  3. Unggah file ZIP yang baru saja Anda unduh, klik Mulai
  4. Ketik PLANE, KEY, TANKatau DRAGON.
640KB
sumber
1

Perl 5, 105 byte

($_,$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

Jika input harus berupa hex

126 byte

Nahuel Fouilleul
sumber
1

Jelly , 21 byte

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

Cobalah online!

Diasumsikan ada paling banyak satu argumen baris perintah.

Erik the Outgolfer
sumber
1

APL (Dyalog Extended) , 23 byte SBCS

metode dzaima

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

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

Cobalah online!

{... }/ kurangi dari kanan ke kiri menggunakan lambda anonim berikut:

|⍺ besarnya argumen kiri (faktor penskalaan)

⍵/⍨ gunakan itu untuk mereplikasi argumen yang benar secara horizontal

 mengubah urutan

⊖⍣(... ) balik jika:

  >⍺ faktor penskalaan kurang dari nol

 mengungkapkan (karena reduksi terlampir untuk mengurangi peringkat tensor dari 1 ke 0)

' x'⊇⍨ pilih elemen dari string "x" menggunakan matriks itu

Adm
sumber
1

Ruby , 89 byte

->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]]}*''}}

Cobalah online!

GB
sumber
1

T-SQL, 216 byte

Sebelum menjalankan Manajemen MS-SQL Studio ini, tekan CRTL-t untuk menampilkan data sebagai teks. Ketinggian tidak dapat disesuaikan untuk melebihi jumlah elemen dalam input.

Karena implementasi STRING_AGG yang mengerikan , variabel tinggi hanya akan berfungsi di MSSM. MS seharusnya membuat parameter opsional ketiga untuk memasukkan urutan elemen yang sedang digabungkan.

Versi online hanya dapat mendukung penyesuaian lebar. Tinggi akan menghasilkan hasil yang funky dengan berbagai bentuk susun.

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

Skrip ini tidak akan menampilkan bentuk yang benar dalam versi online, jadi saya membuat beberapa penyesuaian kecil untuk mengkompensasi. Cobalah online

t-clausen.dk
sumber