Anda harus membuat Tiang ASCII!

24

Cross diposting dari posting anagolf saya (catatan: mungkin mengandung spoiler, post mortem).

Keluarkan teks berikut dengan tepat.

  • Anda mungkin memiliki spasi tambahan trailing di setiap baris, dan juga mengikuti baris baru.
  • Kode terpendek, dalam byte, menang.
                                                
                                              !"!
                                             "#$#"
                                            #$%&%$#
                                           $%&'('&%$
                                          %&'()*)('&%
                                         &'()*+,+*)('&
                                        '()*+,-.-,+*)('
                                       ()*+,-./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
Conor O'Brien
sumber
3
Apakah ada garis spasi putih khusus khusus yang disengaja?
AdmBorkBork
9
@AdmBorkBork itu ruang karena itu yang pertama ASCII char lol
HyperNeutrino
2
@ the4kman dan <=>=<ikan.
pizzapants184
4
Apakah ada alasan mengapa ini tidak berjudul "Kamu Harus Membangun Tiang ASCII!"?
mattdm
3
@mattdm Saya hanya datang ke sini dari daftar HNQ untuk memperbaiki ini karena judulnya. Bagus sekali.
Todd Wilcox

Jawaban:

4

Kanvas , 15 14 byte

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

Coba di sini!

Perhatikan bahwa saat membuat ini saya menambahkan beberapa built-in ( & ) sebagai Canvas entah bagaimana tidak memiliki built-in untuk ASCII / unicode sebelum ...

Penjelasan (beberapa karakter telah diganti agar terlihat monospace):

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
dzaima
sumber
16

PowerShell , 73 byte

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

Cobalah online!

Menghasilkan baris spasi-saja pertama, kemudian loop dari 46ke 0. Setiap iterasi, menghasilkan jumlah spasi yang sesuai dan kemudian -joindisatukan char- simbol-simbol yang sesuai, melalui beberapa perhitungan.

AdmBorkBork
sumber
1
Bisakah Anda menyimpan beberapa perhitungan dengan memperlakukan baris pertama sebagai 47 spasi diikuti oleh karakter spasi?
Bersepeda
@Riking Untuk melakukannya, Anda perlu memberi contoh khusus bagaimana char-array dibuat hanya untuk membuat satu item, bukan 3 atau lebih. Akibatnya, lebih pendek untuk kasus khusus garis hanya spasi sepenuhnya terpisah.
AdmBorkBork
11

Arang , 13 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

 ⁴⁸             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
Neil
sumber
5
Outputnya kelihatannya salah bagi saya.
Tn. Xcoder
1
@ Mr.Xcoder Ugh, kesalahan off-by-1 klasik ...
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])

Cobalah online! Crossposted dari anarchy golf (lihat kiriman saya ).

Analisis post-mortem cepat: xnor dan dianne menemukan solusi yang persis sama . ebicochneal mengirimkan a 71 byte yang mitch ditingkatkan menjadi 70 byte . Mereka menghindari berurusan dengan bytearray(yang panjang) atau ''.join(map(chr,…))(yang bahkan lebih lama) sepenuhnya, dengan menjaga variabel "baris saat ini" dan secara pintar memperbaruinya.

Lynn
sumber
4

05AB1E , 16 byte

48FžQNÝûN+èJ}).C

Cobalah online!

Emigna
sumber
Ahhh ... žQjauh lebih baik daripadažw79ŸvyžwN2*+ŸûçJ}).C
Magic Octopus Mm
4

Gangguan Umum , 110 byte

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

Cobalah online!

Penjelasan

(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
)
Khusus ASCII
sumber
3

VBA, 71 byte

Fungsi jendela langsung VBE anonim yang tidak mengambil input dan output ke konsol.

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

Ruby , 70 byte

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

Cobalah online!

Buat string ASCII yang dapat dicetak penuh dan kemudian cetak jumlah maju yang diperlukan (diisi dengan spasi) + irisan mundurnya.

Kirill L.
sumber
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);}}

Cobalah online!

Tidak Disatukan:

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');
    }
}
pizzapants184
sumber
108 byte
ceilingcat
2

C (gcc) , 114 113 107 byte

#define _(_)for(k=32;k<j;)putchar(j+_++);
f(j,k){for(j=31;++j<80;){printf("\n%*c",80-j,j);_(-31+k)_(j+~k)}}

Cobalah online!

101 byte dimungkinkan menggunakan flag kompiler.

Jonathan Frech
sumber
2

Perl 6 , 55 53 byte

say ' 'x 47-$_,chrs 32+2*$_ X-(-$_..$_)>>.abs for ^48

Cobalah online!

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

Pengembalian hanya untuk tampilan.

Saya mencoba beberapa ide, termasuk satu loop untuk membangun kembali string penuh (163 karakter), dan loop bersarang untuk membangunnya dengan cepat (168 karakter), tetapi ini akhirnya menjadi yang terpendek.

Pada dasarnya, setiap loop saya menjejalkan 4 karakter baru ke tengah-tengah string, kemudian memotong tambahan dari kedua ujungnya, menggunakan fungsi SQLSTUFF() .

Diformat dan dijelaskan:

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
BradC
sumber
2

J , 47 44 byte

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

Cobalah online!

Terima kasih kepada Conor O'Brien untuk templatnya! Terima kasih kepada FrownyFrog karena menunjukkan solusi yang tidak valid.

Galen Ivanov
sumber
1
Mungkin ini lebih mudah dimodifikasi: Cobalah online!
Conor O'Brien
@Conor O'Brien - Terima kasih untuk templatnya, saya telah memperbarui tautannya.
Galen Ivanov
Mencetak garis tambahan di bagian atas.
FrownyFrog
@FrownyFrog Oh, baru sekarang saya melihat bahwa hanya trailing newlines diizinkan, tidak memimpin. Saya akan mencoba memperbaikinya.
Galen Ivanov
@FrownyFrog - Tetap dan sedikit golf.
Galen Ivanov
2

Ruby, 59 byte

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

Diposting silang dari jawaban saya di anagol.

histokrat
sumber
2

Japt -R, 18 15 byte

14 byte jika baris baru terkemuka tambahan diizinkan.

#0õ_odH+ZÉ ¬êÃû

Menguji


Penjelasan

#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
Shaggy
sumber
2

J ,  40 37  32 byte

40 ungkapan u:30+2>.(+:@i.@(2&+)(-*(>+:))"0 _|@i:)47terima kasih kepada + Galen Ivanov & + Conor O'Brien untuk ide-ide dalam solusi mereka

37 termasuk gema echo u:32+|.(~.(>:*+:@[-])"0 _])|i:47

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

menggabungkan tips @FrownyFrog dari komentar

TIO

jayprich
sumber
Saya tidak berpikir ekspresi adalah pengiriman yang valid.
LyricLy
@ LyricLy, pendapat tampaknya berbeda karena saya melihat jawaban J lain dalam formulir ini .. toh terima kasih telah mendorong saya untuk mencukur 8 byte lagi .. sekarang saya punya ruang untuk menambahkan "gema": harap Anda senang
:)
"0 _"{
FrownyFrog
+:@[-][+-
FrownyFrog
cantik .. terima kasih untuk tips ini @FrownyFrog
jayprich
2

Perl 5 , 77 75 69 byte

map{say$"x(47-$_),(@a=map chr$_+32,$_..$_*2),reverse@a[0..@a-2]}0..47

Cobalah online!

Xcali
sumber
1

Python 2 , 98 88 byte

-1 byte terima kasih kepada @ Mr.Xcoder

i=32
exec"print''.join(chr(i+i-32-abs(j))for j in range(32-i,i-31)).center(95);i+=1;"*48

Cobalah online!

Possum Mati
sumber
-i+32=> 32-idan Anda mungkin menggunakan ' '*(79-i)alih-alih .center(95)menyimpan byte.
Tn. Xcoder
@ Mr.Xcoder terima kasih! ' '*(79-i)+tidak benar-benar menyimpan byte: D
Dead Possum
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}

Cobalah online!

Program lengkap. Tidak Disatukan:

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
}
benj2240
sumber
1

Yabasic , 80 byte

Fungsi anonim yang tidak mengambil input dan output ke konsol

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

Cobalah online!

Taylor Scott
sumber
1

uBASIC , 95 byte

0ForI=0To47
1ForJ=ITo47:?" ";:NextJ
2ForK=-1*IToI:?Left$(Chr$(32-Abs(K)+2*I),1);:NextK
3?:NextI

Cobalah online!

Taylor Scott
sumber
1

MY-BASIC , 97 byte

Respons MY-BASIC anonim yang tidak mengambil input dan output ke Konsol

For i=0 To 47
For j=i To 47
Print" "
Next
For j=-i To i
Print Chr(32-Abs(j)+2*i)
Next
Print;
Next

Cobalah online!

-1 byte terima kasih kepada Jonathan Frech

Taylor Scott
sumber
1
Print " "-> Print" ".
Jonathan Frech
@JonathanFrech - ups maaf saya salah mengeja nama Anda
Taylor Scott
1

Gol> <> , 29 byte

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

Cobalah online!

Bagaimana itu bekerja

`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
Bubbler
sumber
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

Cobalah online!

Penjelasan

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
Khusus ASCII
sumber
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--;}}

Cobalah online!

Terima kasih kepada Picard dan PunPun1000 untuk semua bantuannya

Jonathan Landrum
sumber
@Picard saya menghapus spasi. Saya selanjutnya dapat meminimalkan dengan variabel iterator global.
Jonathan Landrum
@Picard saya mengeditnya di ponsel saya; tidak menyadari bahwa saya telah meninggalkan garis kosong.
Jonathan Landrum
1
Tidak ada ruang yang tidak perlu dalam panggilan printf setelah koma, dan nama variabel dapat disingkat menjadi satu huruf. Juga akan lebih baik jika Anda dapat menyertakan tautan TIO dan jumlah byte yang sebenarnya. Berikut tautan untuk kode Anda saat ini TIO
PunPun1000
ok, saya sudah meremasnya sedikit lebih, saya pikir saya harus mengubah algoritma untuk menyusutkan lebih lanjut
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]

Hal yang saya coba itu tidak lebih pendek:

  • Mengekspresikan semuanya dalam bentuk literal karakter dan succatau preduntuk menyimpanmap toEnum .
  • Menulis rentang ke bawah alih-alih menggunakan reverse.
Kevin Reid
sumber