打印指定大小的立方体网


26

挑战

给定大小s,打印由哈希符号(#)和空格()组成的该大小的立方体网。

例子:

1:
  #
# # #    
  #
  #

2:
    # #
    # #
# # # # # #
# # # # # #
    # #
    # #
    # #
    # #

3:
      # # #
      # # #
      # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
      # # #
      # # #
      # # #
      # # #
      # # #
      # # #

该网络实际上可以是任何可以折叠成立方体的有效立方体网络,例如:

    # #
    # #
# # # # # # # #
# # # # # # # #
    # #
    # #

    # # # #
    # # # #
    # #
    # #
    # #
    # #
# # # #
# # # #

规则

  • 生成的网必须在几何上有效(可折叠为立方体)
  • 禁止标准漏洞
  • 仔细阅读规则
  • 这是,答案最短,但不会被选中

1
可以有前导/尾随空格/换行符吗?
Kritixi Lithos

@KritixiLithos是的
dkudriavtsev

13
供参考,所有11个立方网
xnor

3
如果我不仔细阅读规则怎么办?
steenbergh

1
@steenbergh然后您的解决方案无效
dkudriavtsev

Answers:


23

Python 2,47个字节

n=input()
for c in 1,4,1:exec"print'# '*c*n;"*n

在线尝试!

打印此网,选择左对齐:

# # 
# # 
# # # # # # # # 
# # # # # # # # 
# # 
# # 

这些行具有n或的4*n副本'# '。对于每一个1,4,1,我们打印n倍多份,做完n时间n线。在一个exec循环中包含一个for循环似乎很浪费,但是我没有看到更好的结果。

我测试过的替代方法:

lambda n:('# '*n*3+'\n')*n+('  '*n+'# '*n+'\n')*3*n

lambda n:('# '*n*3+'\n')*n+(' '*4*n+'# '*n*3+'\n')*n

def f(n):
 for c in[3]*n+[1]*3*n:print('# '*c*n).center(6*n)

def f(n):
 for c in[4]*n+[0]*n:print' '*c*n+'# '*n*3

def f(n):
 for c in[1]*n+[4]*n+[1]*n:print'# '*c*n

def f(n):
 c=1;exec("print'# '*c*n;"*n+"c^=5;"*n)*3

def f(n):
 for i in range(3*n):print'# '*[1,4,1][i/n]*n

def f(n):
 for c in 1,4,1:print('# '*c*n+'\n')*n,

def f(n):
 for c in 1,4,1:exec"print'# '*c*n;"*n

(这些def功能可以比一个程序短一个。)


8

八度,58 44 42 32字节

@(n)[z=repmat('# ',n);z,z,z,z;z]

部分受@xnor的python答案启发。

z=repmat('# ',n);

为输入2创建squre模式“#”,结果为以下模式:

# #             
# # 

y=[z,z,z,z];

四个zs串联在一起:

# # # # # # # # 
# # # # # # # # 

[z;y;z]

zyz垂直连接

在线尝试!

# #             
# #             
# # # # # # # # 
# # # # # # # # 
# #             
# #             

先前的答案:

@(n){h(1:n,1:2:n*6)=1;h(1:n*4,n*2+1:2:4*n)=1;' #'(h+1)}{3}

在线尝试!

产生一个T形

# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
      # # #      
      # # #      
      # # #      
      # # #      
      # # #      
      # # #      
      # # #      
      # # #      
      # # #      

6

Mathematica,77 60 52字节

感谢Martin Ender打高尔夫球8字节!

{±s_:=s~Table~#;b=±{a=±"# ","
"},±{a,a,a,a,"
"}}<>b&

未命名函数,采用正整数参数#并返回带有换行符的字符串(包括结尾的换行符);每行也有尾随空格。首先,我们定义±为重复输入#时间的函数;然后a被定义为±"# "(这#是一个字符,而不是输入!),并由此b被定义为#短线的集合,而长线±{a,a,a,a}<>n的集合#。(在两种情况下,匹配的引号之间都有文字换行符。)末尾<>b将结果字符串列表与短线集的第二个副本连接在一起。以下示例输出#=2xnor的答案告诉我这种方向是高尔夫球手):

# #     
# #     
# # # # # # # # 
# # # # # # # # 
# #     
# #     

此实现的先前版本:

""<>(±s_:=s&~Array~#;{b=±{a=±"# ",n="\n"},±{a,a,a,a}<>n,b})&

原始提交:

""<>If[(m=n~Mod~t)==0,"\n",If[n<t#||#<m<=2#,"# ","  "]]~Table~{n,4(t=3#+1)#}&

建立一个串出的4*(3#+1)块,其中的每一个或者是"# "" ",或"\n"; 只需根据索引计算要使用的片段n。输出示例#=2

# # # # # # 
# # # # # # 
    # #     
    # #     
    # #     
    # #     
    # #     
    # #     

5

JavaScript(ES6),59个字节

f=
n=>`141`.replace(/./g,m=>`${`# `.repeat(n*m)}\n`.repeat(n))
<input type=number oninput=o.textContent=f(this.value)><pre id=o>

输出在每行末尾包含一个尾随空格和一个尾随新行。


5

Ruby,36个字节

f=->n{puts (t=[s="# "*n]*n)+[s*4]*n+t}

用法:

f=->n{puts (t=[s="# "*n]*n)+[s*4]*n+t}
f[3]
# # #
# # #
# # #
# # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # #
# # #
# # #
# # #

Ruby,38个字节

在Ruby中,这种形状较长,但我希望有些语言的形状较短。

->n{puts [s="# "*n*3]*n+[" "*n*4+s]*n}

用法:

g=->n{puts [s="# "*n*3]*n+[" "*n*4+s]*n}
g[3]
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
            # # # # # # # # #
            # # # # # # # # #
            # # # # # # # # #

如果允许返回(最好)返回一个字符串数组或(不太希望返回)单个字符串代替打印,则两个答案都可能会更短。


返回字符串被认为是有效的输出形式。
dkudriavtsev

4

Scala,56个字节

(n:Int)=>Seq(1,4,1)map("# "*_*n+"\n")map(_*n)mkString ""

4

JavaScript(ES6),71

n=>((z='# '[R='repeat'](n))[R](3)+`
`)[R](n)+('  '[R](n)+z+`
`)[R](n*3)

测试

f=
n=>((z='# '[R='repeat'](n))[R](3)+`
`)[R](n)+('  '[R](n)+z+`
`)[R](n*3)

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

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


我不确定,但我认为您需要将空格和哈希值一起输出。(我也犯了这样的错误,即我的答案的第一次编辑中没有包含空格)
Kritixi Lithos

@KritixiLithos嗯,知道了。谢谢
edc65

4

Java 8,99字节

l->{for(int i=-1,j;++i<3*l;)for(j=-1,k=(i/l==2)?4*l:l;++j<k;)System.out.print("# "+j>k-2?"\n":"");}

4

V24 23 20 18 20字节

Ài# ddÀpLyGïp3PGïp

显示所有隐藏的字符

Ài# ^[ddÀp^VLyGïp3PGoïp

^[0x1b(转义字符文字)并且^V0x16C-v

在线尝试!

我必须增加字节数,因为该Ä命令在此新的V pull中存在错误

以这种格式输出:

# 
# # # # 
# 

与领先的换行符

十六进制转储:

00000000: c069 2320 1b64 64c0 7016 4c79 47ef 7033  .i# .dd.p.LyG.p3
00000010: 5047 ef70                                PG.p

说明

Ài# ^[              " Argument times insert "# "
ddÀp                " Argument times duplicate line

现在,一张网已经完成,我们必须创建一张网

^VLy                " Copy the face
Gïp                 " Paste it at the end of buffer
3P                  " Paste 3 times (these form the line)
Gïp                 " Paste at end of buffer again

不输出空格的替代解决方案:

21 20 18 16 18字节

Àé#ddÀpLyGïp3pGïp

(出于与最佳解决方案相同的原因,此TIO链接已修改)

在线尝试!


4

V,14字节(非竞争)

Ài# 5Ù4JjòÀÄk

在线尝试!

00000000: c069 2320 1b35 d934 4a6a f2c0 c46b       .i# .5.4Jj...k

无论出于何种原因,这一挑战都发现了许多错误。既然它们都已修复,很遗憾,此版本是非竞争版本,但是很高兴看到在不必添加大量字节来跟上我的草率编码的情况下,针对此挑战的V答案应该是什么样子。

说明:

À                   " Arg 1 times:
 i# <esc>           "   Insert the string "# "
         5Ù         " Make 5 copies of this line, and put the cursor on the second copy
           4J       " Join four of these lines together
             j      " Move down to the last line
              ò     " Recursively:
               ÀÄ   "   Make Arg 1 copies of this line
                 k  "   And move up a line

公平地说,J问题不是AFAIK的草率编码,我认为这只是nvim的默认设置?
nmjcman101

对,是真的。但是重复的运算符肯定是草率的。幸运的是,这个新版本要简单得多。
DJMcMayhem

4

果冻20 19字节

”#xẋ³Wẋ³K€Y
141DÇ€Y

在线尝试!

-1感谢44874(steenbergh)。

我无法摆脱泥泞的帮助!

这是可打高尔夫球的吗???看到链接1,似乎20 19字节太多了

说明:

”#xẋ³Wẋ³K€Y Helper link. Arguments: z
”#          Character #.
            y (implicit)
  x         Repeat each element of y x times.
    ³       1st command-line argument.
   ẋ        Repeat x y times.
     W      Wrap z.
       ³    1st command-line argument.
      ẋ     Repeat x y times.
        K   Join z on spaces.
         €  Map this link on x.
          Y Join z on newlines.

141DÇ€Y Main link. Arguments: 0
141     Integer 141.
   D    Convert z to base 10.
    Ç   The above link as a monad.
     €  Map this link on x.
      Y Join z on newlines.

现在是V对果冻:)
Kritixi Lithos

@KritixiLithos Nah,您的解决方案是第一个。
暴民埃里克(Erik the Outgolfer)'17年

V现在是18个字节:)
Kritixi Lithos

您可以不使用@而是将操作数交换给x自己来丢弃一个字节:”#xẋ³Wẋ³K€Y
steenbergh

3

木炭,20字节

NλG↑λ←×⁶λ↓λ# DM×⁴λ← 

代码以空格结尾。在线尝试!

说明

木炭是专门用于ASCII艺术的语言。它也是不完整的,错误的和未充分记录的文档。可以说,这需要花很多时间反复尝试,然后才能做到预期的效果。

  • Nλ输入一个数字到中λ
  • 是多边形命令,我们将在此处使用它绘制一个矩形。↑λ←×⁶λ↓λ指定多边形的边界:向上λ步进,向左6次λ步进和向下λ步进。(这是3 λλ块并排侧。)的矩形的底部边缘推断。然后,用字符串填充多边形#
  • 将当前画布转储到stdout,结果如下:
 #########
 #########
 #########
  • 在之后的命令,光标在画布的左下角。M×⁴λ←将其向左移动4 λ步(相当于两个λλ块)。
  • 在此处输出一个空间,将画布向左扩展正确的数量。
  • 在程序结束时,再次将画布发送到stdout:
             #########
             #########
             #########

将它们放在一起,您就会得到一个立方体网。


哇,那时候您真的很努力!(直到几周后才添加长方形)。–
Neil

2

Bash / Unix实用程序,72 69 68 66字节

b()(yes `dc<<<2o4d$n^$1^3/p`|tr 01 ' #'|head -$n);n=$1;b 1;b 4;b 1

在线尝试!

这是通过使用[4 ^ k / 3](以基数2编写)为10101010 ... 01,且k为1的事实而起作用的。(此处的方括号表示发言权功能。)


2

Pyke,16个字节

uAD,sXF**"# 

在这里尝试!

相当于

1 4 1]3AD,sXF**"# 

由于无法打印

这使用了一些技巧来降低字节数:

  • 它使用一些不可打印的内容来表示列表 [1, 4, 1]
  • XF 自动将输出转储到堆栈
  • 最后的字符串"#与last交换*,这意味着"不需要关闭。当最后一个标记是字符串时,会隐式发生。


u                -      [1, 4, 1]
     AD          -     apply(*, ^, input)
       ,         -    zip(^)
        s        -   sum(^)
          F**"#  -  for i in ^:
           *     -    ^ * input
            *    -   ^ * v
             "#  -    "# "
         X       - splat(^)

2

Python 2中68个 71 65字节

-6感谢@sagiksp

def f(i,c=1):
 print(' '*i*4,'')[c>i]+'# '*i*3
 if i*2>c:f(i,c+1)

在线尝试!

在找不到击败@xnor的方法的情况下,我将发布递归函数只是一种替代方法。对于f(5)打印

                    # # # # # # # # # # # # # # # 
                    # # # # # # # # # # # # # # # 
                    # # # # # # # # # # # # # # # 
                    # # # # # # # # # # # # # # # 
                    # # # # # # # # # # # # # # # 
# # # # # # # # # # # # # # # 
# # # # # # # # # # # # # # # 
# # # # # # # # # # # # # # # 
# # # # # # # # # # # # # # # 
# # # # # # # # # # # # # # # 

选择此模式的原因很简单,因为它可以分为两个部分,与其他所有部分不同。


2
空间在哪里?
dkudriavtsev

1
在输出中没有空格,这是无效的。
Mego

我的错误+3添加空格。更新。
ElPedro

1
实际上,您为什么甚至需要j?您可以根据i重新定义整个内容,并节省〜6个字节!
sagiksp

@sagiksp-谢谢。根据您的建议进行了更新。
ElPedro '17

2

PHP,64 62字节

感谢Christoph节省了2个字节。

while($a="282"[$i++/$s=$argv[1]]*$s)echo str_pad("
",$a,"# ");

打印这样的网:

# #
# #
# # # # # # # #
# # # # # # # #
# #
# #

(带有换行符)


1
while($a="282"[$i++/$s=$argv[1]]*$s)echo str_pad("\n",$a,"# ");保存2个字节。
Christoph'2

1

批处理,111字节

@set s=
@set i=@for /l %%i in (1,1,%1)do @
%i%call set s=%%s%% #
%i%echo%s%
%i%echo%s%%s%%s%%s%
%i%echo%s%


1

视网膜39 37字节

这是我第一次使用Retina,我仍在尝试了解操作方法。

.+
$*#
#
# 
\`# 
$_¶
G`.
)*%`^
$_$_$_

(在第4行和第5行之后有两个尾随空格)

感谢Martin Ender打高尔夫球2个字节!

在线尝试!


@MartinEnder谢谢,我没有注意到该要求,现在应该是正确的。您对我应该如何打高尔夫球有任何建议吗?
Leo

tio.run/nexus/…没有很多绝妙的主意,但节省了两个字节。您可以通过将所有内容包装在具有输出标志的组中来避免尾随换行(并且由于该组是程序的最后一件事,因此输出标志默认为非静音)。另一个字节$_通过在删除空行后进行一些转换来避免底部的第四个字节。tio.run/nexus/…是相同的字节数,但比较难看
Martin Ender

@MartinEnder感谢您的提示,也感谢您使用的这种语言,它的确很棒!
Leo

谢谢你的客气话。:) 如果您有任何疑问或想要讨论的事情,这里有一个聊天室。目前它很安静,但我尝试保持冻结状态,以防人们有任何疑问(您应该可以在任何时候对我进行ping操作)。
Martin Ender

1

QBIC52 67 40字节

完成重写:

:[a*3|G=G+@#`][a*2|G=G+@ `][a|?G][a|?_fG

现在,使用以下模式:

###--
--###

哪里-充满空格。

:        Read 'a' from the command line        > Assume 3
[a*3|    Create 3 segments times 'a' filling   > 3*3 = 9
G=G+@#`] Define A$ to be '#' and add this to G > G = "#########" 
[a*2|    Create 2 segments times 'a' spacer
G=G+@ `] Define B$ to be ' ' and add this to G > G = "#########       " 
[a|      FOR d == 1; d <= a; d++
?G]      Display G$:
            "#########       " 
            "#########       " 
            "#########       " 
[a|      FOR e == 1; e <= a; e++
?_fG     Display G$ in reverse (_f...|):
            "      #########" 
            "      #########" 
            "      #########" 
         (For loop and function call to Flip impicitly closed by QBIC)


@EriktheOutgolfer更新。
steenbergh

2
挑战的适当语言名称!
FlipTack

1

28 17 16字节

15个字节的代码,-n标志+1 。

"# "Xa*_RLaM141

将size作为命令行参数。在线尝试!

说明

                 a is 1st cmdline arg
       _         Build a lambda function
     a*          (a) times argument
"# "X            Repeat string "# " that many times
        RLa      Wrap in a list and repeat list (a) times
           M141  Map that function to the characters of 141
                 Autoprint (-n flag separating list items with newlines)

以下内容不完全是如何修改数据的方法,但提供了基本思想(针对a=2):

141

[1;4;1]

[2;8;2]

["# # ";"# # # # # # # # ";"# # "]

[["# # ";"# # "];["# # # # # # # # ";"# # # # # # # # "];["# # ";"# # "]]

# # 
# # 
# # # # # # # # 
# # # # # # # # 
# # 
# # 

0

05AB1E,13个字节

D141S×S*„# ×»

在线尝试!

说明

输入示例 n=2

D              # duplicate input
               # STACK: 2, 2
 141S          # push the list [1,4,1]
               # STACK: 2, 2, [1,4,1]
     ×         # repeat each item in the list input_no times
               # STACK: 2, [11, 44, 11]
      S        # split into list of digits
               # STACK: 2, [1, 1, 4, 4, 1, 1]
       *       # multiply each digit with input
               # STACK: [2, 2, 8, 8, 2, 2]
        „# ×   # repeat the string "# " for each item in the list
               # STACK: ['# # ','# # ','# # # # # # # # ','# # # # # # # # ','# # ','# # ']
            »  # join by newlines
               # OUTPUT: # # 
                         # # 
                         # # # # # # # # 
                         # # # # # # # # 
                         # # 
                         # # 

0

C#,152个字节

n=>{var m="";foreach(int c in new[]{1,4,1})for(int i=0,j;i++<n;){for(j=0;j++<c;)m+=new System.Text.StringBuilder().Insert(0,"# ",n);m+="\n";}return m;};

0

SmileBASIC,57 50字节

INPUT S
E$=("#"*S*3+CHR$(10))*S?E$SCROLL-S*2,-1?E$

解释:

INPUT SIZE
PART$=("#"*SIZE*3+CHR$(10))*S 'generate half of the pattern
PRINT PART$ 'print half the pattern
SCROLL SIZE*-2,-1 'scroll the text 2 squares right (and 1 character down)
PRINT PART$ 'print half the pattern again

在第一个PRINT之后(大小= 2,@是光标位置):

######
######

@ 

滚动后:

    ######
    ######
@

在第二次打印之后:

    ######
    ######
######
######
@

在这种情况下,您可以跳过空格
dkudriavtsev

0

Common Lisp,83 81 79字节

(lambda(x)(format t"~v@{~v@{# ~}~:*~%~}~v@{~vt~0@*~v{# ~}~%~}"x(* x 3)(* x 2)))

用法:

(funcall #'(lambda(x)(format t"~v@{~v@{# ~}~:*~%~}~v@{~vt~0@*~v{# ~}~%~}"x(* x 3)(* x 2)))2)

输出:

# # # # # #
# # # # # #
    # # 
    # # 
    # # 
    # #       
    # # 
    # #           

它是如何工作的?

in format there is control string (inside "") and arguments after it
certain commands in string can use arguments (for example ~a displays argument)
~v{~} - takes argument and does commends inside {~} number of times 
                                      (number is given by argument)
       we can write text in loop body - it'll get displayed. Even if
       in loop body there are none commends to use arguments loop itself                 
       will consume one argument (it doesn't matter what it'll be -
       it doesn't seem to affect output)
~% - newline
~n* - jump n arguments forward (relative)
~n:* - jump n arguments backwards (relative)
~n@* - jump to argument n (global, counting from 0)

~v@{~v{# ~}~%~1@*~} <--- we make x rowns, 3x columns of string "# ". 
                         ~1@* is used during looping, it also means we end on argument 1. 
                         (second argument: (* x 3))
~v@{~vt~0@*~v{# ~}~%~} <--- we now make 3x rows, x columns of "(spaces)# "
                         ~vt - is used to move to accurate column. 
                         Here it takes argument (* x 2) - this is 
                         minimal number of columns to display. It uses
                         space as default character for missing characters
                         (when string inside <~> is shorter than min 
                         number of columns). I use it to make (* x 2) spaces, 
                         by giving it no text.
      ~0@* <--- after making spaces we have no new arguments, we go back to
                argument number zero - it is used to determine number of columns in our block

欢迎提出改进意见。

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.