你能把我做成六角形吗?


53

今天,我们将制作一个ASCII六边形。您必须编写一个程序或函数,该程序或函数采用正整数n,并输出大小为n的六边形网格,该网格由星号组成。例如,大小为2的六边形如下所示:

 * *
* * *
 * *

虽然大小为3的六边形如下所示:

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

您可以使用任何默认的输入和输出方法,例如STDIO / STDOUT,函数参数和返回值或读取/写入文件。

您可能会认为输入始终有效,因此,如果输入的值不是正整数,则您的程序可以执行您想要的任何操作。你但是必须处理大小为1六边形,这恰好是一个星号的特殊情况:

*

只要输出在视觉上相同,就允许前导和尾随空格。

例子:

1:
*

2:
 * *
* * *
 * *

3:
  * * *
 * * * *
* * * * *
 * * * *
  * * *

4:
   * * * *
  * * * * *
 * * * * * *
* * * * * * *
 * * * * * *
  * * * * *
   * * * *

5:
    * * * * *
   * * * * * *
  * * * * * * *
 * * * * * * * *
* * * * * * * * *
 * * * * * * * *
  * * * * * * *
   * * * * * *
    * * * * *

6:
     * * * * * *
    * * * * * * *
   * * * * * * * *
  * * * * * * * * *
 * * * * * * * * * *
* * * * * * * * * * *
 * * * * * * * * * *
  * * * * * * * * *
   * * * * * * * *
    * * * * * * *
     * * * * * *

12:
           * * * * * * * * * * * *
          * * * * * * * * * * * * *
         * * * * * * * * * * * * * *
        * * * * * * * * * * * * * * *
       * * * * * * * * * * * * * * * *
      * * * * * * * * * * * * * * * * *
     * * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * * *
   * * * * * * * * * * * * * * * * * * * *
  * * * * * * * * * * * * * * * * * * * * *
 * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * *
 * * * * * * * * * * * * * * * * * * * * * *
  * * * * * * * * * * * * * * * * * * * * *
   * * * * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * * *
     * * * * * * * * * * * * * * * * * *
      * * * * * * * * * * * * * * * * *
       * * * * * * * * * * * * * * * *
        * * * * * * * * * * * * * * *
         * * * * * * * * * * * * * *
          * * * * * * * * * * * * *
           * * * * * * * * * * * *

通常,这是,因此存在标准漏洞,并且您应尝试编写以字节为单位的最短程序。当然,某些语言固有地比其他语言短或长,因此请记住,目标不一定是拥有最短的总字节数,而是要击败相同或相似语言的提交。

愿最好的高尔夫球手获胜!


15
为什么我们甚至有一个六角形网格标签?
帕维尔

13
同样,有人需要写一个六角形的解决方案。
帕维尔

如果有人想获得赏金,您可以在这里重用我的Hexagony答案的输出循环。
Martin Ender

6
“你能把我做成六角形吗?” -当然,您可以前往:i.imgur.com/1emYIia.png
aditsu

@Pavel,因为在六角形网格上的许多操作与在更标准的正方形网格上不同,并且可以在解决不同问题的解决方案之间移植。诸如坐标操纵,旋转,输出布局等操作
。– Sparr

Answers:


37

六角 + Bash Coreutils,0 + 3 + 8 = 11字节

包括+3的-g标志和+8 |tr . \*的非标准调用(请参阅此meta post


输入已作为Hexagony的参数提供。使用该-g N选项调用Hexagony解释器时,它将打印.s 的六边形。然后,我们使用tr将替换为*s。


2
哇,真是天才。而且您正在击败所有高尔夫语言!
DJMcMayhem

6
我不会真正使用Hexagony语言来称呼它,更像是将bash(或其他外壳程序)与Hexagony解释器作为命令之一一起使用。例如hexagony -g $1|tr . \*,假设六角形解释器以此方式命名。
圣保罗Ebermann

3
这将从实际的,可运行的命令中受益……
jpmc26,2016年

1
@ jpmc26对于长度为5的十六进制,您可以运行ruby ./interpreter.rb -g 5|tr . \*
莱利

3
@OlivierDulac“程序”为零字节。所有的工作都由“标志”来完成。
莱利

20

Python 2,61字节

i=n=input()
while~-n+i:i-=1;j=abs(i);print' '*j+'* '*(2*n+~j)

在每行末尾打印尾随空格。

感谢Outgolfer的Erik节省了一个字节。


从此开始,您将获得一个非PEP8但有效的Python 3代码(具有69个字节),int(input())而不是input()通常的print(' '*j+'* '*(2*n+~j))替换方式print' '*j+'* '*(2*n+~j)-酷代码btw ;-)
Dilettant

那是一些非常酷的代码!
Matias Bjarland '02

13

JavaScript(ES6),77 81 84

@Upvoters:不要错过@ETHproductions的答案,这是76个字节

编辑规格更改后修订,允许尾随空格

只是为了帽子...嘿!没有帽子?

f=(n,b='* '.repeat(n+n-1),o=b)=>--n?f(n,b=` ${b}`.slice(0,-2),b+`
${o}
`+b):o

测试

f=(n,b='* '.repeat(n+n-1),o=b)=>--n?f(n,b=` ${b}`.slice(0,-2),b+`
${o}
`+b):o


function update()
{
  O.textContent=f(+I.value)
}

update()
<input id=I type=number min=1 value=3 oninput='update()'>
<pre id=O></pre>


11

六角91 87 86字节

?{2'*=&~}=&}='P0</0P}|@..;>;'.\};0Q/..\&(<>"-_"&}=\?_&\/8.=-\<><;{M/.(.(/.-{><.{&'/_.\

在线尝试!

终于做到了。

最初(在意识到循环的昂贵程度之前),我希望它可以适合边长5,但是现在很难将其适合边长6。

为此,我实际上必须稍微修改线性代码。实际上,编写此代码使我实现了将线性代码缩减1 2字节的方法。


10

JavaScript(ES6),77 76字节

g=(n,s=`
*`+' *'.repeat(n*2-2),c=s,q=c.replace('*',''))=>--n?g(n,q+s+q,q):s

我告诉自己,直到我创下新的ES6记录而不看其他答案之前,我不会睡觉,所以这里就是...

测试片段

g=(n,s=`
*`+' *'.repeat(n*2-2),c=s,q=c.replace('*',''))=>--n?g(n,q+s+q,q):s

for(var i = 1; i < 7; i++) console.log(g(i)) // joe


10

C,91 89 80 74字节

w,y;f(s){for(y=-s;++y<s;)for(w=printf("\n%*s",y,"");++w<s*printf(" *"););}

我几乎进行了调整,以获取正确的公式,然后将其合并在一起。

f用数字n进行调用,它将六边形打印到标准输出。

取消说明(80字节版本):

w,y;
f(s) {
    // y iterates over [-s + 1 ; s - 1] (the number of rows)
    for(y = -s; ++y < s;)
        // w iterates over [abs(y) + 2 ; s * 2 - 1] (the number of stars on the row)
        for(
            // This prints a backspace character (ASCII 8)
            // padded with abs(y) + 2 spaces, effectively
            // printing abs(y) spaces to offset the row.
            // Also initializes w with abs(y) + 2.
            printf("\n%*c", w = abs(y) + 2, 8);

            // This is the for's condition. Makes use
            // of the 2 returned by printf, since we coïncidentally
            // need to double the upper bound for w.
            w++ < s * printf("* ");

            // Empty for increment
        )
            ; // Empty for body
}

在Coliru上实时观看

笔记:

  • printf可以处理负填充,这会导致字符与右侧的填充左对齐。因此,我尝试了某种效果w = printf("%*c*", y, ' ')以使它可以处理绝对值,并且可以从其返回值中检索它。不幸的是,零填充宽度和一填充宽度都单独打印了字符,因此三个中心线是相同的。
    更新: Jasen找到了一种方法来解决此问题,方法是打印一个空字符串而不是一个字符-减少了6个字节!

  • 退格字符被Coliru处理不正确-在本地终端上执行此代码确实会删除每行的前导空格。


w=printf("\n%*s",abs(y),"");++w<s*printf(" *");
Jasen

@Jasen我不敢相信我会错过...谢谢!
昆汀

9

05AB1E14 13字节

码:

F¹N+„ *×})û.c

说明:

F       }        # Input times do (N = iteration number)
 ¹N+             #   Calculate input + N
    „ *×         #   Multiply by the string " *"
         )       # Wrap everything into an array
          û      # Palindromize the array
           .c    # Centralize

使用CP-1252编码。在线尝试!


1
我不了解“集中化”部分的作用。当我删除它时,我得到了一个字符串数组,但没有适当数量的前导空格。
DJMcMayhem

1
@DJMcMayhem在数组上,您可以看到它,就像是一个由换行符连接的字符串,其文本居中对齐。就是输入时所做的。
阿德南

8

果冻,24字节

R+’µạṀx@€⁶żx@K¥€”*$F€ŒḄY

在线尝试!

果冻对它不具有集中化原子这一事实感到,愧,因此它被05AB1E和V打败。分别被11和7个字节击败!

如果您找到任何打高尔夫球的方法,请发表评论。任何帮助表示赞赏。

说明

R+’µạṀx@€⁶żx@K¥€”*$F€ŒḄY Main link. Arguments: z.
R+’                      The sizes of the hexagon's rows. (implicit argument)
   µ                     Start a new monadic chain with the above argument.
    ȧṀx@€⁶               The spaces you must prepend to each row. (implicit argument)
           x@K¥€”*$      The stars (points) of each row, space-joined, as a single link. (implicit argument)
          ż        F€    Conjoin and merge the leading spaces with the stars appropriately.
                     ŒḄ  Create the second half of the hexagon without the middle row.
                       Y Join the rows with newlines. This makes the shape look like a hexagon.

奖励:要查找六角形中有多少颗星,请使用以下方法:

Ḷ×6S‘

2
哎呀,解释是压倒性的。
暴民埃里克(Erik the Outgolfer)

“集中原子”会做什么?
DJMcMayhem

@DJMcMayhem有关示例,请参见05AB1E答案。
暴民埃里克(Erik the Outgolfer)

7

八度,62 58字节

@(n)' *'(dilate(impad(1,2*--n,n),[k='01010'-48;~k;k],n)+1)

先前的答案:

@(n)' *'(dilate(impad(1,2*(m=n-1),m),[k='01010'-48;~k;k],m)+1)

可以称为

(@(n)' *'(dilate(impad(1,2*(m=n-1),m),[k='01010'-48;~k;k],m)+1))(5)

Octave Online上尝试(粘贴)

例如,的基本图像n=5

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

可以用

impad(1,2*(n-1),n-1)

dilation morphological operator使用以下邻居掩模图像上施加4次:

0 1 0 1 0
1 0 1 0 1
0 1 0 1 0

可以用 [k='01010'-48;~k;k]

扩张的结果:

0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 0 0
0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0
0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0
0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0
0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 0 0

然后将0和1分别替换为''和'*'

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

6

postgresql9.6,290个字节

do language plpgsql $$ declare s constant smallint:=4;declare n smallint;declare a constant int[]:=array(select generate_series(1,s));begin foreach n in array a||array(select unnest(a)t order by t desc offset 1)loop raise info'%',concat(repeat(' ',s-n),repeat(' *',s+(n-1)));end loop;end;$$

格式化的sql在这里:

do language plpgsql $$
declare s constant smallint := 4;
declare n smallint;
declare a constant int[] := array(select generate_series(1, s));
begin
foreach n in array a || array(select unnest(a)t order by t desc offset 1) loop
    raise info '%', concat(repeat(' ', s - n), repeat(' *', s + (n - 1)));
end loop;
end;
$$;

输出:

INFO:      * * * *
INFO:     * * * * *
INFO:    * * * * * *
INFO:   * * * * * * *
INFO:    * * * * * *
INFO:     * * * * *
INFO:      * * * *

lpad也许可以为您节省一些字节。我也称这种语言为pl / pgsql,但这引起了关于是否必须计算do language plpgsql $$和结尾的问题$$;。如果以前没有提出过,最好在meta上解决。
jpmc26 2016年

另外,为什么需要多个DECLAREs?一个人行不通吗?
jpmc26 2013年

6

V,17个字节

é*À­ñ>{MÄpXA *Î.

在线尝试!

像往常一样,这是一个十六进制转储,因为其中包含不可打印的字符:

00000000: e92a c0ad f13e 7b4d c470 5841 202a 1bce  .*...>{M.pXA *..
00000010: 2e                                       .

6

APL(Dyalog Unicode)40 36 35 33 27 25字节

(⍉⊖⍪1↓⊢)⍣2∘↑⍳↓¨∘⊂'* '⍴⍨+⍨

假设⎕IO←0,即从零开始的索引。输出在每行上包含一个前导空格和一个尾随空格。

非常感谢@FrownyFrog和@ngn打高尔夫球。

在线尝试!

这个怎么运作

(⍉⊖⍪1↓⊢)⍣2∘↑⍳↓¨∘⊂'* '⍴⍨+⍨   Main function train
                 '* '⍴⍨+⍨     Repeat '* ' up to length 2×⍵
            ⍳↓¨∘⊂             Generate lower-right corner of the hexagon
          ∘↑                  Convert to matrix
(⍉⊖⍪1↓⊢)                      Palindromize vertically and transpose
        2                    ... twice

5

JavaScript(ES6), 83 81字节

这是我的第一个(代码高尔夫球)答案。我希望我能正确格式化所有内容。

a=>{for(b=c=2*a-1;c;)console.log(" ".repeat(d=Math.abs(a-c--))+"* ".repeat(b-d))}

与当前的两个ES6答案不同,我没有递归调用函数,而是使用控制台进行输出。


alert如果指定浏览器js,可以使用吗?
FlipTack

@FlipTack,不是真的,因为我逐渐建立了字符串(逐行)。如果我进行了alert编辑,它将逐行警报,而不是整个过程。
路加福音

5

Haskell,99 97 79字节

h n=mapM_(putStrLn.(\k->([k..n]>>" ")++([2..n+k]>>"* ")))([1..n-1]++[n,n-1..1])

说明:该程序基于以下观察结果:n六角形的每一行包含(nk)个空格,后跟(n + k-1)个星号,其中某些k取决于行号。

h n=                                             h is a function of type Int -> IO ()
  mapM_                                          mapM_ executes a function returning 
                                                 monadic actions on all objects 
                                                 in a list, in order. Then it executes 
                                                 these actions, in order. For this code, it 
                                                 transforms each value in the list into a 
                                                 monadic action that prints 
                                                 the corresponding line

      (                                          the function consists of two components
        putStrLn                                 the second part is printing the result of 
                                                 the first part to stdout 

        .                                        concatenating both components

        (\k->                                    the first parts first prints (n-k) spaces 
                                                 and then (n+k-1) asterisks

          ([k..n]>>" ")                          create the list of the integers from 
                                                 k to n (That is actually one more entry
                                                 than necessary, but just results in a
                                                 leading whitespace per line, while
                                                 saving 2 bytes compared to [1..n-k]).
                                                 Then create a new list where 
                                                 each element of that first list is 
                                                 replaced with the string " " and 
                                                 concatenate that result into one string

          ++                                     concatenate both lists

          ([2..n+k]>>"* ")                       create the list of the integers 
                                                 from 2 to n+k (of length n+k-1). 
                                                 Then create a new list where each 
                                                 element of that first list is replaced 
                                                 with the string "* " and concatenate 
                                                 that result into one big string
        ) 

      )         
      ([1..n-1]++[n,n-1..1])                     the list simply goes from 1 to n and 
                                                 back, supplying the k 

编辑:切换到mapM_。我不知道不使用导入就可以使用


5

Python 2中100 97 89 88 87 81 79个字节

-1来自@ Flp.Tkc

@Flp再次返回-6

-2感谢@ nedla2004。我试图找到摆脱第二个问题的方法,但没有想到:)

i=input()
a=[" "*(i-x)+"* "*(i+x)for x in range(i)]
print'\n'.join(a+a[-2::-1])

在线尝试!

为上半部分创建一个数组,然后添加反转的数组减去中线,然后打印。完全按“原样” 1打印,除了带有前导空格的打印(我想允许a *在外观上与*有或没有前导空格的a 相同)。


1
这为1-“ *”提供了错误的解决方案。我认为应该是星号,前面没有空格?
АндрейЛомакин

@АндрейЛомакин-在OP中:“只要输出在视觉上是相同的,就可以允许在行距和尾随空格。” 单颗星在视觉上与单颗星在前方相同,或者至少是我的解释;-)
ElPedro

但是您实际上是对的,因为我与我在回答中所说的相矛盾。我已经更新了答案以澄清。现在好多了?顺便说一句,在找到旧答案并发现潜在错误方面做得很好。尊重。
ElPedro '18年

1
我本人正在尝试进行此挑战,并且无法提出更好的建议,正在研究您的灵感。
АндрейЛомакин

希望我的谦卑努力对您有所帮助。当然,将来我们会一起打高尔夫球。享受PPCG。我确定do
ElPedro '18

4

批处理,161字节

@echo off
set s=*
set l=for /l %%i in (2,1,%1)do call 
%l%set s= %%s%% *
%l%echo %%s%%&call set s=%%s:~1%% *
echo %s%
%l%set s= %%s:~0,-2%%&call echo %%s%%

注意:第2行的尾随空格。

@echo off
set s=*
rem build up the leading spaces and stars for the first row
for /l %%i in (2,1,%1) do call :s
rem output the top half of the hexagon
for /l %%i in (2,1,%1) do call :t
rem middle (or only) row
echo %s%
rem output the bottom half of the hexagon
for /l %%i in (2,1,%1) do call :b
exit/b
:s
set s= %s% *
exit/b
:t
echo %s%
rem for the top half remove a space and add a star to each row
set s=%s:~1% *
exit/b
:b
rem for the bottom half add a space and remove a star from each row
set s= %s:~0,-2%
echo %s%
exit/b

4

JavaScript(ES6),83个字节

f=
n=>[...Array(n+--n)].map((_,i,a)=>a.map((_,j)=>j<n-i|j<i-n?``:`*`).join` `).join`
`
<input type=number min=1 oninput=o.textContent=f(+this.value)><pre id=o>


4

画布,9 字节

╷⁸+* ×]/─

在这里尝试!

击败内置的:D

说明:

{╷⁸+* ×]/─  implicit "{"
{      ]    map over 1..input
 ╷            decrement: 0..input-1
  ⁸+          add the input: input..(input*2-1)
    * ×       repeat "* " that many times
        /   diagonalify that - pad each line with 1 less space than the previous
         ─  palindromize vertically

不知道为什么会有这么大的填充,但是允许这样做,我会尽快解决。固定?希望我没有破东西


3

Perl 6,49个字节

->\n{say " "x n*2-1-$_~"*"xx$_ for n...n*2-1...n}

在线尝试!

这个怎么运作

->\n{                                           }  # Lambda accepting edge size (e.g. 3)
                               for n...n*2-1...n   # For each row-size (e.g. 3,4,5,4,3):
                       "*"xx$_                     # List of stars     (e.g. "*","*","*")
         " "x n*2-1-$_                             # Spaces to prepend (e.g. "  ")
                      ~                            # Concatenate.      (e.g. "  * * *")
     say                                           # Print

3

Powershell,91 89 78 68 63 52 48字节

param($n)$n..1+1..$n|gu|%{' '*$_+'* '*(2*$n-$_)}

测试脚本:

$script = {
param($n)$n..1+1..$n|gu|%{' '*$_+'* '*(2*$n-$_)}
}

12,6,5,4,3,2,1 |%{
    $_
    . $script $_
}

输出(多余的空格):

12
            * * * * * * * * * * * *
           * * * * * * * * * * * * *
          * * * * * * * * * * * * * *
         * * * * * * * * * * * * * * *
        * * * * * * * * * * * * * * * *
       * * * * * * * * * * * * * * * * *
      * * * * * * * * * * * * * * * * * *
     * * * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * * * *
   * * * * * * * * * * * * * * * * * * * * *
  * * * * * * * * * * * * * * * * * * * * * *
 * * * * * * * * * * * * * * * * * * * * * * *
  * * * * * * * * * * * * * * * * * * * * * *
   * * * * * * * * * * * * * * * * * * * * *
    * * * * * * * * * * * * * * * * * * * *
     * * * * * * * * * * * * * * * * * * *
      * * * * * * * * * * * * * * * * * *
       * * * * * * * * * * * * * * * * *
        * * * * * * * * * * * * * * * *
         * * * * * * * * * * * * * * *
          * * * * * * * * * * * * * *
           * * * * * * * * * * * * *
            * * * * * * * * * * * *
6
      * * * * * *
     * * * * * * *
    * * * * * * * *
   * * * * * * * * *
  * * * * * * * * * *
 * * * * * * * * * * *
  * * * * * * * * * *
   * * * * * * * * *
    * * * * * * * *
     * * * * * * *
      * * * * * *
5
     * * * * *
    * * * * * *
   * * * * * * *
  * * * * * * * *
 * * * * * * * * *
  * * * * * * * *
   * * * * * * *
    * * * * * *
     * * * * *
4
    * * * *
   * * * * *
  * * * * * *
 * * * * * * *
  * * * * * *
   * * * * *
    * * * *
3
   * * *
  * * * *
 * * * * *
  * * * *
   * * *
2
  * *
 * * *
  * *
1
 *

说明:

param($n)           # define script parameter
$n..1+              # int range from n to 1 step -1; append
1..$n|              # int range from 1 to n
gu|                 # alias for Get-unique eliminates equal neighbors - here is 1,1 -> 1
%{                  # for each int from [n, n-1, n-2, ... 2, 1, 2, ... n-2, n-1, n]
    ' '*$_+         # string (' ' have repeated $_ times) append
    '* '*(2*$n-$_)  # string ('* ' have repeated 2*n-$_ times)
}

1
很好用gu
AdmBorkBork

3

PHP,83 79字节

for($p=str_pad;++$y<2*$n=$argn;)echo$p($p("
",1+$k=abs($n-$y)),4*$n-$k-2,"* ");

与管道一起运行-nR在线尝试


这接近科多斯的答案;但str_padstr_repeat打高尔夫球还短。
并且++循环头中可以节省更多。


2

Ruby,54个字节

->n{(1-n..n-1).map{|j|i=j.abs;' '*i+'* '*(n*2+~i)}*$/}

lambda函数将n作为参数,并返回由换行符分隔的字符串。($/是一个包含默认行分隔符的变量。)

在测试程序中

f=->n{(1-n..n-1).map{|j|i=j.abs;' '*i+'* '*(n*2+~i)}*$/}

puts f[gets.to_i]

您可以使用带有3个点的(1-n ... n)来保存1个字节
GB

似乎共识是将输出代码(即puts)包括在字符计数中。但是重新阅读该定义时,它仅表示您的函数应“输出”结果,该结果可以读作“返回”结果。很酷的解决方案。
Matias Bjarland '02



2

SmileBASIC,74个字节

FOR I=0TO N-1P
NEXT
FOR I=N-2TO.STEP-1P
NEXT
DEF P?" "*(N-I);"* "*(N+I)END

添加前导和尾随空格。

当字符的宽度和高度相同时,这些“六边形”看起来很可怕。


2

球拍/方案

(define (f n)
  (define (s t n)
    (if (= n 0) t (s (~a t "* ") (- n 1))))
  (define (h t p a i)
    (if (= i 0)
        (display t)
        (let ((x (~a t (make-string p #\space) (s "" a) "\n"))
              (q (if (> i n) (- p 1) (+ p 1)))
              (b (if (> i n) (+ a 1) (- a 1))))
          (h x q b (- i 1)))))
  (h "" (- n 1) n (- (* 2 n) 1)))

测试:

(f 1)
*

(f 4)
   * * * *
  * * * * *
 * * * * * *
* * * * * * *
 * * * * * *
  * * * * *
   * * * *

3
欢迎光临本站!这是一场代码高尔夫比赛,因此您应该包括字节数。您也可以删除此答案中存在的许多空格以缩短它。
小麦巫师

感谢您的输入,Cat Wizard。我是打高尔夫球的新手,我认为scheme并不是最适合的语言,但是我将尝试缩短它,消除空格,并在下一个条目中添加字节数。
凯文

2

Python 2,111字节

n=input()
l=range(n,2*n-1)
S=l+[2*n-1]+l[::-1]
W=range(1,n)
for w in W[::-1]+[0]+W:print" "*w+"* "*S[0];S=S[1:]

无聊,简单的实现(以及完整的程序)。在每行输出尾随空格。

测试用例:

1:
*

2:
 * * 
* * * 
 * * 

3:
  * * * 
 * * * * 
* * * * * 
 * * * * 
  * * * 

4:
   * * * * 
  * * * * * 
 * * * * * * 
* * * * * * * 
 * * * * * * 
  * * * * * 
   * * * * 

2

Javascript(ES6),143个字节

终于是圣诞节假期(圣诞快乐!),所以我有一些时间打高尔夫球。
男孩已经有一段时间了-因此字节数很大。
开始:

c=[];a=a=>{for(i=0;i<a;i++){c.push(" ".repeat(a-i-1)+"* ".repeat(i+a-1)+"*")}for(j=c.length-2;j>-1;j--)c.push(c[j]);return a==1?"*":c.join`\n`}
console.log(a(3));


2
一些改进:for(j=c.length-2;j>-1;j--)c.push(c[j])可以写为for(j=a-1;j;c.push(c[--j]))并且for(i=0;i<a;i++){c.push(" ".repeat(a-i-1)+"* ".repeat(i+a-1)+"*")}可以是for(i=0;i<a;c.push(" ".repeat(a-i-1)+"* ".repeat(a-1+i++));。return语句可以缩短为return a-1?c.join\ n :"*"总的来说,这些更改节省了18B(11 + 7 + 1)。
路加福音

2

Java中,157 149 129 127字节

s->{for(int j=~--s,t;++j<=s;p(s-~s-t,"* "),p(1,"\n"))p(t=j<0?-j:j," ");};<T>void p(int j,T s){for(;j-->0;)System.out.print(s);}
  • Jonathan Frech删除了8个字节。
  • 凯文·克鲁伊森(Kevin Cruijssen)删除了20个字节。
  • Kevin Cruijssen删除了2个字节。

在线尝试!



1
94个字节。注意:Java 11具有String#repeat(int),但TIO仍然是JDK 10,因此是仿真repeat(String,int)方法(具有相同的字节数)。Java 11中的实际代码为:s->{for(int j=~--s,t;++j<=s;System.out.println(" ".repeat(t)+"* ".repeat(s-~s-t)))t=j<0?-j:j;}
Kevin Cruijssen

1
@Eugene当然。:)在这种情况下,当前Java版本(8+)中有一些优势:129 bytes
凯文·克鲁伊森

1
@KevinCruijssen在这里打了很多高尔夫球,谢谢。
尤金(Eugene)

1
又是我。还发现一件事-2个字节。127个字节在上面的Java 11解决方案中,这也可以用来打1个字节
凯文·克鲁伊森

2

六角形(线性),128 127 126字节

请注意,这不是 Hexagony,而只是Esoteric IDE支持的(元)语言Timwi,所以这是不是符合赏金资格。

但是,可以将其转换为Hexagony解决方案(并且我认为它会比该解决方案小),我稍后可以这样做。需要更多的努力 我在这里做了

首字母占3个字节(e2 9d a2)。每个换行符占用1个字节(0a)。

❢?{2'*=(
A
if > 0
 "-"&}=&~}=&}=?&
 B
 if > 0
  }P0;'(
  goto B
 &{&'-{=-(
 C
 if > 0
  'P0;Q0;}(
  goto C
 {M8;{(
 goto A
@

否在线尝试!。这个在Esoteric IDE中有效。

带注释的代码:

❢?        # read input n
[n]
{2'*=(     # x = 2n-1
[x]
A
if > 0    # loop (x) from 2n-1 to 1
 "-      # a = x - n
 [a]
 "&}=&~}=&    # a = abs(a). Let K be this amount
 }=?&
 B
 if > 0       # print ' ' (a) times
  }P0;'(
  goto B
 &        # current cell = a (= K)
 {&       # a = n if K>0 else x
          # Note that K=abs(x-n). So if K==0 then x==n.
          # Therefore after this step a is always equal to n.
 '-{=-    # compute n-(K-n) = 2n+K
 (        # decrement, get 2n+K-1
 C
 if > 0   # print ' *' this many times
  'P0;Q0;}(
  goto C
 {M8;{    # print a newline, goto x
 (        # x -= 1
 goto A
@

2

Japt -R11个10字节

Æ°çSi*Ãû ê

试试看(或使用TIO运行多个测试)


说明

               :Implicit input of integer U
Æ              :Map the range [0,U)
 °             :  Postfix increment U
  ç            :  Repeat
   S           :    Space
    i*         :    Prepend asterisk
      Ã        :End map
       û       :Centre pad each string with spaces to the length of the longest string
         ê     :Palindromise
               :Implicitly join with newlines and output
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.