Creating a Crossed Square

Creating a Crossed Square

You are to take input of an integer of one or more and output a square made of any printable character of your choice with a diagonal cross through the centre.

The general idea is for the output to be a hollow square that has a diagonal cross through it.:

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


In the above example the '*'s represent the outer box and the '#'s represent the diagonal cross.

Note that the above example uses two different characters so that it is easier to see what the output looks like, your program should use one character only.

Input

An integer of 1 or more, it is guaranteed to be odd.

Output

A square that is made up of a character of your choice with a cross through the middle.

• The cross must be diagonal
• The square may be output via the function or written to output
• Trailing newlines are okay
• Can output as a graphic, diagram or image if you wish too

Examples

Input: 1
Output:
*

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

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

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


Specs

• Functions or full programs are allowed
• You can get input by your preferred means
• Standard loopholes are disallowed
• Programs must work without any additional statements i.e. usings in C#, they must be included in the entry
• You can output from a function or print the result

This is code golf so the shortest solution wins.

• Could we also index these outputs with 0,1,2,3,...? – flawr Aug 25 '16 at 11:51
• @flawr I'm not 100% sure what you mean – TheLethalCoder Aug 25 '16 at 11:52
• @TheLethalCoder He asks whether he can take input n and print a square of size 2n+1. – Martin Ender Aug 25 '16 at 12:11
• @MartinEnder Oh so in my examples input 1 gives * but for him it will be input 0? – TheLethalCoder Aug 25 '16 at 12:13
• @TheLethalCoder Yes, and input 1 would yield your example for 3. – Martin Ender Aug 25 '16 at 12:13

MATL, 2019 17 bytes

2-:XdtP!+~TTYa1YG


You can try it experimentally in MATL online. You may need to refresh the page if it doesn't work.

Sample run:

ASCII version: 19 bytes

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


Try it online!

• But at least make sure that the lines are parallel & rectangular. :D – flawr Aug 25 '16 at 13:20
• @flawr Hm? What do you mean? – Luis Mendo Aug 25 '16 at 13:31
• At least in the middle looks as if the sides of the squares are slanted, but it's just an illusions. Or is it? (Might also be a black hole behind my screen, warping space time.) – flawr Aug 25 '16 at 15:27
• @flawr Or maybe go to the eye doctor :-P – Luis Mendo Aug 25 '16 at 15:55
• Doesn't work over MATL online, version 19.0.0. Hmmm... – Erik the Outgolfer Apr 5 '18 at 22:41

VBA Excel, 168 bytes

Instruction:

I find Excel with the help of VBA is an effective and a sufficient tool for this challenge. Set the worksheet of Excel like following

Yes, we use the small, classic square-shaped pixels like the old times by using the cells in a worksheet as the pixels. Ha-ha...

Here I use cell A1 as the input and I change its font color to red. Why red? Because red is three-letter-color so it fits for golfing. Write and run the following code in the Immediate Window:

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


Ungolfed the code:

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


Step-by-step Explanation:

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


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


Looping through the diagonal of range cells: Cells(i, i).Interior.Color = vbRed

Final step and output: 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 – Taylor Scott Jun 26 '18 at 1:52

JavaScript (ES6), 96 bytes

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>

Python 2, 65 bytes

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


Uses Jonathan Allan's idea of outputting binary numbers like:

11111
11011
10101
11011
11111


The rows are created with bit arithmetic and displayed in binary. Each part it or'ed into the rest. The part are are produced by powers of 2 n (fixed) and i (falling) via

1. Left side 1
2. Right side n
3. Diagonals i and n/i
4. Top and bottom by n-1 when i==1 or i==n.

Actually, (1) and (4) are combined by producing 1 when 1<i<n and n-1 otherwise.

Python, 114 110 96 90 bytes

Totally changed:

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)]


Returns a list of strings, characters using 1 and 0.
-6 bytes thanks to TheBikingViking

Test it at ideone

Previous 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)


Test it on ideone

• Save 6 bytes by converting to a lambda and restructuring the and-or expression: 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 Aug 25 '16 at 21:00
• @TheBikingViking Ah, you are right - I really should have golfed down to bit twiddling (my original intent) before putting the idea out there and sleeping :p. – Jonathan Allan Aug 26 '16 at 4:16

Java 7, 131130128125124 122 bytes

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;}


3 bytes saved thanks to @LeakyNun;
1 byte saved thanks to @OliverGrégoire in my answer for the Draw a hollow square of # with given width challenge;
2 bytes saved thanks to @cliffroot.

Ungolfed & test code:

Try it here.

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));
}
}


Output:

*

***
***
***

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

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

• 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 bytes saved – Leaky Nun Aug 25 '16 at 13:36
• @LeakyNun 3 actually. You'd still need the ; behind the inner for-loop. – Kevin Cruijssen Aug 25 '16 at 13:48
• first, i believe it should be i-->0 rather than n-->0 and you can also use i*j<1 instead of i<1|j<1 for 2 bytes – cliffroot Nov 8 '16 at 13:24
• @cliffroot Of course you had to find something. Hehe, jk, thanks! ;) I remember I've done something like that before in another answer, so pretty bad I forgot to do it here.. :S – Kevin Cruijssen Nov 8 '16 at 14:30

Matlab, 68 66 64 58 bytes

Since graphical output is allowed too:

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


Which outputs e.g.

The ascii only versions would be:

This is using the indexing 0,1,2,3,...

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


Alternatively with the indexing 1,3,7,...:

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

• Nice, not only does the graphical output look better imo, it's cool that it's also shorter in terms of bytes. Usually making something more graphical instead of plain ASCII would only increase the byte-count (usually by a lot). – Kevin Cruijssen Aug 25 '16 at 12:45

C#, 112 101 bytes

Thanks to TheLethalCoder for reminding me that these anonymous lambda statement-nor-expression things are allowed in C#.

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;};


Who said C# isn't a fun golfing language?

Logo, 155 bytes

Graphical solution, implemented as a function

I retooled my answer for Alphabet Triangle and changed the angles around a bit. As before, r draws a line of characters. This time, the b function draws a box by drawing one straight edge and one diagonal, rotating, and repeating four times. This causes the diagonals to be drawn twice (on top of each other), but it was less code than handling it separately. This answer also properly handles even numbers. I had to add special handling for an input of 1 to prevent it from going forward.

I implemented it as a function, b which takes the size as an argument:

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*sqrt 2 rt 45]
end


Try it out on Calormen.com's Logo interpreter. To call it, append a line and call b in the following format:

b 7


... or try the sampler platter, which draws four samples in sizes 5, 7, 9, and 11, rotating 90 degrees in between:

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


R, 102 bytes

    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")}


Note that it is more efficient to express the condition using %in% than i==1|j==1|...

• It is possible to golf away one character if the input is guaranteed to be more than one: 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")} – JDL Aug 25 '16 at 12:59
• 94 bytes – Giuseppe Apr 5 '18 at 20:22

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=' '

• Saved 2 bytes, thanks to flawr.
• Saved 4 more bytes by using list comprehensions.
• 5 bytes saved combining flawr's improvement with any
• 4 bytes saved by replacing any with elem

Ungolfed version:

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 = ' '  I'm sure this can still be improved, but this is what I've come up with for now. Old version: 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=' '  • You're using [1..s] twice, I think you could define that in where. – flawr Aug 25 '16 at 15:32 • It would result in 102 bytes too, since we'd have to add an extra space before the where keyword. 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 Aug 25 '16 at 21:02 • Ah right, but you can pack <$>[1..s] into a function, right? Like 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]) – flawr Aug 25 '16 at 22:03 • Good point, that does work indeed. :) – sudee Aug 25 '16 at 22:33 • 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=' ' – flawr Aug 26 '16 at 8:38 Java, 130 bytes 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":"*":" ");};  Test Program 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! I would specify that it's Java 8, btw. Also, you can golf it a bit by removing the int  before j and use int i=0,j; instead. You can also replace all || with | and remove the parenthesis in the ternary-check. Also, you use s-1 four times, so I would put this in a variable. Also, you can change the ==0 to <1. So in total it becomes 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 bytes) Quite a bit shorter than my Java 7 answer, so nice approach! – Kevin Cruijssen Aug 25 '16 at 12:59 • @KevinCruijssen I always end up with a shorter answer, but with more room for improvement than you LMAO. Well golfed my friend. – Shaun Wild Aug 25 '16 at 13:17 • Hehe. xD Feel free to use the 116 byte version btw. It's your code, just golfed down some more. ;) My Java 7 answer (which is unfortunately longer) uses a slightly different approach. If I would edit it into the 116 byte version I would basically steal your answer, which I don't want to. – Kevin Cruijssen Aug 25 '16 at 13:24 • No point just copying and pasting your golfs, I normally post a quick mock up and then come back to it later on to see if I missed anything that could be golfed. But you RUINED IT FOR MEE :( haha jk – Shaun Wild Aug 25 '16 at 13:33 • Ah sorry. Most of the tips I gave are actually present in the Tips for golfing in Java. I guess I'm just 2quick4u. ;) – Kevin Cruijssen Aug 25 '16 at 13:39 C, 140121 114 bytes 19 bytes thanks to Quentin. 7 bytes saved by switching from a double-nested loop to one loop. 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);}  Golfing suggestions welcome. • I never program in C, but isn't it possible to place the int in the first for-loop like in Java? I.e. int i,j;for(i=0; to for(int i=0,j; – Kevin Cruijssen Aug 25 '16 at 12:18 • The last time I used C you couldn't even put the int i,j; after the scanf! – Neil Aug 25 '16 at 12:21 • Try n+~i-j etc. – Neil Aug 25 '16 at 12:30 • GCC is fine with removing the #include completely. – Quentin Aug 25 '16 at 12:55 • @Neil What do you mean by you couldn't put that after that? – Leaky Nun Aug 25 '16 at 13:00 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}}  Clunky, but it works well enough. s(11) *********** **_______** *_*_____*_* *__*___*__* *___*_*___* *____*____* *___*_*___* *__*___*__* *_*_____*_* **_______** ***********  Golfing suggestions definitely welcome, it's been too long since I've PowerShell'd. S.I.L.O.S, 212 bytes 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  Try it online! • :) thanks for bringing more attention to this language – Rohan Jhunjhunwala Aug 27 '16 at 4:57 • @RohanJhunjhunwala I enjoyed programming in it, thank you for creating such a brilliant language. – Leaky Nun Aug 27 '16 at 4:58 GNU sed, 117 114 + 1(r flag) = 115 bytes 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


Since sed has no native support for numbers, the input is given in unary based on this consensus. The second half of the square is the first half that was stored in reverse order in hold space.

Run:

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


Output:

00000
00 00
0 0 0
00 00
00000


Python, 89 bytes

This was a throwback! I used python's turtle module.

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


Here's the result when n=200:

• +1 for creativity – mbx Apr 5 '18 at 20:14

Scala, 141 137 bytes

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)


Run:

$scala cross.scala 10 Technically I could remove the print stuff and go to something like 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}  This would make it 135 or 121 bytes depending on whether you count the function syntax stuff. Readable version: 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 }  Pyth, 27 25 bytes jmsm?|qFKaLJ/Q2,dk}JKN\ Q  Try it online! Probably golfable. Python 2, 83 bytes i=n=input() while i:l=['* '[1<i<n]]*n;i-=1;l[0]=l[~0]=l[i]=l[~i]='*';printl[2::5]  Modifies a list of the row's characters to put a * into the first, last, i'th, and i'th-to-last place. The first and last row start as all *, and the rest as all spaces. Works for evens too. A lambda expression is probably shorter than modification, but I like this method. Pyke, 2824 23 bytes ]Ua]jshqjXq|0[j{|)Qt[)P  Try it here! Mathematica, 81 bytes ""<>#&/@Table[If[i^2==j^2||i^2==#^2||j^2==#^2,"*"," "],{i,-#,#},{j,-#,#}]&[(#-1)/2]&  Creates a coordinate system with the origin in the center, and computes where the *s should go. Outputs an array of strings, one per row. Javascript (289 270 bytes) 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}  Ungolfed: 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; }  EDIT: Saved 19 bytes thanks to Philipp Flenker. • Since trailing newlines are okay, I think you don't need the check for size==1 – Philipp Nov 8 '16 at 14:45 • @PhilippFlenker Correct. – Paul Schmitz Nov 9 '16 at 14:04 Perl, 83 +1 = 84 bytes Run with the -n flag. $\="*
*";print$c="*"x($_+1);for$b(1..$_){@a=($")x$_;@a[$b-1,-$b]=(a,a);print@a}say$c  The literal newline saves 1 byte over \n or $/.

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


The code prints the top line and saves it in $c, then prints a bunch of spaces with the appropriate slots replaced with as, then prints the top line again. The assignment to the $\ variable tells the interpreter to print the contents (an asterisk, a newline, and another asterisk) after every print, but this does NOT occur after a say.

SmileBASIC, 46 bytes

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


(No, SB does NOT use 1-indexed graphics...)

Charcoal, 8 bytes (noncompeting; language postdates challenge)

ＧＨ+↘↑↙Ｎ*


Try it online! Link is to verbose version of code. Explanation: When used as a parameter to the PolygonHollow command, + draws a box, and the arrows then create the diagonals. There are some other shortcut characters but they would need to be redefined to be useful e.g. Y is equivalent to ↖↗↓ but if it was eqivalent to ↗↓↖ then Y+ would suffice.

SHELL ( 135 Bytes):

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


tests:

 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


Kotlin, 123 116 bytes

change if with \n to println

{s:Int->val n=s-1
for(r in 0..n){for(c in 0..n)print(if(n-r==c||r==c||r<1||c<1||r==n||c==n)"#"
else " ")
println()}}


Try it online!