您必须构造ASCII定向塔!


24

从我的anagolf帖子中发布的Cross(注:可能包含扰流板,验尸)。

准确输出以下文本。

  • 每行上可能还有其他尾随空格,以及尾随换行符。
  • 以字节为单位的最短代码获胜。
                                                
                                              !"!
                                             "#$#"
                                            #$%&%$#
                                           $%&'('&%$
                                          %&'()*)('&%
                                         &'()*+,+*)('&
                                        '()*+,-.-,+*)('
                                       ()*+,-./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
是否有意在第一条仅纯空白行?
AdmBorkBork '18

9
@AdmBorkBork是一个空格,因为这是第一个ASCII字符
-HyperNeutrino,

2
@ the4kman和<=>=<鱼。
pizzapant184 '18

4
有没有这样的标题不是“您必须构造ASCII定向塔!”的原因?
mattdm '18

3
@mattdm我只是从HNQ列表中来的,因为它的标题而对此进行了投票。做得很好。
Todd Wilcox

Answers:


4

帆布15 14字节

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

在这里尝试!

请注意,在进行此操作时,我添加了一些内置函数(),因为Canvas在某种程度上之前没有ASCII / unicode的内置...

说明(一些字符已替换为看起来是空格):

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

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

在线尝试!

输出第一条仅纯空白行,然后从循环460。每次迭代都会输出相应数量的空格,然后通过一些计算将相应符号的-joined char数组一起编辑。


1
您是否可以通过将第一行视为47个空格后接一个空格字符来保存一些计算?
Riking

@Riking为此,您需要特例说明如何创建char数组以仅创建一项而不是3项或更多项。因此,仅在特殊情况下,仅空格行会完全分开。
AdmBorkBork

11

木炭,13字节

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

在线尝试!链接是详细版本的代码。说明:

 ⁴⁸             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
输出对我来说似乎是错误的。
Xcoder先生18年

1
@ Mr.Xcoder Ugh,经典的“ by-by-1”错误...
Neil

8

Python 2,73个字节

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

在线尝试!来自无政府状态高尔夫的交叉报道(请参阅我的提交)。

快速验尸分析:同或与戴安娜发现确切相同的解决方案。ebicochneal提交了一个71字节的解决方案,将米奇提高到70字节。他们通过保留“当前行”变量并巧妙地对其进行更新,避免完全处理bytearray(很长)或''.join(map(chr,…))(甚至更长)。





4

普通Lisp,110字节

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

在线尝试!

说明

(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个字节

匿名的VBE立即窗口函数,不输入任何内容并输出到控制台。

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

3

Ruby,70个字节

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

在线尝试!

构造完整的可打印ASCII字符串,然后打印所需数量的正向(用空格填充)+向后的切片。



2

C(gcc),117个字节

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

在线尝试!

取消高尔夫:

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个字节

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

退货仅用于显示。

我尝试了几种方法,包括一个用于预构造完整字符串的循环(163个字符),以及一个用于动态构建它的嵌套循环(168个字符),但这最终是最短的。

基本上,每个循环我都将4个新字符填充到字符串的中心,然后使用SQL 函数修剪两端的多余字符STUFF()

格式说明:

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

J47 44字节

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

在线尝试!

感谢Conor O'Brien提供的模板!感谢FrownyFrog指出无效的解决方案。


1
也许这更容易修改:在线尝试!
科纳·奥布莱恩

@Conor O'Brien-谢谢您提供模板,我已经更新了链接。
Galen Ivanov '18

在顶部打印额外的一行。
FrownyFrog

@FrownyFrog哦,直到现在我才看到只允许尾随换行符,而不是前导。我会尝试修复它。
Galen Ivanov

@FrownyFrog-固定,略打高尔夫球。
Galen Ivanov

2

Ruby,59个字节

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

从我对anagol的回答中交叉发布。


2

Japt -R18 15字节

如果允许使用额外的前导换行符,则为14个字节

#0õ_odH+ZÉ ¬êÃû

测试一下


说明

#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字节

40表达 u:30+2>.(+:@i.@(2&+)(-*(>+:))"0 _|@i:)47+ Galen Ivanov和+ Conor O'Brien的解决方案提出了

37包括回声 echo u:32+|.(~.(>:*+:@[-])"0 _])|i:47

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

从评论中合并@FrownyFrog提示

蒂奥


我认为表达式不是有效的提交。
LyricLy

@LyricLy,意见似乎有所不同,因为我确实看到这种形式的另一个Ĵ答案..反正感谢捅了捅我刮胡子另外8个字节。现在我有房加上“回声”:希望你快乐:)
jayprich

"0 _"{
FrownyFrog

+:@[-][+-
FrownyFrog

美丽..谢谢你的这些提示@FrownyFrog
jayprich 18-4-28


1

Python 2中98 88个字节

-1字节感谢@ 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

在线尝试!


-i+32=> 32-i,您可能会使用' '*(79-i)而不是.center(95)保存字节。
Xcoder先生18年

@ Mr.Xcoder谢谢!' '*(79-i)+并没有真正保存字节:D
死负鼠

1

红宝石,78个字节

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

在线尝试!

完整程序。取消高尔夫:

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个字节

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

在线尝试!

怎么运行的

`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

TCL129个 122 118 117字节

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

在线尝试!

说明

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

#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--;}}

在线尝试!

感谢Picard和PunPun1000的所有帮助


@Picard我删除了空格。我可以使用全局迭代器变量进一步缩小。
乔纳森·兰德鲁姆

@Picard我在手机上进行了编辑;没意识到我会留下空白。
乔纳森·兰德鲁姆

1
逗号后的printf调用中没有多余的空格,并且变量名可以缩短为一个字母。如果可以包含TIO链接和实际字节数,那也很好。这是您当前代码TIO
PunPun1000 '18

好的,我已经压缩了更多,我认为我必须更改算法才能进一步缩小
Jonathan Landrum,

1

Haskell,102字节

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

我尝试过的事情并不短:

  • 用字符文字表示所有内容,succpred保存map toEnum
  • 写一个向下的范围而不是使用reverse
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.