ASCII Sun 확장


43

STDIN / 명령 줄을 통해 음이 아닌 정수 N을 취하는 프로그램을 작성하십시오.

N이 0이면 프로그램은 인쇄해야합니다 O(자본은 0이 아닌 Oh).

N이 1이면 프로그램이 인쇄되어야합니다

\|/
-O-
/|\

N이 2 인 경우 프로그램은 인쇄해야합니다

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

N이 3이면 프로그램이 인쇄되어야합니다

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

더 큰 N의 경우,이 패턴은 동일한 정확한 방식으로 계속됩니다. 은 "태양"의 8 광선의 각 해당의 N 만들어 져야한다 -, |, /, 또는 \문자.

세부

  • 프로그램 대신 정수를 사용하는 함수를 작성할 수 있습니다. 이 함수는 태양 디자인을 정상적으로 인쇄하거나 문자열로 반환해야합니다.
  • 당신은

    • 후행 공백이 없거나
    • 후행 공백이 충분하므로 패턴이 완벽한 (2N + 1) * (2N + 1) 사각형입니다.
  • 임의의 또는 모든 N에 대한 출력은 선택적으로 후행 개행을 가질 수있다.

채점

바이트 단위의 가장 짧은 코드가 이깁니다.


선행 개행이 허용됩니까? 특히 흥미 롭습니다 N=0.
Jakube

@Jakube No. 트레일 링.
Calvin 's Hobbies

답변:


12

Pyth, 39 38 36 바이트

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

온라인 사용해보기 : Pyth Compiler / Executor

설명

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

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

나는이 접근법을 사용하여 최소한의 솔루션에 상당히 가까워지고 있다고 생각하지만 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 ++"... heh!
bjb568

나는 당신이 그것을 풀기 때문에 기쁘다. 그 삼항의 경우는 미쳤다!
ldam

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

휴-나는 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^.*^\\&|&/^;taN-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의 Descartes 곱을 생성합니다. 예를 들어 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=0와 같고y=0
    • -XY, 동일 0IFF에 x=y우리가 대각선에있는 즉,
    • +X + Y, 동일 0IFF에 x=-y우리는 안티 대각선에있는 즉,
    • [X, 동일 0IFF에 x=0우리가 중간 행에있는 즉,
    • ]Y는 동일 0IFF에 y=0우리가 중간 컬럼에있는 즉,
  • 'O\/-|'#~0=th 속성이 true 인 경우 위의 속성 값을 비교 하여 문자열에서 th 문자를 0가져옵니다 .i'O\/-|'i

  • 결과 문자열의 첫 번째 문자는 항상 필요한 문자입니다. 문자열이 비어 있으면 공백이 필요합니다
  • {. 문자열의 첫 번째 문자를 가져오고 아무도 없으면 공백 문자를 필요에 따라 패딩으로 반환합니다.
  • 이제 필요한 정확한 행렬을 얻었으므로 stdout으로 한 번 인쇄합니다. 1:echo

여기에서 온라인으로 사용해보십시오.


5
이것은 ungolfed 버전입니까?! 나는 때때로 꽤 평범한 프로그래머처럼 느껴지고 어떤 이유로 나는 codegolf를 끝내고 너희들이 뽑아서 바보처럼 느끼는 것을 본다.
JustSid

@JustSid 글쎄, 텍스트는 코드가 최신이 아니지만 기술적으로 코드가 풀리지 않았다고 기술하지 않았습니다. :)
randomra

그것은 여전히 ​​어느 쪽이든 인상적입니다
JustSid

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.
비위 ossifrage

삼항 연산자는 좋은 팁입니다.
Nick

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

1. 필요가 없습니다 $r; 그냥 사용하십시오 echo( $r.=와 같은 바이트 양입니다 echo). 2. 삼항 연산자를 사용했습니다 (많은 문자를 저장합니다). 3. $h같았 기 때문에 쓸모가 없었습니다 $n. 4. 사용하지 않은 floor위한 $x = floor($i%$e);정수의 계수가 둥근 다운 할 필요가 없기 때문.
royhowie

@squeamishossifrage 나는 그런 생각을하지 않았다. 팁 주셔서 감사합니다!
Kodos Johnson

9

파이썬 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==-i, j==0, j==i해킹으로, 또는 어느 것도 중심선 작동하게 없음.


1 바이트를 절약 하는 R대신 사용할 수 있다고 생각합니다 .5.
randomra

@randomra 영리합니다. 감사합니다. 두 자리 숫자까지!
xnor


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를 사용한 출력

여기에 이미지 설명을 입력하십시오


익명 사용자가 2 바이트를 저장 하도록 변경 "-": NEXT y: PRINT AT s,s;"O"하도록 제안했습니다 "-";AT s,s;"O": NEXT y.
Martin Ender 2016 년

7

자바 스크립트 (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

난이게 좋아. 문자열을 사용하여 특정 색인에 액세스하려고 시도했지만 훨씬 짧습니다.
royhowie

6

"치터 버전"의 경우 OS / 2 Classic 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

Cheater 's version에서 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에 "실제"답변을 게시 한 이유입니다. 참신을 위해서였습니다.
리사

전혀 소설이 아닌 것을 제외하고 @lisa;). 또한이 도전에 사용되면 리더 보드 스크립트가 손상됩니다.
옵티 마이저

6

하스켈, 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]]

설명:

연산자 #는 태양이 (0,0)을 중심으로 좌표 (i, j)에 표시 할 문자를 지정합니다. 함수 는 -n에서 n까지의 모든 좌표 쌍 f에 맵핑하여 결과 문자열을 빌드합니다 #.

용법:

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

당신은 중위 연산자를 사용하는 대신하여 몇 바이트를 저장할 수 있습니다 s예를 들어, 0#0='O', 0#_='-', 등을 1<2대신 True.
nimi

아마도 map(i#)[-n..n]2 바이트를 절약 할 수 있습니다.
Lynn

4

R, 177149 바이트

미키 티가 남자 다! 그는 내 원래 잘못된 솔루션을 해결 도움 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
미안 알렉스, 당신은 수직 광선을 놓쳤다. 일반적인 프로세스를 변경하지 않고이를 단축하기 위해 변경할 수있는 몇 가지가 있습니다. 은 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

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

요청에 따라 ungolfed 버전 : 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

나는 ungolfed 버전을 추가했습니다 :)
Transmission

4

루비 : 98 92 자

Sun과 함께 문자열을 반환하는 Proc.

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 자 더 깁니다.

Ungolfed 코드 :

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

항상 =)처럼 Bulding 행렬 eye은 항등 행렬을 생성하고 나머지는 자명합니다.

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

내 것보다 여전히 2 바이트가 더 낫습니다 :( 실제로는 이와 비슷한 것을 시도했지만 충분히 작게 얻을 수 없었습니다. "m (:, k) = '|'"할 수 있다는 것을 몰랐습니다. 좋은 제출!
Oebele

4

IDL 8.3, 135 바이트

골프를 더 많이 할 수 있다면 Dunno ... 매우 간단합니다. 먼저 빈 문자열 의 m x m배열 ( m=2n+1)을 만듭니다 . 다음, 우리가 줄의 문자를 그리는 ( y=x, y=-x, y=n, 및 x=n). 그런 다음 point에 O를 넣고 배열을 기본적으로 인쇄 할 때 여분의 간격이 없도록 각 줄에 길이가 1 인 문자열로 (n, n)서식이 지정된 모든 것을 m인쇄합니다.

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

"프로그램 대신 정수를 사용하는 함수를 작성할 수 있습니다.이 함수는 태양 디자인을 정상적으로 인쇄하거나 문자열로 반환해야합니다."
sirpercival

hahaha 걱정 마세요 :)
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 배열로 변환하기 위해 쓰면 다른 바이트 또는 2 바이트를 절약 할 수 있습니다. (방금 약간 다른 접근 방식으로 옥타브 프로그램을 제출했지만, 당신의 것을 찾기 전에 =)
flawr

실제로 입력 줄을 먼저 가지고 있었지만 어떤 이유로 든 실수로 허용되지 않았다고 생각했습니다 ...하지만 다른 팁에 감사드립니다!
Oebele

3

자바 스크립트 ( 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 바이트

어려운 부분은 각면에 슬래시를 전환하는 방법을 알아내는 것입니다. 기호를 사용하는 람다를 정의하기로 결정했습니다.

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

더 많은 골프를 치는 것 같습니다. 설명이 곧 올 것입니다.

여기에서 온라인으로 사용해보십시오 .


2

펄, 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$/}-몇 가지 조정 : 내부를지도로 변환하고 $ y를 $ _로 변경; 인라인 ($n=<>).
alexander-brett

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

작업중 !!
Ewan

1

자바 스크립트 (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
두 개의 광선이없는 것 같습니다.

아,
젠장

(A=Array).from(A(m))
Shmiddty

@MichaelT 나는 그것을 고쳤지만, 좀 더 골프를

@Shmiddty 제안에 감사드립니다! 많은 캐릭터를 구했습니다
royhowie

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
Zach Gates

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

1

파이썬, 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

루비-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

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

프롤로그, 219 바이트

아닙니다. 골프 언어는 아닙니다. 하지만이 사이트에는 더 많은 프롤로그가 필요하다고 생각합니다.

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

swiplLinux에서 테스트되었습니다 . 다음과 같이 호출하십시오. 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

자바 스크립트 (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>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.