Perpanjang ASCII Sun

43

Tulis program yang menerima (melalui STDIN / baris perintah) bilangan bulat non-negatif N.

Ketika N adalah 0, program Anda harus mencetak O(itu modal Oh, bukan nol).

Ketika N adalah 1, program Anda harus mencetak

\|/
-O-
/|\

Ketika N adalah 2, program Anda harus mencetak

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

Ketika N adalah 3, program Anda harus mencetak

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

Untuk N yang lebih besar, pola ini berlanjut dengan cara yang sama persis. Masing-masing dari delapan sinar dari "matahari" harus terbuat dari N dari yang sesuai -, |, /, atau \karakter.

Detail

  • Alih-alih sebuah program, Anda dapat menulis fungsi yang mengambil integer. Fungsi harus mencetak desain matahari secara normal atau mengembalikannya sebagai string.
  • Anda juga harus

    • tidak memiliki spasi sama sekali, atau
    • hanya memiliki cukup ruang trailing sehingga polanya sempurna (2N + 1) * (2N + 1) persegi panjang.
  • Output untuk setiap atau semua N dapat secara opsional memiliki baris tambahan.

Mencetak gol

Kode terpendek dalam byte menang.

Hobi Calvin
sumber
Apakah baris baru terkemuka diizinkan? Sangat menarik untuk N=0.
Jakube
@Jakube No. Trailing saja.
Hobi Calvin

Jawaban:

12

Pyth, 39 38 36 byte

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

Cobalah secara online: Pyth Compiler / Executor

Penjelasan

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"

Solusi 36 byte lainnya adalah:

jbmXXj\|m*?\-KqdQ\ Q2d\\_hd?\OK\/hyQ
Jakube
sumber
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);}

Saya pikir saya semakin dekat dengan solusi minimal menggunakan pendekatan ini, tetapi saya tidak bisa berhenti merasa bahwa ada pendekatan yang jauh lebih baik di 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'
    );
}
Untuk S
sumber
7
"c ++" di C ... heh!
bjb568
Aku senang kau tidak mengunyahnya. Jika ternary itu gila!
ldam
Anda dapat menyimpan 2 byte lebih banyak dan membuatnya vc 2012 compliant;)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

Fiuh - Saya mengalahkan jawaban php!

Skor +1 untuk menggunakan -rparameter.

Karena keterbatasan sed, kita harus membakar hampir 100 byte hanya mengkonversi N ke string ruang N. Sisanya adalah hal yang menyenangkan.

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

Penjelasan

  • Baris pertama adalah jalan keluar awal untuk kasus N = 0.
  • 15 baris berikutnya (hingga :) mengkonversi N ke string N spasi
  • s/ // menghapus satu ruang
  • s^.*^\\&|&/^;tamengonversi ruang N-1 menjadi: \+ ruang |N-1 + + ruang N-1 +/
  • Iterasi, cetak setiap iterasi, dan gerakkan \satu ruang ke kanan dan /satu ruang ke kiri ...
  • ... sampai kami cocok \|/, yang diganti dengan -O-dan melompat ke nlabel
  • ganti dengan -dan cetak
  • ganti -0-dengan /|\, dan ganti dengan -dan lompat kembali ke loop utama
  • Iterasi, cetak setiap iterasi, dan gerakkan \satu ruang ke kanan dan /satu ruang ke kiri ...
  • ... sampai kami cocok \$yang menunjukkan selesai, dan berhenti.

Keluaran

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

J, 37 34 40 byte

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

Pemakaian:

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

Penjelasan (dari kiri ke kanan):

  • i: menghasilkan daftar -n, -(n-1), ..., n-1, n
  • ( )"*/~@i:menciptakan produk Descartes dari i: dengan dirinya sendiri dalam susunan matriks, misalnya untuk n = 1membuat 3-by-3matriks berikut

    ┌─────┬────┬────┐
    │-1 -1│-1 0│-1 1│
    ├─────┼────┼────┤
    │0 -1 │0 0 │0 1 │
    ├─────┼────┼────┤
    │1 -1 │1 0 │1 1 │
    └─────┴────┴────┘
    
  • untuk setiap elemen matriks dengan bilangan bulat, x ykami melakukan hal berikut

  • +&|,-,+,[,] hitung daftar properti

    • +&| abs(x)+abs(y), sama dengan 0iff (jika dan hanya jika) x=0dany=0
    • -xy, sama dengan 0iff x=yyaitu kita berada di diagonal
    • +x + y, sama dengan 0iff x=-yyaitu kita berada di anti-diagonal
    • [x, sama dengan 0iff x=0yaitu kita berada di baris tengah
    • ]y, sama dengan 0iff y=0yaitu kita berada di kolom tengah
  • 'O\/-|'#~0=bandingkan nilai properti di atas 0dan ambil ikarakter th dari string 'O\/-|'jika iproperti th benar.

  • karakter pertama dalam string yang dihasilkan akan selalu menjadi yang kita butuhkan, jika ada string kosong kita perlu spasi
  • {. mengambil karakter pertama dari sebuah string dan jika tidak ada yang mengembalikan karakter ruang sebagai padding seperti yang kita butuhkan
  • kita sekarang memiliki matriks yang tepat yang kita butuhkan sehingga kita mencetaknya ke stdout sekali dengan 1:echo

Cobalah online di sini.

randomra
sumber
5
Ini adalah versi yang tidak diserang ?! Saya merasa seperti seorang programmer yang cukup rata-rata pada suatu waktu, dan kemudian untuk beberapa alasan saya berakhir dengan codegolf dan melihat hal-hal yang kalian lakukan dan merasa seperti orang idiot.
JustSid
@JustSid Ya, teksnya tidak mutakhir dengan kodenya, tetapi secara teknis saya tidak pernah menulis bahwa kodenya ungolfed. :)
randomra
Bagaimanapun juga masih sangat mengesankan
JustSid
2
@JustSid Bukan berarti itu kurang mengesankan tetapi kode J cukup banyak hanya terlihat seperti itu, dan ini sepertinya sebuah tantangan bahwa itu akan menjadi bahasa yang baik untuk. Ini jawaban yang sangat mengesankan, tetapi begitu juga semua yang lain dalam J :)
undergroundmonorail
11

PHP, 182 byte

Ini sepertinya kegiatan yang menyenangkan untuk jawaban pertama saya. Komentar pada kode saya dipersilakan.

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

Berikut adalah kode un-golfed dengan komentar:

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

Diedit dengan kode oleh royhowie

Kodos Johnson
sumber
3
Hai :-) Upaya pertama yang bagus. Anda dapat menyusutkan kode Anda di beberapa tempat. Misalnya if(($y-$h)==($x-$h))melakukan hal yang sama dengan if(($y==$x). Anda dapat menyimpan karakter lain dengan menggantinya if($x==y$)foo();else bar();dengan if($x^$y)bar();else foo();. Anda juga harus mencoba menggunakan operator ternary alih-alih if .. elsepernyataan.
ossifrage mual
operator ternary adalah tip yang bagus
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. tidak perlu untuk $r; cukup gunakan echo( $r.=jumlah byte yang sama dengan echo). 2. operator ternary yang digunakan (menyimpan banyak karakter). 3. $htidak berguna karena sama dengan $n. 4. Anda tidak perlu menggunakan flooruntuk $x = floor($i%$e);, karena modulus pada integer tidak perlu menjadi bulat ke bawah.
royhowie
@squeamishossifrage Saya tidak pernah memikirkan itu. Terima kasih atas tipsnya!
Kodos Johnson
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)

Cetakan baris demi baris, menciptakan setiap baris dengan memeriksa apakah koordinat (i,j)(berpusat di (0,0)) memenuhi j==-i, j==0, j==i, atau tidak, dengan hack untuk membuat pekerjaan garis tengah.

Tidak
sumber
Saya pikir Anda bisa menggunakan Rbukannya .5menghemat 1 byte.
randomra
@randomra Itu pintar, terima kasih. Turun menjadi dua digit!
xnor
8

CJam, 48 45 43 41 38 byte

Ini masih terlalu lama dan saya masih melakukan beberapa hal yang berlebihan, tetapi begini:

ri:R{_S*"\|/"@R-~S**1$N}%'-R*'O1$W$sW%

Cobalah online di sini

Pengoptimal
sumber
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"

Ini mencetak garis miring dan garis putus-putus dalam satu lingkaran, dan kemudian mem-plon "O" di tengah.

Output menggunakan 1, 2 dan 9

masukkan deskripsi gambar di sini

Brian
sumber
Seorang pengguna anonim menyarankan perubahan "-": NEXT y: PRINT AT s,s;"O"untuk "-";AT s,s;"O": NEXT ymenyelamatkan dua byte.
Martin Ender
7

JavaScript (ES6) 97 98

Ini sepertinya cukup berbeda ...

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

edc65
sumber
Indah. Saya seharusnya memikirkan penutupan untuk menggunakan normal untuk loop.
nderscore
Saya suka yang ini. Saya telah mencoba menulis satu menggunakan string dan mengakses indeks tertentu, tetapi milik Anda jauh lebih pendek.
royhowie
6

OS / 2 Classic Rexx, 102 ... atau 14 untuk "versi penipu"

Keluarkan umpan baris untuk "bermain golf".

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

Versi Cheater, beri nama skrip apa pun kode sumber yang Anda inginkan di bawah 255 karakter (memerlukan disk HPFS):

interpret '%0'

EDIT: Hanya untuk memperjelas, versi penipu tidak dimaksudkan untuk dihitung! Itu hanya untuk menjadi konyol dan menunjukkan seekor anjing tua masih bisa melakukan trik. :)

mis. Untuk kesenangan dan permainan nyata, implementasi ekspresi "lambda" gaya Java-8 / C11 pada daftar iterator. Tidak diuji, tetapi harus berjalan pada mainframe IBM 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

- Kode panggilan menganggap Anda sudah membuat batang (array), secara alami.

lisa
sumber
Untuk versi penipu Anda: jika nama file suatu program tidak sembarangan, ia harus dimasukkan dalam jumlah byte .
Martin Ender
Cukup adil. Versi Cheater sama sekali tidak serius! :) ... itulah sebabnya saya memposting jawaban "asli" di 102. Itu hanya demi hal baru.
lisa
@ Lisa kecuali itu bukan novel sama sekali;). Juga, itu akan mematahkan skrip leaderboard jika digunakan dalam tantangan ini.
Pengoptimal
6

Haskell, 109 98 96 byte

Terima kasih kepada nimi dan Mauris atas bantuan mereka!

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

Penjelasan:

Operator #menentukan karakter yang muncul pada koordinat (i, j), dengan matahari berpusat pada (0,0). Fungsi fmembangun String hasil dengan memetakan #semua pasangan koordinat mulai dari -n hingga n.

Pemakaian:

ghci> putStr $ f 2
\ | /
 \|/ 
--O--
 /|\ 
/ | \
pengguna40671
sumber
Anda dapat menyimpan beberapa byte dengan menggunakan operator infiks bukan s, misalnya 0#0='O', 0#_='-', dll dan 1<2bukan True.
nimi
Mungkin map(i#)[-n..n]untuk menghemat dua byte.
Lynn
4

R, 177 149 byte

Mickey T. adalah pria! Dia membantu saya memperbaiki solusi saya yang awalnya salah dan menghemat 28 byte. Terima kasih, 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="")

Penjelasan + tidak dikumpulkan:

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

Saran lebih lanjut dipersilakan!

Alex A.
sumber
1
Maaf Alex, Anda melewatkan sinar vertikal. Ada beberapa hal yang bisa diubah untuk mempersingkat ini tanpa mengubah proses umum. Tidak scanbenar - benar membutuhkan w=. Itu juga bisa digeser lebih dalam ke perintah. The ifdapat membuang jika Anda mengubah cara matriks ditangani dalam beberapa kasus. Menerapkan ini saya dapatkan 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=''). Golf lebih lanjut mungkin saya pikir.
MickyT
@MickyT: Luar biasa. Terima kasih banyak telah memperhatikan kesalahan saya dan membuktikan solusi yang jauh lebih baik! Saya mengedit jawabannya.
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;}

Seperti yang diminta, versi tanpa tanda: 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; 
    }

Ini adalah posting pertama saya, jadi saya minta maaf jika saya melakukan kesalahan. Setiap komentar dan koreksi sangat kami harapkan.

Transmisi
sumber
Juga, s=2*n+1daripada s=(n*2)+1dan w==s-h-1bukannya w==(s-h)-1akan membuat ini sedikit lebih pendek.
Alex A.
bagus, mungkin mencuri metode membangun string Anda. itu mengganggu saya bahwa LINQ lebih lama daripada untuk loop :(
Ewan
Saya telah menambahkan versi yang ungolfed :)
Transmisi
4

Ruby: 98 92 karakter

Proc yang mengembalikan string dengan Matahari.

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}

Contoh dijalankan:

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
manatwork
sumber
4

Karat, 215 karakter

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

Saya mencoba menggunakan metode pengiris string (dengan membuat string n-1spasi dan mengiris ke dan dari indeks) seperti:

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

Tapi itu sebenarnya 3 chars lebih lama.

Kode tidak dikunci:

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

Bagian yang saya suka adalah bagaimana saya mencukur beberapa karakter pada string format. Sebagai contoh,

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

setara dengan

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

karena "penambahan otomatis" untuk posisi argumen string format tidak terpengaruh oleh menentukan nomor secara manual, dan bertindak sepenuhnya independen.

Gagang pintu
sumber
4

Oktaf 85

Matriks bulding seperti biasa =) eyemenghasilkan matriks identitas, sisanya adalah cukup jelas.

m=(e=eye(2*(k=input('')+1)-1))*92+rot90(e)*47;m(:,k)='|';m(k,:)=45;m(k,k)='o';[m,'']
cacat
sumber
Masih dua byte lebih baik dari milik saya :( Saya sebenarnya mencoba sesuatu yang mirip dengan ini pada awalnya, tetapi tidak bisa mendapatkannya cukup kecil - saya tidak menyadari bahwa saya bisa melakukan "m (:, k) = '|'". Pengajuan yang bagus!
Oebele
4

IDL 8.3, 135 byte

Tak tahu apakah ini bisa dipukul lebih ... Ini sangat mudah. Pertama kita membuat m x marray ( m=2n+1) dari string kosong; kemudian, kita menarik karakter dalam baris ( y=x, y=-x, y=n, dan x=n). Kemudian kita menjatuhkan O pada titik (n, n), dan mencetak semuanya, diformat sebagai mstring dengan panjang 1 pada setiap baris sehingga tidak ada spasi tambahan dari mencetak array secara asli.

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

Uji:

IDL> s,4
\   |   /
 \  |  / 
  \ | /  
   \|/   
----O----
   /|\   
  / | \  
 /  |  \ 
/   |   \
Sirpercival
sumber
"Alih-alih sebuah program, Anda dapat menulis fungsi yang mengambil bilangan bulat. Fungsi tersebut harus mencetak desain matahari secara normal atau mengembalikannya sebagai string."
sirpercival
hahaha jangan khawatir :)
sirpercival
3

Matlab, 93 87 byte

Sayangnya fungsi header harus sangat besar ... Selain itu saya pikir golfnya cukup baik. Saya ingin tahu apakah itu dapat dilakukan dengan lebih baik dengan beberapa perbedaan sintaksis dalam Oktaf.

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 '']
Oebele
sumber
Anda bisa membuat program dengan N=input('')menyimpan 2 karakter. Selain itu Anda bisa menulis [E V D;H 79 H;D V E '']untuk mengubah seluruh matriks menjadi array char, yang akan menghemat satu atau dua byte lagi. (Saya baru saja mengirimkan program Oktaf dengan pendekatan yang sedikit berbeda, tetapi sebelum saya menemukan program Anda =)
flawr
Saya benar-benar memiliki jalur input pertama, tetapi untuk beberapa alasan saya keliru mengira itu tidak diizinkan ... Terima kasih atas tip lainnya!
Oebele
3

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 />');

nderscore
sumber
2

Pyth - 52 byte

Bagian yang sulit adalah mencari tahu cara mengganti garis miring untuk setiap sisi. Saya setuju untuk mendefinisikan lambda yang menggunakan simbol untuk digunakan.

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

Kemungkinan bisa bermain golf lebih banyak, penjelasannya segera hadir.

Cobalah online di sini .

Maltysen
sumber
2

Perl, 94

Ada banyak operator ternary bersarang di sini, tapi saya pikir kodenya cukup mudah.

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

Cobalah di sini: ideone.com/E8MC1d

lubang keras melengking
sumber
1
88B: for$x(-($n=<>)..$n){map{print$x^$_?$x+$_?$x?$_?$":'|':'-':'/':$x?'\\':O}-$n..$n;print$/}- Beberapa penyesuaian: konversi inner untuk memetakan dan ubah $ y menjadi $ _; sebaris ($n=<>).
alexander-brett
2

C # - 291 (program lengkap)

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
sumber
mengerjakannya !!
Ewan
1

JavaScript (ES6), 139 135 140 +1 byte

(+1 untuk -pbendera dengan simpul di konsol)

tetap:

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

pemakaian:

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");
}
royhowie
sumber
2
Tampaknya Anda kehilangan dua sinar.
Oh, sial, aku lupa menambahkannya kembali ...
royhowie
(A=Array).from(A(m))
Shmiddty
@MichaelT aku memperbaikinya, tapi aku pikir aku bisa bermain golf lagi
royhowie
@Shmiddty, terima kasih atas sarannya! yang menyelamatkan banyak karakter
royhowie
1

Python 3, 193 186 byte

Golf

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

Keluaran

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

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

Tidak disatukan

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
Zach Gates
sumber
1
Ada beberapa hal yang bisa dimainkan di sini, tetapi yang terbesar adalah argumen default Anda. s=' ',b='\\',f='/',d='|',g='-'adalah sangat panjang, sehingga Anda akan lebih baik bergerak dengan menambahkan s,b,f,d,g=" \/|-"ke baris kedua.
Sp3000
Maksud saya " \/|-"sebagai string tunggal, daripada membaginya menjadi karakter individu. Anda dapat membongkar dari string seperti x,y,z="123", yang membuat x="1", y="2"dan z="3".
Sp3000
Diedit lagi. Terima kasih @ Sp3000
Zach Gates
1

CJam, 59 55 byte

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

Ini tidak akan memenangkan penghargaan apa pun, tetapi saya cukup senang itu berhasil!

Terima kasih kepada Sp3000 untuk tips golf.

Claudiu
sumber
1
Kerja bagus! Berikut adalah beberapa tips: 1) Anda dapat menggunakan Salih-alih 'versi untuk ruang dan 2) Untuk '-A*'O'-Adapat Anda lakukan '-A*_'O\karena membuatnya dua kali lebih lama
Sp3000
1

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

Cobalah online di sini .

Tim
sumber
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

pemakaian:

irb(main):002:0> f(3)
\  |  /
 \ | /
  \|/
---O---
  /|\
 / | \
/  |  \
Tomáš Dundáček
sumber
1
Menerapkan beberapa trik lama: 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))}(Lihat Tips untuk bermain golf di Ruby untuk lebih banyak lagi.)
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

Tidak Disatukan:

# 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
alexander-brett
sumber
1

Prolog, 219 byte

Tidak, ini bukan bahasa golf. Tapi saya pikir situs ini membutuhkan lebih banyak 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).

Diuji dengan swipldi Linux. Memohon seperti: swipl -s asciiSun.prolog; lalu cari ukuran matahari yang Anda inginkan:

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

Tidak Disatukan:

 % 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).
DLosc
sumber
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``

Cobalah

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>

Shaggy
sumber