Mở rộng Mặt trời ASCII


43

Viết chương trình nhận (thông qua STDIN / dòng lệnh) một số nguyên không âm N.

Khi N bằng 0, chương trình của bạn sẽ in O(đó là chữ Oh, không phải số không).

Khi N là 1, chương trình của bạn sẽ in

\|/
-O-
/|\

Khi N là 2, chương trình của bạn sẽ in

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

Khi N là 3, chương trình của bạn sẽ in

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

Đối với N lớn hơn, mô hình này tiếp tục theo cùng một cách chính xác. Mỗi trong số tám tia của "mặt trời" nên được làm bằng N thích hợp -, |, /, hoặc \ký tự.

Chi tiết

  • Thay vì một chương trình, bạn có thể viết một hàm lấy một số nguyên. Hàm nên in thiết kế mặt trời bình thường hoặc trả về dưới dạng chuỗi.
  • Bạn phải

    • không có dấu vết ở tất cả, hoặc
    • chỉ có đủ dấu cách để mô hình là một hình chữ nhật hoàn hảo (2N + 1) * (2N + 1).
  • Đầu ra cho bất kỳ hoặc tất cả N có thể tùy chọn có một dòng mới.

Chấm điểm

Mã ngắn nhất tính bằng byte thắng.


Là một dòng mới hàng đầu được phép? Đặc biệt thú vị cho N=0.
Jakube

@Jakube số Trailing chỉ.
Sở thích của Calvin

Câu trả lời:


12

Pyth, 39 38 36 byte

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

Dùng thử trực tuyến: Trình biên dịch / thực thi Pyth

Giải trình

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"

Một giải pháp 36 byte khác sẽ là:

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

Tôi nghĩ rằng tôi đang tiến gần đến một giải pháp tối thiểu bằng cách sử dụng phương pháp này, nhưng tôi không thể ngừng cảm thấy rằng có một cách tiếp cận tốt hơn nhiều trong 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 ++" trong C ... heh!
bjb568

Tôi rất vui vì bạn đã không hiểu nó. Những ifs ternary là điên rồ!
ldam

Bạn có thể lưu thêm 2 byte và làm cho nó tuân thủ 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

Phew - Tôi đánh bại câu trả lời php!

Điểm + 1 khi sử dụng -rtham số.

Do các giới hạn sed, chúng ta phải ghi gần 100 byte chỉ cần chuyển đổi N thành một chuỗi N khoảng trắng. Phần còn lại là những thứ thú vị.

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

Giải trình

  • Dòng đầu tiên là một lối thoát sớm cho trường hợp N = 0.
  • 15 dòng tiếp theo (tối đa :) chuyển đổi N thành một chuỗi N khoảng trắng
  • s/ // xóa một khoảng trống
  • s^.*^\\&|&/^;tachuyển đổi không gian N-1 thành: \+ không gian |N-1 + + không gian N-1 +/
  • Lặp lại, in mỗi lần lặp và di chuyển \một khoảng trắng sang phải và /một khoảng trắng ở bên trái ...
  • ... cho đến khi chúng tôi khớp \|/, được thay thế -O-và nhảy đến nnhãn
  • thay thế với -và in
  • thay thế -0-bằng /|\, và thay thế bằng -và nhảy trở lại vào vòng lặp chính
  • Lặp lại, in mỗi lần lặp và di chuyển \một khoảng trắng sang phải và /một khoảng trắng ở bên trái ...
  • ... cho đến khi chúng tôi khớp với \$chỉ số đã kết thúc và thoát.

Đầu ra

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

16

J, 37 34 40 byte

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

Sử dụng:

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

Giải thích (từ trái sang phải):

  • i: tạo danh sách -n, -(n-1), ..., n-1, n
  • ( )"*/~@i:tạo sản phẩm Descartes của i: với chính nó trong một sắp xếp ma trận, ví dụ để n = 1tạo 3-by-3ma trận sau

    ┌─────┬────┬────┐
    │-1 -1│-1 0│-1 1│
    ├─────┼────┼────┤
    │0 -1 │0 0 │0 1 │
    ├─────┼────┼────┤
    │1 -1 │1 0 │1 1 │
    └─────┴────┴────┘
    
  • Đối với mọi phần tử ma trận có số nguyên, x ychúng tôi thực hiện như sau

  • +&|,-,+,[,] tính toán một danh sách các thuộc tính

    • +&| abs(x)+abs(y), bằng 0iff (nếu và chỉ nếu) x=0y=0
    • -xy, bằng 0iff x=ytức là chúng ta đang ở trên đường chéo
    • +x + y, bằng 0iff x=-ytức là chúng ta đang ở trên đường chéo
    • [x, bằng 0iff x=0tức là chúng ta ở hàng giữa
    • ]y, bằng 0iff y=0tức là chúng ta ở cột giữa
  • 'O\/-|'#~0=so sánh các giá trị thuộc tính trên với 0và lấy iký tự thứ từ chuỗi 'O\/-|'nếu thuộc tính ithứ là đúng.

  • ký tự đầu tiên trong chuỗi kết quả sẽ luôn là ký tự chúng ta cần, nếu có chuỗi trống, chúng ta cần một khoảng trắng
  • {. lấy ký tự đầu tiên của một chuỗi và nếu không có ai, nó sẽ trả về một ký tự khoảng trắng làm phần đệm giống như chúng ta cần
  • Bây giờ chúng ta có ma trận chính xác mà chúng ta cần vì vậy chúng ta in nó ra thiết bị xuất chuẩn một lần với 1:echo

Hãy thử trực tuyến tại đây.


5
Đây là phiên bản vô văn hóa?! Đôi khi tôi cảm thấy mình là một lập trình viên trung bình khá, và sau đó vì một số lý do, tôi kết thúc với codegolf và thấy những thứ mà các bạn rút ra và không thể không cảm thấy như một thằng ngốc.
JustSid

@JustSid Chà, văn bản không được cập nhật với mã nhưng về mặt kỹ thuật tôi không bao giờ viết rằng mã đó là vô căn cứ. :)
ngẫu nhiên

Dù sao thì nó vẫn rất ấn tượng
JustSid

2
@JustSid Không phải là nó kém ấn tượng nhưng mã J khá giống như vậy, và đây có vẻ như là một thách thức mà nó sẽ là một ngôn ngữ tốt. Đó là một câu trả lời rất ấn tượng, nhưng mọi thứ khác trong J :) cũng vậy
ngầm vào

11

PHP, 182 byte

Đây dường như là một hoạt động thú vị cho câu trả lời đầu tiên của tôi. Nhận xét về mã của tôi được chào đón.

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

Đây là mã không được đánh gôn với các bình luậ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>

Được chỉnh sửa với mã bởi royhowie


3
Xin chào :-) Nỗ lực đầu tiên tốt. Bạn có thể thu nhỏ mã của mình ở một vài nơi. Ví dụ, if(($y-$h)==($x-$h))làm tương tự như if(($y==$x). Bạn có thể lưu một ký tự khác bằng cách thay thế if($x==y$)foo();else bar();bằng if($x^$y)bar();else foo();. Bạn cũng nên thử sử dụng các toán tử ternary thay vì các if .. elsecâu lệnh.
squossish ossifrage

khai thác ternary là một mẹo hay
nick

174 byte: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. không cần $r; chỉ sử dụng echo( $r.=là cùng một lượng byte như echo). 2. toán tử ternary đã sử dụng (lưu rất nhiều ký tự). 3. $hlà vô dụng vì nó bằng $n. 4. Bạn không cần phải sử dụng floorcho $x = floor($i%$e);, vì một mô đun trên một số nguyên sẽ không cần phải được làm tròn xuống.
royhowie

@squeamishossifrage Tôi chưa bao giờ nghĩ về điều đó. Cảm ơn vì những lời khuyên!
Kodos Johnson

9

Con trăn 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)

In từng dòng, mỗi dòng tạo ra bằng cách kiểm tra xem phối hợp (i,j)(tập trung ở (0,0)) thỏa mãn j==-i, j==0, j==i, hoặc không, với một hack để làm cho công việc đường trung tâm.


Tôi nghĩ bạn có thể sử dụng Rthay vì .5để tiết kiệm 1 byte.
ngẫu nhiên

@randomra Thật thông minh, cảm ơn. Xuống hai chữ số!
xnor


7

SpecBAS - 117 byte

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"

Điều này in các dấu gạch chéo và dấu gạch ngang trong một vòng lặp, và sau đó plon chữ "O" ở giữa.

Đầu ra sử dụng 1, 2 và 9

nhập mô tả hình ảnh ở đây


Một người sử dụng nặc danh đề nghị thay đổi "-": NEXT y: PRINT AT s,s;"O"để "-";AT s,s;"O": NEXT ycứu hai byte.
Martin Ender

7

JavaScript (ES6) 97 98

Điều này dường như đủ khác ...

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


Đẹp. Tôi nên nghĩ về việc đóng cửa để sử dụng bình thường cho các vòng lặp.
nderscore

Tôi thích cái này. Tôi đã thử viết một chuỗi bằng cách sử dụng một chuỗi và truy cập vào một chỉ mục cụ thể, nhưng chuỗi của bạn ngắn hơn nhiều.
royhowie

6

OS / 2 Classic Rexx, 102 ... hoặc 14 cho "phiên bản của kẻ lừa đảo"

Đưa ra các nguồn cấp dữ liệu để "đánh gôn" nó.

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

Phiên bản của Cheater, đặt tên cho tập lệnh bất kỳ mã nguồn nào bạn muốn dưới 255 ký tự (yêu cầu đĩa HPFS):

interpret '%0'

EDIT: Để rõ ràng, phiên bản của kẻ lừa đảo không có ý định đếm! Chỉ là ngớ ngẩn và cho thấy một con chó già vẫn có thể làm thủ thuật. :)

ví dụ: Đối với các trò chơi và trò chơi thực sự thú vị, việc triển khai các biểu thức "lambda" kiểu Java-8 / C11 trên một trình vòng lặp danh sách. Không được thử nghiệm, nhưng phải chạy trên máy tính lớn của IBM vào khoảng năm 1979. ;)

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

- Mã gọi giả định rằng bạn đã thực hiện một thân (mảng), một cách tự nhiên.


Đối với phiên bản gian lận của bạn: nếu tên tệp của chương trình không phải là tùy ý, thì nó phải được bao gồm trong số byte .
Martin Ender

Đủ công bằng. Phiên bản của Cheater không nhằm mục đích nghiêm túc! :) ... đó là lý do tại sao tôi đăng câu trả lời "thực sự" ở 102. Đó chỉ là vì lợi ích mới lạ.
lisa

@lisa ngoại trừ việc nó không phải tiểu thuyết nào cả;). Ngoài ra, nó sẽ phá vỡ kịch bản bảng xếp hạng nếu được sử dụng trong thử thách này.
Tối ưu hóa

6

Haskell, 109 98 96 byte

Cảm ơn nimi và Mauris vì sự giúp đỡ của họ!

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

Giải trình:

Toán tử #chỉ định ký tự nào xuất hiện tại tọa độ (i, j), với mặt trời ở giữa (0,0). Hàm fxây dựng Chuỗi kết quả bằng cách ánh xạ #qua tất cả các cặp tọa độ từ -n đến n.

Sử dụng:

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

Bạn có thể tiết kiệm một vài byte bằng cách sử dụng một nhà điều hành ghi thay vì s, ví dụ như 0#0='O', 0#_='-', vv và 1<2thay vì True.
nimi

Có lẽ map(i#)[-n..n]để tiết kiệm hai byte.
Lynn

4

R, 177 149 byte

Mickey T. là đàn ông! Anh ấy đã giúp tôi sửa giải pháp ban đầu không chính xác của mình tiết kiệm được 28 byte. Cảm ơn, 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 + giải thích:

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

Bất kỳ đề xuất thêm đều được chào đón!


1
Xin lỗi Alex, bạn đã bỏ lỡ các tia dọc. Có một vài điều có thể được thay đổi để rút ngắn điều này mà không thay đổi quy trình chung. Các scankhông thực sự cần w=. Nó cũng có thể được chuyển sâu hơn vào các lệnh. Có ifthể bỏ qua nếu bạn thay đổi cách xử lý ma trận trong một vài trường hợp. Áp dụng những điều này tôi nhận được 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=''). Hơn nữa có thể chơi golf tôi nghĩ.
MickyT

@MickyT: Thật tuyệt vời. Cảm ơn bạn rất nhiều vì đã nhận ra sai lầm của tôi và chứng minh một giải pháp tốt hơn nhiều! Tôi chỉnh sửa câu trả lời.
Alex A.

4

C #, 230 226 byte

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

Theo yêu cầu, phiên bản không được chỉnh sửa: chuỗi 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; 
    }

Đây là bài viết đầu tiên của tôi vì vậy xin lỗi nếu tôi đã làm sai điều gì đó. Bất kỳ ý kiến ​​và sửa chữa đều rất hoan nghênh.


Ngoài ra, s=2*n+1thay vì s=(n*2)+1w==s-h-1thay vì w==(s-h)-1sẽ làm cho điều này ngắn hơn một chút.
Alex A.

tốt đẹp, có thể ăn cắp phương pháp xây dựng chuỗi của bạn. điều đó làm tôi khó chịu vì linq dài hơn các vòng lặp :(
Ewan

Tôi đã thêm phiên bản chưa được chỉnh sửa :)
Truyền

4

Ruby: 98 92 ký tự

Proc trả về một chuỗi với Mặt trời.

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}

Chạy mẫu:

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

Rust, 215 ký tự

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

Tôi đã cố gắng sử dụng một phương pháp cắt chuỗi (bằng cách tạo một chuỗi n-1khoảng trắng và cắt đến và từ một chỉ mục) như vậy:

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

Nhưng đó thực sự là 3 ký tự dài hơn.

Mã bị đánh cắp:

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

Phần tôi thích là cách tôi cạo một vài ký tự trên chuỗi định dạng. Ví dụ,

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

tương đương với

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

bởi vì "trình tăng tự động" cho vị trí đối số chuỗi định dạng không bị ảnh hưởng bằng cách chỉ định thủ công số và hoạt động hoàn toàn độc lập.


4

Octave 85

Ma trận Bulding như mọi khi =) eyetạo ra một ma trận danh tính, phần còn lại là tự giải thích tôi nghĩ.

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

Vẫn còn hai byte tốt hơn của tôi :( Tôi thực sự đã thử một cái gì đó tương tự như lúc đầu, nhưng không thể có đủ nhỏ - Tôi không nhận ra mình có thể làm "m (:, k) = '|'".
Oebele

4

IDL 8.3, 135 byte

Nếu không điều này có thể được đánh gôn nhiều hơn ... Nó rất đơn giản. Đầu tiên chúng ta tạo một m x mmảng ( m=2n+1) của các chuỗi rỗng; Sau đó, chúng tôi rút ra những nhân vật trong dòng ( y=x, y=-x, y=n, và x=n). Sau đó, chúng tôi thả chữ O vào điểm (n, n)và in toàn bộ, được định dạng dưới dạng mchuỗi có độ dài 1 trên mỗi dòng để không có khoảng cách thêm từ việc in mảng nguyên bản.

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

Kiểm tra:

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

"Thay vì một chương trình, bạn có thể viết một hàm lấy một số nguyên. Hàm này sẽ in thiết kế mặt trời bình thường hoặc trả về dưới dạng chuỗi."
sirpercival

hahaha không phải lo lắng :)
sirpercival

3

Matlab, 93 87 byte

Đáng buồn là tiêu đề chức năng phải quá lớn ... Ngoài ra tôi nghĩ rằng nó được chơi golf khá tốt. Tôi tự hỏi nếu nó có thể được thực hiện tốt hơn với một số khác biệt cú pháp trong 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 '']

Bạn chỉ có thể tạo một chương trình với N=input('')để lưu 2 ký tự. Ngoài ra, bạn chỉ có thể viết [E V D;H 79 H;D V E '']để chuyển đổi toàn bộ ma trận thành một mảng char, điều này sẽ giúp bạn tiết kiệm được một hoặc hai byte khác. (Tôi vừa gửi một chương trình Octave với cách tiếp cận hơi khác, nhưng trước khi tôi tìm thấy chương trình của bạn =)
flawr

Tôi thực sự đã có dòng đầu vào đầu tiên, nhưng vì một số lý do tôi đã nhầm tưởng rằng nó không được phép ... Mặc dù vậy, cảm ơn vì lời khuyên khác!
Oebele

3

Javascript ( Dự thảo 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 byte

Phần khó là tìm ra cách chuyển các dấu gạch chéo cho mỗi bên. Tôi giải quyết cho việc xác định một lambda có các biểu tượng để sử dụng.

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

Có thể có khả năng được chơi golf nhiều hơn, giải thích đến sớm.

Hãy thử trực tuyến tại đây .


2

Perl, 94

Có rất nhiều toán tử ternary lồng nhau ở đây, nhưng tôi nghĩ rằng mã này là đơn giản hợp lý.

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

Dùng thử tại đây: ideone.com/E8MC1d


1
88B: for$x(-($n=<>)..$n){map{print$x^$_?$x+$_?$x?$_?$":'|':'-':'/':$x?'\\':O}-$n..$n;print$/}- Một vài điều chỉnh: chuyển đổi bên trong thành bản đồ và thay đổi $ y thành $ _; nội tuyến ($n=<>).
alexander-brett

2

C # - 291 (chương trình đầy đủ)

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

làm việc trên đó!!
Ewan

1

JavaScript (ES6), 139 135 140 + 1 byte

(+1 dành cho -pcờ có nút trong bảng điều khiển)

đã sửa:

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

sử dụng:

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

vô dụng:

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
Bạn dường như bị thiếu hai tia.

Ôi trời ơi, tôi đã quên thêm điều đó trở lại trong
trận đấu

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

@MichaelT Tôi đã sửa nó, nhưng tôi nghĩ rằng tôi có thể đánh gôn thêm một chút
royhowie

@Shmiddty cảm ơn lời đề nghị! đã cứu rất nhiều nhân vật
royhowie

1

Python 3, 193 186 byte

Chơi gôn

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

Đầu ra

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

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

Bị đánh cắp

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
Có một vài điều cần được chơi ở đây, nhưng vấn đề lớn nhất là các đối số mặc định của bạn. s=' ',b='\\',f='/',d='|',g='-'rất dài, vì vậy bạn nên di chuyển nó bằng cách thêm s,b,f,d,g=" \/|-"vào dòng thứ hai.
Sp3000

Tôi có nghĩa " \/|-"là một chuỗi duy nhất, thay vì chia nó thành các ký tự riêng lẻ. Bạn có thể giải nén từ một chuỗi như x,y,z="123", mà làm x="1", y="2"z="3".
Sp3000

Chỉnh sửa lại. Cảm ơn @ Sp3000
Zach Gates

1

CJam, 59 55 byte

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

Điều này sẽ không giành được bất kỳ giải thưởng nào nhưng tôi rất vui vì nó đã hoạt động!

Cảm ơn Sp3000 cho lời khuyên chơi golf.


1
Công việc tốt đẹp! Dưới đây là một vài mẹo: 1) Bạn có thể sử dụng Sthay vì 'phiên bản cho không gian và 2) Thay vào đó, '-A*'O'-Abạn có thể thực hiện '-A*_'O\vì việc tạo nó hai lần là dài
Sp3000

1

Con trăn, 175 129 127 125 byte

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

Hãy thử trực tuyến tại đây .


1

Ruby - 130 byte

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

sử dụng:

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

1
Áp dụng một vài mẹo cũ: 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))}(Xem Mẹo chơi golf trong Ruby để biết thêm.)
thao tác

1

Perl 85 91 90 89 86B

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

Ung dung:

# 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 byte

Không, đó không phải là ngôn ngữ chơi gôn. Nhưng tôi nghĩ rằng trang web này cần nhiều Prolog hơn.

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

Đã thử nghiệm với swiplLinux. Gọi như vậy : swipl -s asciiSun.prolog; sau đó truy vấn kích thước mặt trời mong muốn của bạn:

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

Ung dung:

 % 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 byte

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

Thử nó

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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.