创建一个交叉的正方形


23

创建一个交叉的正方形

您将输入一个或多个整数,然后输出一个由您选择的任何可打印字符构成的正方形,并在中心穿过对角线。

通常的想法是输出是一个空心正方形,其中有一个对角交叉。

Input: 7
Output:
*******
*#   #*
* # # *
*  #  *
* # # *
*#   #*
*******

在上面的示例中,“ *”表示外框,“#”表示对角线。

请注意,上面的示例使用两个不同的字符,以便更轻松地查看输出内容,程序应仅使用一个字符。

输入项

1或更大的整数,保证是奇数。

输出量

由您选择的字符组成的正方形,中间有一个十字。

  • 十字架必须是对角线
  • 平方可以通过函数输出或写入输出
  • 尾随换行符可以
  • 如果您愿意,也可以输出为图形,图表或图像

例子

Input: 1
Output:
*

Input: 3
Output:
***
***
***

Input: 5
Output:
*****
** **
* * *
** **
*****

Input: 7
Output:
*******
**   **
* * * *
*  *  *
* * * *
**   **
*******

眼镜

  • 允许功能或完整程序
  • 您可以通过首选方式获得输入
  • 不允许出现标准漏洞
  • 程序必须能在没有任何其他语句using的情况下运行,例如C#,必须包含在条目中
  • 您可以从函数输出或打印结果

这是代码高尔夫,因此最短的解决方案将获胜。


1
我们还可以用这些索引编制索引0,1,2,3,...吗?
瑕疵的

@flawr我不确定100%的意思
TheLethalCoder 16'Aug

@TheLethalCoder他询问他是否可以接受输入n并打印一个正方形的大小2n+1
马丁·恩德

@MartinEnder哦,所以在我的示例中输入1给出了,*但对他来说输入0?
TheLethalCoder

1
@TheLethalCoder是的,输入1将产生您的示例3
马丁·恩德

Answers:


9

MATL20 19 17字节

2-:XdtP!+~TTYa1YG

您可以在线MATL进行实验。如果它不起作用,您可能需要刷新页面。

样品运行:

在此处输入图片说明

ASCII版本:19个字节

2-:XdtP!+~TTYa~42*c

在线尝试!


但至少要确保这些线是平行和矩形的。:D
瑕疵的

@flawr嗯?你什么意思?
路易斯·门多

至少在中间看起来好像正方形的侧面是倾斜的,但这只是一种幻想。还是?(也可能是我屏幕后面的黑洞,扭曲了时空。)
更加模糊的

@flawr或去看眼科医生:-P
Luis

无法通过MATL 19.0.0版在线运行。嗯...
暴民埃里克

16

VBA Excel,168个字节

指令:

我发现在VBA的帮助下,Excel是解决此挑战的有效工具。如下设置Excel工作表

在此处输入图片说明

是的,我们通过使用工作表中的单元格作为像素,像过去一样使用小的经典方形像素。哈哈...

在这里,我使用单元格A1作为输入,并将其字体颜色更改为红色。为什么是红色?因为红色是三个字母的颜色,所以它适合打高尔夫球。在立即窗口中编写并运行以下代码:

N=[A1]:Range("A1",Cells(N,N)).Interior.Color=vbRed:Range("B2",Cells(N-1,N-1)).Clear:For i=1To N:Cells(i,i).Interior.Color=vbRed:Cells(i,N+1-i).Interior.Color=vbRed:Next

解开代码:

Sub A()
    N = [A1]
    Range("A1", Cells(N, N)).Interior.Color = vbRed
    Range("B2", Cells(N - 1, N - 1)).Clear

    For i = 1 To N
        Cells(i, i).Interior.Color = vbRed
        Cells(i, N + 1 - i).Interior.Color = vbRed
    Next
End Sub

分步说明:

N = [A1]: Range("A1", Cells(N, N)).Interior.Color = vbRed

在此处输入图片说明

Range("B2", Cells(N - 1, N - 1)).Clear

在此处输入图片说明

遍历范围单元的对角线: Cells(i, i).Interior.Color = vbRed

在此处输入图片说明

最后一步和输出: Cells(i, N + 1 - i).Interior.Color = vbRed

在此处输入图片说明


Cells.RowHeight=48:set r=[A1]:r.Resize(r,r).Interior.Color=0:[B2].Resize(r-2,r-2).Clear:For i=1To[A1]:set r=Union(r,Cells(i,i),Cells(i,r-i+1)):Next:r.Interior.Color=0
泰勒·斯科特

8

JavaScript(ES6),96个字节

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


7

Python 2,65个字节

i=n=2**input()/2
while i:print bin((n>i>1or~-n)|n|i|n/i)[2:];i/=2

使用乔纳森·艾伦(Jonathan Allan)的输出二进制数的想法,例如:

11111
11011
10101
11011
11111

这些行使用位算术创建并以二进制显示。每个部分或其余部分。该零件由2的幂n(固定)和i(下降)通过

  1. 左边 1
  2. 右边 n
  3. 对角线in/i
  4. 按或n-1时按上和下。i==1i==n

实际上,(1)和(4)通过1在when 1<i<nn-1else之外产生来组合。


7

Python,11411096 90字节

完全更改:

lambda n:[bin(sum(2**p for p in[range(n),{0,n-1,r,n-1-r}][0<r<n-1]))[2:]for r in range(n)]

使用1和返回字符串,字符列表0
-6个字节,感谢TheBikingViking

ideone上测试


以前的Python 2 @ 110

def f(n):g=range(n);n-=1;print'\n'.join(''.join((c in(r,n-r,0,n)or r in(0,n))and'#'or' 'for c in g)for r in g)

ideone测试


通过转换为lambda并重组and-or表达式来节省6个字节lambda n:[bin(sum(2**p for p in[range(n),{0,n-1,r,n-1-r}][0<r<n-1]))[2:]for r in range(n)]
TheBikingViking

@TheBikingViking啊,您是对的-在提出这个想法并睡觉之前,我真的应该打一下高尔夫球(我的初衷)。
乔纳森·艾伦

7

Java 7中,131个 130 128 125 124 122字节

String c(int n){String r="";for(int i=n,j;n-->0;r+="\n")for(j=0;j<n;r+=i*j<1|n-i<2|n-j<2|i==j|i==n-++j?"*":" ");return r;}

@LeakyNun节省了3个字节;@OliverGrégoire在我的答案中
节省了1个字节,以便给定宽度挑战的情况下绘制#的空心正方形@cliffroot
节省了2个字节。

取消测试的代码:

在这里尝试。

class M{
  static String c(int n){
    String r = "";
    for(int i = n, j; n-- > 0; r += "\n"){
      for(j = 0; j < n;
            r += i < 1      // Responsible for the first horizontal line
               | j < 1      // Responsible for the first vertical line
               | n-i < 2    // Responsible for the last horizontal line
               | n-j < 2    // Responsible for the last vertical line
               | i == j     // Responsible for the top-left to bottom-right diagonal line
               | i == n-++j // Responsible for the top-right to bottom-left diagonal line (and increasing j)
             ? "*"
             : " ");
    }
    return r;
  }

  public static void main(String[] a){
    System.out.println(c(1));
    System.out.println(c(3));
    System.out.println(c(5));
    System.out.println(c(7));
  }
}

输出:

*

***
***
***

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

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

1
String c(int n){String r="";for(int i=-1,j;++i<n;r+="\n")for(j=0;j<n;r+=i<1|j<1|n-i<2|n-j<2|i==j|i==n-++j?"*":" ")return r;}保存了4个字节
Leaky Nun

@LeakyNun 3实际上。您仍然需要;内部for循环的后面。
凯文·克鲁伊森

1
首先,我认为应该i-->0而不是n-->0,您也可以使用i*j<1代替i<1|j<1 2个字节
悬崖根

@cliffroot当然,必须找到一些东西。呵呵,JK,谢谢!;)我记得我在另一个答案中已经做过类似的事情,所以很糟糕,我忘了在这里做..:S
凯文·克鲁伊森

6

Matlab,68 66 64 58字节

由于也允许图形输出:

k=input('');[x,y]=ndgrid(abs(-k:k));spy(~(max(x,y)<k&x-y))

哪个输出例如

在此处输入图片说明

唯一的ascii版本是:

这是使用索引 0,1,2,3,...

k=input('');[x,y]=ndgrid(abs(-k:k));[(max(x,y)==k|~(x-y))*42,'']

或者与索引 1,3,7,...

n=input('');k=1:n;m=eye(n);m([k,end-k+1])=1;[(m|flip(m'))*42,'']

不错,不仅imo图形输出看起来更好,而且很酷,因为它的字节数也更短。通常使图形化而不是纯ASCII只会增加字节数(通常增加很多)。
凯文·克鲁伊森

6

C#,112101字节

感谢TheLethalCoder提醒我,C#允许使用这些匿名lambda语句-不表达表达式。

n=>{var r="";for(int y=n--,x;y-->0;r+="*\n")for(x=0;x<n;r+=y%n*x<1|y==x|y==n-x++?"*":" ");return r;};

谁说C#不是一种有趣的高尔夫语言?


我知道,对吧?27591位元组:p
Jonathan Allan

5

徽标,155个字节

图形化解决方案,实现为功能

我重新调整了字母三角的答案,并稍微改变了角度。和以前一样,r绘制一行字符。这次,该b函数通过绘制一个直线和一个对角线,旋转并重复四次来绘制一个框。这将导致对角线绘制两次(彼此重叠),但是与单独处理相比,它的代码更少。此答案还可以正确处理偶数。我必须为输入增加特殊处理,1以防止其继续进行。

我将其实现为一个函数,b该函数将size作为参数:

pu
to r:n:b:l repeat:n[rt:b label "A lt:b if repcount>1[fd:l]] end
to b:s
repeat 4[rt 90
r:s 90-heading 20 rt 135
r:s 90-heading 20*sqrt 2 rt 45]
end

Calormen.com的徽标解释器上尝试一下。要调用它,请添加一行并b以以下格式调用:

b 7

7号样本

...或尝试使用采样盘,该盘将以5、7、9和11的大小绘制四个样本,它们之间旋转90度:

repeat 4[
  b repcount*2+3
  rt 90
]

多种尺寸的样品


4

R,102字节

    n=scan();for(i in 1:n){for(j in 1:n){z=" ";if(i%in%c(1,n,n-j+1)|j%in%c(1,i,n))z="*";cat(z)};cat("\n")}

请注意,使用%in%表示条件比i == 1 | j == 1 | ...更有效。


如果保证输入多个,就可以n=scan();for(i in n:1){for(j in n:2){z=" ";if(i%in%c(1,n,n-j+1)|j%in%c(i,n))z="*";cat(z)};cat("*\n")}
打掉


4

Haskell,102 100 96 91 87字节

c s=unlines.f$f.(#)where f=(<$>[1..s]);x#y|elem y[1,s,x]||elem x[1,s,s-y+1]='*'|1>0=' '
  • 多亏了furr,节省了2个字节。
  • 使用列表推导多保存了4个字节。
  • 结合了frackr的改进和any
  • 替换any为4个字节elem

非高尔夫版本:

cross :: Int -> String
cross s = unlines $ map line [1..s]
    where line y = map (pos y) [1..s]
          pos y x | x == y = '*'
                  | x == s - y + 1 = '*'
                  | y `elem` [1, s] = '*'
                  | x `elem` [1, s] = '*'
                  | otherwise = ' '

我敢肯定,这仍然可以改善,但这是我目前要提出的。

旧版:

c s=unlines.f$f.(#)where f=(<$>[1..s]);x#y|any(==y)[1,s,x]||any(==x)[1,s,s-y+1]='*'|1>0=' '

2
您使用了[1..s]两次,我想您可以在中进行定义where
瑕疵的

这也将导致102个字节,因为我们必须在where关键字之前添加一个额外的空间。 c s=unlines$(\m->(m#)<$>z)<$>z where z=[1..s];m#n|or((==)<$>[n,m]<*>[1,s])||n==m||n==s-m+1='*'|1>0=' '
sudee

1
是的,但是您可以打包<$>[1..s]成一个函数,对吗?喜欢c s=unlines$f(\m->f(m#))where m#n|or((==)<$>[n,m]<*>[1,s])||n==m||n==s-m+1='*'|1>0=' ';f=(<$>[1..s])
骗子

好点,确实可以。:)
sudee

1
PS:c s=unlines$f$f.(#)where f=(<$>[1..s]);m#n|or((==)<$>[n,m]<*>[1,s])||n==m||n==s-m+1='*'|1>0=' '
瑕疵的

3

Java,130字节

s->{for(int i=0;i<s;i++)for(int j=0;j<s;j++)System.out.print((s-1-i==j||i==j||i==0||j==0||i==s-1||j==s-1)?j==s-1?"*\n":"*":" ");};

测试程序

Consumer<Integer> consumer = s -> {
        for (int i = 0; i < s; i++) {
            for (int j = 0; j < s; j++) {
                System.out.print((s - 1 - i == j || i == j || i == 0 || j == 0 || i == s - 1 || j == s - 1) ? j == s - 1 ? "*\n" : "*" : " ");
            }
        }
    };

    consumer.accept(20);

+1!我会指定它是Java 8,顺便说一句。另外,您可以通过去除int 之前的部分来打高尔夫球,而改为j使用int i=0,j;。您也可以在三元检查中将所有内容替换|||并删除括号。另外,您使用了s-1四次,所以我将其放在一个变量中。另外,您可以将更==0改为<1。因此,总的来说,它变成了s->{for(int i=0,j,x=s-1;i<s;i++)for(j=0;j<s;j++)System.out.print(x-i==j|i==j|i<1|j<1|i==x|j==x?j==x?"*\n":"*":" ");}116字节),比我的Java 7答案短了很多,好方法!
凯文·克鲁伊森

1
@KevinCruijssen我总是得到一个较短的答案,但是比起LMAO,还有更多的改进空间。打好我的朋友。
肖恩·怀尔德

呵呵。xD随时使用116字节版本btw。这是您的代码,只是更多内容。;)我的Java 7答案(不幸的是更长)使用了稍微不同的方法。如果我将其编辑为116字节版本,那么我基本上会窃取您的答案,但我不想这么做。
凯文·克鲁伊森

毫无疑问,只是复制并粘贴您的高尔夫球,我通常会发布一个快速的模型,然后稍后再回来查看是否错过了任何可以打高尔夫球的东西。但是你认为它是值得的:(哈哈jk
肖恩·

不好意思 我给出的大多数技巧实际上都存在于Java高尔夫技巧中。我想我只是2quick4u。;)
Kevin Cruijssen

3

C,140个 121 114字节

19字节感谢Quentin。

从双嵌套循环切换到一个循环可节省7个字节。

main(a){scanf("%d",&a);for(int i=0;i<a*a;i++,i%a||puts(""))putchar(i/a&&i/a^a-1&&i%a&&-~i%a&&i%-~a&&i%~-a?32:42);}

欢迎打高尔夫球。


我从不使用C编程,但是否不可能像Java中那样将int放入第一个for循环中?即int i,j;for(i=0;for(int i=0,j;
凯文Cruijssen

1
我上一次使用C时,您甚至都不能放在!int i,j;之后scanf
尼尔

试试n+~i-j等等
。– Neil

GCC可以#include完全删除。
昆汀

@Neil是什么意思,您不能在那之后再说呢?
Leaky Nun

3

PowerShell(133)

filter s($x){1..$x|%{$o="";$r=$_;1..$x|%{if($_-eq1-or$r-eq1-or$_-eq$x-or$r-eq$x-or$r-eq$_-or$r-1-eq$x-$_){$o+="*"}else{$o+="_"}};$o}}

笨拙,但效果很好。

s(11)
***********
**_______**
*_*_____*_*
*__*___*__*
*___*_*___*
*____*____*
*___*_*___*
*__*___*__*
*_*_____*_*
**_______**
***********

打高尔夫球的建议绝对值得欢迎,自从我使用PowerShell以来已经太久了。


3

SILOS,212字节

readIO 
a = i
lbla
a - 1
t = a
t + 1
t % i
t * a
b = i
lblb
b - 1
u = b
u + 1
u % i
u * b
u * t
v = a
v - b
u * v
v = a
v + b
v + 1
v % i
u * v
u |
if u c
print #
GOTO d
lblc
print .
lbld
if b b
printLine 
if a a

在线尝试!


:)感谢您对这种语言的关注
Rohan Jhunjhunwala

1
@RohanJhunjhunwala我喜欢其中的编程,感谢您创造了如此出色的语言。
Leaky Nun

3

GNU sed,117114 + 1(r标志)= 115字节

p;/^0$/Q;/^000$/{p;q}
h;s/./ /3g;s/  $/00/
:f;/ 00 /!{G;h;s/\n.*//p;t;:}
s/^(0 *)0  ?( *)0/\1 0\20 /
tf;s/00/0/p;g

由于sed没有数字的本机支持,因此基于该共识以一元形式给出输入。正方形的后半部分是按相反顺序存储在容纳空间中的前半部分。

跑:

sed -rf crossed_square.sed <<< "00000"

输出:

00000
00 00
0 0 0
00 00
00000

3

Python,89个字节

这是一个倒退!我使用了python的turtle模块。

from turtle import*
n=input()
for i in[(n,n),(n,0),(0,n),(0,0),(n,0),(0,n),(n,n)]:goto(i)

这是n = 200时的结果:

在此处输入图片说明


1
为创造力+1
mbx

2

Scala中,141个 137字节

val s=args(0).toInt-1;val t=0 to s;print(t.map{x=>t.map{y=>if(x==0||x==s||y==0||y==s||x==y||x==s-y)"*" else " "}.mkString+"\n"}.mkString)

跑:

$ scala cross.scala 10

从技术上讲,我可以删除打印内容,然后转到类似

def c(n:Int)={val (s,t)=(n-1,0 to n-1);t.map{x=>t.map{y=>if(x==0||x==s||y==0||y==s||x==y||x==s-y)"*" else " "}.mkString+"\n"}.mkString}

根据是否计算函数语法,这将使其为135或121字节。

可读版本:

def cross(n: Int) = {
   // Declares both s and t as variables with tuple expansion
   // s is the zero-based size and t is a range from 0 to s
   val (s,t) = (n-1, 0 to n-1)

   // Maps all rows by mapping the columns to a star or a space
   t.map { x =>
      t.map { y =>
        if (x == 0 || x == s || y == 0 || y == s || x == y || x == s-y) "*" 
        else " "
      }.mkString+"\n" // Concatenate the stars and spaces and add a newline
   }.mkString         // Concatenate the created strings
 }


2

Python 2,83字节

i=n=input()
while i:l=['* '[1<i<n]]*n;i-=1;l[0]=l[~0]=l[i]=l[~i]='*';print`l`[2::5]

修改行的字符列表,以将a *放在第一个,最后一个,第i个和最后一个位置。第一行和最后一行从all开始*,其余从所有空格开始。也为偶数工作。甲lambda表达可能比修改短,但我喜欢这个方法。



2

Mathematica,81个字节

""<>#&/@Table[If[i^2==j^2||i^2==#^2||j^2==#^2,"*"," "],{i,-#,#},{j,-#,#}]&[(#-1)/2]&

创建一个以原点为中心的坐标系,并计算*s的位置。输出字符串数组,每行一个。


2

Javascript(289270字节)

function s(a){b=[];for(i=0;i<a;i++)if(b.push([]),0==i||i==a-1)for(j=0;j<a;j++)b[i].push("*");else for(j=0;j<a;j++)0==j||j==a-1?b[i].push("*"):j==i||a-1-j==i?b[i].push("*"):b[i].push(" ");c="";for(i=0;i<b.length;i++){for(j=0;j<b[i].length;j++)c+=b[i][j];c+="\n"}return c}

取消高尔夫:

function square(size){
str=[];

for(i=0;i<size;i++){
    str.push([]);
    if(i==0||i==size-1){
        for(j=0;j<size;j++){
            str[i].push("*");
        }
    }else{
        for(j=0;j<size;j++){
            if(j==0||j==size-1){
                str[i].push("*");
            }else if(j==i||size-1-j==i){
                str[i].push("*");
            }else{
                str[i].push(" ");
            }
        }
    }
}

out="";
for(i=0;i<str.length;i++){
    for(j=0;j<str[i].length;j++){
        out+=str[i][j];
    }
    out+="\n";
}
return out;
}

编辑:感谢Philipp Flenker,节省了19个字节。


由于尾随换行符是可以的,所以我认为您不需要检查size==1
Philipp Flenker '16

1
@PhilippFlenker正确。
Paul Schmitz

1

Perl,83 +1 = 84字节

-n标志一起运行。

$\="*
*";print$c="*"x($_+1);for$b(1..$_){@a=($")x$_;@a[$b-1,-$b]=(a,a);print@a}say$c

文字换行符比\n或保存1个字节$/

可读性:

$\="*\n*";
print$c="*"x($_+1);
for$b(1..$_){
    @a=($")x$_;
    @a[$b-1,-$b]=(a,a);
    print@a
}
say$c

该代码将打印第一行并将其保存在中$c,然后打印一堆空格,并用as 替换相应的插槽,然后再次打印第一行。

$\变量的赋值告诉解释器在每次之后打印内容(星号,换行符和另一个星号)print,但这不会在后面出现say


1

SmileBASIC,46个字节

INPUT I
GBOX I,I,1,1GLINE 1,I,I,1GLINE 1,1,I,I

(不,SB不使用1索引的图形...)


1

木炭,8个字节(不竞争;语言后期挑战)

GH+↘↑↙N*

在线尝试!链接是详细版本的代码。说明:当用作PolygonHollow命令的参数时,+绘制一个框,然后箭头创建对角线。还有其他一些快捷方式字符,但是需要重新定义它们才有用,例如Y与等同,↖↗↓但是如果等同↗↓↖Y+就足够了。


1

外壳135字节):

 C(){ j=$(($1-1));for i in $(seq 0 $j);do dc<<<2o10i`echo $((1|2**$i|2**($j-$i)|2**$j|(($i==0||$i==$j))*(2**$j-1)))`p;done|tr 01 ' X';}

测试:

 C 1
 X

 C 3
 XXX
 XXX
 XXX

 C 5
 XXXXX
 XX XX
 X X X
 XX XX
 XXXXX

 C 7
 XXXXXXX
 XX   XX
 X X X X
 X  X  X
 X X X X
 XX   XX
 XXXXXXX

 C 9
 XXXXXXXXX
 XX     XX
 X X   X X
 X  X X  X
 X   X   X
 X  X X  X
 X X   X X
 XX     XX
 XXXXXXXXX

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.