Avventura classica ASCII VCS


21

Crescendo, il mio primo sistema di gioco per console è stato un Atari 2600 e avrò sempre l'amore per alcuni di quei giochi che mi sono divertiti tanto da bambino. Molte grafiche sono ancora memorabili, forse anche iconiche.

Si scopre che questi sprite sono bitmap molto semplicistiche, larghe 8 pixel con altezza variabile in cui la rappresentazione binaria è la disposizione dei pixel.

Ad esempio, i byte esadecimali 0x18, 0x24, 0x18 disegnerebbero un cerchio grezzo in questo modo:

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

Poiché la larghezza di 8 pixel crea una grafica abbastanza piccola (anche secondo gli standard Atari 2600) era comune raddoppiare o quadruplicare l'altezza, la larghezza o entrambi per creare una versione più grande (anche se più bloccata e distorta) della stessa immagine. Normalmente sarebbero anche capovolti verticalmente o orizzontalmente sia per gli sprite dei giocatori che per i campi di gioco. Il gioco Combat ne è un buon esempio.

La sfida è scrivere codice per visualizzare questi sprite come "grafici" in forma ASCII, inclusa la possibilità di allungarli o capovolgerli verticalmente, orizzontalmente o entrambi. Questo deve essere sotto forma di un programma completo o di una funzione richiamabile.

Ingresso:

  • Una matrice di byte, ognuno dei quali rappresenta i bit orizzontali per quella linea.
  • Un valore intero diverso da zero per ciascuna direzione, orizzontale e verticale che rappresenta il fattore di ridimensionamento per quella dimensione.
  • Un valore negativo indica che anche la dimensione deve essere capovolta lungo il suo asse.

Produzione:

  • Rappresentazione ASCII in STDOUT o una stringa separata da una nuova riga, usando un carattere spazio per i pixel neri (0) e qualsiasi carattere non spaziale stampabile di tua scelta per i pixel bianchi (1).

Dati di test:

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]

Nota: sopra l'esempio, gli array di input di byte sono forniti come esadecimali. Se la tua piattaforma non accetta valori letterali esadecimali per la rappresentazione di byte, puoi convertirli in valori letterali nativi equivalenti a byte.

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

Nota: le linee orizzontali sopra e sotto mostrano l'inizio e la fine dell'output. Non sono richiesti nell'output, tuttavia sono richieste righe vuote (rappresentate da tutti gli zeri / spazi) all'inizio e / o alla fine, come mostrato.

Nota 2: queste bitmap di prova sono state ispirate e rielaborate / codificate sulla base di schermate di gioco contrassegnate come "fair use" su Wikipedia.

Criteri vincenti

  • Questo è , quindi vince il codice più breve in byte per lingua.
  • Sono vietate le scappatoie standard .

6
"Qualcuno mi porti via questa strana anatra!" - Strong Bad
AdmBorkBork

7
L'ironia è che anche il golf più intelligente qui non sarà probabilmente intelligente come quello che i programmatori dell'Atari 2600 dovevano effettivamente fare se volevano qualcosa di più interessante di un clone Pong: l'intero schermo veniva riprodotto una riga alla volta e il La CPU ha trascorso la maggior parte del tempo a farlo. Con solo 128 byte di RAM, non c'era spazio per un lusso come un buffer dello schermo ... I cinque interi sprite che hai ottenuto erano il lusso.
Jeroen Mostert,

Possiamo prendere l'input come un elenco di stringhe binarie a 8 bit o formati simili in cui i byte sono già decompressi in bit?
Luis Mendo,

@LuisMendo " Se la tua piattaforma non accetta valori letterali esadecimali per la rappresentazione di byte, puoi convertirli in valori letterali nativi equivalenti a byte. "
Kevin Cruijssen,

@KevinCruijssen Questo è il punto, non so cosa sia accettato come equivalente . Questo apre le porte all'inserimento della bitmap direttamente?
Luis Mendo,

Risposte:



5

05AB1E , 27 26 byte

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

Prende l'input come un elenco di stringhe binarie a 8 bit e le emette 1come carattere non spaziale.

-1 byte grazie a @MagicOctopusUrn .

Provalo online o verifica tutti i casi di test .

Spiegazione:

ε         # 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)

Ci deve essere un 2-byter per 0‹i...
Magic Octopus Urn

@MagicOctopusUrn Dovrebbe esserci un 1 byte per 0‹davvero .. Abbiamo un 1 byte per >=0, che è d. Ma dovremmo anche avere 1 byte per verificare la presenza di immagini negative. Ora uso solo 0‹o d_.
Kevin Cruijssen,

Tutto quello che ho potuto inventare era: „íR³²‚0‹Ï.V(codice completo εε²Ä×}J³Äи0ð:}„íR³²‚0‹Ï.V˜») che non è un miglioramento, ma mi libera di uno di quei controlli negativi.
Magic Octopus Urn

1
Inoltre, abbastanza sicuro εS²Ä×J³Äи²0‹ií]³0‹iR}˜0ð:»salva un byte. Se riesci a inserire un array 2D, puoi rimuoverlo Scompletamente per 25 byte.
Magic Octopus Urn

@MagicOctopusUrn Ah ovviamente, S²Ä×invece di ε²Ä×}. Grazie! Hmm, se ci è permesso di prendere gli input binari come un elenco di 0 e 1, un byte aggiuntivo potrebbe essere salvato omettendo il S. Chiederà a OP se questo è permesso. Mi piace anche il „íR³²‚0‹Ï.Vtuo altro commento. :)
Kevin Cruijssen,

3

MATL , 24 19 byte

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

Gli input sono una matrice di numeri decimali, scala orizzontale, scala verticale.

Provalo online!

Spiegazione

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

3

Dyalog APL, 46 42 33 byte

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

Provalo online!

-9 grazie a ngn!


ciascuno -> riduci: {' #'[⊃{⌽⍣(0>⍺)⊢(|⍺)/⍉⍵}/⍺,⊂⍉⍵⊤⍨8/2]}dfn -> programma:' #'[⊃{⌽⍣(0>⍺)⊢(|⍺)/⍉⍵}/⎕,⊂⍉⎕⊤⍨8/2]
ngn

più breve: ' #'[⍉⊃{⊖⍣(0>⍺)⍉⍵/⍨|⍺}/⎕,⊂⎕⊤⍨8/2]. tra l'altro, l'uscita per il secondo test sembra invertita nella soluzione originale
ngn

@ngn grazie! gli input per il secondo esempio avrebbero dovuto essere invertiti per corrispondere al secondo caso di test nella domanda.
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)).

Provalo online!

Spiegazione

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

2

Carbone , 28 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

Fθ

Scorri l'elenco di byte.

E↔ζ

Mappa sopra il fattore di ridimensionamento verticale, moltiplicando così le linee di uscita.

⭆⮌↨ι²×§ Xμ↔η

Convertire l'ingresso in base 2, invertirlo, mappare le cifre nello spazio e Xquindi moltiplicare ciascun carattere per il fattore di scala orizzontale.

F›η⁰‖

Se il fattore di ridimensionamento orizzontale era positivo, rifletti per ottenere di nuovo l'immagine nel modo corretto.

F‹ζ⁰‖↓

Rifletti verticalmente se il fattore di ridimensionamento verticale era negativo.


Non che salverebbe alcun byte, ma sono solo curioso: perché hai usato F( For) invece di ¿( If) per i controlli?
Kevin Cruijssen,

1
@KevinCruijssen In modalità succinta carbone elseè implicito, quindi l'unica volta che posso usare ifè se è l'ultima istruzione nel blocco.
Neil

Ah ok, non lo sapevo. Quindi usarne due Ifqui sarebbe effettivamente uno If ... Else If ...invece di due sciolti If. Hmm, buono a sapersi.
Kevin Cruijssen,


2

Lisp comune , 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"
"))))

Provalo online!

Spiegazione

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

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

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

2

8088 codice macchina, IBM PC DOS, 77 71 byte

assemblato:

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

annuncio:

    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

Questo si è rivelato più stupido di ASM di quanto pensassi inizialmente. Più cicli simultanei e molte ramificazioni if ​​/ else possono sicuramente darti mal di testa.

Questo è implementato come MACRO poiché consente il passaggio di parametri simili a funzioni per il test.

Produzione

Ecco un programma di test per DOS che richiede il fattore di ridimensionamento X e Y e disegna sullo schermo. Nota, ridimensionare troppo il drago scorrerà oltre la parte superiore poiché la finestra DOS predefinita è solo 24 righe.

inserisci qui la descrizione dell'immagine

Ed ecco il nostro piccolo drago (anatra):

inserisci qui la descrizione dell'immagine

Provalo online!

È possibile eseguire il test in una VM DOS utilizzando DOSBox o VirtualConsoles.com con i seguenti passaggi:

  1. Scarica VCS.ZIP (contiene tutti e quattro i file eseguibili)
  2. Vai a https://virtualconsoles.com/online-emulators/DOS/
  3. Carica il file ZIP appena scaricato, fai clic su Avvia
  4. Digitare PLANE, KEY, TANKo DRAGON.

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

Se l'input deve essere esadecimale

126 byte



1

APL (Dyalog Extended) , 23 byte SBCS

il metodo di dzaima

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

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

Provalo online!

{... }/ riduci da destra a sinistra usando la seguente lambda anonima:

|⍺ la grandezza dell'argomento sinistro (il fattore di ridimensionamento)

⍵/⍨ usalo per replicare l'argomento giusto in senso orizzontale

 trasporre

⊖⍣(... ) capovolgi se:

  >⍺ il fattore di ridimensionamento è inferiore a zero

 divulgare (poiché la riduzione è inclusa per ridurre il rango di tensore da 1 a 0)

' x'⊇⍨ seleziona gli elementi dalla stringa "x" usando quella matrice



1

T-SQL, 216 byte

Prima di eseguire questo MS-SQL Studio Management, premere CRTL-t per mostrare i dati come testo. L'altezza non può essere regolata per superare il numero di elementi nell'input.

A causa della terribile implementazione di STRING_AGG , la variabile di altezza funzionerà solo in MSSM. Gli Stati membri avrebbero dovuto creare un terzo parametro facoltativo per includere l'ordine degli elementi concatenati.

La versione online può supportare solo la regolazione della larghezza. L'altezza si tradurrà in un risultato funky con più forme di impilamento.

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

Questo script non mostrerà le forme corrette nella versione online, quindi ho apportato alcune piccole modifiche per compensare. Provalo online

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.