绘制ASCII风险


25

涉及使用星号绘制形状的问题很多,因此我认为,由于存在许多星号,我们应该使用ASCII表绘制一个。

挑战

您的任务是编写一个无需输入的程序或函数,并输出以下确切文本:

          !
         "#
         $%
         &'
         ()
         *+
         ,-
         ./
         01
23456789:;<=>?@ABCDEF
GHIJKLMNOPQRSTUVWXYZ[
        \]^_
       `a  bc
      de    fg
     hi      jk
    lm        no
   pq          rs
  tu            vw
 xy              z{
|}                ~

作为参考,该站点列出了完整的ASCII表。

规则

  • 输出应该是准确的文本,如上所示。允许前导/尾随空格。
  • 适用标准高尔夫球漏洞-无需从互联网等读取此ASCII风险。
  • 这是,因此最短的解决方案(以字节为单位)获胜。

2
我想尝试这个挑战...但是听起来有点冒险。请原谅我可怕的幽默。
HyperNeutrino

1
堆栈溢出有一个NoBadJokes政策,因此我将不得不忽略该评论。抱歉,但是政策

2
好的。对不起,违反政策。感谢您无视我的评论,回复它。
HyperNeutrino

Answers:


5

05AB1E40 38 37 36 35字节

žQ2ô376S3*£`2ôvyN·ð×ýð«}rsJ2äsr)˜.c

在线尝试!

说明

žQ                                   # push the printable ascii chars
  2ô                                 # split into pairs
    376S                             # split the number 376 into a list of digits
        3*                           # multiply each by 3 to get [9,21,18]
          £                          # divide the pairs of ascii chars into 
                                     # pieces of these sizes
           `                         # flatten list to stack
            2ô                       # split the "legs" of the asterisk into pairs of pairs
              v                      # loop over the pairs of pairs
               yN·ð×ý                # join the pairs by index*2 spaces
                     ð«              # append a space
                       }             # end loop
                        rs           # move the middle section to top of stack
                          J2ä        # convert to a string split into 2 pieces
                             sr      # rearrange the stack in the correct order
                               )˜    # wrap in a flattened list
                                 .c  # pad each element with spaces on either side

žQ2ôÐ9£s30£R21£RøsrR18£R2ôvyN·ð×ý})˜.C»,我才39岁,但我想您可以使用ZIP剃光一些。
魔术章鱼缸

@carusocomputing:我不认为zip在这里非常有用,因为我们希望字符保持顺序。在开始时将所有内容成对拆分是一个好主意。使用这么多rs感觉很浪费,但我看不出有办法解决。
Emigna

13

Python 3,110个字节

s='%c';print(('\n'.join(['%10c%c']*9+[s*21]*2+[' '*(8-i)+s*2+'  '*i+s*2for i in range(9)]))%(*range(32,128),))

生成模板

         xx
         xx
         xx
         xx
         xx
         xx
         xx
         xx
         xx
xxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxx
        xxxx
       xx  xx
      xx    xx
     xx      xx
    xx        xx
   xx          xx
  xx            xx
 xx              xx
xx                xx

%cfor 一起使用x,然后使用字符串内range(32,128)插将ASCII值插入模式中。

在线尝试!

Python 2的长度增加了一个字节,元组解压缩的时间更长,但较短的了print

s='%c';print('\n'.join(['%10c%c']*9+[s*21]*2+[' '*(8-i)+s*2+'  '*i+s*2for i in range(9)]))%tuple(range(32,128))

它应该获得艾菲尔铁塔相似奖!
sergiol

11

V54,50字节

¬ ~9ñ9É 11|á
ñ2ñ20lá
ñ$18é 9ñ^y|Ehé
Pf xxywk$hP>ñd

在线尝试!

与通常不同,此程序不包含任何不可打印的字符。

说明:

¬ ~                     " Insert the entire printable ASCII range
   9ñ           ñ       " 9 times:
     9É                 "   Insert 9 spaces at the beginning of this line
        11|             "   Move to the 11'th column on this line
           á<CR>        "   And append a newline after the 11'th column

现在缓冲区看起来像这样:

          !
         "#
         $%
         &'
         ()
         *+
         ,-
         ./
         01
23456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

现在我们建立中间部分:

2ñ        ñ             " Two times:
  20l                   "   Move 20 characters to the right (because 'l' == 'right', duh)
     á<CR>              "   Append a newline

这是有点奇怪的地方。

$                       " Move to the end of this line 
 18é                    " Insert 18 spaces before the last character
     9ñ                 " Repeat the following 9 times:
       ^                "   Move to the first non-whitespace character
        y|              "   Yank all the whitespace before the current character. 
                        "   We'll call this the "Leading whitespace register"
          E             "   Move to the end of the current WORD (up to before a space)
           h            "   Move back one character
            é<CR>       "   And insert a newline before the current character
P                       "   Paste the leading whitespace for indentation
 f                      "   Move forward to a space
   xx                   "   Delete two characters
                        "   (Note how we are inbetween the two bottom branches right now)
     yw                 "   Yank everything upto the next branch (all spaces)
                        "   We'll paste this on the line up so that we can yank it again later
                        "   To keep track of how far apart the branches are
       k$               "   Move up a line and to the end of that line
         hP             "   Move back a character and paste the whitespace we yanked
           >            "   Indent this line by one space
            ñ           "   End the loop

这是重要的注意事项。该>命令实际上是一个运算符,这意味着它在没有参数的情况下不会执行任何操作,而要对文本进行操作。例如,

>_      "Indent the current line
>>      "Indent the current line
>j      "Indent the current and next line
>G      "Indent every line

但是由于此命令是循环的,因此可以通过不给运算符来保存字符。在循环结束时,如果有任何运算符挂起,它将_隐式填充(当前行)作为参数。

现在,我承认这个循环有点怪异,并且很难随时跟踪所有文本的外观。因此,您可以使用这个简单的程序查看N个循环后的外观。

如果将其设置为9,则可以看到我们还有一些多余的文字可以删除。(仅当前行)。

因此,我们使用删除当前行dd。可是等等!您知道我怎么说操作员必须接受有时隐式填充的参数吗?在程序结束时,参数也会隐式填充。因此,我们可以简单地让V 代替,而不是ddor d_(等效)。d_


滥用隐式行为的好工作ÿ:)
Kritixi Lithos

5

蟒3 170 165 155 147字节

我已经打了这么多高尔夫球,我忘记了它是如何工作的...

i=b=0
for x in range(32,127):a=x%2<1;c=x>90;d=x<50;print(end=[' '*9*d,['\n'+' '*(8-i),'  '*~-i][b]][c]*a+chr(x)+'\n'*(x==70or d*x%2));b^=a;i+=b*c*a

在线尝试!


5

的JavaScript(ES6),156 ... 115个 114字节

可悲的是,臭名昭著的String.fromCharCode()费用为19个字节。

f=(x=y=k=1)=>k<96?String.fromCharCode(x-22?y/2^5&&(y>9?x-y+1>>1&&22-y-x>>1:x/2^5)?32:31+k++:(x=!++y,10))+f(x+1):''

console.log(f())

格式化和评论

f = (                         // given:
  x =                         //   - x = current column
  y =                         //   - y = current row
  k = 1                       //   - k = current ASCII character code, minus 31
) =>                          //
  k < 96 ?                    // if we havent't reached character #127 (96 + 31):
    String.fromCharCode(      //   let's compute the next character
      x - 22 ?                //   if x is not equal to 22 (end of line):
        y / 2 ^ 5 && (        //     if y doesn't equal 10 or 11 (horizontal bar):
          y > 9 ?             //       and either y is greater than 9:
            x - y + 1 >> 1 && //         and we are not located on one of the
            22 - y - x >> 1   //         bottom diagonals
          :                   //       or y is less or equal to 9:
            x / 2 ^ 5         //         and x doesn't equal 10 or 11 (vertical bar)
        ) ?                   //     then:
          32                  //       append a space
        :                     //     else:
          31 + k++            //       append the next ASCII character
      :                       //   else:
        (x = !++y, 10)        //     increment y, reset x and append a LineFeed
    ) + f(x + 1)              //   do a recursive call with x + 1
  :                           // else:
    ''                        //   stop recursion

我认为您可以String.fromCharCode(...[...Array(n)].map(_=>k++))保存4个字节。
ETHproductions

@ETHproductions我喜欢调用String.fromCharCode()数组的想法,但是我尝试了另一种方法。不管怎么说,还是要谢谢你!
Arnauld

3

QBIC153个 151字节

[32,49,2|?space$(9)+chr$(a)+chr$(a+1)][2|X=Y[a,a+20|X=X+chr$(c)]a=a+21?X][0,8|X=space$(8-d)[0,1|X=X+chr$(a+e)]X=X+space$(d*2)[2,3|X=X+chr$(a+f)]a=a+f?X

它实际上只是一系列的FOR循环,并将int强制转换为字符(chr$())。

样本输出:

          !
         "#
         $%
         &'
         ()
         *+
         ,-
         ./
         01
23456789:;<=>?@ABCDEF
GHIJKLMNOPQRSTUVWXYZ[
        \]^_
       `a  bc
      de    fg
     hi      jk
    lm        no
   pq          rs
  tu            vw
 xy              z{
|}                ~

3

Perl,113个字节

112个字节的代码+ -l标志。

sub g{chr$c+++32}print$"x9,&g,&g for 0..8;print map&g,0..20for 0,1;print$"x-$_,&g,&g,$"x(16+2*$_),&g,&g for-8..0

在线尝试!


3

PHP,110个 105 103 93 91字节

for(;$c<95;$y+=!$x%=21)echo"
"[$x],chr(31+($y%11<9&(max($y,10)-abs(9.5-$x++))%11<9?:++$c));

打印领先的换行符。在线运行-nr或对其进行测试

Arnauld采纳了基本原理,但这是反复进行的。
它从PHP的隐式类型转换中获得了很好的好处:
NULL到int表示字符串索引,float到int表示%,boolean到int &以及for +=

用伪代码解释

If $x is 0, print a newline. ("\n"[$x] is newline for $x=0; empty for every larger $x)
if $y is neither 9 nor 10 (not middle part: $y<9|$y>10 <=> $y%11<9)
AND distance to center == abs(9.5-$x) (in [0.5,1.5,..,10.5]) ->
    lower part:     abs($y-10-distance)>1                   => ($y-distance)%11<9
                (this works because $y is always <20)
    upper part: $x<9|$x>10 <=> distance>1 <=> 10-distance<9 => (10-distance)%11<9
                (this works because % has negative results for negative first operands)
    both parts: $y>9?$y:10 <=> max($y,10)
// $a?:$b evaluates to $a if $a is truthy, to $b else
// and the ternary condition evaluates to 1 if the coords are not in the shape
then print chr(31+1) = space
else print chr(31+incremented $c)

2

Pyth,53个字节

js.e@[+L*9;cb2c2b.e+*-8Ydj*yYdZcL2cb4)kcsrdC127,18 60

一个打印结果的程序。

在线尝试!

怎么运行的

srdC127 创建可打印ASCII字符的列表,并将其连接到字符串。

c....,18 60拆分此字符串的索引1860,使对应于输出的不同部分三个字符串的列表:顶部,中部和底部。

.e在字符串上以字符串as b及其索引为开始枚举映射k

[...)创建一个包含该图各部分所需动作的列表。通过使用索引到具有当前索引的列表中,可以选择正确的操作@...k

  • 最佳

    cb2将字符串拆分为成对的字符,并+L*9;9每对之间添加空格。

  • 中间

    c2b 将字符串分成两个等长字符串。

  • 底部

    cL2cb4 将字符串分成四个字符的组,每个组成对。

    .e开始一个枚举映射,其中字符串对为as Z,其索引为Y

    j*yYdZ将空格上的对连接起来2*Y,并添加空格。+*-8Yd8-Y

js合并所有结果,并在换行符上加入结果列表。然后将其隐式打印。


2

Haskell,144个字节

b!n=[1..n]>>b
('*':r)#(a:s)=a:r#s
(a:r)#s=a:r#s
r#s=r
p="**"
f=unlines([" "!9++p]!9++["*"!21]!2++[" "!(8-n)++p++" "!(2*n)++p|n<-[0..8]])#[' '..]

在线尝试!

说明:

b!n=[1..n]>>b定义一个!重复列表或字符串b n时间的函数。

unlines([" "!9++p]!9++["*"!21]!2++[" "!(8-n)++p++" "!(2*n)++p|n<-[0..8]]) 使用此功能绘制星号的星号(哦,具有讽刺意味的!):

         **
         **
         **
         **
         **
         **
         **
         **
         **
*********************
*********************
        ****
       **  **
      **    **
     **      **
    **        **
   **          **
  **            **
 **              **
**                **

#被定义为一个函数,该函数连续使用*给定列表中的char 替换字符串。上面的星号称为星号,[' '..]它是从空格开始的所有字符的无限列表' '


超级晚会到这里来,但是" "!(2*n)可以"(TWO SPACES)"!n
林恩

2

木炭,39个字节(无竞争)

GH↑χ→⁴↓χ→¹¹↓⁴←χ↘χ←⁴↖⁹←²↙⁹←⁴↗χ←⁹↑⁴→⁹ ↓¤γ

在线尝试!提供AST进行说明,χ是AST 的预初始化变量10


2

J,63

(不竞争)

a.{~32>.31+20 21$(* +/\),(9 21&$@{.,1:,1:,}.)(+.1&|."1)|.=|i:10

该表达式从右到左求值,因此:

  • i: 10 从-10到+10
  • | 拿腹肌使+10到0回到+10
  • = 自分类以在0的块中获得1的V形
  • |. 反转行顺序以获得/ \形状
  • ( +. 1&|."1 ) 钩子表达式将每一行右移一位,并与原始行进行或运算
  • ( 9 21&$@{. , 1: , 1: , }. ) 嵌套的叉子可以放在水平位置并拉伸顶部
  • , 将块分成线性序列进行累积
  • ( * +/\ ) 自我积累和繁殖
  • 20 21 $ 将形状恢复为20行21元素的块
  • 31 + 加31,因为前1应该是空格字符代码32
  • 32 >. 32楼
  • a. {~ 从内置的ascii中选择字符

4
欢迎来到PPCG!您怎么把这标记为不竞争?
Martin Ender '18

我只是想即使比赛开始已经很长时间了[15个月],我还是要付出更多的努力..您是说每个谜题都保持开放状态吗?..也让J表达式在REPL之外打印,即在脚本中执行时,我需要给smoutput命令或等效命令
加上

挑战通常无限期地保持开放状态(即使答案已经被接受)。有一些特殊类型的挑战有时不适合新条目(想到的是答案链,警察和强盗,山丘之王),但通常在挑战说明中会这样说。至于这是否是有效的答案格式,您必须询问具有J经验的人,但是只要将REPL答案标记为这样,通常就可以了。
Martin Ender '18

1

Ruby,91个字节

->{(-11..8).map{|i|["%s"*21,"%#{9-i}s%s%#{i*2+1}s%s","%10s%s"][i/2<=>-1]}*$/%[*' '..?~,$/]}

不打高尔夫球

->{(-11..8).map{|i|            #For each line
  ["%s"*21,                    #If i/2==-1 make a format string of 21 %s
   "%#{9-i}s%s%#{i*2+1}s%s",   #If i/2>-1 make a format string %{9-i}s%s%{i*2+1}s%s
   "%10s%s"][i/2<=>-1]         #If i/2<-1 make a format string %10s%s
  }*$/%                        #Join the format strings with newlines $/ then use sprintf operator %
  [*' '..?~,$/]                #to replace the %s with *' '..'~' and a newline for last corner.
}

1

我错过了C#的答案,所以...

C#(.NET核心)175个 174字节

_=>{var r="";for(int i=0,j,d=32,s=1;i<54;i++)for(j=0;j++<"*#4#4#4#4#4#4#4#4#+K)%1###/#%#-#'#+#)#)#+#'#-#%#/###1#"[i]-33;)r+=(char)(i%2<1?32:d++)+(s++%21<1?"\n":"");return r;}

在线尝试!

  • 多亏了Kevin Cruijssen,节省了1个字节!

1
您可以通过将ints放入for循环中来保存字节:for(int i=0,j,d=32,s=1;i<54;i++)for(j=0
Kevin Cruijssen

1

Tcl,209字节

proc I {} {incr ::i}
proc A {} {time {append a [$::F %c [I]]} 21;puts $a}
set i 31
time {puts [[set F format] %10c%c [I] [I]]} 9
A
A
time {puts [$F %[expr 32-[I]/4]c%c $i [I]][$F %[expr $i/2-45]c%c [I] [I]]} 9

在线尝试!


Tcl,212字节

proc I {} {incr ::i}
proc A {} {time {append a [$::F %c [I]]} 21;puts $a}
set i 31
time {puts [[set F format] %10c%c [I] [I]]} 9
A
A
time {puts [$F %[expr (129-[I])/4]c%c $i [I]][$F %[expr $i/2-45]c%c [I] [I]]} 9

在线尝试!

tcl,213

proc I {} {incr ::i}
set F format
proc A {} {time {append a [$::F %c [I]]} 21;puts $a}
set i 31
time {puts [$F %10c%c [I] [I]]} 9
A
A
time {puts [$F %[expr (129-[I])/4]c%c $i [I]][$F %[expr $i/2-45]c%c [I] [I]]} 9

演示


tcl,214

proc I {} {incr ::i}
set F format
proc A {} {time {append a [$::F %c [I]]} 21;puts $a}
set i 31
time {puts [$F %10c%c [I] [I]]} 9
A
A
time {I;puts [$F %[expr (129-$i)/4]c%c $i [I]][$F %[expr $i/2-45]c%c [I] [I]]} 9

演示


tcl,227

proc I {} {incr ::i}
set F format
proc A {} {time {append ::a [$::F %c [I]]} 21}
set i 31
time {puts [$F %10c%c [I] [I]]} 9
A
set a $a\n
A
puts $a
time {I;puts [$F %[expr (129-$i)/4]c%c $i [I]][$F %[expr $i/2-45]c%c [I] [I]]} 9

演示

tcl,236

proc I {} {incr ::i}
set F format
proc A {} {time {append ::a [$::F %c [I]]} 21}
set i 31
time {puts [$F %10c%c [I] [I]]} 9
set a ""
A
set a $a\n
A
puts $a
time {I;puts [$F %[expr (129-$i)/4]c%c $i [I]][$F %[expr $i/2-45]c%c [I] [I]]} 9

演示


tcl,237

proc I {} {incr ::i}
set F format
proc A {} {time {set ::a $::a[$::F %c [I]]} 21}
set i 31
time {puts [$F %10c%c [I] [I]]} 9
set a ""
A
set a $a\n
A
puts $a
time {I;puts [$F %[expr (129-$i)/4]c%c $i [I]][$F %[expr $i/2-45]c%c [I] [I]]} 9

演示


相同大小的替代方法:

proc I {} {incr ::i}
set F format
proc A b {time {upvar $b c;set c $c[$::F %c [I]]} 21}
set i 31
time {puts [$F %10c%c [I] [I]]} 9
set a ""
A a
set a $a\n
A a
puts $a
time {I;puts [$F %[expr (129-$i)/4]c%c $i [I]][$F %[expr $i/2-45]c%c [I] [I]]} 9

演示

Tcl,288

lassign {set while puts format incr expr} S W P F I E
$S i 31
$W \$i<48 {$P [$F %10c%c [$I i] [$I i]]}
$S a ""
$W {[$I i]<71} {$S a $a[$F %c $i]}
$S a $a\n
$W \$i<92 {$S a $a[$F %c $i];$I i}
$P $a
$W \$i<128 {$P [$F %[$E (129-$i)/4]c%c $i [$I i]][$F %[$E $i/2-45]c%c [$I i] [$I i]]; $I i}

演示


tcl,297个字节(天真尝试)

set i 31
while \$i<48 {puts [format %10c%c [incr i] [incr i]]}
set a ""
while {[incr i]<71} {set a $a[format %c $i]}
set a $a\n
while \$i<92 {set a $a[format %c $i];incr i}
puts $a
while \$i<128 {puts [format %[expr (129-$i)/4]c%c $i [incr i]][format %[expr $i/2-45]c%c [incr i] [incr i]]; incr i}

演示


1
“天真的尝试”是什么意思?您不应该在标题中输入长度吗?

1
我的意思是还有打高尔夫的空间,因为仍然有很多重复的地方。而且我会打更多的高尔夫球。
sergiol

原始方法有254个字节范围。
sergiol


仅限@ASCII:谢谢。我的并不完全等于您的建议!;)
sergiol

1

诗意的,899字节

ill be honest with you
i expect a big solitude
i guess i had a guilt
my own idea being:i was real alone,i was a lonely human
also,i am still
o,i guess i was expecting a shift
i figured,surely i know i am tired of silence
now i dreamed for a shift
a magical desire cant come
i am barely a man,so i guess i see why a woman i see ignores myself
i know i am awful
o,a night of passion and a moment of love
i am truly the foolish person,every time i am saying i may recapture a love
o,i think i can,i think i can
i really do know i am unfit
o,i notice a lot,i think i know i am unfit
o,a novel,or perhaps poetry in code,i do enjoy the writing
and i shudder and i wonder in a moment
i was a weirdo,i was a freak,or like,i am creepy
o,i think i was a misfit
i know i am,really
o,i ought not concern myself
and sure,i am still some joyless man
i focused and i tried
a lasting solace and joy is nearby for me

在线尝试!

Poetic是我于2018年为一个班级项目制作的一首esolang。基本上是用字长而不是符号来操心。

这首诗令人沮丧。😟


0

Python 2.7版,194个 188字节

k,l,c,s,r=8,0,chr,' ',range;o=''.join(map(chr,r(32,127)))
for i in r(0,18,2):print s*9+o[i:i+2]
print o[18:39]+'\n'+o[39:60]
for i in r(60,95,4):print s*k+o[i:i+2]+s*l+o[i+2:i+4];k-=1;l+=2

你可以通过改变下降2个字节map(chr,以map(c作为c已经被定义为chr

0

jQuery 1.5,180字节

foreach((range(9)|[9,2]),(range(2)|[0,21]),(range(9)|[8-.,2,.+.,2]))as$r({s:[range(32;127)]|implode};.r=$r|.p=""|until(.r==[];.p+=" "*.r[0]+.s[:.r[1]]|.s =.s[.r[1]:]|.r=.r[2:]);.p)

展开式

foreach (                              # instruction sequence: [indent, count]
    (range(9)|[9,2]),                  # 9 rows of 2 characters indented 9 spaces
    (range(2)|[0,21]),                 # 2 rows of 21 characters
    (range(9)|[8-.,2,.+.,2])           # 9 rows of 4 characters with varying indent
) as $r (
    {s:[range(32;127)]|implode}        # state = ascii string
  ; .r = $r                            # current instruction
  | .p = ""                            # print string for this row
  | until(.r==[];                      # until current instruction is exhausted
        .p += " "*.r[0] + .s[:.r[1]]   # add to print string
      | .s = .s[.r[1]:]                # remove from state
      | .r = .r[2:]                    # remove from instruction
    )
  ; .p                                 # emit print string
 )

在线尝试!


0

斜线(///),324字节

          !
         "#
         $%
         &'
         ()
         *+
         ,-
         .\/
         01
23456789:;<=>?@ABCDEF
GHIJKLMNOPQRSTUVWXYZ[
        \\]^_
       `a  bc
      de    fg
     hi      jk
    lm        no
   pq          rs
  tu            vw
 xy              z{
|}                ~

Slashes中的第一个(默认)操作是“ print”,因此将打印字符串。在/\必须通过程序进行转义\秒。


您应该添加字节数,最好添加到解释器的链接。不过,它看起来有点让人失望(不确定是否最好在///中做得更好)。
Stewie Griffin

显示///的美感有点开玩笑,我将添加它们!
clabe45

0

Java的8,176个 173字节

v->{for(int i=0,j,d=32,s=1;i<54;i++)for(j=0;j++<"*#4#4#4#4#4#4#4#4#+K)%1###/#%#-#'#+#)#)#+#'#-#%#/###1#".charAt(i)-33;)System.out.printf(s++%21<1?"%c\n":"%c",i%2<1?32:d++);}

@Charlie的C#.NET答案的端口,因此请确保对他进行投票。
-3个字节,感谢@ceilingcat

在线尝试。

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.