Classic VCS ASCII Adventure


21

เมื่อโตขึ้นระบบเกมคอนโซลเครื่องแรกของฉันคืออาตาริ 2600 และฉันจะรักเกมเหล่านั้นบางเกมที่ฉันยังเด็ก กราฟิกจำนวนมากยังคงน่าจดจำหรืออาจเป็นสัญลักษณ์

ปรากฎว่าสไปรต์เหล่านี้เป็นบิตแมปแบบง่ายมากกว้าง 8 พิกเซลพร้อมความสูงของตัวแปรที่การแสดงแบบไบนารี่คือการจัดเรียงของพิกเซล

ตัวอย่างเช่น hex bytes 0x18, 0x24, 0x18 จะวาดวงกลมที่หยาบเช่น:

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

เมื่อความกว้าง 8 พิกเซลสร้างกราฟิกขนาดเล็กพอสมควร (แม้ตามมาตรฐาน Atari 2600) มันเป็นเรื่องธรรมดาที่จะเพิ่มเป็นสองเท่าหรือสี่เท่าไม่ว่าจะเป็นความสูงความกว้างหรือทั้งสองอย่างเพื่อสร้างภาพที่มีขนาดใหญ่ขึ้น พวกเขามักจะถูกพลิกในแนวตั้งหรือแนวนอนสำหรับผู้เล่นทั้งสไปรต์และเพลย์ฟิลด์ เกมCombatเป็นตัวอย่างที่ดีของเรื่องนี้

ความท้าทายคือการเขียนโค้ดเพื่อแสดง sprites เหล่านี้เป็น "กราฟิก" ในรูปแบบ ASCII รวมถึงความสามารถในการยืดหรือพลิกแนวตั้งแนวนอนหรือทั้งสองอย่าง นี้จะต้องอยู่ในรูปแบบของโปรแกรมเต็มรูปแบบหรือฟังก์ชั่น callable

การป้อนข้อมูล:

  • อาเรย์ของแต่ละไบต์แสดงถึงบิตแนวนอนสำหรับบรรทัดนั้น
  • ค่าจำนวนเต็มไม่เป็นศูนย์สำหรับแต่ละทิศทางแนวนอนและแนวตั้งแสดงถึงตัวคูณสเกลสำหรับมิตินั้น
  • ค่าลบแสดงว่ามิติควรพลิกตามแกนของมัน

เอาท์พุท:

  • ASCII เป็นตัวแทนของ STDOUT หรือสตริงที่คั่นด้วยการขึ้นบรรทัดใหม่โดยใช้อักขระเว้นวรรคสำหรับสีดำ (0) พิกเซลและอักขระที่ไม่พิมพ์เว้นวรรคที่คุณต้องการสำหรับสีขาว (1) พิกเซล

ข้อมูลการทดสอบ:

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]

หมายเหตุ: ตัวอย่างข้างต้นอาร์เรย์อินพุตของไบต์มีให้เป็นฐานสิบหก หากแพลตฟอร์มของคุณไม่ยอมรับตัวอักษรฐานสิบหกสำหรับการแทนค่าไบต์คุณสามารถแปลงให้เป็นตัวอักษรที่เทียบเท่ากับไบต์ดั้งเดิม

ตัวอย่างผลลัพธ์:

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

หมายเหตุ: เส้นแนวนอนด้านบนและด้านล่างเป็นการแสดงจุดเริ่มต้นและจุดสิ้นสุดของเอาต์พุต ไม่จำเป็นต้องใช้ในเอาต์พุตอย่างไรก็ตามบรรทัดว่าง (แสดงโดยศูนย์ / ช่องว่างทั้งหมด) ที่จุดเริ่มต้นและ / หรือสิ้นสุดตามที่แสดง

หมายเหตุ 2: บิตแมปการทดสอบเหล่านี้ได้รับแรงบันดาลใจจากและวาดใหม่ / เข้ารหัสตามภาพหน้าจอเกมที่ติดแท็กเป็น "การใช้งานที่เหมาะสม" ใน Wikipedia

เกณฑ์การชนะ

  • นี่คือดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์ต่อภาษาจะชนะ
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม

6
"ใครบางคนเอาเป็ดตัวนี้ออกไปจากฉัน!" - Strong Bad
AdmBorkBork

7
ประชดคือแม้แต่การเล่นกอล์ฟที่ฉลาดที่สุดที่นี่ก็อาจจะไม่ฉลาดเท่าที่นักเขียนโปรแกรมสำหรับ Atari 2600 ต้องทำหากพวกเขาต้องการสิ่งที่น่าสนใจมากกว่าการเลียนแบบโป่ง - หน้าจอทั้งหมดแสดงครั้งละหนึ่งบรรทัดและ CPU ใช้เวลาส่วนใหญ่ในการทำเช่นนั้น ด้วย RAM ขนาด 128 ไบต์เท่านั้นไม่มีที่ว่างสำหรับความหรูหราเหมือนบัฟเฟอร์หน้าจอ ... ทั้ง Sprite ทั้งห้าที่คุณได้รับคือความหรูหรา
Jeroen Mostert

เราสามารถรับอินพุตเป็นรายการไบนารี่สตริง 8 บิตหรือฟอร์แมทที่คล้ายกันซึ่งไบต์ถูกคลายออกเป็นบิตแล้วหรือไม่?
Luis Mendo

@LuisMendo " หากแพลตฟอร์มของคุณไม่ยอมรับตัวอักษรฐานสิบหกสำหรับการแทนค่าไบต์คุณสามารถแปลงเป็นตัวอักษรเทียบเท่าไบต์ได้ "
Kevin Cruijssen

@KevinCruijssen นั่นคือจุดที่ผมไม่ทราบว่าสิ่งที่เป็นที่ยอมรับในฐานะเทียบเท่า นั่นเปิดประตูเพื่อป้อนบิตแมปโดยตรงหรือไม่
Luis Mendo

คำตอบ:



5

05AB1E , 27 26 ไบต์

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

รับอินพุตเป็นรายการของไบนารีสตริง 8 บิตและเอาต์พุตที่1เป็นอักขระที่ไม่ใช่ช่องว่าง

-1 ขอบคุณไบต์@MagicOctopusUrn

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

ε         # 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 สำหรับ0‹i...
Magic Octopus Urn

@MagicOctopusUrn ควรจะมี 1 ไบต์สำหรับ0‹แน่นอน .. เราจะมี 1 byter สำหรับซึ่งเป็น>=0 dแต่เราควรมีขนาด 1 ไบต์เพื่อตรวจสอบ imo เชิงลบ ตอนนี้ผมเพียงแค่ใช้หรือ0‹ d_
Kevin Cruijssen

ทั้งหมดที่ฉันสามารถทำได้คือ: „íR³²‚0‹Ï.V(รหัสเต็มεε²Ä×}J³Äи0ð:}„íR³²‚0‹Ï.V˜») ซึ่งไม่ได้ปรับปรุง แต่จะกำจัดหนึ่งในการตรวจสอบเชิงลบเหล่านั้น
Magic Octopus Urn

1
นอกจากนี้ค่อนข้างแน่ใจว่าεS²Ä×J³Äи²0‹ií]³0‹iR}˜0ð:»บันทึกไบต์ หากคุณสามารถใช้อาร์เรย์แบบ 2 มิติได้คุณสามารถลบSทั้งหมดได้ 25 ไบต์
Magic Octopus Urn

@MagicOctopusUrn อาแน่นอนแทนS²Ä× ε²Ä×}ขอบคุณ! อืมถ้าเราได้รับอนุญาตให้ใช้ไบนารีปัจจัยการผลิตเป็นรายการของ 0s และ 1S Sไบต์เพิ่มเติมจะถูกบันทึกไว้โดยถนัด จะถาม OP หากได้รับอนุญาต ฉันชอบ„íR³²‚0‹Ï.Vความคิดเห็นอื่นของคุณเช่นกัน :)
Kevin Cruijssen

3

MATL , 24 19 ไบต์

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

อินพุตเป็นอาร์เรย์ของตัวเลขทศนิยมสเกลแนวนอนแนวตั้งสเกล

ลองออนไลน์!

คำอธิบาย

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 ไบต์

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

ลองออนไลน์!

-9 ขอบคุณ ngn!


แต่ละรายการ -> ลด: {' #'[⊃{⌽⍣(0>⍺)⊢(|⍺)/⍉⍵}/⍺,⊂⍉⍵⊤⍨8/2]}dfn -> โปรแกรม:' #'[⊃{⌽⍣(0>⍺)⊢(|⍺)/⍉⍵}/⎕,⊂⍉⎕⊤⍨8/2]
ngn

' #'[⍉⊃{⊖⍣(0>⍺)⍉⍵/⍨|⍺}/⎕,⊂⎕⊤⍨8/2]สั้น: btw ผลลัพธ์สำหรับการทดสอบครั้งที่สองดูเหมือนจะกลับรายการในโซลูชันดั้งเดิมของคุณ
ngn

@ngn ขอบคุณ! อินพุตสำหรับตัวอย่างที่ 2 ควรกลับด้านเพื่อให้ตรงกับกรณีทดสอบที่ 2 ในคำถาม
dzaima

3

Prolog (SWI) 252 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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

ถ่าน 28 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

Fθ

วนซ้ำรายการของไบต์

E↔ζ

แม็พกับปัจจัยการขยายสเกลแนวตั้งดังนั้นจึงคูณบรรทัดเอาต์พุต

⭆⮌↨ι²×§ Xμ↔η

แปลงอินพุตเป็นฐาน 2 กลับด้านจับคู่ตัวเลขกับช่องว่างXแล้วคูณตัวอักขระแต่ละตัวด้วยปัจจัยการปรับสเกลแนวนอน

F›η⁰‖

หากปัจจัยการปรับสเกลแนวนอนเป็นค่าบวกให้สะท้อนเพื่อให้ได้ภาพที่ถูกต้องอีกครั้ง

F‹ζ⁰‖↓

สะท้อนในแนวตั้งหากปัจจัยการปรับสเกลในแนวตั้งเป็นลบ


ไม่ใช่ว่ามันจะช่วยประหยัดไบต์ใด ๆ แต่ฉันแค่อยากรู้ว่าทำไมคุณถึงใช้F( For) แทน¿( If) เพื่อตรวจสอบ?
Kevin Cruijssen

1
@KevinCruijssen ในโหมดรวบรัด Charcoal elseมันบอกเป็นนัยดังนั้นเวลาเดียวที่ฉันสามารถใช้ได้ifคือถ้ามันเป็นคำสั่งสุดท้ายในบล็อก
Neil

อาตกลงไม่รู้เรื่องนั้นเลย ดังนั้นการใช้สองIfที่นี่จริงจะเป็นแทนของทั้งสองหลวมIf ... Else If ... Ifอืมดีน่ารู้
Kevin Cruijssen


2

เสียงกระเพื่อมสามัญ 157 ไบต์

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

ลองออนไลน์!

คำอธิบาย

(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 ไบต์

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

ลองออนไลน์!

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, IBM PC DOS, 77 71 ไบต์

ประกอบ:

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

รายการ:

    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

เรื่องนี้กลายเป็นเรื่องที่น่ากลัวใน ASM มากกว่าที่ฉันคิดไว้ การวนซ้ำพร้อมกันหลายครั้งและการแตกกิ่งถ้า / อย่างอื่นสามารถทำให้คุณปวดหัวได้อย่างแน่นอน

สิ่งนี้ถูกนำไปใช้เป็น MACRO เนื่องจากอนุญาตให้พารามิเตอร์เหมือนฟังก์ชั่นผ่านการทดสอบ

เอาท์พุต

นี่คือโปรแกรมทดสอบสำหรับ DOS ที่พร้อมท์ให้ใส่ตัวคูณการปรับ X และ Y และเข้าสู่หน้าจอ หมายเหตุการปรับขนาดมังกรมากเกินไปจะเลื่อนผ่านด้านบนเนื่องจากหน้าต่าง DOS เริ่มต้นมีเพียง 24 แถว

ป้อนคำอธิบายรูปภาพที่นี่

และนี่คือมังกรตัวน้อยของเรา (เป็ด):

ป้อนคำอธิบายรูปภาพที่นี่

ลองออนไลน์!

คุณสามารถทดสอบใน DOS VM โดยใช้DOSBoxหรือVirtualConsoles.comด้วยขั้นตอนต่อไปนี้:

  1. ดาวน์โหลดVCS.ZIP (มีไฟล์เรียกทำงานทั้งสี่)
  2. ไปที่https://virtualconsoles.com/online-emulators/DOS/
  3. อัปโหลดไฟล์ ZIP ที่คุณเพิ่งดาวน์โหลดคลิกเริ่ม
  4. ประเภทPLANE, KEY, หรือTANKDRAGON



1

APL (Dyalog Extended) , 23 ไบต์SBCS

วิธีการของ dzaima

(โวลต์,ชั่วโมง,B)โวลต์ชั่วโมงB⎕IO←0

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

ลองออนไลน์!

{... }/ ลดจากขวาไปซ้ายโดยใช้แลมบ์ดานิรนามดังต่อไปนี้:

|⍺ ขนาดของอาร์กิวเมนต์ด้านซ้าย (ปัจจัยการปรับสเกล)

⍵/⍨ ใช้สิ่งนั้นเพื่อทำซ้ำอาร์กิวเมนต์ที่ถูกต้องในแนวนอน

 transpose

⊖⍣() พลิกถ้า:

  >⍺ ปัจจัยการปรับสเกลน้อยกว่าศูนย์

 เปิดเผย (ตั้งแต่การลดค่าถูกปิดเพื่อลดอันดับของเมตริกซ์จาก 1 เป็น 0)

' x'⊇⍨ เลือกองค์ประกอบจากสตริง "x" โดยใช้เมทริกซ์นั้น



1

T-SQL, 216 ไบต์

ก่อนดำเนินการจัดการ MS-SQL Studio นี้ให้กด CRTL-t เพื่อแสดงข้อมูลเป็นข้อความ ความสูงไม่สามารถปรับได้เกินจำนวนองค์ประกอบในอินพุต

เนื่องจากการใช้งานที่น่ากลัวของSTRING_AGGตัวแปรความสูงจะทำงานใน MSSM เท่านั้น MS ควรสร้างพารามิเตอร์ทางเลือกที่สามเพื่อรวมลำดับขององค์ประกอบที่ต่อกันอยู่

เวอร์ชันออนไลน์สามารถรองรับการปรับความกว้างเท่านั้น ความสูงจะส่งผลให้ผลลัพธ์ที่ขี้ขลาดกับรูปร่างซ้อนกันหลาย

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

สคริปต์นี้จะไม่แสดงรูปร่างที่ถูกต้องในเวอร์ชันออนไลน์ดังนั้นฉันจึงทำการปรับเปลี่ยนเล็กน้อยเพื่อชดเชย ลองออนไลน์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.