绘制此菱形图案


24

以下模式将构成这一挑战的基础。

     /\
     \/
     /\
    /  \
   /    \
/\/      \/\
\/\      /\/
   \    /
    \  /
     \/
     /\
     \/

在给定输入宽度和高度的情况下,每个都>=1重复输出上述ASCII艺术图案多次,并在小菱形处接合(并重叠)。

例如,这是带有width = 2和的输入height = 1

     /\        /\
     \/        \/
     /\        /\
    /  \      /  \
   /    \    /    \
/\/      \/\/      \/\
\/\      /\/\      /\/
   \    /    \    /
    \  /      \  /
     \/        \/
     /\        /\
     \/        \/

这是输入width = 3height = 2

     /\        /\        /\
     \/        \/        \/
     /\        /\        /\
    /  \      /  \      /  \
   /    \    /    \    /    \
/\/      \/\/      \/\/      \/\
\/\      /\/\      /\/\      /\/
   \    /    \    /    \    /
    \  /      \  /      \  /
     \/        \/        \/
     /\        /\        /\
     \/        \/        \/
     /\        /\        /\
    /  \      /  \      /  \
   /    \    /    \    /    \
/\/      \/\/      \/\/      \/\
\/\      /\/\      /\/\      /\/
   \    /    \    /    \    /
    \  /      \  /      \  /
     \/        \/        \/
     /\        /\        /\
     \/        \/        \/

规则和I / O

  • 输入和输出可以通过任何方便的方法给出。
  • 您可以将其打印到STDOUT或将其作为功能结果返回。
  • 完整的程序或功能都是可以接受的。
  • 只要字符正确排列,任何数量的外部空格都是可以接受的。
  • 禁止出现标准漏洞
  • 这是因此所有常见的高​​尔夫规则都适用,并且最短的代码(以字节为单位)获胜。

Answers:


10

画布26 25 24 21 18 字节

4/╬/╬⁰r:⤢n↷⁸{A×├m↷

在这里尝试!

-3个字节,通过固定不重复画布

说明:

4/╬                 quad-palindromize a 4-long diagonal - big inner diamond
   /╬               quad-palindromize "/" - small diamond
     ⁰r             join the two vertically, centered
       :⤢n          overlap with transpose
           ↷        and rotate the thing clockwise
            ⁸{      for each input
              A×      times 10
                ├     plus 2
                 m    mold the canvas to that width
                  ↷   and rotate clockwise, setting up for the next iteration

哇O_o画布太短了

6

的JavaScript(ES8),167个 161 159字节

注意:这是编码模式。请参阅我的其他答案,以简化数学方法。

将输入作为(width)(height)

w=>h=>(g=h=>h?g(--h)+`
`+([4106,4016,31305,21504,17010]['0102344320'[h%=10]]+'').replace(/./g,c=>'\\/'[c^h>5]||''.padEnd(c-1)).repeat(w+1).slice(8):'')(h*10+2)

在线尝试!

怎么样?

我们用数字对模式的上半部分进行编码:

  • 0表示\
  • 1意思/
  • n=27表示n1空格

这给出:

0  ···/\·····  -->  [3 spaces] [/] [\] [5 spaces]             -->  4106
1  ···\/·····  -->  [3 spaces] [\] [/] [5 spaces]             -->  4016
0  ···/\·····  -->  [3 spaces] [/] [\] [5 spaces]             -->  4106
2  ··/··\····  -->  [2 spaces] [/] [2 spaces] [\] [4 spaces]  -->  31305
3  ·/····\···  -->  [1 space] [/] [4 spaces] [\] [3 spaces]   -->  21504
4  /······\/\  -->  [/] [6 spaces] [\] [/] [\]                -->  17010

对于下半部分中,我们使用的行4,3,2,0/\反转。


6

JavaScript(ES6),139个字节

这使用的方法与我的最初答案完全不同,因此我将其单独发布。

将输入作为(width)(height)

w=>h=>(g=x=>y>8?` /\\
`[a=(x+y*9)%10,d=(x+y)%10,x?(y%10>3&&2*(a==8)|d==5)|(y%10<6&&2*(a==6)|d==7):3]+g(x--?x:--y&&w):'')(w=w*10+2,y=-~h*10)

在线尝试!

怎么样?

wh

  • 10w+3
  • 10h+2

x10w+20y10h+109

w=3h=2

(32,30)(31,30)(0,30)(32,29)(31,29)(0,29)(32,9)(31,9)(0,9)

x=0

对于所有其他单元格,我们计算:

  • a=(xy)mod10
  • d=(x+y)mod10

我们得出一个"/"if:

((ymod10)>3 and d=5) or ((ymod10)<6 and d=7)

 y  | y % 10 | output (w = 3, h = 1)
----+--------+----------------------------------
 20 |    0   | ...../........./........./......
 19 |    9   | ....../........./........./.....
 18 |    8   | ...../........./........./......
 17 |    7   | ..../........./........./.......
 16 |    6   | .../........./........./........
 15 |    5   | /./......././......././......./.
 14 |    4   | ./......././......././......././
 13 |    3   | ......../........./........./...
 12 |    2   | ......./........./........./....
 11 |    1   | ....../........./........./.....
 10 |    0   | ...../........./........./......
  9 |    9   | ....../........./........./.....

我们得出一个"\"if:

((ymod10)>3 and a=8) or ((ymod10)<6 and a=6)

 y  | y % 10 | output (w = 3, h = 1)
----+--------+----------------------------------
 20 |    0   | ......\.........\.........\.....
 19 |    9   | .....\.........\.........\......
 18 |    8   | ......\.........\.........\.....
 17 |    7   | .......\.........\.........\....
 16 |    6   | ........\.........\.........\...
 15 |    5   | .\.......\.\.......\.\.......\.\
 14 |    4   | \.\.......\.\.......\.\.......\.
 13 |    3   | ...\.........\.........\........
 12 |    2   | ....\.........\.........\.......
 11 |    1   | .....\.........\.........\......
 10 |    0   | ......\.........\.........\.....
  9 |    9   | .....\.........\.........\......

或者,如果没有满足这些条件,则我们划一个空格。


这真的很酷。
AdmBorkBork


@Arnauld通过查看代码即可知道这是您的答案:D
瑕疵

6

C ++(gcc),137字节

#include<cstdio>
auto p(int x,int y){int n=10,t=x=++x*n;for(++y*=n;y>8;)t>7?putchar(t<9?y--,n:t%n-y%n+4&7?t%n+y%n-5&7?32:47:92),t--:t=x;}

在线尝试!

说明

_______________________________
   098765432109876.... 
   9    \/    .     factor =y%10 - x10
   8    /\    .     if factor = -4 || 4. Print --> '\'  47
   7   /  \   . 
   6  /    \  .     factor =x%10+y%10;  
   5\/      \/*-.   if factor = 5 || 13 --> /  92
   4/\      /\   `.
   3  \    /       `->  * is 9,5 => \
   2   \  /      
   1    \/   
   0    /\       
   9

1
无效,既不是完整的程序也不是函数
仅限ASCII的

1
但是,10/10是一个非常好的方法
仅ASCII形式的

1
到底哪个程序不是完整的程序或功能?(只是问,可能已经错过了)请注意,某些语言(例如脚本语言)不需要完整程序的样板
仅ASCII格式的


1
159,但不确定从函数输出是否有效(可能是)
仅ASCII

4

Haskell,179个字节

k '\\'='/'
k '/'='\\'
k x=x
f x=take(10*x+2)
w#h=map(f w.cycle).f h.drop 9.cycle$(++).reverse=<<map(map k)$["\\/\\      /","   \\    / ","    \\  /  ","     \\/   ","     /\\   "]

在线尝试!


Haskell,181个字节

k '\\'='/'
k '/'='\\'
k x=x
f x=take(10*x+2)
w#h=map(f w.cycle).f h.drop 9.cycle$(++).reverse=<<map(map k)$map t[49200,36058,31630,30010,29038]
t 0=""
t n="\\ /"!!mod n 3:t(div n 3)

在线尝试!


1
在两种解决方案中,使用reverse.map(map k)<>idover (++).reverse=<<map(map k)可以节省3个字节。
ბიმო

1
嗯,第二个map t也可以变成另一个字节t<$>take$10*x+2保存,最后您可以使用cycle"\\ /"!!nover- "\\ /"!!mod n 3现在第二个更短了:) 在线尝试!
ბიმო

3

木炭24 22 20字节

\/↘²‖M↘LF⊖NCχ⁰F⊖NC⁰χ

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

´\/↘²

绘制原始图案的八分之一。

‖M↘L

将其复制三遍以完成原始图案。

F⊖NCχ⁰

水平复制所需的次数。

F⊖NC⁰χ

垂直复制所需的次数。


3

Powershell,146个字节

param($w,$h)0..9*$h+0,1|%{$y=$_
-join(0..9*$w+0,1|%{('3  /\33  \/33  /\33 /  \3  /3 \ /\/33\\/\33/3\3 /3  \  /33 \/3'-replace3,'   ')[$y*10+$_]})}

说明

模式是10x10字符数组:

     /\   
     \/   
     /\   
    /  \  
   /    \ 
/\/      \
\/\      /
   \    / 
    \  /  
     \/   

剧本:

  • 重复图案;
  • 将[0,1]列附加到每行的末尾;
  • 将行[0,1]附加到输出的末尾。

高尔夫两件事:

  1. 模式数组映射到长度为100个字节的字符串;
  2. 字符串由simple简化replace

2

Perl -p 5、148字节

$_='3A3'x$_.$/.'3B3
3A3
2/2\\2
1/4\\1
A6A
B6B
1\\4/1
2\\2/2
3B3
3A3
'=~s/^.*$/$&x$_/mger x<>.'3B3'x$_;s|A+|/\\|g;s|B+|\\/|g;s/\d/$"x$&/ge;s|^ |  |gm

在线尝试!


1

PHP,159字节

摘自mazzy的图案;转换为1-2-3,转换为base26->由程序解码

while($y<$argv[2]*10+2)echo str_pad("",$argv[1]*10+2,strtr(base_convert([jng1,jnnb,jng1,jofn,k333,"1h4p5",23814,k94d,k02h,jnnb][$y++%10],26,4),312,"\ /")),"
";

需要PHP 5.5或更高版本。运行-nr在线尝试

计算可能会更短(就像Arnauld一样)。我可能会调查一下。


1

Kotlin196135字节

由于仅ASCII的建议使用AZTECCO的C ++算法,因此节省了61个字节。

{h,w->var r=""
for(l in 9..h*10+10){for(c in 9..w*10+10){r+=when{(l%10+c%10)%8==5->'/'
(l%10-c%10+8)%8==4->'\\'
else->' '}}
r+='\n'}
r}

在线尝试!


1
136,从新的C ++答案中窃取
仅ASCII的

1

Python 3中194个 192 187 127字节

@纯ASCII的解决方案:

lambda w,h,n=10:"\n".join("".join([" /","\\"][(j%n-i%n)%8==4][(j%n+i%n)%8==5]for i in range(-1,w*n+1))for j in range(-1,h*n+1))

在线尝试!


原始解决方案

n="\n"
def f(w,h):a=[r"     /\   "*w,r"     \/   "*w,r"    \  /  "*w,r"   \    / "*w,r"\/\      /"*w+r"\/"];return a[0]+n+n.join(([i.translate({47:92,92:47})for i in a]+a[::-1])*h)+n+a[1]

在线尝试!

@Black Owl Kai显示了-2个字节,它显示可以从生成的数组访问顶部和底部,而不是在单独的变量中访问。

@Black Owl Kai使用一种更具创造性的方式来存储钻石,从而多了-5个字节

生成每个菱形的以下部分:

     /\
     \/
    \  /
   \    /
\/\      /\/

一个/\加在每一行的结尾来完成它。然后,将/s和\s交换以形成每个菱形的顶部,并且将线的顺序颠倒以形成下半部分。最后,它将/\s 的最上一行和s的最下一行相\/加以完成图像。


通过不使用变量b和c来获取192个字节
Black Owl Kai

删除两个+=/ *=分配并将整个菱形上下颠倒,从而使最后一个字符串更易于存储,从而达到187个字节
Black Owl Kai


147,使用c ++解决方案
仅ASCII的

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.