| Bytes | Lang | Time | Link |
|---|---|---|---|
| 121 | sed rn | 240414T090500Z | guest430 |
| 044 | TinyAPL | 241017T172011Z | noodle p |
| 023 | 05AB1E | 240411T090627Z | Kevin Cr |
| 069 | Perl 5 n | 240422T170043Z | Xcali |
| 043 | Jelly | 240414T021711Z | Aaron |
| 095 | C GCC | 240414T101058Z | matteo_c |
| 034 | Uiua | 240408T143910Z | noodle p |
| 020 | Vyxal | 240406T003524Z | emanresu |
| 080 | Haskell | 210621T152620Z | lynn |
| 025 | Japt | 190125T231554Z | Shaggy |
| 046 | Vyxal | 210620T095453Z | emanresu |
| 005 | Charcoal | 181106T141028Z | Kevin Cr |
| 099 | Retina 0.8.2 | 190127T102831Z | Neil |
| 014 | Canvas | 190126T210837Z | dzaima |
| 093 | Powershell | 181105T174520Z | mazzy |
| 117 | JavaScript ES6 | 170508T104223Z | Shaggy |
| 087 | SmileBASIC | 170205T230743Z | 12Me21 |
| 096 | Haskell | 150508T170138Z | user4067 |
| 115 | Javascript ES7 Draft | 150508T054026Z | nderscor |
| 113 | Groovy | 150515T160257Z | dbramwel |
| nan | 150508T142903Z | edc65 | |
| 219 | Prolog | 150515T021813Z | DLosc |
| nan | 150508T093636Z | alyx-bre | |
| 182 | PHP | 150507T230019Z | Cave Joh |
| 087 | Matlab | 150508T143002Z | Oebele |
| 130 | Ruby | 150508T072119Z | Tomá |
| 135 | IDL 8.3 | 150508T034211Z | sirperci |
| 099 | Python 2 | 150508T025928Z | xnor |
| nan | OS/2 Classic Rexx | 150509T044930Z | lisa |
| 125 | Python | 150508T124119Z | Tim |
| 085 | Octave | 150508T211038Z | flawr |
| 055 | CJam | 150508T192027Z | Claudiu |
| 215 | Rust | 150508T002642Z | Doorknob |
| 186 | Python 3 | 150508T181311Z | Zach Gat |
| 092 | Ruby | 150508T183401Z | manatwor |
| 090 | C | 150508T020738Z | Fors |
| 2521 | GNU sed | 150508T034903Z | Digital |
| nan | 150508T143734Z | Ewan | |
| 226 | C# | 150508T131034Z | Transmis |
| 040 | J | 150507T214136Z | randomra |
| 036 | Pyth | 150507T235307Z | Jakube |
| 117 | SpecBAS | 150508T092659Z | Brian |
| 149 | R | 150507T220132Z | Alex A. |
| nan | 150508T015813Z | royhowie | |
| 094 | Perl | 150507T233051Z | r3mainer |
| 038 | CJam | 150507T212327Z | Optimize |
| 052 | Pyth | 150507T211009Z | Maltysen |
sed -rn, 132 126 124 122 121 bytes
s/^0/O/p # if input is 0, swap to O and print
t # if success, quit
s/[^ ]*/echo {1..&}/e # swap to 'echo {1..N}' and execute
s///g # delete all but spaces (makes N-1 spaces)
s%.*%\\&|&/%p # swap ALL for \MATCH|MATCH/ and print
:a # define label 'a' (start of main loop)
s%(\\)? (/)?%\2 \1%gp # move slashes and print |
h # copy PATTERN space to HOLD space |
y/ /-/ # change spaces to dashes |
s%\\\|/%-O-%p # if there's a '\|/' change it to '-O-' and print |
x # swap HOLD and PATTERN spaces |
s%%/|\\%p # reuse prev. pattern & change to '/|\' and print |
/^\//!ba # branch to label 'a' (end of main loop)
the real engine of this answer, s%(\\)? (/)?%\2 \1%gp, was taken from this sed answer. it finds any ' /' or '\ ' and swaps them out for '/ ' and ' \' respectively, moving the right slashes in the right directions. I was hoping to use \ch but apperently TIO does not support ^H as a backspace and prints out a literal \x08 char
TinyAPL, 51 47 44 bytes*
{" -|\/O"⊇⍨5⌊+⍆+⍆↟(⊖⊸,=⊞⍨a)⍪⍉⊸,⊣⊞⍨⍵=a←⍳⧺2×⍵}
Try it: TinyAPL REPL
*Encoded with 1 byte per character using (⎕Import"std:sbcs")→Encode.
05AB1E, 25 23 bytes
>"|-/\"SI4*×J…+8×Λ1'O0Λ
Explanation:
Step 1: Draw the ASCII sun without its center:
> # Increase the (implicit) input-integer by 1
"|-/\"S "# Push list ["|","-","/","\"]
I4* # Push the input-integer, and multiply it by 4
× # Repeat each character that many times
J # Join it together to a single string
…+8× # Push string "+8×"
Λ # Use the Canvas builtin with these three arguments
Try just step 1 online.
See this 05AB1E tip of mine to understand how the Canvas builtin and its arguments works.
Step 2: Fix the center:
1'O0 '# # Push 1,"O",0
Λ # Use the Canvas of step 1 as background, and overwrite it
# with the result of this Canvas
# (after which the result is output immediately as result)
Old 25 bytes approach using mirrors:
>I…-\|×{1ú68780.Λ¨'O«.º.∊
Explanation:
Step 1: Draw the top-right corner:
> # Increase the (implicit) input-integer by 1
…-\| # Push string "-\|"
I× # Repeat it the input amount of times
{ # Sort it, so it's in the order "--\\||" again
1ú # Pad a leading space
68780 # Push 68780
.Λ # Use the modifiable Canvas builtin with these three arguments
Try just step 1 online.
See this 05AB1E tip of mine to understand how the Canvas builtin and its arguments works.
Step 2: Fix the center O:
¨ # Remove the trailing character
'O« '# Append an "O" instead
Try just the first two steps online.
Step 3: Mirror it in both directions, and output the result:
.º # Intersected mirror it horizontally
.∊ # Intersected mirror it vertically
# (after which the result is output implicitly)
Perl 5 -n, 71 69 bytes
70 68 bytes of code + 1 for -n (as was the style at the time)
//&say map$_?$_-$'?$_+$'?$'?$":'-':'/':'\\':$'?'|':O,@;for@;=-$_..$_
Jelly, 48 43 bytes
AS$_/SḢṪ5ƭ
Wẋ5Ç=0Ɗ€
ŒRµ,þµÇi1Ɗ€€ị“O\/|- ”Y
Through multiple modifications this basically reduced to be ports of similar answers: exploding the matrix and running a couple of checks through it. Figured I'd post anyway because 1) there was no other Jelly answer and 2) I finally figured out the 'tie' quick.
AS$_/SḢṪ5ƭ # The collection of checks to run against each element
AS$ # Sum of absolute values -> [0,0], "O"
_/ # Difference -> [-x,-x] or [x,x], "\"
S # Sum -> [-x,x] or [x,-x], "/"
Ḣ # First element -> [0,x], "-"
Ṫ # Last element -> [x,0], "|"
5ƭ # Tie all five of those together
Wẋ5Ç=0Ɗ€ # Helper makes 5 copies of each element,
# one to run each of the previous checks through
Wẋ5 # Make five copies of the given array
Ç=0 # Run the above helper and compare each result to 0
Ɗ€ # Run the zero check against each element passed in
ŒRµ,þµÇi1Ɗ€€ị“O\/|- ”Y
ŒRµ # Explode the arg, 1 -> [-1, 0, 1]
,þµ # Make a table/matrix of all combos
Ɗ€€ # For each row, for each column
Ç # Call above helper link
i1 # and find the first 1
Now all the values are [0..5] so they can be indexed:
ị“O\/|- ” # Index each element into this string
# with zero wrapping to the last element
Y # Join with linefeeds for final display
C (GCC), 95 bytes
i;j;main(n){for(i=-++n;++i<n;puts())for(j=-n;++j<n;)putchar(i?j?i-j?i+j?32:47:92:124:j?45:79);}
Takes input as argc. Note that argc can be zero on a POSIX system.
Two bytes can be saved (s/++n/n/) if the input is incremented by one, i.e. N+1 is given instead of N.
Uiua, 46 44 … 35 34 bytes
crossed out 44 is still regular 44 :(
⊏↧5/◇+\+{⇌,¤,⊞=.⟜=}⇡+1×2.:$ -\|/O
Try it! I submitted this on the day of the 2024 solar eclipse, which is fitting for a challenge about the sun. (Edit - the eclipse was beautiful! I saw it at around 85%-90% coverage)
Certainly my most well-golfed Uiua submission to-date. I have had a lot of different ideas and methods to save bytes and frequently switched much of the approach around a lot, but finally I have this at a state where I'd be happy if I don't find anything more.
Omnikar's very clever idea in the Uiua discord to use /+\+ instead of multiplying each term by a different factor helped me save 3 bytes! 38 → 35
Explanation:
Note: This explanation is very slightly outdated, but the strategy is the same, just a few things shifted around.
Consider the input 3. We double this and add 1 to get the side length 7, and take the range from 0 up to it.
[0 1 2 3 4 5 6]
Underneath this we push a copy with a mask of where the original input appears, and a "fixed" (wrapped in an array) copy of that.
[0 0 0 1 0 0 0] [[0 0 0 1 0 0 0]] [0 1 2 3 4 5 6]
Using the range at the top of the stack, push the identity matrix and a reversed copy.
[[1 0 0 0 0 0 0] [[0 0 0 0 0 0 1]
[0 1 0 0 0 0 0] [0 0 0 0 0 1 0]
[0 0 1 0 0 0 0] [0 0 0 0 1 0 0]
[0 0 0 1 0 0 0] [[0 0 0 1 0 0 0]] [0 0 0 1 0 0 0] [0 0 0 1 0 0 0]
[0 0 0 0 1 0 0] [0 0 1 0 0 0 0]
[0 0 0 0 0 1 0] [0 1 0 0 0 0 0]
[0 0 0 0 0 0 1]] [1 0 0 0 0 0 0]]
Take their cumulative sums:
[[0 0 0 0 0 0 1] [[1 0 0 0 0 0 1] [[1 0 0 0 0 0 1] [[1 0 0 1 0 0 1]
[0 0 0 0 0 1 0] [0 1 0 0 0 1 0] [0 1 0 0 0 1 0] [0 1 0 1 0 1 0]
[0 0 0 0 1 0 0] [0 0 1 0 1 0 0] [0 0 1 0 1 0 0] [0 0 1 1 1 0 0]
[0 0 0 1 0 0 0] [0 0 0 2 0 0 0] [1 1 1 3 1 1 1] [1 1 1 4 1 1 1]
[0 0 1 0 0 0 0] [0 0 1 0 1 0 0] [0 0 1 0 1 0 0] [0 0 1 1 1 0 0]
[0 1 0 0 0 0 0] [0 1 0 0 0 1 0] [0 1 0 0 0 1 0] [0 1 0 1 0 1 0]
[1 0 0 0 0 0 0]] [1 0 0 0 0 0 1]] [1 0 0 0 0 0 1]] [1 0 0 1 0 0 1]]
Notice that adding the fixed version of the list adds to each column, while the non-fixed version adds to each row.
Now, we sum the cumulative sums:
[[3 0 0 1 0 0 4]
[0 3 0 1 0 4 0]
[0 0 3 1 4 0 0]
[2 2 2 10 2 2 2]
[0 0 4 1 3 0 0]
[0 4 0 1 0 3 0]
[4 0 0 1 0 0 3]]
We’re going to index these numbers into a string to get each character, and that 10 is going to get in the way, so take the minimum of the results and 5:
[[3 0 0 1 0 0 4]
[0 3 0 1 0 4 0]
[0 0 3 1 4 0 0]
[2 2 2 5 2 2 2]
[0 0 4 1 3 0 0]
[0 4 0 1 0 3 0]
[4 0 0 1 0 0 3]]
Finally index these into a string so that 0 becomes a space, 1 becomes |, 2 becomes -, 3 becomes \, 4 becomes /, and 5 becomes O:
\ | /
\ | /
\|/
---O---
/|\
/ | \
/ | \
Vyxal, 20 bytes
`|/-\\`d•\Op8ʁ8j?›ø∧
ø∧ # Draw on the canvas with
8ʁ8j # Directions [0, 8, 1, 8, 2, 8 ... 6, 8, 7]
# - ↑, center, ⇗, center ... ⇐, center, ⇖
`|/-\\`d # Text: "|/-\|/-\"
• # Each char repeated by the input
\Op # With an O prepended
?› # Line length: Input + 1
Haskell, 80 bytes
a#b=2*a+0^b^2
f n|r<-[-n..n]=[[" /\\x-xOx|"!!mod(0#x#y#(x-y)#(x+y))9|x<-r]|y<-r]
Japt, 26 25 bytes
Pub golfing so, as usual, could probably be shorter.
Æ"\\|/"¬qXçÃÔp'OiUç-¹·ê û
Æ"\\|/"¬qXçÃÔp'OiUç-¹·ê û :Implicit input of integer U
Æ :Map each X in the range [0,U)
"\\|/"¬ : Split the string "\|/"
q : Join with
Xç : X spaces
à :End map
Ô :Reverse
p :Push
'Oi : "O" prepended with
Uç- : "-" repeated U times
¹ :End push
· :Join with newlines
ê :Palindromise
û :Centre pad each line with spaces to the length of the longest
Vyxal, 46 bytes
(\\n›↳⁰↲\|\/n›↲⁰↳Ṡ,)\O-?-,(\/n›↲⁰↳\|\\n›↳⁰↲Ṡ,)
A mess that I can't be bothered fixing, at least for now.
Charcoal, 12 5 bytes
P*⊕θO
-7 bytes thanks to @ASCII-only, by using the builtin :*.
Try it online (verbose) or try it online (pure).
Explanation:
Print the 8-armed lines with a length of the input+1 (the +1 is because the center is included), without moving the cursor position:
MultiPrint(:*, Incremented(q));
P*⊕θ
Then print the "O" at the current location (still in the center, because we haven't moved due to the MultiPrint):
Print("O");
O
Retina 0.8.2, 99 bytes
.+
$* X$&$*-
( *)X(-+)
$1\|/¶$2X$2¶$1/|\
+`^ ( *.)( *)
$1$2 | $2/¶$&
+` ( */)( *).+$
$&¶$1$2 | $2\
Try it online! Explanation:
.+
$* X$&$*-
Place the X and draw n -s to its right. This completes the output for n=0.
( *)X(-+)
$1\|/¶$2X$2¶$1/|\
If n>0 then copy the -s to the left, and add the first level of \|/ and /|\ around the X. This completes the output for n=1.
+`^ ( *.)( *)
$1$2 | $2/¶$&
Extend the \|/ upwards, removing a space of indent each time, adding it back on each side of the |.
+` ( */)( *).+$
$&¶$1$2 | $2\
Extend the /|\ downwards, removing a space of indent each time, adding it back on each side of the |.
Powershell, 108 97 93 bytes
filter f{try{$s=' '*--$_
"\$s|$s/"
$_|f|%{(" $_ ","-$_-")[$_-match'O']}
"/$s|$s\"}catch{'O'}}
Explanation:
- the recursive algorithm throws an exception on
$s=' '*--$_when current number less then 1; - the output is a perfect rectangle with trailing spaces.
Less golfed test script:
filter f{
try{
$s=' '*--$_
"\$s|$s/"
$_|f|%{(" $_ ","-$_-")[$_-match'O']}
"/$s|$s\"
}catch{
'O'
}
}
@(
,(0,"O")
,(1,"\|/",
"-O-",
"/|\")
,(2,"\ | /",
" \|/ ",
"--O--",
" /|\ ",
"/ | \")
,(3,"\ | /",
" \ | / ",
" \|/ ",
"---O---",
" /|\ ",
" / | \ ",
"/ | \")
) | % {
$n,$expected = $_
$result = $n|f
"$result"-eq"$expected"
$result
}
Output:
True
O
True
\|/
-O-
/|\
True
\ | /
\|/
--O--
/|\
/ | \
True
\ | /
\ | /
\|/
---O---
/|\
/ | \
/ | \
JavaScript (ES6), 142 140 134 117 bytes
n=>(g=x=>x?`${t=` `[r=`repeat`](n-x--)}\\${s=` `[r](x)}|${s}/${t}
`+g(x):`-`[r](n))(n)+`O`+[...g(n)].reverse().join``
Try It
f=
n=>(g=x=>x?`${t=` `[r=`repeat`](n-x--)}\\${s=` `[r](x)}|${s}/${t}
`+g(x):`-`[r](n))(n)+`O`+[...g(n)].reverse().join``
i.addEventListener("input",_=>o.innerText=f(+i.value))
o.innerText=f(i.value=1)
<input id=i type=number><pre id=o>
SmileBASIC, 87 bytes
INPUT N
FOR Y=-N TO N
FOR X=-N TO N?" \/|- O"[(X==Y)+!(X+Y)*2+!X*3+!Y*4];
NEXT?NEXT
Haskell, 109 98 96 bytes
Thanks to nimi and Mauris for their help!
0#0='O'
0#_='-'
_#0='|'
i#j|i==j='\\'|i== -j='/'|1<2=' '
f n=unlines[map(i#)[-n..n]|i<-[-n..n]]
Explanation:
The operator # specifies which character appears at coordinates (i,j), with the sun centered at (0,0). Function f builds the result String by mapping # over all pairs of coordinates ranging from -n to n.
Usage:
ghci> putStr $ f 2
\ | /
\|/
--O--
/|\
/ | \
Javascript (ES7 Draft) 115
f=l=>[['O |/\\-'[y^x?z+~x^y?y^l?x^l?1:2:5:3:x^l&&4]for(x in _)].join('')for(y in _=[...Array(z=2*l+1)])].join('\n')
// Snippet demo: (Firefox only)
for(var X of [0,1,2,3,4,5])
document.write('<pre>' + f(X) + '</pre><br />');
Groovy - 113
f={n->s=2*n+1;(1..s).each{r->(1..s+1).each{c->print c==r?n+1==r?"O":"\\":c==s-r+1?"/":c==n+1?"|":c>s?"\n":" "}}}
I think the ternary logic could probably be cleaned up to give a shorter answer...
JavaScript (ES6) 97 98
This seems different enough ...
// GOLFED
f=n=>(y=>{for(t='';++y<n;t+='\n')for(x=-n;++x<n;)t+='-O /\\|'[y?x?x-y?x+y?2:3:4:5:+!x]})(-++n)||t
// Ungolfed
F=n=>{
++n;
t = '';
for (y = -n; ++y < n; t += '\n')
for (x = -n; ++x < n; )
if (y != 0)
if (x != 0)
if (x != y)
if (x != -y)
t += ' '
else
t += '/'
else
t += '\\'
else
t += '|'
else
if (x != 0)
t += '-'
else
t += 'O'
return t;
}
// TEST
function test(){ OUT.innerHTML = f(N.value|0); }
test()
input { width: 4em }
N: <input id=N value=5><button onclick="test()">Go</button>
<pre id="OUT"></pre>
Prolog, 219 bytes
No, it's not much of a golfing language. But I think this site needs more Prolog.
s(N,N,N,79).
s(R,R,_,92).
s(R,C,N,47):-R+C=:=2*N.
s(N,_,N,45).
s(_,N,N,124).
s(_,_,_,32).
c(_,C,N):-C>2*N,nl.
c(R,C,N):-s(R,C,N,S),put(S),X is C+1,c(R,X,N).
r(R,N):-R>2*N.
r(R,N):-c(R,0,N),X is R+1,r(X,N).
g(N):-r(0,N).
Tested with swipl on Linux. Invoke like so: swipl -s asciiSun.prolog; then query for your desired size of sun:
?- g(3).
\ | /
\ | /
\|/
---O---
/|\
/ | \
/ | \
true .
Ungolfed:
% Args to sym/4 are row, column, N and the character code to be output at that location.
sym(N,N,N,79).
sym(R,R,_,'\\').
sym(R,C,N,'/') :- R+C =:= 2*N.
sym(N,_,N,'-').
sym(_,N,N,'|').
sym(_,_,_,' ').
% Args to putCols/3 are row, column, and N.
% Recursively outputs the characters in row from col onward.
putCols(_,C,N) :- C > 2*N, nl.
putCols(R,C,N) :- sym(R,C,N,S), put_code(S), NextC is C+1, putCols(R,NextC,N).
% Args to putRows/2 are row and N.
% Recursively outputs the grid from row downward.
putRows(R,N) :- R > 2*N.
putRows(R,N) :- putCols(R,0,N), NextR is R+1, putRows(NextR,N).
putGrid(N) :- putRows(0,N).
Perl 85 91 90 89 86B
map{$_=$r||O;s/^|$/ /mg;s/ (-*O-*) /-$1-/;$r="\\$s|$s/
$_
/$s|$s\\";$s.=$"}1..<>;say$r
Ungolfed:
# usage: echo 1|perl sun.pl
map {
$_ = $r || O; # no strict: o is "o". On the first run $r is not defined
s/^|$/ /mg; # overwriting $_ saves characters on these regexes
s/ (-*O-*) /-$1-/;
$r = "\\$s|$s/
$_
/$s|$s\\"; # Embedded newlines save 1B vs \n. On the first run $s is not defined.
$s .= $"
} 1..<>;
say $r
PHP, 182 bytes
This seemed like a fun activity for my first answer. Comments on my code are welcome.
<?php function s($n){$e=2*$n+1;for($i=0;$i<$e*$e;$i++){$x=$i%$e;$y=floor($i/$e);echo$y==$x?($x==$n?"O":"\\"):($e-1==$x+$y?"/":($y==$n?"-":($x==$n?"|":" ")));echo$x==$e-1?"\n":"";}}?>
Here is the un-golfed code with comments:
<?php
function s($n) {
$e=2*$n+1; //edge length
for($i=0;$i<$e*$e;$i++) {
$x = $i%$e; // current x coordinate
$y = floor($i/$e); // current y coordinate
if ($y==$n&&$x==$n) {
// center of square
echo'O';
}
else if ($y==$n) {
// horizontal line
echo'-';
}
else if ($x==$n) {
// vertical line
echo'|';
}
else if ($y==$x) {
// diagonal line from top-left to bottom right
echo'\\';
}
else if (($y-$n)==($n-$x)) {
// diagonal line from bottom-left to top-right
echo'/';
}
else {
// empty space
echo' ';
}
if ($x==$e-1) {
// add new line for the end of the row
echo"\n";
}
}
}?>
<pre>
<?php s(10); ?>
</pre>
Edited with code by royhowie
Matlab, 93 87 bytes
Sadly the function header has to be so big... Apart from that I think it is golfed pretty well. I wonder if it could be done better with some of the syntax differences in Octave.
N=input('');E=eye(N)*92;D=rot90(E)*.52;H=ones(1,N)*45;V=H'*2.76;[E V D;H 79 H;D V E '']
Ruby - 130 bytes
def f(n);a=(0...n).map{|i|' '*i+"\\"+' '*(n-1-i)+'|'+' '*(n-1-i)+'/'+' '*i};puts(a+['-'*n+'O'+'-'*n]+a.reverse.map(&:reverse));end
usage:
irb(main):002:0> f(3)
\ | /
\ | /
\|/
---O---
/|\
/ | \
/ | \
IDL 8.3, 135 bytes
Dunno if this can be golfed more... It's very straightforward. First we create a m x m array (m=2n+1) of empty strings; then, we draw the characters in lines (y=x, y=-x, y=n, and x=n). Then we drop the O in at point (n, n), and print the whole thing, formatted as m strings of length 1 on each line so that there's no extra spacing from printing the array natively.
pro s,n
m=2*n+1
v=strarr(m,m)
x=[0:m-1]
v[x,x]='\'
v[x,m-x-1]='/'
v[n,x]='|'
v[x,n]='-'
v[n,n]='O'
print,v,f='('+strtrim(m,2)+'A1)'
end
Test:
IDL> s,4
\ | /
\ | /
\ | /
\|/
----O----
/|\
/ | \
/ | \
/ | \
Python 2, 99
n=input()
R=range(-n,n+1)
for i in R:print''.join("O\|/ -"[[R,i,0,-i,j].index(j)^(i==0)]for j in R)
Prints line by line, creating each line by checking whether the coordinate (i,j) (centered at (0,0)) satisfies j==-i, j==0, j==i, or none, with a hack to make the center line work.
OS/2 Classic Rexx, 102... or 14 for "cheater's version"
Take out the linefeeds to "golf" it.
w='%1'
o=center('O',w,'-')
m='center(space("\|/",w),%1)'
do w
w=w-1
interpret "o="m"|o|"m
end l
say o
Cheater's version, name the script whatever source code you want under 255 characters (requires HPFS disk):
interpret '%0'
EDIT: Just to be clear, cheater's version isn't intended to count! It's just to be silly and show an old dog can still do tricks. :)
e.g. For real fun and games, an implementation of Java-8/C11 style "lambda" expressions on a list iterator. Not tested, but ought to run on a circa 1979 IBM mainframe. ;)
ForEachInList( 'Months.January.Days', 'Day' -> 'SAY "You have an appointment with" Day.Appointment.Name "on" Day.Appointment.Date' )
EXIT
ForEachInList:
SIGNAL ON SYNTAX
PARSE ARG MyList "," MyVar "->" MyCommand
INTERPRET ' MyListCount = ' || MyList || '.Count'
DO ListIndex = 1 TO MyListCount
INTERPRET MyVar || ' = ' || MyList || '.' || ListIndex
INTERPRET MyCommand
END
RETURN
SYNTAX:
SAY MyCommand ' is not a valid expression. '
EXIT
-- Calling code assumes you already made a stem (array), naturally.
Python, 175 129 127 125 Bytes
s,q,x=' ','',int(input())
for i in range(x):d=(x-i-1);q+=(s*i+'\\'+s*d+'|'+s*d+'/'+s*i+'\n')
print(q+'-'*x+'O'+'-'*x+q[::-1])
Try it online here.
Octave 85
Bulding matrices as always=)
eye produces an identity matrix, the rest is self explanatory I think.
m=(e=eye(2*(k=input('')+1)-1))*92+rot90(e)*47;m(:,k)='|';m(k,:)=45;m(k,k)='o';[m,'']
CJam, 59 55 bytes
ri:A,W%{_S*"\|/"\*\A\-(S*_@@++}%_Wf%W%['-A*_'O\++]\++N*
This won't win any awards as-is but I was happy enough it worked!
Thanks to Sp3000 for golfing tips.
Rust, 215 characters
fn a(n:usize){for i in 0..n{println!("{}\\{}|{1}/{0}",s(i),s(n-i-1))}println!("{}O{0}",vec!["-";n].concat());for i in(0..n).rev(){println!("{}/{}|{1}\\{0}",s(i),s(n-i-1))}}fn s(n:usize)->String{vec![" ";n].concat()}
I tried to use a string slicing method (by creating a string of n-1 spaces and slicing to and from an index) like so:
fn a(n:usize){let s=vec![" ";n-(n>0)as usize].concat();for i in 0..n{println!("{}\\{}|{1}/{0}",&s[..i],&s[i..])}println!("{}O{0}",vec!["-";n].concat());for i in(0..n).rev(){println!("{}/{}|{1}\\{0}",&s[..i],&s[i..])}}
But that's actually 3 chars longer.
Ungolfed code:
fn asciisun_ungolfed(n: usize) {
for i in 0..n {
println!("{0}\\{1}|{1}/{0}", spaces(i), spaces(n-i-1))
}
println!("{0}O{0}", vec!["-"; n].concat());
for i in (0..n).rev() {
println!("{0}/{1}|{1}\\{0}", spaces(i), spaces(n-i-1))
}
}
fn spaces(n: usize) -> String { vec![" "; n].concat() }
The part I like is how I shave a few chars off on the formatting strings. For example,
f{0}o{1}o{1}b{0}ar
is equivalent to
f{}o{}o{1}b{0}ar
because the "auto-incrementer" for the format string argument position is not affected by manually specifying the number, and acts completely independently.
Python 3, 193 186 bytes
Golfed
def f(n):
s,b,e,d,g=' \\/|-';p,r,i='',int(n),0
while r:print(s*i+b+s*(r-1)+d+s*(r-1)+e);r-=1;i+=1
print(g*n+'O'+g*n);r+=1;i=n-1
while r<n+1:print(s*i+e+s*(r-1)+d+s*(r-1)+b);r+=1;i-=1
Output
>>> f(3)
\ | /
\ | /
\|/
---O---
/|\
/ | \
/ | \
>>> f(5)
\ | /
\ | /
\ | /
\ | /
\|/
-----O-----
/|\
/ | \
/ | \
/ | \
/ | \
Ungolfed
def f(n):
s, b, e, d, g = ' \\/|-'
p, r, i = '', int(n), 0
while r:
print(s*i + b + s*(r-1) + d + s*(r-1) + e)
r -= 1
i += 1
print(g*n + 'O' + g*n)
r += 1
i = n-1
while r < n+1:
print(s*i + e + s*(r-1) + d + s*(r-1) + b)
r += 1
i -= 1
Ruby: 98 92 characters
Proc that returns a string with the Sun.
f=->n{x=(0..m=n*2).map{|i|s=?|.center m+1
s[i]=?\\
s[m-i]=?/
s}
x[n]=?O.center m+1,?-
x*?\n}
Sample run:
irb(main):001:0> f=->n{x=(0..m=n*2).map{|i|s=?|.center m+1;s[i]=?\\;s[m-i]=?/;s};x[n]=?O.center m+1,?-;x*?\n}
=> #<Proc:0x000000020dea60@(irb):1 (lambda)>
irb(main):002:0> (0..3).each {|i| puts f[i]}
O
\|/
-O-
/|\
\ | /
\|/
--O--
/|\
/ | \
\ | /
\ | /
\|/
---O---
/|\
/ | \
/ | \
=> 0..3
C: 116 102 99 95 92 90
s(n){for(int c=-n,r=c;r<=n;c++)putchar(c>n?c=-c,r++,10:c?r?c-r?c+r?32:47:92:45:r?124:79);}
I think that I am getting fairly close to a minimal solution using this approach, but I can't stop feeling that there is a much better approach in C. Ungolfed:
void s(int n) {
for(
int c = -n, r = c;
r <= n;
c++
)
putchar(
c > n
? c = -c, r++, '\n'
: c
? r
? c - r
? c + r
? ' '
: '/'
: '\\'
: '-'
: r
? '|'
: 'O'
);
}
GNU sed, 252 + 1
Phew - I beat the php answer!
Score + 1 for using the -r parameter.
Because of sed limitations, we have to burn nearly 100 bytes just convert N to a string of N spaces. The rest is the fun stuff.
/^0/{y/0/O/;q}
s/./<&/g
s/9/8 /g
s/8/7 /g
s/7/6 /g
s/6/5 /g
s/5/4 /g
s/4/3 /g
s/3/2 /g
s/2/1 /g
s/1/ /g
s/0//g
:t
s/ </< /g
tt
s/<//g
:
s/ //
s^.*^\\&|&/^;ta
:a
/\\$/q
p
s^\\\|/^-O-^;tn
s^(\\)? (/)?^\2 \1^g;ta
:n
y/ /-/
p
s^-O-^/|\\^
y/-/ /
ta
Explanation
- The first line is an early exit for the N=0 case.
- The next 15 lines (up to the
:) convert N to a string of N spaces s/ //removes one spaces^.*^\\&|&/^;taconverts N-1 spaces to:\+ N-1 spaces +|+ N-1 spaces +/- Iterate, printing each iteration, and moving
\one space to the right and/one space to the left... - ...until we match
\|/, which is replaced with-O-and jump to thenlabel - replace
with-and print - replace
-0-with/|\, and replacewith-and jump back into the main loop - Iterate, printing each iteration, and moving
\one space to the right and/one space to the left... - ...until we match
\$which indicates were finished, and quit.
Output
$ for i in {0..3}; do sed -rf asciisun.sed <<< $i ; done
O
\|/
-O-
/|\
\ | /
\|/
--O--
/|\
/ | \
\ | /
\ | /
\|/
---O---
/|\
/ | \
/ | \
$
C# - 291 (full program)
using System;using System.Linq;class P{static void Main(string[] a){Func<int,int,int,char>C=(s,x,i)=>x==(2*s+1)?'\n':i==s?x==s?'O':'-':x==s?'|':x==i?'\\':x==2*s-i?'/':' ';int S=int.Parse(a[0])*2;Console.Write(Enumerable.Range(0,(S+1)*(S+1)+S).Select(z=>C(S/2,z%(S+2),z/(S+2))).ToArray());}}
C#, 230 226 bytes
string g(int n){string r="";int s=n*2+1;for(int h=0;h<s;h++){for(int w=0;w<s;w++){if(h==w){if(w==n){r+="O";}else{r+="\\";}}else if(w==s-h-1){r+="/";}else if(w==n){r+="|";}else if(h==n){r+="-";}else{r+=" ";}}r+="\n";}return r;}
As requested, the ungolfed version: string ug(int n) {
// The sting we'll be returning
string ret = "";
// The width and height of the output
int s = n * 2 + 1;
// for loop for width and height
for (int height = 0; height < s; height++)
{
for (int width = 0; width < s; width++)
{
// Matches on top-left to bottom-right diagonal line
if (height == width)
{
// If this is the center, write the 'sun'
if (width == n)
{
ret += "O";
}
// If this is not the center, add the diagonal line character
else
{
ret += "\\";
}
}
// Matches on top-right to bottom-left diagonal line
else if (width == s - height - 1)
{
ret += "/";
}
// Matches to add the center line
else if (width == n)
{
ret += "|";
}
// Matches to add the horizontal line
else if (height == n)
{
ret += "-";
}
// Matches all others
else
{
ret += " ";
}
}
// Add a newline to separate each line
ret += "\n";
}
return ret;
}
This is my first post so apologies if I've done something wrong. Any comments and corrections are very welcome.
J, 37 34 40 bytes
1:echo('O\/-|'{.@#~0=+&|,-,+,[,])"*/~@i:
Usage:
(1:echo('O\/-|'{.@#~0=+&|,-,+,[,])"*/~@i:) 2 NB. prints to stdout:
\ | /
\|/
--O--
/|\
/ | \
Explanation (from left to right):
i:generates list-n, -(n-1), ..., n-1, n( )"*/~@i:creates the Descartes product of i: with itself in a matrix arrangement, e.g. forn = 1creates the following3-by-3matrix┌─────┬────┬────┐ │-1 -1│-1 0│-1 1│ ├─────┼────┼────┤ │0 -1 │0 0 │0 1 │ ├─────┼────┼────┤ │1 -1 │1 0 │1 1 │ └─────┴────┴────┘for every matrix-element with integers
x ywe do the following+&|,-,+,[,]calculate a list of properties+&|abs(x)+abs(y), equals0iff (if and only if)x=0andy=0-x-y, equals0iffx=yi.e. we are on the diagonal+x+y, equals0iffx=-yi.e. we are on the anti-diagonal[x, equals0iffx=0i.e. we are on the middle row]y, equals0iffy=0i.e. we are on the middle column
'O\/-|'#~0=compare these above property values to0and take theith character from the string'O\/-|'if theith property is true.- the first character in the resulting string will always be the one we need, if there string is empty we need a space
{.takes the first character of a string and if there is no one it returns a space character as padding just as we need- we now have the exact matrix we need so we print it to stdout once with
1:echo
Pyth, 39 38 36 bytes
jbXmXXj\|m*\ Q2d\\_hd\/JhyQQX*\-JQ\O
Try it online: Pyth Compiler/Executor
Explanation
jbXmXXj\|m*\ Q2d\\_hd\/JhyQQX*\-JQ\O implicit: Q = input
JhyQ J = 1 + 2*Q
m J map each d of [0,1,...,2*Q] to:
*\ Q " "*input
m 2 list with twice " "*input
j\| join this list by "|"
X d\\ replace the value at d to "\"
X _hd\/ replace the value at -(d+1) to "/"
X Q replace line Q by:
*\-J "-"*J
X Q\O replace element at Q with "O"
jb join by "newlines"
Another 36 bytes solution would be:
jbmXXj\|m*?\-KqdQ\ Q2d\\_hd?\OK\/hyQ
SpecBAS - 117 bytes
1 INPUT s: LET t=s*2: FOR y=0 TO t: PRINT AT y,y;"\";AT y,t/2;"|";AT t-y,y;"/";AT t/2,y;"-": NEXT y: PRINT AT s,s;"O"
This prints the slashes and dashes in one loop, and then plonks the "O" in the middle.
Output using 1, 2 and 9

R, 177 149 bytes
Mickey T. is the man! He helped me fix my originally incorrect solution and save 28 bytes. Thanks, Mickey!
m=matrix(" ",(w=2*(n=scan()+1)-1),w);m[row(m)==rev(col(m))]="/";diag(m)="\\";m[,n]="|";m[n,]="-";m[n,n]="O";m[,w]=paste0(m[,w],"\n");cat(t(m),sep="")
Ungolfed + explanation:
# Create a matrix of spaces, read n from stdin, assign w=2n+1
m <- matrix(" ", (w <- 2*(n <- scan() + 1) - 1), w)
# Replace the opposite diagonal with forward slashes
m[row(m) == rev(col(m))] <- "/"
# Replace the diagonal with backslashes
diag(m) <- "\\"
# Replace the vertical center line with pipes
m[, n] <- "|"
# Replace the horizontal center line with dashes
m[n, ] <- "-"
# Put an O in the middle
m[n, n] <- "O"
# Collapse the columns into single strings
m[, w] <- paste0(m[, w], "\n")
# Print the transposed matrix
cat(t(m), sep = "")
Any further suggestions are welcome!
JavaScript (ES6), 139 135 140 + 1 bytes
(+1 is for -p flag with node in the console)
fixed:
t=(n,m)=>(m=2*n+1,(A=Array).from(A(m),(d,i)=>A.from(A(m),(e,j)=>i==j?j==n?"O":"\\":m-1==j+i?"/":i==n?"-":j==n?"|":" ").join("")).join("\n"))
usage:
t(3)
/*
\ | /
\ | /
\|/
---O---
/|\
/ | \
/ | \
*/
ungolfed:
var makeSun = function (n, m) {
m = 2 * n + 1; // there are 2*n+1 in each row/column
return Array.from(Array(m), function (d, i) {
return Array.from(Array(m), function (e, j) {
// if i is j, we want to return a \
// unless we're at the middle element
// in which case we return the sun ("O")
if (i == j) {
return j == n ? "O" : "\\";
// the other diagonal is when m-1 is j+i
// so return a forward slash, /
} else if (m - 1 == j + i) {
return "/";
// the middle row is all dashes
} else if (i == n) {
return "-";
// the middle column is all pipes
} else if (j == n) {
return "|";
// everything else is a space
} else {
return " ";
}
}).join("");
}).join("\n");
}
Perl, 94
There are a lot of nested ternary operators in here, but I think the code is reasonably straightforward.
$n=<>;for$x(-$n..$n){for$y(-$n..$n){print$x^$y?$x+$y?$x?$y?$":'|':'-':'/':$x?'\\':'O'}print$/}
Try it out here: ideone.com/E8MC1d
CJam, 48 45 43 41 38 bytes
This is still too long and I am still doing some redundant things, but here goes:
ri:R{_S*"\|/"@R-~S**1$N}%'-R*'O1$W$sW%
Pyth - 52 bytes
The hard part was figuring out how to switch the slashes for each side. I settled for defining a lambda that takes the symbols to use.
KdMms[*Kt-QdG*Kd\|*KdH)_UQjbg\\\/p\O*Q\-*\-Qjb_g\/\\
Can likely be golfed more, explanation coming soon.