ขยาย ASCII Sun


43

เขียนโปรแกรมที่รับ (ผ่าน STDIN / บรรทัดคำสั่ง) จำนวนเต็มแบบไม่ลบ

เมื่อ N เป็น 0 โปรแกรมของคุณควรพิมพ์O(นั่นคือทุนโอ้ไม่ใช่ศูนย์)

เมื่อ N เป็น 1 โปรแกรมของคุณควรพิมพ์

\|/
-O-
/|\

เมื่อ N เป็น 2 โปรแกรมของคุณควรจะพิมพ์

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

เมื่อ N เป็น 3 โปรแกรมของคุณควรจะพิมพ์

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

สำหรับ N ที่ใหญ่กว่ารูปแบบนี้จะดำเนินต่อไปในลักษณะเดียวกัน แต่ละแปดรังสีของ "ดวงอาทิตย์" ควรจะทำจากเอ็นที่เหมาะสม-, |, /หรือ\ตัวอักษร

รายละเอียด

  • แทนที่จะเป็นโปรแกรมคุณอาจเขียนฟังก์ชั่นที่ใช้จำนวนเต็ม ฟังก์ชั่นควรพิมพ์การออกแบบของดวงอาทิตย์ตามปกติหรือส่งกลับเป็นสตริง
  • คุณต้อง

    • ไม่มีช่องว่างต่อท้ายเลยหรือ
    • มีช่องว่างต่อท้ายเพียงพอเพื่อให้รูปแบบเป็นรูปสี่เหลี่ยมผืนผ้าที่สมบูรณ์แบบ (2N + 1) * (2N + 1)
  • เอาต์พุตสำหรับ N ใด ๆ หรือทั้งหมดอาจมีทางเลือกขึ้นบรรทัดใหม่

เกณฑ์การให้คะแนน

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


ขึ้นบรรทัดใหม่ชั้นนำได้หรือไม่ N=0โดยเฉพาะอย่างยิ่งที่น่าสนใจสำหรับ
Jakube

@Jakube ไม่ตามท้ายเท่านั้น
งานอดิเรกของ Calvin

คำตอบ:


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 ... เฮ้!
bjb568

ฉันดีใจที่คุณไม่ได้รังเกียจ Ifs ประกอบไปด้วยเหล่านั้นบ้า!
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!

คะแนน +1 สำหรับการใช้-rพารามิเตอร์

เนื่องจากข้อ จำกัด sed เราต้องเขียนเกือบ 100 ไบต์เพียงแปลง N เป็นสตริงของช่องว่าง N สิ่งที่เหลือคือความสนุก

/^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:สร้างผลิตภัณฑ์ Descartes ของ 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 (if and only if) x=0และy=0
    • -xy เท่ากับ0iff x=yเช่นเราอยู่บนเส้นทแยงมุม
    • +x + y เท่ากับ0iff x=-yนั่นคือเราอยู่ในแนวต้าน
    • [x เท่ากับ0iff x=0เช่นเราอยู่ในแถวกลาง
    • ]y เท่ากับ0iff y=0นั่นคือเราอยู่ในคอลัมน์กลาง
  • 'O\/-|'#~0=เปรียบเทียบค่าคุณสมบัติข้างต้นเหล่านี้กับ0และนำiอักขระ th จากสตริง'O\/-|'หากiคุณสมบัติ th เป็นจริง

  • อักขระตัวแรกในสตริงผลลัพธ์จะเป็นอักขระที่เราต้องการเสมอหากมีสตริงว่างเราต้องการช่องว่าง
  • {. รับตัวอักษรตัวแรกของสตริงและหากไม่มีตัวอักษรก็จะคืนค่าช่องว่างเป็นช่องว่างภายในเมื่อเราต้องการ
  • ตอนนี้เรามีเมทริกซ์ที่แน่นอนที่เราต้องการดังนั้นเราจึงพิมพ์มันไปยัง stdout ทันที 1:echo

ลองออนไลน์ได้ที่นี่


5
นี่เป็นเวอร์ชั่นที่ไม่ดีไหม! บางครั้งฉันรู้สึกเหมือนโปรแกรมเมอร์โดยเฉลี่ยแล้วก็ด้วยเหตุผลบางอย่างที่ฉันลงเอยด้วย codegolf และดูสิ่งที่คุณดึงออกมาและไม่สามารถช่วย แต่รู้สึกเหมือนคนบ้า
JustSid

@ JustSid ดีข้อความไม่ได้ทันสมัยกับรหัส แต่ในทางเทคนิคฉันไม่เคยเขียนว่ารหัส ungolfed :)
randomra

มันยังคงเป็นสิ่งที่น่าประทับใจอย่างมาก
JustSid

2
@ JustSid ไม่ใช่ว่ามันจะน่าประทับใจน้อยกว่านี้ แต่ J code ก็ดูเหมือนจะเป็นเช่นนั้นและนี่เป็นความท้าทายที่จะเป็นภาษาที่ดี มันเป็นคำตอบที่น่าประทับใจมาก แต่ก็มีทุกอย่างใน 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":"";}}?>

นี่คือรหัส un-golfed ที่มีความคิดเห็น:

<?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 $n4. คุณไม่จำเป็นต้องใช้floorสำหรับ$x = floor($i%$e);เนื่องจากโมดูลัสในจำนวนเต็มจะไม่จำเป็นต้องลงโค้งมน
royhowie

@squeamishossifrage ฉันไม่เคยคิดเลย ขอบคุณสำหรับเคล็ดลับ!
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)

พิมพ์ทีละบรรทัด, การสร้างแต่ละบรรทัดโดยการตรวจสอบว่ามีการประสานงาน(i,j)(ศูนย์กลางที่(0,0)) ตอบสนองj==-i, j==0, j==iหรือไม่มีมีสับเพื่อให้การทำงานสายกลาง


ฉันคิดว่าคุณสามารถใช้Rแทน.5การบันทึก 1 ไบต์
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"

สิ่งนี้จะพิมพ์เครื่องหมายสแลชและขีดคั่นในหนึ่งวงจากนั้น plonks "O" ที่อยู่ตรงกลาง

เอาต์พุตใช้ 1, 2 และ 9

ป้อนคำอธิบายรูปภาพที่นี่


ผู้ใช้ที่ไม่ระบุชื่อแนะนำให้เปลี่ยน"-": NEXT y: PRINT AT s,s;"O"ไป"-";AT s,s;"O": NEXT yเพื่อประหยัดไบต์ที่สอง
Martin Ender

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>


สวย. ฉันควรคิดถึงการปิดเพื่อใช้งานปกติสำหรับลูป
nderscore

ฉันชอบอันนี้ ฉันลองเขียนโดยใช้สตริงและเข้าถึงดัชนีเฉพาะ แต่คุณสั้นกว่ามาก
royhowie

6

OS / 2 Classic Rexx, 102 ... หรือ 14 สำหรับ "cheater's version"

ถอด linefeeds ออกเพื่อ "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

เวอร์ชันของ Cheater ตั้งชื่อสคริปต์ว่าซอร์สโค้ดที่คุณต้องการมีอักขระไม่เกิน 255 ตัว (ต้องใช้ดิสก์ HPFS):

interpret '%0'

แก้ไข:เพื่อให้ชัดเจนรุ่นสิบแปดมงกุฎไม่ได้ตั้งใจที่จะนับ! มันแค่โง่และแสดงให้เห็นว่าสุนัขตัวเก่ายังคงสามารถเล่นกลได้ :)

เช่นเพื่อความสนุกและเกมที่แท้จริงการติดตั้งนิพจน์ "แลมบ์ดา" ในสไตล์ Java-8 / C11 บนตัววนซ้ำรายการ ไม่ได้ทดสอบ แต่ควรรันบนเมนเฟรมของ 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

- รหัสการโทรจะถือว่าคุณได้ทำสเต็ม (อาร์เรย์) ตามธรรมชาติแล้ว


สำหรับรุ่นสิบแปดมงกุฎคุณ: ถ้าชื่อไฟล์ของโปรแกรมไม่ได้โดยพลการจะต้องมีการรวมอยู่ในจำนวนไบต์
Martin Ender

ยุติธรรมพอสมควร เวอร์ชั่นของ Cheater ไม่ได้ตั้งใจอย่างจริงจังเลย! :) ... ซึ่งเป็นเหตุผลที่ฉันโพสต์คำตอบ "ของจริง" ที่ 102 มันเป็นเพียงเพราะความแปลกใหม่
lisa

@ ลิซ่ายกเว้นว่าไม่ใช่นิยายเลย;) นอกจากนี้มันจะทำลายสคริปต์กระดานผู้นำหากใช้ในการท้าทายนี้
เครื่องมือเพิ่มประสิทธิภาพ

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สร้าง String ผลลัพธ์โดยการ#จับคู่กับพิกัดทั้งหมดตั้งแต่ -n ถึง n

การใช้งาน:

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

คุณสามารถบันทึกไม่กี่ไบต์โดยใช้ผู้ประกอบการมัดแทนsเช่น0#0='O', 0#_='-'ฯลฯ และแทน1<2 True
nimi

อาจmap(i#)[-n..n]บันทึกสองไบต์
ลินน์

4

R, 177 149 ไบต์

มิกกี้ตันเป็นผู้ชาย! เขาช่วยฉันแก้ไขปัญหาที่ไม่ถูกต้องในตอนแรกและบันทึกได้ 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="")

คำอธิบาย Ungolfed +:

# 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

@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)+1และw==s-h-1มากกว่าw==(s-h)-1จะทำให้เรื่องนี้สั้นลงเล็กน้อย
Alex A.

ดีอาจขโมยวิธีสร้างสตริงของคุณ มันทำให้ฉันรำคาญที่ LINQ มีความยาวมากกว่าสำหรับลูป :(
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

เนื่องจาก "auto-incrementer" สำหรับตำแหน่งอาร์กิวเมนต์สตริงรูปแบบจะไม่ได้รับผลกระทบจากการระบุหมายเลขด้วยตนเองและทำงานอย่างอิสระโดยสมบูรณ์


4

ระดับแปดเสียง

การฝึกอบรม Bulding เช่นเคย =) 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

4

IDL 8.3, 135 ไบต์

Dunno ถ้านี่สามารถเล่นกอล์ฟได้มากกว่านี้ ... ก่อนอื่นเราจะสร้างm x mอาร์เรย์ ( m=2n+1) ของสตริงว่าง แล้วเราวาดตัวละครในสาย ( y=x, y=-x, y=nและx=n) จากนั้นเราก็ดรอป O ตรงจุด(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----
   /|\   
  / | \  
 /  |  \ 
/   |   \

"แทนที่จะเป็นโปรแกรมคุณอาจเขียนฟังก์ชันที่ใช้จำนวนเต็มฟังก์ชันควรพิมพ์การออกแบบของดวงอาทิตย์ตามปกติหรือคืนค่าเป็นสตริง"
sirpercival

ฮ่า ๆ ๆ ๆ ไม่ต้องกังวล :)
sirpercival

3

Matlab, 93 87 bytes

น่าเสียดายที่ส่วนหัวของฟังก์ชั่นนั้นใหญ่มาก ... นอกเหนือจากนั้นฉันคิดว่ามันค่อนข้างดี ฉันสงสัยว่ามันสามารถทำได้ดีกว่าด้วยความแตกต่างทางไวยากรณ์ใน 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 ซึ่งจะช่วยให้คุณประหยัดอีกไบต์หรือสอง (ผมเพิ่งส่งโปรแกรมคู่ด้วยวิธีการที่แตกต่างกันเล็กน้อย แต่ก่อนที่จะพบคุณ =)
flawr

จริง ๆ แล้วฉันมีอินพุตบรรทัดแรก แต่ด้วยเหตุผลบางอย่างฉันคิดว่ามันไม่ได้รับอนุญาต ... ขอบคุณสำหรับเคล็ดลับอื่น ๆ !
Oebele


2

Pyth - 52 ไบต์

ส่วนที่ยากคือการหาวิธีเปลี่ยนสแลชแต่ละด้าน ฉันตัดสินเพื่อกำหนดแลมบ์ดาที่ใช้สัญลักษณ์นี้

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$/}- ปรับแต่งสองสามอย่าง: แปลงด้านในเพื่อทำแผนที่และเปลี่ยน $ 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

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

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

2
คุณดูเหมือนจะหายไปสองรังสี

โอ้ยี้ฉันลืมที่จะเพิ่มกลับเข้าไปใน ...
royhowie

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

@MichaelT ฉันแก้ไข แต่ฉันคิดว่าฉันสามารถเล่นกอล์ฟได้มากกว่านี้
royhowie

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

Ungolfed

def f(n):
    s, b, e, d, g = ' \\/|-'
    p, r, i = '', int(n), 0
    while r:
        print(s*i + b + s*(r-1) + d + s*(r-1) + e)
        r -= 1
        i += 1
    print(g*n + 'O' + g*n)
    r += 1
    i = n-1
    while r < n+1:
        print(s*i + e + s*(r-1) + d + s*(r-1) + b)
        r += 1
        i -= 1

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

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

ลองออนไลน์ได้ที่นี่


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สำหรับบางอย่างเพิ่มเติม)
จัดการ

1

Perl 85 91 90 89 86B

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

Ungolfed:

# usage: echo 1|perl sun.pl

map {
    $_ = $r || O;  # no strict: o is "o". On the first run $r is not defined
    s/^|$/ /mg;    # overwriting $_ saves characters on these regexes
    s/ (-*O-*) /-$1-/;
    $r = "\\$s|$s/
$_
/$s|$s\\";         # Embedded newlines save 1B vs \n. On the first run $s is not defined.
    $s .= $"
} 1..<>;
say $r

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 .

Ungolfed:

 % Args to sym/4 are row, column, N and the character code to be output at that location.
sym(N,N,N,79).
sym(R,R,_,'\\').
sym(R,C,N,'/') :- R+C =:= 2*N.
sym(N,_,N,'-').
sym(_,N,N,'|').
sym(_,_,_,' ').

 % Args to putCols/3 are row, column, and N.
 % Recursively outputs the characters in row from col onward.
putCols(_,C,N) :- C > 2*N, nl.
putCols(R,C,N) :- sym(R,C,N,S), put_code(S), NextC is C+1, putCols(R,NextC,N).

 % Args to putRows/2 are row and N.
 % Recursively outputs the grid from row downward.
putRows(R,N) :- R > 2*N.
putRows(R,N) :- putCols(R,0,N), NextR is R+1, putRows(NextR,N).

putGrid(N) :- putRows(0,N).

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>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.