编写这个代码不太难吗?


17

您必须使用输出此模式的任何语言编写程序或函数:

~|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||~
|~|||||||||||||||||||||||||||||||||||||||||||||||||||||||||~|
||~|||||||||||||||||||||||||||||||||||||||||||||||||||||||~||
|||~|||||||||||||||||||||||||||||||||||||||||||||||||||||~|||
||||~|||||||||||||||||||||||||||||||||||||||||||||||||||~||||
|||||~|||||||||||||||||||||||||||||||||||||||||||||||||~|||||
||||||~|||||||||||||||||||||||||||||||||||||||||||||||~||||||
|||||||~|||||||||||||||||||||||||||||||||||||||||||||~|||||||
||||||||~|||||||||||||||||||||||||||||||||||||||||||~||||||||
|||||||||~|||||||||||||||||||||||||||||||||||||||||~|||||||||
||||||||||~|||||||||||||||||||~|||||||||||||||||||~||||||||||
|||||||||||~|||||||||||||||||~|~|||||||||||||||||~|||||||||||
||||||||||||~|||||||||||||||~|||~|||||||||||||||~||||||||||||
|||||||||||||~|||||||||||||~|||||~|||||||||||||~|||||||||||||
||||||||||||||~|||||||||||~|||||||~|||||||||||~||||||||||||||
|||||||||||||||~|||||||||~|||||||||~|||||||||~|||||||||||||||
||||||||||||||||~|||||||~|||||||||||~|||||||~||||||||||||||||
|||||||||||||||||~|||||~|||||||||||||~|||||~|||||||||||||||||
||||||||||||||||||~|||~|||||||||||||||~|||~||||||||||||||||||
|||||||||||||||||||~|~|||||||||||||||||~|~|||||||||||||||||||

输出由20行组成,每行61个字符。

规则

  • 禁止出现标准漏洞
  • 输出末尾可能只有一条尾随换行符
  • 在输出的任何行上可能没有尾随空格

如果没有尾随换行符,则输出的md5校验和为fde4e3b4606bf9f8c314131c93988e96

在尾随换行符的情况下,输出的md5校验和为1f0b43db4fec6594be202c8339024cb7

这是,因此以字节为单位的最短代码获胜。


我已经对挑战进行了编辑,使其更加清晰,可以随时回滚编辑。
Kritixi Lithos'7

1
我画了一个奇怪的图案... rextester.com/WXZV81312
sergiol

Answers:


13

C(gcc)97 82 81 80字节

学习完absC语言中内置的15个字节后,再加上一个字节感谢Rogem指出我的变量的声明可以移到函数中,另一个字节感谢ceilingcat提出了建议x=31;--x+31而不是x=-31;++x<31

f(x,y){for(y=21;--y;puts(""))for(x=31;--x+31;)printf(abs(10-abs(x))-y?"|":"~");}

在线尝试!

输出带有尾随换行符。该函数f进行输出。

说明

输出可以表示为图形。

~|||||||||||||||||||||||||||||+|||||||||||||||||||||||||||||~
|~||||||||||||||||||||||||||||+||||||||||||||||||||||||||||~|
||~|||||||||||||||||||||||||||+|||||||||||||||||||||||||||~||
|||~||||||||||||||||||||||||||+||||||||||||||||||||||||||~|||
||||~|||||||||||||||||||||||||+|||||||||||||||||||||||||~||||
|||||~||||||||||||||||||||||||+||||||||||||||||||||||||~|||||
||||||~|||||||||||||||||||||||+|||||||||||||||||||||||~||||||
|||||||~||||||||||||||||||||||+||||||||||||||||||||||~|||||||
||||||||~|||||||||||||||||||||+|||||||||||||||||||||~||||||||
|||||||||~||||||||||||||||||||+||||||||||||||||||||~|||||||||
||||||||||~|||||||||||||||||||+|||||||||||||||||||~||||||||||
|||||||||||~|||||||||||||||||~+~|||||||||||||||||~|||||||||||
||||||||||||~|||||||||||||||~|+|~|||||||||||||||~||||||||||||
|||||||||||||~|||||||||||||~||+||~|||||||||||||~|||||||||||||
||||||||||||||~|||||||||||~|||+|||~|||||||||||~||||||||||||||
|||||||||||||||~|||||||||~||||+||||~|||||||||~|||||||||||||||
||||||||||||||||~|||||||~|||||+|||||~|||||||~||||||||||||||||
|||||||||||||||||~|||||~||||||+||||||~|||||~|||||||||||||||||
||||||||||||||||||~|||~|||||||+|||||||~|||~||||||||||||||||||
|||||||||||||||||||~|~|||||||||||||||||~|~|||||||||||||||||||
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

+仅出于说明目的显示s并代表轴。)

该图的等式为y=abs(10abs(x)),如此处在Desmos图的链接中所示

abs(10 - abs(x))
abs(           )            Reflect whatever is beneath the x-axis to above the x-axis
    10 - abs(x)             This forms the central triangle-like structure

在function中f,我们有两个for循环遍历此图中的每个坐标。y201,x从-3030

对于each x,我们通过三进制检查是否abs(10-abs(x))相等。如果它们相等,则会在C中产生一个假值,否则它将计算为某个正值。然后在三元组中,我们相应地。yabs(10-abs(x))-y0abs(10-abs(x))-y?"|":"~"printf

在每一行之后,我们使用来输出换行符puts(""),这就是函数以尾随换行符输出的方式。


1
使用- f(x,y)而不是x,y;f()

@ceilingcat感谢您的高尔夫
Kritixi Lithos 19-10-25



3

果冻18 16字节

⁵×3ŒRAạ=þḤṚị⁾~|Y

在线尝试!

⁵×3ŒRAạ=þḤṚị⁾~|Y  Main link. No arguments.

⁵                 Set the argument and the return value to 10.
 ×3               Multiply by 3 to yield 30.
   ŒR             Balanced range; yield [-30, -29, ..., 29, 30].
     A            Take absolute values.
      ạ           Take absolute differences with 10.
         Ḥ        Unhalve; yield 20.
       =þ         Table equals; compare each result with each k in [1, ..., 20].
          Ṛ       Reverse the resulting 2D array.
           ị⁾~|   Index into "~|", yielding '~' for 1 and '|' for 0.
               Y  Separate by linefeeds.

3

Python 2.7版,163个 138 135 133 113 91字节

l,t=S='|~'
for s in range(20):a=[l]*61;a[s]=a[60-s]=t;a[40-s]=a[20+s]=S[s>9];print`a`[2::5]

在线尝试!

编辑1:-25字节:在感到有些野心之后更改了算法。:P

编辑2:-3个字节:由Felipe Nardi Batista提供

编辑3:-2个字节:由shooqie提供

编辑4:-20个字节:由notjagan提供

编辑5:-22字节:由Leaky Nun提供


完全错过了!感谢@FelipeNardiBatista。没关系,尽管:P完全改变了算法。
Koishore Roy


1
堆叠属性与将每个属性放在自己的行中a,b,c='1','2','3'相同,a='1';b='2';c='3'并且相同,但是您可以通过解包字符串来获得字节,例如a,b,c='123'
Felipe Nardi Batista

1
是不是n<m比短n-m<0
shooqie

1
减少到113个字节
notjagan

3

///,231字节

/3/|~//2/\/\///1/!!20/|
2-/&#2,/|#2'/"""2&/||2%/1|2#/&~2"/1!2!/&&|/~'%,
3'1#0#'1~&
,'!,&0-'!3&&
!~'-!
!3'#!0!#'~!&
!,""%#!&0!-""%~!&&
1~"-"-1
%~"#3"#%
1#"~,"~%0%#%#!~%#%&
%,%~!#%~%&0"~!-!-!-"
"3!#%~!#"0"#!~%#!~"&
",,"~,"&0"-3"#3"&&

在线尝试!或者,在此处以交互方式查看它!


3

WendyScript,65个字节(不包括换行符)

<<a=>(x)?x<0/>-x:/>x
#y:20->0{#x:-30->31?a(10-a(x))==y@"~":@"|"""}

在线尝试!

遵循与上述C答案相同的原理。第一行是abs函数,第二行运行两个for循环和输出~|基于图形。""每个循环打开后,最后一个用于输出换行符y


1
为什么要排除换行符?
科纳·奥布莱恩

不需要换行符,可以删除换行符,脚本仍然可以正常运行。它就在那里,因此更容易看到abs函数与主函数的分离。
Felix Guo


2

Japt,32个字节

20ç|
AÆhX'~
VméA
VpWUVmw)c ê z ·

在线尝试!确保展开输出框。

说明

20ç|

设置U|重复20次。

AÆhX'~

设置为由(隐式)映射V的范围[0,9]
U,索引X(当前值)处的字符设置为(h~

VméA

设置WV每行A向右旋转10()个字符。

VpWUVmw

创建array:,V, W, U并且V每行都反转(w)。现在是形状的左半部分,向左旋转了90°。

c ê z ·

展平数组(c),对其进行平整化(),向右ê旋转90°(z),并与换行符(·)连接。


2

画笔,36字节

不竞争

b|20{s~>v}10{>^s~}9{>vs~}>v20{>^s~}▁

说明

b|20{s~>v}10{>^s~}9{>vs~}>v20{>^s~}▁  Program
b|                                    Sets the background character to `|`
  20{    }                            Executes function 20 times
     s~                               Sets the current character to `~`
       >v                             Moves one space right and one space down
          10{    }                    Executes function 10 times
             >^                       Moves one space right and one space up
               s~                     Sets the current character to `~`
                  9{    }             Executes function 9 times
                    >v                Moves one space right and one space down
                      s~              Sets the current character to `~`
                         >v           Moves one space right and one space down
                           20{    }   Executes function 20 times
                              >^      Moves one space right and one space up
                                s~    Sets the current character to `~`
                                   ▁  Cuts off the last line (because it pads an extra line when the pointer moves near the edge)

这使我想起,我需要添加一个镜像操作。


2

八度157 57 54字节

多亏了其他答案和评论,它才得以进一步发展。

a=zeros(20,61);for i=-30:30;a(21-abs(10-abs(i)),i+31)=2;end
a=char(a+124)

我只是使用abs(10-abs(x))函数像其他答案一样处理它,然后使用正确的ASCII字符打印出图像。


1
在这里,我们要求答案在代码高尔夫挑战赛中得到很好的体现。至少你应该尝试高尔夫球它例如通过去除不必要的空格等
埃里克Outgolfer

1
而且,该语言简称为“八度”。至于打高尔夫球,除了删除所有空白(也包括换行符)外,请确保将语句合并起来,如最后两行。
桑奇斯

如果有人知道在endfor之后如何摆脱换行符,那将是很大的帮助。
Michthan '17年




1

泡泡糖,90个字节

00000000: 9dcb a10d 0040 08c5 50cf cc4d 673f 85ab  .....@..P..Mg?..
00000010: b880 22fd 7972 3f07 ef98 e1cc 85e1 ca05  ..".yr?.........
00000020: 8623 97d5 78c2 abf1 8457 e305 b31a 0f78  .#..x....W.....x
00000030: f507 0fcc 54fc 6ed3 794b b6d2 c1ed 163a  ....T.n.yK.....:
00000040: b8dd 42c7 68b7 d031 f757 3ab8 dd42 07b7  ..B.h..1.W:..B..
00000050: 5be8 e076 0b1d dcaf 060f                 [..v......

在线尝试!


1

MathGolf,22字节

I{S╒xñ♂-±Iï--mÆ┬û|~§yp

在线尝试!

说明

可能有2到3个字节之间的距离,我将拭目以待。

I                        push 20
 {                       start block or arbitrary length
  S                      push 30
   ╒                     range(1,n+1)
    x                    reverse int/array/string
     ñ                   pop(a), push palindromize(a) string/list/number
      ♂                  push 10
       -                 pop a, b : push(a-b)
        ±                absolute value
         I               push 20
          ï              index of current loop, or length of last loop
           -             pop a, b : push(a-b)
            -            pop a, b : push(a-b)
             m           explicit map
              Æ          start block of length 5
               ┬         check if equal to 0
                û|~      string "|~"
                   §     get from array/string
                    y    join array without separator to string or number
                     p   print with newline

尽管自动生成的解释很方便,但它们通常会漏掉该程序为什么这样做的要点……
Jo King

@JoKing这几乎是果冻答案的一部分。在此之后,我使用几乎相同的逻辑找到了一个21倍的字节,我将尝试为此写一个更好的解释。
maxb


0

正电子,165字节

i=0;while(i<20)do{k='|'*(59-2*i);if(i==10)then{j='|'*19;k=j+'~'+j;};if(i>10)then{q=39-2*i;j='|'*q;q=2*i-21;k=j+'~'+'|'*q+'~'+j;}print@('|'*i+'~'+k+'~'+'|'*i);i=i+1;}

在线尝试!

我认为Positron包含太多错误。我应该将其更新为TIO,因为这样++才能真正起作用。


0

Mathematica,78 75字节

Print[""<>Riffle[Array[If[#+Abs[10-Abs[31-#2]]==21,"~","|"]&,{20,61}],"\n"]]

除外,\n而由实际的换行符代替。在线尝试!(出于某种原因,在Mathics中,行的开头有多余的空格,但在Mathematica中效果很好。)

我提出了自己的建议,但后来Kritixi Lithos添加了对其的解释,它与我的解释非常相似,但使用了一个稍微巧妙的公式,所以现在这只是该答案的一部分。(去读那个并投票吧!)


0

泡泡糖,93字节

00000000: 9dcb 390e 4301 10c2 d09e 335b 9c3d 5d56  ..9.C.....3[.=]V
00000010: e72f 4c35 327a 65bf 86ee 9830 f342 5879  ./L52ze....0.BXy
00000020: 8130 f202 848d 9797 a613 262c bc7c 6a3a  .0........&,.|j:
00000030: 60c2 552e 9858 bcdc a2f9 55ac 9916 5e6f  `.U..X....U...^o
00000040: a285 d79b 6819 eb4d b4cc fe99 165e 6fa2  ....h..M.....^o.
00000050: 85d7 9b68 e1d5 26da 782f 3578 00         ...h..&.x/5x.

在线尝试!


0

JavaScript(ES6),87个字节

for(a=Math.abs,y=20;y--;console.log(s))for(s='',x=-30;x<31;x++)s+=a(10-a(x))+~y?'|':'~'


0

Lua,193个字节

m={}function g(x,y)if(x<62)then
m[x+y*61]="~"if(x==31or x==21or x==41)then
b=not b
end
g(x+1,y+((b and-1)or 1))end
end
g(1,0)for y=0,19 do
s=""for x=1,61 do
s=s..(m[x+y*61]or"|")end
print(s)end

请注意,Lua无法在不创建新行的情况下打印出某些内容。因此,我必须打破其中一条规则。

在很大程度上最小化:

map={}
o=20
p=61
--b is true means go up
function bounce(x,y,c)
    if (x~=p)then
        map[x+y*p]=c 
        if(x==31 or x==21 or x==41)then 
            b=not b 

        end
        bounce(x+1,y+((b and -1) or 1),c)
    end
end
bounce(1,0,"~")
--map[2+60] = "h"
for y=0,o-1 do
    str = ""
    for x=1,p do
        str = str..(map[x+y*p] or "|")
    end
    print(str)
end

在缩小过程中进行了一些更改,所有这些更改使程序的扩展性较差但较小。

试试看:https://tio.run/##PY7LCoMwEEX3@YqQVVJTcWwRCp0vKV1oNa1QJ0UjGPr49TRq6eoO91wOcx/LEDp8vs1IF9da4lc5aa9aI6djkSt3a4h1pynxmwLOKD5iJog7sD2Pmf9yD@u0QrKOV6yhmkVTAtonUla8pHoLKm5BqZmtHHSmTCw9ZhoOvLZsQCHMogRdwNoMaSr/L9hevMSiePQtOTnMdwhf

我不确定是否有人这样做过,但是我尝试通过将程序作为字符串加载并使用gsub(search / replace)来进行压缩。不可思议的是,它使程序变大了。但是,如果此程序足够大,它将产生更少的字节。

g=string.gsub
loadstring(g(g(g('m={}function g(x,y)if(x<62vm[x+y*61]="~"if(x==31zx==21zx==41vb=not beg(x+1,y+((b and-1)z1))eeg(1,0)fzy=0,19 do s=""fzx=1,61 do s=s..(m[x+y*61]z"|")eprint(s)e','e',' end '),'v',')then '),'z','or '))()

由于它与实际结果相对紧密(240字节,仅41个字节),因此我想将其发布。如果该程序的位置超过350个字节,则可能会减少。


0

Java 8,113字节

v->{String r="";for(int i=-1,j;++i<20;r+="\n")for(j=61;j-->0;)r+=j==i|j+i==60|i>9&(j-i==20|j+i==40)?"~":"|";return r;}

我有检查的感觉(j==i|j+i==60|i>9&(j-i==20|j+i==40)一定程度上可以通过将多张支票组合成一张票来打高尔夫球。

说明:

在这里尝试。

v->{                    // Method with empty unused parameters and String return-type
  String r="";          //  Result-String
  for(int i=-1,j;       //  Index integers
      ++i<20;           //  Loop (1) from 0 to 20 (exclusive)
      r+="\n")          //    After every iteration: append a new-line to the result-String
    for(j=61;           //   Reset `j` to 61
        j-->0;)         //   Inner loop (2) from 60 down to 0 (inclusive)
      r+=               //    Append the result-String with:
         j==i           //     If `j` and `i` are equal (top-right /),
         |j+i==60       //     or `j` + `i` is 60 (top-left \),
         |i>9           //     or we're at the bottom halve
          &(j-i==20     //      and `j` - `i` is 20 (bottom left \),
            |j+i==40)?  //      or `j` + `i` is 40 (bottom right /)
          "~"           //       Append a literal "~" to the result-String
         :              //     Else:
          "|";          //      Append a literal "|" to the result-String
                        //   End of inner loop (2) (implicit / single-line body)
                        //  End of loop (1) (implicit / single-line body)
  return r;             //  Return the result-String
}                       // End of method


0

Tcl,104字节

time {incr j
set i 0
time {puts -nonewline [expr 21-abs(abs([incr i]-31)-10)-$j?"|":"~"]} 61
puts ""} 20

在线尝试!


Tcl,105字节

time {incr j
set i 0
time {puts -nonewline [expr $j==21-abs(abs([incr i]-31)-10)?"~":"|"]} 61
puts ""} 20

在线尝试!


Tcl,109字节

time {incr j;set i 0;time {append s [expr $j==21-abs(abs([incr i]-31)-10)?"~":"|"]} 61;set s $s\n} 20
puts $s

在线尝试!

Tcl,143133123 110

仍然远远不够,但我将在以下方面进行改进:

time {incr j;set i 0;time {incr i;append s [expr $j==21-abs(abs($i-31)-10)?"~":"|"]} 61;set s $s\n} 20
puts $s

演示


沃尔夫勒姆(Wolfram)在打高尔夫球方面提供了一些帮助:wolframalpha.com/input/?i = -abs(10
sergiol

0

05AB1E20 19 字节

20F„|~20Ýû31∍ûNQèJ,

在线尝试。

说明:

20F               # Loop 20 times:
   „|~            #  Push the string "|~"
   20Ý            #  List of range [0,20]
      û           #  Palindromize [0..20..0]
       31        #  Shorten to length 31 [0..20..10]
          û       #  Palindromize again [0..20..10..20..0]
           NQ     #  Check if the loop index is equal to it
             è    #  And index it into the string
              J   #  Then join the list of characters together
               ,  #  And print with trailing newline

20Ýû31∍û 生成列表:

[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,19,18,17,16,15,14,13,12,11,10,11,12,13,14,15,16,17,18,19,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]
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.