Класична пригода VCS ASCII


21

Виростаючи, моєю першою консольною ігровою системою був Atari 2600, і я завжди буду любити деякі з тих ігор, які мені так сподобалися в дитинстві. Багато графіки все ще запам'ятовуються, можливо, навіть знакові.

Виявляється, ці спрайти - це дуже спрощені растрові зображення, шириною 8 пікселів із змінною висотою, де двійкове представлення - це розташування пікселів.

Наприклад, шістнадцяткові байти 0x18, 0x24, 0x18 намалювали б так сире коло:

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

Оскільки ширина 8 пікселів створює досить малу графіку (навіть за стандартами Atari 2600), було звичайно подвоїти або вчетверо збільшити висоту, ширину або обидва, щоб створити більшу (хоча і більш блоковану та спотворену) версію одного зображення. Вони, як правило, перевертаються вертикально або горизонтально як для спрайтів гравців, так і для ігрових полів. Гра Combat є хорошим прикладом цього.

Завдання полягає в тому, щоб написати код для відображення цих спрайтів як "графічних" у формі ASCII, включаючи можливість розтягування або перевертання їх по вертикалі, горизонталі або обом. Це повинно бути у формі або повної програми, або функції дзвінка.

Вхід:

  • Масив байтів, кожен з яких представляє горизонтальні біти для цього рядка.
  • Ненульове ціле число для кожного напрямку, горизонтальне та вертикальне, що представляє коефіцієнт масштабування для цього виміру.
  • Від'ємне значення вказує на те, що розмір також слід перевернути вздовж своєї осі.

Вихід:

  • Представлення 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: ці тестові растрові файли були натхнені та перероблені / кодовані на основі скріншотів гри, позначених як «добросовісне використання» у Вікіпедії.

Критерії виграшу

  • Це , тому виграє найкоротший код у байтах за мову.
  • Стандартні лазівки заборонені.

6
"Хтось відбере цю відкачану качку від мене!" - Сильно погано
AdmBorkBork

7
Іронія полягає в тому, що навіть найрозумніший гольф тут, мабуть, не буде настільки розумним, як те, що програмісти для Atari 2600 насправді мали робити, якщо вони хотіли чогось цікавішого, ніж клон Понга - весь екран виводився по одному рядку за один раз ЦП витрачав більшість свого часу на це. Маючи всього 128 байт оперативної пам’яті, не було місця для розкоші, як буфер екрану… П’ять цілих спрайтів, які ви отримали, були розкішшю.
Jeroen Mostert

Чи можемо ми вважати вхід списком 8-бітових бінарних рядків або подібних форматів, де байти вже розпаковані в біти?
Луїс Мендо

@LuisMendo " Якщо ваша платформа не приймає шістнадцяткові літерали для байтового представлення, ви можете перетворити їх у нативний еквівалентний літерал ".
Кевін Круїйсен

@KevinCruijssen Це справа, я не знаю, що прийнято як рівнозначне . Це відкриває двері для введення растрової карти безпосередньо?
Луїс Мендо

Відповіді:



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-байт для 0‹i...
Чарівний восьминога Урна

@MagicOctopusUrn Повинно бути 1-байт для 0‹справді. У нас є 1-байт для >=0, який є d. Але ми також повинні мати 1-байт, щоб перевірити наявність негативного imo. Тепер я просто використовую 0‹або d_.
Кевін Круїссен

Все, що я міг придумати, це: „íR³²‚0‹Ï.V(повний код εε²Ä×}J³Äи0ð:}„íR³²‚0‹Ï.V˜»), який не є поліпшенням, але позбавляється від однієї з цих негативних перевірок.
Чарівний восьминога Урна

1
Крім того, досить впевнено εS²Ä×J³Äи²0‹ií]³0‹iR}˜0ð:»економить байт. Якщо ви можете взяти двовимірний масив, ви можете видалити Sцілком на 25 байт.
Чарівний восьминога Урна

@MagicOctopusUrn Ах, звичайно, S²Ä×замість ε²Ä×}. Спасибі! Хм, якщо нам дозволено сприймати двійкові входи як список 0 і 1, додатковий байт можна зберегти, опустивши S. Попросить ОП, якщо це дозволено. Мені подобається і твій „íR³²‚0‹Ï.Vінший коментар. :)
Кевін Круїссен

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

Діалог APL, 46 42 33 байт

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

Спробуйте в Інтернеті!

-9 завдяки ngn!


кожен -> зменшити: {' #'[⊃{⌽⍣(0>⍺)⊢(|⍺)/⍉⍵}/⍺,⊂⍉⍵⊤⍨8/2]}dfn -> програма:' #'[⊃{⌽⍣(0>⍺)⊢(|⍺)/⍉⍵}/⎕,⊂⍉⎕⊤⍨8/2]
ngn

коротше : ' #'[⍉⊃{⊖⍣(0>⍺)⍉⍵/⍨|⍺}/⎕,⊂⎕⊤⍨8/2]. До речі, вихід для другого тесту , здається , змінилася в вихідне рішення
СПП

@ngn спасибі! входи для 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) для перевірок?
Кевін Кройсейсен

1
@KevinCruijssen У лаконічному режимі деревного вугілля elseмається на увазі, тому єдиний раз, коли я можу використати ifце, якщо це остання заява в блоці.
Ніл

Ну гаразд, не знав про це. Тож використання двох Ifтут насправді було б If ... Else If ...замість двох вільних If. Хм, добре знати.
Кевін Круїссен


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, ніж я спочатку думав. Кілька паралельних циклів і безліч гілок if / else, безумовно, можуть доставити вам головний біль.

Це реалізовано як 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, TANKабо DRAGON.



1

APL (Dyalog Extended) , 23 байти SBCS

метод дзайма

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

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

Спробуйте в Інтернеті!

{}/ Зменшити праворуч наліво за допомогою наступної анонімної лямбда:

|⍺ величина лівого аргументу (коефіцієнт масштабування)

⍵/⍨ використовуйте це, щоб повторити правильний аргумент по горизонталі

 переносити

⊖⍣() Переверніть, якщо:

  >⍺ коефіцієнт масштабування менше нуля

 розкрити (оскільки зменшення додається для зменшення тензора з 1 до 0)

' x'⊇⍨ виберіть елементи з рядка "x" за допомогою цієї матриці



1

T-SQL, 216 байт

Перед виконанням цього управління MS-SQL Studio натисніть CRTL-t, щоб показати дані у вигляді тексту. Висоту не можна регулювати, щоб перевищувати кількість елементів на вході.

Через жахливу реалізацію STRING_AGG змінна висоти працюватиме лише в MSSM. МС повинен був зробити третій необов'язковий параметр, щоб включити порядок з'єднаних елементів.

Інтернет-версія може підтримувати лише регулювання ширини. Висота призведе до прикольного результату з декількома формами укладання.

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

Цей сценарій не відображатиме правильні форми в онлайн-версії, тому я вніс деякі незначні корективи, щоб компенсувати. Спробуйте в Інтернеті

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.