Bạn phải xây dựng giá đỡ ASCII!


24

Cross đăng từ bài anagolf của tôi (lưu ý: có thể chứa spoilers, post mortem).

Xuất văn bản chính xác sau đây.

  • Bạn có thể có thêm khoảng trắng theo dõi trên mỗi dòng và theo dõi dòng mới.
  • Mã ngắn nhất, tính bằng byte, thắng.
                                                
                                              !"!
                                             "#$#"
                                            #$%&%$#
                                           $%&'('&%$
                                          %&'()*)('&%
                                         &'()*+,+*)('&
                                        '()*+,-.-,+*)('
                                       ()*+,-./0/.-,+*)(
                                      )*+,-./01210/.-,+*)
                                     *+,-./012343210/.-,+*
                                    +,-./0123456543210/.-,+
                                   ,-./01234567876543210/.-,
                                  -./0123456789:9876543210/.-
                                 ./0123456789:;<;:9876543210/.
                                /0123456789:;<=>=<;:9876543210/
                               0123456789:;<=>?@?>=<;:9876543210
                              123456789:;<=>?@ABA@?>=<;:987654321
                             23456789:;<=>?@ABCDCBA@?>=<;:98765432
                            3456789:;<=>?@ABCDEFEDCBA@?>=<;:9876543
                           456789:;<=>?@ABCDEFGHGFEDCBA@?>=<;:987654
                          56789:;<=>?@ABCDEFGHIJIHGFEDCBA@?>=<;:98765
                         6789:;<=>?@ABCDEFGHIJKLKJIHGFEDCBA@?>=<;:9876
                        789:;<=>?@ABCDEFGHIJKLMNMLKJIHGFEDCBA@?>=<;:987
                       89:;<=>?@ABCDEFGHIJKLMNOPONMLKJIHGFEDCBA@?>=<;:98
                      9:;<=>?@ABCDEFGHIJKLMNOPQRQPONMLKJIHGFEDCBA@?>=<;:9
                     :;<=>?@ABCDEFGHIJKLMNOPQRSTSRQPONMLKJIHGFEDCBA@?>=<;:
                    ;<=>?@ABCDEFGHIJKLMNOPQRSTUVUTSRQPONMLKJIHGFEDCBA@?>=<;
                   <=>?@ABCDEFGHIJKLMNOPQRSTUVWXWVUTSRQPONMLKJIHGFEDCBA@?>=<
                  =>?@ABCDEFGHIJKLMNOPQRSTUVWXYZYXWVUTSRQPONMLKJIHGFEDCBA@?>=
                 >?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>
                ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?
               @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@
              ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA
             BCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCB
            CDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDC
           DEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFED
          EFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFE
         FGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGF
        GHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHG
       HIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnoponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIH
      IJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJI
     JKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJ
    KLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLK
   LMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONML
  MNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyzyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONM
 NOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPON
OPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPO

3
Có một dòng chỉ có khoảng trắng đầu tiên có chủ ý?
admBorkBork

9
@AdmBorkBork đó là một không gian vì đó là trò chơi ASCII char lol đầu tiên
HyperNeutrino

2
@ the4kman và <=>=<cá.
pizzapants184

4
Có một lý do nào đó không có tiêu đề "Bạn phải xây dựng các trụ ASCII!"?
mattdm

3
@mattdm Tôi chỉ đến đây từ danh sách HNQ để nâng cao điều này vì tiêu đề của nó. Hoàn thành tốt
Todd Wilcox

Câu trả lời:


4

Canvas , 15 14 byte

0c[C²[j}¹m]/││

Hãy thử nó ở đây!

Lưu ý rằng trong khi thực hiện điều này, tôi đã thêm một vài tích hợp ( & ) vì Canvas bằng cách nào đó không có bất kỳ tích hợp nào cho ASCII / unicode trước ...

Giải thích (một số ký tự đã được thay thế để tìm kiếm không gian):

0c              push the charcode of "0" - 48
  {       ]     map over 1..48
   C              push the ASCII characters
    ²[ ]          repeat by the counter (0-indexed)
      j             remove the last character
        ¹m        mold to the length of the counter
           /    pad each line with spaces so it looks like a diagonal
            ││  palindromize the whole thing horizontally

16

PowerShell , 73 byte

' '*48;46..0|%{" "*$_+-join[char[]](($x=79-$_)..($y=$x+$j++)+(++$y)..$x)}

Hãy thử trực tuyến!

Xuất ra dòng chỉ khoảng trắng đầu tiên, sau đó lặp từ 46đến 0. Mỗi lần lặp, xuất ra số lượng khoảng trắng tương ứng và sau đó là một biểu tượng -joincùng với charcác ký hiệu thích hợp, thông qua một số tính toán.


1
Bạn có thể lưu một số tính toán bằng cách coi dòng đầu tiên là 47 khoảng trắng theo sau là ký tự khoảng trắng không?
Đạp xe

@Riking Để làm như vậy, bạn cần phải đặc biệt làm thế nào mảng char được tạo để chỉ tạo một mục thay vì 3 hoặc nhiều hơn. Kết quả là, nó ngắn hơn trong trường hợp đặc biệt là dòng chỉ có khoảng trắng hoàn toàn riêng biệt.
admBorkBork

11

Than , 13 byte

E⁴⁸⮌✂γι⊕⊗ι‖O←

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

 ⁴⁸             Literal 48
E               Map over implicit range
      ι  ι      Current index
        ⊗       Doubled
       ⊕        Incremented
     γ          Printable ASCII
    ✂           Slice
   ⮌            Reverse
                Implicitly print each slice on separate lines
          ‖O←   Reflect with overlap

5
Đầu ra có vẻ sai với tôi.
Ông Xcoder

1
@ Mr.Xcoder Ugh, lỗi off-by-1 cổ điển ...
Neil

8

Python 2 , 73 byte

i=48
while i:i-=1;r=range(79-i,127-i*2);print' '*i+bytearray(r+r[-2::-1])

Hãy thử trực tuyến! Crossposted từ golf vô chính phủ (xem trình của tôi ).

Nhanh phân tích post-mortem: XNOR và Dianne đã khám phá ra chính xác cùng một giải pháp . ebicochneal đã gửi một giải pháp 71 byte mà mitchs đã cải thiện thành 70 byte . Họ tránh xử lý hoàn toàn bytearray(dài) hoặc ''.join(map(chr,…))(thậm chí dài hơn) bằng cách giữ biến "dòng hiện tại" và cập nhật nó một cách khéo léo.





4

Lisp thông thường , 110 byte

(dotimes(i 48)(dotimes(j 96)(princ(if(>(abs(- j 48))i)" "(code-char(+(-(* i 2)(abs(- j 48)))32)))))(princ"
"))

Hãy thử trực tuyến!

Giải trình

(dotimes(i 48)                   ;; for i from 0 up to 47
    (dotimes(j 96)               ;; for j from 0 up to 95
        (princ                   ;; print
            (if(>(abs(- j 48))i) ;; if abs(j - 48) > i
                " "              ;; print " "
                (code-char(+(-(* i 2)(abs(- j 48)))32)) ;; else print appropriate character
            )
        )
    )(princ"
") ;; print newline
)

3

VBA, 71 byte

Một chức năng cửa sổ ngay lập tức VBE ẩn danh không có đầu vào và đầu ra cho bàn điều khiển.

For i=0To 47:?Spc(47-i);:For j=-i To i:?Chr(32-Abs(j)+2*i);:Next:?:Next

3

Ruby , 70 byte

s=[*?\s..?~]*'';48.times{|i|puts s[i,i+1].rjust(48)+s.reverse[-2*i,i]}

Hãy thử trực tuyến!

Xây dựng chuỗi ASCII có thể in đầy đủ và sau đó in số lượng chuyển tiếp cần thiết (được đệm bằng khoảng trắng) + các lát lùi của chuỗi.



2

C (gcc), 117 byte

c;i;main(){for(i=0;i<48;++i){for(c=2*i-15;c<32+2*i;++c)putchar(c>31+i?c:32);for(;c>31+i;--c)putchar(c);putchar(10);}}

Hãy thử trực tuyến!

Ung dung:

int ch;
int row;
int main(void) {
    for (row = 0; row < 48; ++row) {
        for (ch = 2*row-15; ch < 32 + 2*row; ++ch) {
            // The first character in the row is 2*row - 15 (row is zero-indexed)
            if (ch > 31+row)
                putchar(ch);
            else
                // If the current character is not in the pyramid, mask it with a space
                putchar(' ');
        }
        for (; ch > 31+row; --ch) {
            // Finish the other side of the pyramid
            putchar(ch);
        }
        putchar('\n');
    }
}




2

T-SQL, 153 byte

DECLARE @ INT=33,@t CHAR(95)=''a:PRINT @t;
SET @t=LEFT(STUFF(STUFF(@t,63-@/2,2,''),46,0,CHAR(@-1)+CHAR(@)+CHAR(@+1)+CHAR(@)),33+@/2)
SET @+=2IF @<128GOTO a

Trả về chỉ để hiển thị.

Tôi đã thử một vài ý tưởng, bao gồm một vòng lặp để cấu trúc lại chuỗi đầy đủ (163 ký tự) và một vòng lặp lồng nhau để xây dựng nó một cách nhanh chóng (168 ký tự), nhưng kết quả này là ngắn nhất.

Về cơ bản, mỗi vòng lặp tôi nhồi nhét 4 ký tự mới vào giữa chuỗi, sau đó cắt bớt các phần bổ sung từ cả hai đầu, sử dụng hàm SQLSTUFF() .

Định dạng và giải thích:

DECLARE @ INT=33,                      --Using a single counter for both rows and CHAR
        @t CHAR(95)=''                 --a non-null CHAR field will pre-fill with spaces
a:                                     --GOTO loop, shorter than a WHILE
    PRINT @t                           --duh
    SET @t = LEFT(                     --lops off the character at the end
            STUFF(                     --crams 4 new characters in the middle
            STUFF(@t, 63-@/2, 2, '')   --snips out a space and the leading character
                 ,46, 0, CHAR(@-1) + CHAR(@) + CHAR(@+1) + CHAR(@))
                 ,33 + @/2)            --rest of the LEFT()
    SET @+=2
IF @<128 GOTO a

2

J , 47 44 byte

(,.~}:@|."1)(1+i.48)([|.@{.}.)"0 1 u:31+i.96

Hãy thử trực tuyến!

Cảm ơn Conor O'Brien cho mẫu! Cảm ơn FrownyFrog đã chỉ ra giải pháp không hợp lệ.


1
Có lẽ điều này dễ dàng sửa đổi hơn: Hãy thử trực tuyến!
Conor O'Brien

@Conor O'Brien - Cảm ơn bạn về mẫu, tôi đã cập nhật liên kết.
Galen Ivanov

In một dòng phụ ở trên cùng.
FrownyFrog

@FrownyFrog Ồ, chỉ đến bây giờ tôi mới thấy rằng chỉ những dòng mới mới được phép, không dẫn đầu. Tôi sẽ cố gắng sửa nó.
Galen Ivanov

@FrownyFrog - Đã sửa lỗi và hơi chơi gôn.
Galen Ivanov

2

Ruby, 59 byte

48.times{|i|-47.upto(i){|c|putc~c<i ?32-c.abs+2*i:32};puts}

Đăng chéo từ câu trả lời của tôi trên anagol.


2

Japt -R, 18 15 byte

14 byte nếu một dòng mới hàng đầu được cho phép.

#0õ_odH+ZÉ ¬êÃû

Kiểm tra nó


Giải trình

#0                  :48
  õ                 :Range [1,48]
   _         Ã      :Pass each Z through a function
    o               :  Range [0,Z)
      H+ZÉ          :    To each add 32+Z-1
     d              :    Get the character at that codepoint
           ¬        :  Join to a string
            ê       :  Palinrdomise
              û     :Centre pad each element to the length of the longest element
                    :Implicitly join with newlines and output

2

J ,  40 37  32 byte

40 biểu thức u:30+2>.(+:@i.@(2&+)(-*(>+:))"0 _|@i:)47 cảm ơn + Galen Ivanov & + Conor O'Brien vì những ý tưởng trong giải pháp của họ

37 bao gồm tiếng vang echo u:32+|.(~.(>:*+:@[-])"0 _])|i:47

echo u:32+|.(~.(>:*[+-)"{])|i:47

kết hợp các mẹo @FrownyFrog từ các bình luận

TIO


Tôi không nghĩ rằng biểu thức là đệ trình hợp lệ.
LyricLy

@LyricLy, ý kiến ​​dường như thay đổi khi tôi thấy một câu trả lời J khác ở dạng này .. dù sao cũng cảm ơn vì đã cho tôi cạo thêm 8 byte .. bây giờ tôi có chỗ để thêm "echo": hy vọng bạn hạnh phúc :)
jayprich

"0 _"{
FrownyFrog

+:@[-][+-
FrownyFrog

đẹp .. cảm ơn vì những lời khuyên này @FrownyFrog
jayprich



1

Ruby , 78 byte

s=*32;48.times{puts (s.map(&:chr)*'').center 95;c=*s[0]+1;s=c+s.map{|x|x+2}+c}

Hãy thử trực tuyến!

Chương trình đầy đủ. Ung dung:

s=*32;                              # s is an array of integers
48.times{                           # Repeat 48 times:
  puts (s.map(&:chr)*'').center 95; # Turn each int to a char, join, center, and print
  c = *s[0] + 1;                    # c is a singleton array. It will bookend the next line
  s = c + s.map{|x|x+2} + c         # Add 2 to each element of s before adding the bookends
}





1

Gol> <> , 29 byte

`0FaLssLF:P|LF:M|`/L-R` lRo|;

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

`0FaLssLF:P|LF:M|`/L-R` lRo|;

`0F                        |;  Repeat the following 48 times and halt...
   a                           Push 10 (\n)
    Lss                        Push L(loop counter) + 32
       LF:P|                   Repeat "Clone the top and increment" L times
            LF:M|              Repeat "Clone the top and decrement" L times
                 `/L-R`        Push 32 (space) 47-L times (space is significant)
                        lRo    Print everything as char, from the top,
                               until the stack is empty

1

Tcl , 129 122 118 117 byte

time {incr i;set j -48;set a {};time {set a $a[format %c [expr abs([incr j])>=$i?32:$i*2-abs($j)+30]]} 96;puts $a} 48

Hãy thử trực tuyến!

Giải trình

time { # for i from 0 up to 47
    incr i
    set j -48
    set a {}
    time { # for j from -48 up to 47
        # add next character to a
        set a $a[format %c [expr abs([incr j])>$i?32:$i*2-abs($j)+32]]
    } 96
    puts $a # print a
} 48

1

C (gcc) 199 byte

#include<stdio.h>
int i,j=32,k=32,l=49;int main(){while(k<127){for(i=0;i<l;++i)printf(" ");for(i=j;i<k;++i)printf("%c",i);printf("%c",k);for(i=k-1;i>=j;--i)printf("%c",i);printf("\n");j++;k+=2;l--;}}

Hãy thử trực tuyến!

Cảm ơn Picard và PunPun1000 vì tất cả sự giúp đỡ


@Picard Tôi xóa dấu cách. Tôi có thể giảm thiểu hơn nữa với một biến lặp toàn cầu.
Jonathan Landrum

@Picard Tôi đã chỉnh sửa nó trên điện thoại của tôi; không nhận ra tôi đã để lại một dòng trống.
Jonathan Landrum

1
Có các khoảng trắng không cần thiết trong lệnh gọi printf sau dấu phẩy và tên biến có thể được rút ngắn xuống còn một chữ cái. Ngoài ra, sẽ rất tuyệt nếu bạn có thể bao gồm một liên kết TIO và số byte thực tế. Đây là liên kết cho mã hiện tại của bạn TIO
PunPun1000

ok, tôi đã siết nó thêm một chút nữa, tôi nghĩ rằng tôi phải thay đổi thuật toán để thu nhỏ nó hơn nữa
Jonathan Landrum

1

Haskell, 102 byte

main=putStr$do
i<-[48,47..0]
let l=replicate i 32++[79-i..126-i*2]
map toEnum$l++tail(reverse l)++[10]

Những điều tôi đã thử không ngắn hơn:

  • Thể hiện tất cả mọi thứ theo nghĩa đen của nhân vật và succhoặc predđể lưu map toEnum.
  • Viết một phạm vi đi xuống thay vì sử dụng reverse.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.