Klasik VCS ASCII Macera


21

Büyüdükçe, ilk konsol oyun sistemim Atari 2600'dü ve çocukken çok zevk aldığım oyunlardan her zaman bir sevgim olacak. Grafiklerin çoğu hala unutulmaz, hatta belki ikoniktir.

Bu spriteların çok basit bitmapler olduğu, değişken yükseklikte 8 piksel genişliğinde, ikili gösterimin piksellerin düzenlendiği olduğu ortaya çıktı.

Örneğin, onaltılık bayt 0x18, 0x24, 0x18 şöyle bir ham daire çizer:

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

8 piksel genişliğinde oldukça küçük grafikler oluşturduğu için (Atari 2600 standartlarına göre), aynı görüntünün daha büyük (daha bloklu ve bozuk) bir versiyonunu oluşturmak için yüksekliği, genişliği veya her ikisini iki katına veya dörte katlamak yaygındı. Ayrıca, hem oyuncu sprite hem de playfield'ler için dikey veya yatay olarak çevrilirler. Oyun Combat buna güzel bir örnektir.

Buradaki zorluk, ASCII formunda bu grafikleri dikey, yatay veya her ikisini de uzatma veya döndürme yeteneğini içeren "grafikler" olarak görüntülemek için kod yazmaktır. Bu, tam bir program veya çağrılabilir işlev biçiminde olmalıdır.

Giriş:

  • Her biri bu satır için yatay bitleri temsil eden bir bayt dizisi.
  • Her yön için sıfır olmayan bir tamsayı değeri, bu boyut için ölçeklendirme faktörünü temsil eden yatay ve dikey.
  • Negatif bir değer, boyutun kendi ekseni boyunca çevrilmesi gerektiğini gösterir.

Çıktı:

  • Siyah (0) pikseller için bir boşluk karakteri ve beyaz (1) pikseller için seçtiğiniz herhangi bir yazdırılabilir, boşluksuz karakter için STDOUT veya yeni satırlarla ayrılmış bir dizeye ASCII gösterimi.

Test verisi:

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]

Not: Yukarıdaki örnekte bayt giriş dizileri altıgen olarak verilmiştir. Platformunuz bayt temsili için onaltılık değişmezleri kabul etmezse, onları yerel bayt eşdeğeri bir değişmeze dönüştürebilirsiniz.

Örnek çıktı:

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

Not: Yukarıdaki ve altındaki yatay çizgiler, çıkışın başlangıcını ve sonunu göstermektir. Çıktıda gerekli değildirler, ancak gösterildiği gibi, başlangıç ​​ve / veya sondaki boş satırlar (tüm sıfırlar / boşluklarla temsil edilir) gereklidir.

Not 2: Bu test bitmap'leri ilham aldı ve Wikipedia'da "adil kullanım" olarak etiketlenen oyun ekran görüntülerine dayanarak yeniden çizildi / kodlandı.

Kazanma Kriterleri

  • Bu , yani dil başına bayt cinsinden en kısa kod kazanır.
  • Standart boşluklar yasaktır.

6
"Birisi bu ucube ördeği benden uzak tut!" - Güçlü Kötü
AdmBorkBork

7
Buradaki ironi, en zeki golf oyununun bile, Atari 2600 için programcıların Pong klonundan daha ilginç bir şey isterlerse yapmak zorunda oldukları kadar akıllıca davranmayacaklarıydı - tüm ekran bir seferde bir satır ve CPU zamanının çoğunu bunu yaparak geçirdi. RAM sadece 128 byte ile, var beş bütün sprite ... ekran tampon gibi bir lüks için hiçbir yer yoktu vardı lüks.
Jeroen Mostert Jan'da

Girdiyi 8 bitlik ikili dizelerin bir listesi veya baytların zaten bitler halinde açıldığı benzer formatlar olarak alabilir miyiz?
Luis Mendo

@LuisMendo " Eğer platformunuz bayt temsili için onaltılık değişmezleri kabul etmezse, onları yerel bayt eşdeğeri bir değişmeze dönüştürebilirsiniz. "
Kevin Cruijssen

@KevinCruijssen Mesele bu, eşdeğer olarak neyin kabul edildiğini bilmiyorum . Bu doğrudan bitmap'i girmek için kapıyı açar mı?
Luis Mendo

Yanıtlar:



5

05AB1E , 27 26 bayt

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

Girdiyi 8 bitlik ikili dizelerin bir listesi olarak alır ve boşluksuz 1karakter olarak verir.

@MagicOctopusUrn sayesinde -1 bayt .

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

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

2-byter olması gerekiyor 0‹i...
Magic Octopus Urn

@ MagicOctopusUrn 0‹Gerçekten de bir 1-bayt olmalı .. Bunun için 1-baytımız >=0var d. Ancak, negatif imo olup olmadığını kontrol etmek için 1 bayt değerine de sahip olmalıyız. Şimdi sadece 0‹ya da kullanıyorum d_.
Kevin Cruijssen

Tek bulabildiğim şey şuydu: „íR³²‚0‹Ï.V(tam kod εε²Ä×}J³Äи0ð:}„íR³²‚0‹Ï.V˜») bu bir gelişme değil, ama bu olumsuz çeklerden birinden kurtulur.
Magic Octopus Urn

1
Ayrıca, kesinlikle εS²Ä×J³Äи²0‹ií]³0‹iR}˜0ð:»bir bayt kazandırır. Bir 2D dizisine girebilirseniz, Stamamen 25 bayt için kaldırabilirsiniz .
Magic Octopus Urn

@MagicOctopusUrn elbette Ah S²Ä×yerine ε²Ä×}. Teşekkürler! Hmm, eğer ikili girişleri 0 ve 1 lerin bir listesi olarak kabul etmemize izin verilirse, ek bir bayt atlanarak kaydedilebilir S. OP'ye buna izin verilip verilmediğini soracak. Seninkini gibi „íR³²‚0‹Ï.Vdiğer yorumunda de. :)
Kevin Cruijssen

3

MATL , 24 19 bayt

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

Girişler, ondalık sayılar, yatay ölçek, dikey ölçek dizisidir.

Çevrimiçi deneyin!

açıklama

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 bayt

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

Çevrimiçi deneyin!

-9 ngn sayesinde!


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

kısa: ' #'[⍉⊃{⊖⍣(0>⍺)⍉⍵/⍨|⍺}/⎕,⊂⎕⊤⍨8/2]. btw, ikinci testin çıktısı orijinal çözümünüzde ters görünüyor
ngn

@ teşekkürler! 2. örneğe ait girdiler, söz konusu 2. test durumuyla eşleşecek şekilde tersine çevrilmiş olmalıdır.
dzaima

3

Prolog (SWI) , 252 bayt

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

Çevrimiçi deneyin!

açıklama

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

Kömür , 28 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

Fθ

Bayt listesi üzerinde döngü.

E↔ζ

Dikey ölçeklendirme faktörü üzerinde harita, böylece çıkış çizgileri çarpılır.

⭆⮌↨ι²×§ Xμ↔η

Girişi baz 2'ye dönüştürün, ters çevirin, basamakları boşlukla eşleştirin ve Xardından her karakteri yatay ölçeklendirme faktörü ile çarpın.

F›η⁰‖

Yatay ölçekleme faktörü pozitifse, görüntüyü tekrar doğru yoldan almak için yansıtın.

F‹ζ⁰‖↓

Dikey ölçeklendirme faktörü negatif ise dikey olarak yansıtın.


Herhangi bayt kaydetmek, ama ben sadece merak kadarıyla hayır: niye kullandınız F( Foryerine) ¿( Ifçekler için)?
Kevin Cruijssen

1
@KevinCruijssen Kömürün özlü modunda else, ima edilen tek şey, kullanabileceğim tek zaman if, bloktaki son ifade ise.
Neil

Ah tamam, bunu bilmiyordum. Yani Ifburada iki tane If ... Else If ...kullanmak, iki tane gevşek olmak yerine aslında olur If. Hmm, bilmek güzel.
Kevin Cruijssen


2

Ortak Lisp , 157 bayt

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

Çevrimiçi deneyin!

açıklama

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

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

Çevrimiçi deneyin!

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 makine kodu, IBM PC DOS, 77 71 bayt

Birleştirilmiş:

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

Liste:

    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

Bu, ASM'de düşündüğümden daha fazla sarhoş oldu. Birden fazla eşzamanlı döngü ve çok sayıda if / else dallanması size kesinlikle baş ağrısı verebilir.

Bu, bir MACRO olarak uygulanır çünkü test için fonksiyon benzeri parametrelerin geçmesine izin verir.

Çıktı

İşte DOS için X ve Y ölçeklendirme faktörünü isteyen ve ekrana çizen bir test programı. Ejderhayı çok fazla ölçeklendirmek, varsayılan DOS penceresi yalnızca 24 satır olduğundan üste kaydırılacağını unutmayın.

görüntü tanımını buraya girin

Ve işte bizim küçük ejderhamız (ördek):

görüntü tanımını buraya girin

Çevrimiçi Deneyin!

Aşağıdaki adımları takip ederek DOSBox veya VirtualConsoles.com'u kullanarak bir DOS VM'de test edebilirsiniz :

  1. VCS.ZIP'i indirin (dört çalıştırılabilir dosyanın tümünü içerir)
  2. Git Https://virtualconsoles.com/online-emulators/DOS/ adresine
  3. İndirdiğiniz ZIP dosyasını yükleyin, Başlat'a tıklayın.
  4. Tür PLANE, KEY, TANKveya DRAGON.

1

Perl 5, 105 bayt

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

Girdi onaltılı ise

126 bayt



1

APL (Dyalog Genişletilmiş) , 23 bayt SBCS

dzaima yöntemi

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

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

Çevrimiçi deneyin!

{}/ Aşağıdaki anonim lambda'yı kullanarak sağdan sola azaltın:

|⍺ sol argümanın büyüklüğü (ölçekleme faktörü)

⍵/⍨ yatay argümanı yatay olarak kopyalamak için bunu kullanın

 devrik

⊖⍣() Çevirirseniz:

  >⍺ ölçeklendirme faktörü sıfırdan az

 ifşa (tensör sıralamasını 1'den 0'a düşürmek için yapılan azaltma nedeniyle

' x'⊇⍨ bu matrisi kullanarak "x" dizesinden eleman seçin



1

T-SQL, 216 bayt

Bu MS-SQL Studio Yönetimi'ni yürütmeden önce, verileri metin olarak göstermek için CRTL-t tuşlarına basın. Yükseklik, girişteki öğe sayısını aşacak şekilde ayarlanamaz.

STRING_AGG'nin korkunç bir uygulaması nedeniyle , yükseklik değişkeni yalnızca MSSM'de çalışacaktır. MS, birleştirilen öğelerin sırasını içerecek şekilde üçüncü bir isteğe bağlı parametre yapmalıdır.

Çevrimiçi sürüm, yalnızca genişlik ayarını destekleyebilir. Yükseklik, çoklu istifleme şekilleriyle korkak bir sonuç verir.

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

Bu script çevrimiçi versiyonda doğru şekilleri göstermeyecek, bu yüzden telafi etmek için bazı küçük değişiklikler yaptım. Çevrimiçi deneyin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.