扩展ASCII Sun


43

编写一个程序(通过STDIN /命令行)使用一个非负整数N。

当N为0时,您的程序应打印O(大写字母Oh,而不是零)。

当N为1时,您的程序应打印

\|/
-O-
/|\

当N为2时,您的程序应打印

\ | /
 \|/
--O--
 /|\
/ | \

当N为3时,您的程序应打印

\  |  /
 \ | /
  \|/
---O---
  /|\
 / | \
/  |  \

对于较大的N,此模式将以完全相同的方式继续。每个“太阳”的八个射线应的适当的N个-|/,或\字符。

细节

  • 您可以编写一个带整数的函数来代替程序。该函数应正常打印sun设计或将其作为字符串返回。
  • 你必须

    • 根本没有尾随空格,或者
    • 仅具有足够的尾随空格,因此该模式是一个完美的(2N + 1)*(2N + 1)矩形。
  • 任何N个或所有N个的输出都可以选择包含尾随换行符。

计分

以字节为单位的最短代码获胜。


允许换行符吗?尤其有趣N=0
雅库布2015年

@Jakube号。仅尾随。
加尔文的爱好

Answers:


12

Pyth,39 38 36字节

jbXmXXj\|m*\ Q2d\\_hd\/JhyQQX*\-JQ\O

在线尝试:Pyth编译器/执行器

说明

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"

另一个36字节的解决方案是:

jbmXXj\|m*?\-KqdQ\ Q2d\\_hd?\OK\/hyQ

26

传真: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);}

我想我已经很接近使用这种方法的最小解决方案了,但是我不禁感到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'
    );
}

7
C中的“ c ++”……嘿!
bjb568

我很高兴您取消了订单。那些三元ifs疯了!
拉丹2015年

您可以再保存2个字节,使其与vc 2012兼容;)c,r;s(n){for(r=c=-n;r<=n;c++)putchar(c>n?c=-c,r++,10:c?r?c-r?c+r?32:47:92:45:r?124:79);}
Johan du Toit

21

GNU sed,252 + 1

ew-我击败了PHP答案!

使用该-r参数得分+1 。

由于sed的限制,我们仅需将N转换为N个字符串,就必须刻录近100个字节。剩下的就是好玩的东西。

/^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

说明

  • 第一行是N = 0情况的提早退出。
  • 接下来的15行(最多:)将N转换为N个字符串
  • s/ // 删除一个空间
  • s^.*^\\&|&/^;ta将N-1个空格转换为:\+ N-1个空格+ |+ N-1个空格+/
  • 迭代,打印每次迭代,然后\向右移动一个空格,向左移动一个空格/...
  • ...直到匹配\|/,被替换-O-并跳转到n标签
  • 更换-和打印
  • 更换-0-/|\,并更换-和跳回主循环
  • 迭代,打印每次迭代,然后\向右移动一个空格,向左移动一个空格/...
  • ...直到我们匹配\$表明完成的人,然后退出。

输出量

 $ for i in {0..3}; do sed -rf asciisun.sed <<< $i ; done
 O
 \|/
 -O-
 /|\
 \ | /
  \|/ 
 --O--
  /|\ 
 / | \
 \  |  /
  \ | / 
   \|/  
 ---O---
   /|\  
  / | \ 
 /  |  \
 $

16

J,37 34 40字节

1:echo('O\/-|'{.@#~0=+&|,-,+,[,])"*/~@i:

用法:

   (1:echo('O\/-|'{.@#~0=+&|,-,+,[,])"*/~@i:) 2  NB. prints to stdout:
\ | /
 \|/ 
--O--
 /|\ 
/ | \

说明(从左到右):

  • i: 产生清单 -n, -(n-1), ..., n-1, n
  • ( )"*/~@i:创建i:的笛卡尔积,其自身以矩阵排列,例如用于n = 1创建以下3-by-3矩阵

    ┌─────┬────┬────┐
    │-1 -1│-1 0│-1 1│
    ├─────┼────┼────┤
    │0 -1 │0 0 │0 1 │
    ├─────┼────┼────┤
    │1 -1 │1 0 │1 1 │
    └─────┴────┴────┘
    
  • 对于每个具有整数的矩阵元素,x y我们执行以下操作

  • +&|,-,+,[,] 计算属性列表

    • +&| abs(x)+abs(y),等于0iff(当且仅当)x=0y=0
    • -xy,等于0iff x=y即我们在对角线上
    • +x + y,等于0iff x=-y即我们在反对角线上
    • [x,等于0iff x=0即我们在中间行
    • ]y,等于0iff,y=0即我们在中间一列
  • 'O\/-|'#~0=如果th属性为true,则将上述这些属性值0与进行比较,并i从字符串中获取th字符。'O\/-|'i

  • 结果字符串中的第一个字符将始终是我们需要的字符,如果字符串为空,则需要一个空格
  • {. 接受字符串的第一个字符,如果没有,则根据需要返回一个空格字符作为填充
  • 现在我们有了所需的精确矩阵,因此可以使用一次将其打印到stdout 1:echo

在这里在线尝试。


5
这是非高尔夫版本?!我有时感觉像是一个普通的程序员,然后由于某种原因,我最终进入了代码高尔夫,看到你们遇到的东西,不禁觉得自己像个白痴。
JustSid 2015年

@JustSid嗯,文本不是最新的代码,但是从技术上讲,我从来没有写过该代码不完整的信息。:)
randomra'5

无论哪种方式,它仍然给人留下深刻的印象
JustSid 2015年

2
@JustSid并没有那么令人印象深刻,但是J代码几乎就是这样,这似乎是一种挑战,对于它来说这是一种很好的语言。这是一个非常令人印象深刻的答案,但是J :)中的所有其他内容也都如此:
Undergroundmonorail

11

PHP,182字节

对于我的第一个答案,这似乎是一个有趣的活动。欢迎对我的代码发表评论。

<?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":"";}}?>

这是带有注释的非公开代码:

<?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>

由royhowie用代码编辑


3
您好:-)尽力而为。不过,您可以在很多地方缩小代码。例如if(($y-$h)==($x-$h))与相同if(($y==$x)。您可以替换if($x==y$)foo();else bar();为来保存另一个字符if($x^$y)bar();else foo();。您还应该尝试使用三元运算符代替if .. else语句。
2015年

三元运算符是一个很好的提示
尼克

174个字节: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":"";}}
royhowie 2015年

1.有没有必要$r; 只需使用echo$r.=与相同的字节数echo)。2.使用三元运算符(节省很多字符)。3. $h等于没用$n。4.您不需要使用floorfor $x = floor($i%$e);,因为整数的模数不需要四舍五入。
royhowie

@squeamishossifrage我从没想过。感谢您的提示!
科多斯·约翰逊

9

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)

打印一行行,通过检查是否坐标创建每个线(i,j)(在中心(0,0))满足j==-ij==0j==i,或无,用一劈,使中心线的工作。


我认为您可以使用R而不是.5节省1个字节。
randomra 2015年

@randomra这很聪明,谢谢。下降到两位数!
xnor 2015年


7

SpecBAS-117字节

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"

这会在一个循环中打印斜线和破折号,然后在中间打“ O”。

使用1、2和9进行输出

在此处输入图片说明


匿名用户建议更改"-": NEXT y: PRINT AT s,s;"O""-";AT s,s;"O": NEXT y以保存两个字节。
Martin Ender 2015年

7

JavaScript(ES6)97 98

这似乎足够不同...

// 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>


美丽。我应该考虑过使用正常的for循环的闭包。
nderscore 2015年

我喜欢这一个。我曾尝试使用字符串编写一个并访问特定索引,但是您的索引要短得多。
royhowie 2015年

6

OS / 2经典Rexx,102 ...或14(作弊者版本)

取出换行符以“高尔夫”起来。

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

作弊者的版本,使用255个字符以下的脚本将脚本命名为所需的任何源代码(需要HPFS磁盘):

interpret '%0'

编辑:只是要清楚,作弊者的版本不打算计数!只是愚蠢,表明一只老狗仍然可以骗人。:)

例如,对于真正的娱乐和游戏,在列表迭代器上实现Java-8 / C11样式的“ lambda”表达式。未经测试,但应在大约1979年的IBM大型机上运行。;)

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

-调用代码自然就假设您已经创建了一个词干(数组)。


对于作弊者版本:如果程序的文件名不是任意的,则必须将其包含在字节数中
马丁·恩德

很公平。骗子的版本根本不是认真的!:) ...这就是为什么我在102上发布“真实”答案的原因。这只是出于新颖性的缘故。
丽莎2015年

@lisa,除了它根本不是新颖的;)。同样,如果在此挑战中使用,它将破坏排行榜脚本。
Optimizer

6

Haskell,109 98 96字节

感谢nimi和Mauris的帮助!

0#0='O'
0#_='-'
_#0='|'
i#j|i==j='\\'|i== -j='/'|1<2=' '
f n=unlines[map(i#)[-n..n]|i<-[-n..n]]

说明:

操作员#指定哪个字符出现在坐标(i,j)处,太阳居中(0,0)。函数f通过映射#从-n到n的所有坐标对来构建结果String 。

用法:

ghci> putStr $ f 2
\ | /
 \|/ 
--O--
 /|\ 
/ | \

您可以通过使用中缀运算符,而不是节约的几个字节s,如0#0='O'0#_='-'等,1<2来代替True
nimi 2015年

也许map(i#)[-n..n]要保存两个字节。
林恩(Lynn)2015年

4

R,177149字节

米奇T.是男人!他帮助我解决了最初不正确的解决方案,节省了28个字节。谢谢,米奇!

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

取消+说明:

# 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 = "")

欢迎任何其他建议!


1
抱歉,Alex,您错过了垂直光线。在不更改一般流程的情况下,可以进行一些更改以缩短此时间。在scan并不真正需要的w=。也可以将其深入到命令中。该if如果更改矩阵在几个实例的处理方式可以抛弃。应用这些我得到m=matrix(" ",(w=2*(n=scan()+1)-1),w);m[row(m)-rev(col(m))==0]='/';diag(m)="\\";m[,n]='|';m[n,]="-";m[n,n]="O";m[,w]=paste0(m[,w],'\n');cat(t(m),sep='')。我认为可能进一步打高尔夫球。
MickyT,2015年

@MickyT:太好了。非常感谢您注意到我的错误并证明了更好的解决方案!我编辑了答案。
Alex A.

4

C#,230个 226字节

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

根据要求,展开版本: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; 
    }

这是我的第一篇文章,如果我做错了事,我深表歉意。任何意见和更正是非常欢迎的。


而且,s=2*n+1而不是s=(n*2)+1w==s-h-1而不是w==(s-h)-1会使该过程变得更短。
Alex A.

很好,可能会窃取您的字符串构建方法。令我烦恼的是,linq比for循环还要长:(
Ewan

我添加了取消高尔夫的版本:)
传输时间

4

Ruby:98 92个字符

Proc返回带有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}

样品运行:

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

4

锈,215个字符

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

我尝试使用字符串切片方法(通过创建一个n-1空格字符串并与索引进行切片),如下所示:

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

但这实际上要长3个字符。

取消程式码:

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

我喜欢的部分是如何在格式化字符串上节省一些字符。例如,

f{0}o{1}o{1}b{0}ar

相当于

f{}o{}o{1}b{0}ar

因为格式字符串参数位置的“自动增量器”不受手动指定数字的影响,并且完全独立地起作用。


4

八度85

将矩阵作为always =) eye生成一个单位矩阵,其余的我可以自我解释。

m=(e=eye(2*(k=input('')+1)-1))*92+rot90(e)*47;m(:,k)='|';m(k,:)=45;m(k,k)='o';[m,'']

仍然比我的好两个字节:(实际上,我最初尝试过类似的操作,但是并不能将其做得足够小-我没有意识到我可以做“ m(:,k)='|'”。不错的提交!
Oebele 2015年

4

IDL 8.3,135字节

邓诺(Dunno),如果可以打更多的球……这非常简单。首先,我们创建一个由空字符串组成的m x m数组(m=2n+1);那么,我们得出字符线(y=xy=-xy=nx=n)。然后,将O放入point (n, n),然后打印整个内容,并m在每一行上将其格式化为长度为1的字符串,这样就不必在本地打印数组了。

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

测试:

IDL> s,4
\   |   /
 \  |  / 
  \ | /  
   \|/   
----O----
   /|\   
  / | \  
 /  |  \ 
/   |   \

“您可以编写一个带整数的函数来代替程序。该函数应正常打印sun设计或将其作为字符串返回。”
sirpercival,2015年

哈哈哈,别担心:)
sirpercival

3

Matlab,93 87字节

遗憾的是,函数头必须很大...除此之外,我认为它还算不错。我想知道,使用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 '']

您只需编写一个程序N=input('')即可保存2个字符。除此之外,您可以编写[E V D;H 79 H;D V E '']将整个矩阵转换为char数组的方法,这将为您节省一两个字节。(我刚刚提交了一个使用稍有不同的方法的Octave程序,但是在找到你的=之前)
更加错误的

我实际上首先输入了行,但是由于某种原因,我错误地认为这是不允许的。
Oebele 2015年

3

Javascript(ES7草案)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 />');


2

Pyth-52个字节

困难的部分是弄清楚如何在每侧切换斜线。我决定定义一个使用符号的lambda。

KdMms[*Kt-QdG*Kd\|*KdH)_UQjbg\\\/p\O*Q\-*\-Qjb_g\/\\

可能还会打更多的高尔夫球,解释即将到来。

在这里在线尝试


2

Perl,94岁

这里有很多嵌套的三元运算符,但是我认为代码相当简单。

$n=<>;for$x(-$n..$n){for$y(-$n..$n){print$x^$y?$x+$y?$x?$y?$":'|':'-':'/':$x?'\\':'O'}print$/}

在这里尝试: ideone.com/E8MC1d


1
88B:for$x(-($n=<>)..$n){map{print$x^$_?$x+$_?$x?$_?$":'|':'-':'/':$x?'\\':O}-$n..$n;print$/}-进行一些调整:将inner转换为map并将$ y更改为$ _;内联($n=<>)
亚历山大·布雷特

2

C#-291(完整程序)

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

正在努力!!
伊万2015年

1

的JavaScript(ES6),139 135 140 + 1个字节

(+1表示-p控制台中带有节点的标志)

固定:

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

用法:

t(3)
/*
\  |  /
 \ | / 
  \|/  
---O---
  /|\  
 / | \ 
/  |  \
*/

松散:

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

2
您似乎缺少两条光线。

哦,该死,我忘了加进去……
royhowie 2015年

(A=Array).from(A(m))
2015年

@MichaelT我修复了它,但我想我可以
再打

@Shmiddty感谢您的建议!节省了很多角色
royhowie 2015年

1

Python 3中,193个 186字节

打高尔夫球

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

输出量

>>> f(3)
\  |  /
 \ | /
  \|/
---O---
  /|\
 / | \
/  |  \

>>> f(5)
\    |    /
 \   |   /
  \  |  /
   \ | /
    \|/
-----O-----
    /|\
   / | \
  /  |  \
 /   |   \
/    |    \

不打高尔夫球

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

1
这里有很多事情要做,但是最大的是您的默认参数。s=' ',b='\\',f='/',d='|',g='-'长,所以你会离开,加入移动它更好的s,b,f,d,g=" \/|-"下联。
Sp3000

我的意思是" \/|-"作为单个字符串,而不是将其拆分为单个字符。您可以从像绳子解开x,y,z="123",这使得x="1"y="2"z="3"
Sp3000

再次编辑。感谢@ Sp3000
扎克·盖茨

1

CJam,59 55字节

ri:A,W%{_S*"\|/"\*\A\-(S*_@@++}%_Wf%W%['-A*_'O\++]\++N*

这不会按原样获得任何奖项,但是我很高兴它能起作用!

感谢Sp3000提供的高尔夫技巧。


1
干得好!这里有一些提示:1)您可以使用S代替'版本的空间,以及2)'-A*'O'-A您可以这样做,'-A*_'O\因为生成两次的时间很长
Sp3000 2015年

1

Python,175129127125字节

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

在这里在线尝试。


1

Ruby-130字节

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

用法:

irb(main):002:0> f(3)
\  |  /
 \ | /
  \|/
---O---
  /|\
 / | \
/  |  \

1
应用了两个古老的技巧:(f=->n{a=(0...n).map{|i|(s=' ')*i+?\\+s*(m=n-1-i)+?|+s*(m)+?/+s*i};puts(a+[?-*n+'O'+?-*n]+a.reverse.map(&:reverse))}更多有关Ruby高尔夫的技巧,请参阅。)
manatwork

1

Perl 85 91 90 89 86B

map{$_=$r||O;s/^|$/ /mg;s/ (-*O-*) /-$1-/;$r="\\$s|$s/
$_
/$s|$s\\";$s.=$"}1..<>;say$r

取消高尔夫:

# 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

1

Prolog,219字节

不,这不是打高尔夫球的语言。但我认为该站点需要更多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).

swipl在Linux上进行了测试。调用像这样:swipl -s asciiSun.prolog; 然后查询您想要的太阳大小:

?- g(3).
\  |  /
 \ | /
  \|/
---O---
  /|\
 / | \
/  |  \
true .

取消高尔夫:

 % 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).

1

的JavaScript(ES6),142个 140 134 117字节

n=>(g=x=>x?`${t=` `[r=`repeat`](n-x--)}\\${s=` `[r](x)}|${s}/${t}
`+g(x):`-`[r](n))(n)+`O`+[...g(n)].reverse().join``

试试吧

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>

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.