รูปแปดเหลี่ยมศิลปะ ASCII


22

รับค่าอินพุทจำนวนเต็มn > 1ส่งออกรูปแปดเหลี่ยม ASCII-art ที่มีความยาวด้านข้างประกอบด้วยnอักขระ ดูตัวอย่างด้านล่าง:

n=2
 ##
#  #
#  #
 ##

n=3
  ###
 #   #
#     #
#     #
#     #
 #   #
  ###

n=4
   ####
  #    #
 #      #
#        #
#        #
#        #
#        #
 #      #
  #    #
   ####

n=5
    #####
   #     #
  #       #
 #         #
#           #
#           #
#           #
#           #
#           #
 #         #
  #       #
   #     #
    #####

and so on.

คุณสามารถพิมพ์ไปที่ STDOUT หรือส่งคืนเป็นผลลัพธ์ของฟังก์ชัน

สามารถยอมรับช่องว่างที่ไม่เกี่ยวข้องใด ๆ ได้ตราบใดที่อักขระมีการจัดเรียงอย่างเหมาะสม

กฎและ I / O

  • อินพุตและเอาต์พุตสามารถกำหนดได้โดย วิธีการที่สะดวกใด
  • คุณสามารถใช้อักขระ ASCII ที่พิมพ์ได้ใด ๆ แทนการ # (ยกเว้นช่องว่าง) แต่อักขระ "พื้นหลัง" ต้องเป็นช่องว่าง (ASCII 32)
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการเล่นกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

1
เราสามารถใช้อักขระเอาต์พุตอื่นหรือต้องสอดคล้องกันได้หรือไม่
Emigna

@Emigna อักขระที่ต่างกันก็ใช้ได้
AdmBorkBork

1
ที่เกี่ยวข้องค่อนข้าง
Charlie

คำตอบ:


22

05AB1E , 3 ไบต์

7ÝΛ

ลองออนไลน์!

คำอธิบาย

      # implicit input as length
      # implicit input as string to print
7Ý    # range [0...7] as directions
  Λ   # canvas print

ดูคำตอบนี้เพื่อทำความเข้าใจผืนผ้าใบ 05AB1E


แน่นอนนี่ควรเป็น 5 ไบต์? หรือทำสิ่งที่ท้าทายรหัสกอล์ฟดูไบต์และตัวอักษรแทนกัน
ดั๊ก

3
@Doug: มันคือ 3 ไบต์ในหน้ารหัสของ
05ab1e

โอ้เยี่ยมเลย! ขอบคุณสำหรับลิงค์เอกสาร!
Doug


11

JavaScript (ES6), 114 106 105 104 103 ไบต์

n=>(g=x=>v=x*2>w?w-x:x,F=x=>~y?`# 
`[~x?(h=g(x--))*g(y)>0&h+v!=n|n>h+v:(y--,x=w,2)]+F(x):'')(y=w=--n*3)

ลองออนไลน์!

อย่างไร?

สิ่งนี้จะสร้างอักขระเอาต์พุตโดยอักขระ

รับอินพุตnเราคำนวณ:

n'=n-1W=3n'

สำหรับอักขระแต่ละตัวที่(x,Y)เราคำนวณ(ชั่วโมง,โวลต์) :

ชั่วโมง=W/2-|x-W/2|โวลต์=W/2-|Y-W/2|

เซลล์ที่อยู่ในรูปแปดเหลี่ยมเป็นไปตามเงื่อนไขข้อใดข้อหนึ่งต่อไปนี้:

  • ( ชั่วโมง=0 OR โวลต์=0 ) และชั่วโมง+โวลต์n' (สีแดงด้านล่าง)
  • h+v=n (สีส้มด้านล่าง)

ตัวอย่างเช่นด้วยn=4 (และn=3 ):

(0,0)(1,0)(2,0)(3,0)(4,0)(4,0)(3,0)(2,0)(1,0)(0,0)(0,1)(1,1)(2,1)(3,1)(4,1)(4,1)(3,1)(2,1)(1,1)(0,1)(0,2)(1,2)(2,2)(3,2)(4,2)(4,2)(3,2)(2,2)(1,2)(0,2)(0,3)(1,3)(2,3)(3,3)(4,3)(4,3)(3,3)(2,3)(1,3)(0,3)(0,4)(1,4)(2,4)(3,4)(4,4)(4,4)(3,4)(2,4)(1,4)(0,4)(0,4)(1,4)(2,4)(3,4)(4,4)(4,4)(3,4)(2,4)(1,4)(0,4)(0,3)(1,3)(2,3)(3,3)(4,3)(4,3)(3,3)(2,3)(1,3)(0,3)(0,2)(1,2)(2,2)(3,2)(4,2)(4,2)(3,2)(2,2)(1,2)(0,2)(0,1)(1,1)(2,1)(3,1)(4,1)(4,1)(3,1)(2,1)(1,1)(0,1)(0,0)(1,0)(2,0)(3,0)(4,0)(4,0)(3,0)(2,0)(1,0)(0,0)


ว้าวนี่มันยอดเยี่ยมมาก! ฉันคิดว่าสามารถทำให้เป็นh + v > n ′ ได้ง่ายขึ้นถึงแม้ว่าฉันไม่แน่ใจว่าจะช่วยให้ตรรกะการเล่นกอล์ฟได้ทั้งหมดหรือไม่ ชั่วโมง+โวลต์n'ชั่วโมง+โวลต์>n'
Giuseppe

@Giuseppe มันอาจจะง่ายกว่านี้หากมีการทดสอบเงื่อนไขทั้งสอง แต่ในรหัสกรณีและh v 0จะถูกแยกออก อย่างไรก็ตามฉันกำลังทดสอบเงื่อนไขที่ตรงกันข้าม ( n > h + v ) ซึ่งสั้นกว่า 1 ไบต์อยู่แล้ว ชั่วโมงโวลต์=0ชั่วโมงโวลต์0n'>ชั่วโมง+โวลต์
Arnauld

@Giuseppe ความคิดเห็นของคุณทำให้ฉันมองใกล้สูตรและในที่สุดฉันก็บันทึกไบต์โดยการเขียนมันแตกต่างกันเล็กน้อย :)
Arnauld

1
ดีความคิดเห็นของคุณเกี่ยวกับแจ้งให้ฉันไปดูพอร์ตตรรกะของคุณและบันทึกอีกสองสามไบต์! ชั่วโมงโวลต์=0
Giuseppe

8

ถ่าน 5 ไบต์

GH*N#

คำตอบแรกของฉันกับ Charcoal!

คำอธิบาย:

GH*N#      //Full program
GH          //Draw a hollow polygon
   *         //with 8 sides
    N       //of side length from input
      #      //using '#' character

ลองออนไลน์!


3
สำหรับผู้ที่ชอบ verbose ถ่าน, PolygonHollow(:*, InputNumber(), "#");ว่า
Neil


4

R , 122 117 115 ไบต์

function(n){n=n-1
m=matrix(0,y<-3*n+1,y)
v=t(h<-(w=3*n/2)-abs(row(m)-1-w))
m[h*v&h+v-n|h+v<n]=' '
write(m,1,y,,"")}

ลองออนไลน์!

พอร์ตตรรกะจากคำตอบของ Arnauldโดยเฉพาะการแก้ไขนี้ในกรณีที่มีการปรับปรุงเพิ่มเติม อีก 2 ไบต์บันทึกไว้ขอบคุณคำแนะนำของ Arnauld ในการแปลงตรรกะ!


-2 ไบต์โดยวิธีอื่น ๆ (ฉันไม่สามารถทำได้h*v&h+v-nใน JS เพราะ&เป็นตัวดำเนินการระดับบิต แต่เป็นตรรกะใน R ดังนั้นจึงใช้งานได้)
Arnauld

@Arnauld ขอบคุณ!
Giuseppe




2

PowerShell , 107 97 ไบต์

param($n)($z=$n-1)..1+,0*$n+1..$z|%{" "*$_+"#"+($x=" "*($z-$_))+(" ","#")[!($_-$z)]*($n-2)+"$x#"}

ลองออนไลน์!

หากมีวิธีที่ถูกในการกลับครึ่งแรกคำตอบนี้จะรู้สึกดีขึ้นมาก มันสร้างครึ่งซ้ายจากนั้นแกน (ซึ่งก็คือ x#'sหรือช่องว่าง) จากนั้นสะท้อนตรรกะของด้านซ้ายเพื่อทำให้ถูกต้อง สนุกจริง ๆ คุณไม่จำเป็นต้องคัดลอกพื้นที่สีขาวต่อท้าย

ไม่ได้ควบคุมและอธิบาย:

param($n)
($z=$n-1)..1 + ,0*$n + 1..$z |%{  #Range that repeats 0 n times in the middle
" "*$_ + "#" +($x=" "*($z-$_)) +  #Left side
(" ","#")[!($_-$z)]*($n-2) +      #Core that swaps when it's the first or last row
"$x#"}                            #Right side which is left but backwards

2

C (เสียงดังกราว) , -DP=printf( -DF=for(i + 179 = 199 180 ไบต์

i;*m="%*s%*s\n";g(n){P"%*s",n,H;F;--i;)P H;P"\n");}f(n){g(n);F;--i;)P m,i,(H,3*n-i+~i,H;F-2;i--;)P"#%*s\n",3*n-3,H;F;--i;)P m,n-i,(H,n+i+i-1,H;g(n);}

ลองออนไลน์!

Ungolfed:

f(n){
	int i;
	printf("%*d",n,0);
	for(i=0;i<n-1;i++){
		printf("0");
	}
	printf("\n");
	for(i=1;i<n;i++){
		printf("%*d%*d\n",n-i,0,n+i+i-1,0);
	}
	for(i=0;i<n-2;i++){
		printf("0%*d\n",n+n+n-3,0);
	}
	for(i=n-1;i>0;i--){
		printf("%*d%*d\n",n-i,0,n+i+i-1,0);
	}
	printf("%*d",n,0);
	for(i=0;i<n-1;i++){
		printf("0");
	}
}

-19 ไบต์ขอบคุณ @ceilingcat



1

Python 2 , 130 ไบต์

def f(n):
 a=[' '*~-n+n*'#']
 b=[' '*(n-i-2)+'#'+' '*(n+2*i) +'#'for i in range(n-2)]
 return a+b+['#%*s'%(3*n-3,'#')]*n+b[::-1]+a

ลองออนไลน์!

บนมือถือดังนั้นไม่ต้องตีกอล์ฟอย่างไม่น่าเชื่อ


(n+2*i)คุณสามารถลบพื้นที่หลัง
Zacharý

1

แบตช์ 260 ไบต์

@echo off
set s=
for /l %%i in (1,1,%1)do call set s= %%s%%
echo %s% %s: =#%
call:c %1,-1,3
for /l %%i in (1,1,%1)do echo   #%s:~2%%s%%s:~2%#
call:c 3,1,%1
echo %s% %s: =#%
exit/b
:c
for /l %%i in (%*)do call echo %%s:~,%%i%%#%%s:~%%i%%%s%%%s:~%%i%%#

เอาต์พุตช่องว่างนำหน้าสองช่องในแต่ละบรรทัด คำอธิบาย: แบทช์ไม่มีโอเปอเรเตอร์การทำซ้ำสตริงความสามารถในการแบ่งสตริงที่ จำกัด และต้องการคำสั่งแยกต่างหากเพื่อดำเนินการทางคณิตศาสตร์ ดังนั้นจึงเป็นการง่ายที่สุดที่จะสร้างสตริงของความยาวอินพุตในช่องว่าง (อย่างน้อยแบทช์สามารถแปลสิ่งเหล่านี้เป็น#s สำหรับบรรทัดด้านบนและด้านล่าง) แล้วหั่นจากหรือไปยังตำแหน่งเฉพาะตั้งแต่ 3 ถึงความยาวเพื่อสร้างเส้นทแยงมุม (นี่คือสิ่งที่บรรทัดสุดท้ายของสคริปต์ประสบความสำเร็จ)



1

สีแดง 171 ไบต์

func[n][c:(a: n - 1)* 2 + n
b: collect[loop c[keep pad/left copy"^/"c + 1]]s: 1x1 s/1: n
foreach i[1x0 1 0x1 -1x1 -1x0 -1 0x-1 1x-1][loop a[b/(s/2)/(s/1): #"#"s: s + i]]b]

ลองออนไลน์!

คำอธิบาย:

Red[]
f: func [ n ] [
    a: n - 1                                         ; size - 1
    c: a * 2 + n                                     ; total size of widht / height 
    b: collect [                                     ; create a block
        loop c [                                     ; composed of size - 1 rows
            keep pad/left copy "^/" c + 1            ; of empty lines of size c (and a newline)
        ]
    ]
    s: a * 1x0 + 1                                   ; starting coordinate
    foreach i [ 1x0 1 0x1 -1x1 -1x0 -1 0x-1 1x-1 ] [ ; for each offset for the 8 directions
        loop a [                                     ; repeat n - 1 times  
            b/(s/2)/(s/1): #"#"                      ; set the array at current coordinate to "#"
            s: s + i                                 ; next coordinate
        ]        
    ]
    b                                                ; return the block 
]

1

APL (Dyalog Unicode) , 46 ไบต์SBCS

(' '@~5 6∊⍨1⊥⊢∘,)⌺3 3⊢<(⍉⌽⌊⊢)⍣2∘(∘.+⍨∘⍳¯2+3×⊢)

โซลูชันนี้จัดหาให้โดยAdám - ขอบคุณ!

ลองออนไลน์!

โซลูชันดั้งเดิมของฉัน (เกือบ):

APL (Dyalog Unicode) , 61 ไบต์SBCS

(((⊃∘' #'¨1+5∘=+6∘=)⊢)1⊥⊢∘,)⌺3 3⊢<(((⊖⌊⊢)⌽⌊⊢)(∘.+⍨(⍳¯2+3×⊢)))

ลองออนไลน์!

ขอบคุณAdámสำหรับความช่วยเหลือของเขา!

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



1
คุณไม่สามารถใช้งานจริงคลาสสิกที่นี่เพราะ แต่นับ 1 ไบต์ / ถ่านโดยอ้างถึงSBCSตามMeta
Adám

@ Adámขอบคุณ! ฉันไม่รู้วิธีแก้ไขส่วนหัวคุณช่วยฉันได้ไหม
Galen Ivanov

คุณหมายถึงอะไรโดยการแก้ไขส่วนหัว
Adám

1
แก้ไขและสำเนาจากที่นี่
อดัม

1

Perl 5, 201 197 188 187 186 ไบต์:

$a=<>;$b=3*$a-4;$c='$"x($e-$_)."#".$"x$f."#\n"';$e=($b-$a)/2+1;$d=$"x$e."#"x$a.$/;$f=$a;print$d,(map{(eval$c,$f+=2)[0]}1..$a-2),("#".$"x$b."#\n")x$a,(map{$f-=2;eval$c}reverse 1..$a-2),$d

ลองออนไลน์!

STDINอ่านขนาดของรูปแปดเหลี่ยมจากบรรทัดแรกของ


ยินดีต้อนรับสู่ PPCG! คุณสามารถโกนทิ้งไปได้สองสามไบต์ที่นี่และใช้เทคนิคที่พบในโพสต์นี้
Mego

@Mego Yep ผมสามารถที่จะบันทึก 4 ไบต์โดยใช้แทน$" " "
Nathan Mills

1

Perl 5, 176 ไบต์

$f=$a=<>;$b=3*$a-4;$c='$"x($e-$_)."#".$"x$f."#\n"';$e=$a-1;$d=$"x$e."#"x$a.$/;print$d,(map{(eval$c,$f+=2)[0]}1..$a-2),("#".$"x$b."#\n")x$a,(map{$f-=2;eval$c}reverse 1..$a-2),$d

ตามคำตอบของ Nathan Mills ข้างต้น (ซึ่งฉันมีตัวแทนไม่เพียงพอในการแสดงความคิดเห็น!)

$eสามารถทำให้ง่ายขึ้นเพื่อ$a-1ประหยัด 6 ไบต์; $fสามารถมอบหมายโซ่ ประหยัดสองไบต์ ไม่แน่ใจว่าอีกสองคนมาจากไหน!

ในขณะที่$eสามารถแทนที่ด้วย$a-1ในสองสถานที่มันเกิดขึ้นวงเล็บพิเศษที่จำเป็นหมายถึงการนี

Ungolfed:

$f = $a = <>;
$b = 3 * $a - 4;
$c = '$"x($e-$_)."#".$"x$f."#\n"';
$e = $a - 1;
$d = $" x $e . "#" x $a . $/;
print $d, ( map { ( eval $c, $f += 2 )[0] } 1 .. $a - 2 ),
  ( "#" . $" x $b . "#\n" ) x $a,
  ( map { $f -= 2; eval $c } reverse 1 .. $a - 2 ), $d




0

Perl 5, 170 168 166 ไบต์

$a=<>-1;$\="#\n";print$x=$_=$"x$a."#"x$a;if(s/^( *)  #*/$1 #  $1 /){print}while (s/ #/#  /){print}$z=$_;for(1..$a){print$_=$z}while(s/#  (\s{$a})/ #$1/){print}print$x

มันทำงานได้ด้วยเวทมนตร์ของ regex "if" จำเป็นต้องใช้เพื่อจัดการกับกรณีทางพยาธิวิทยาของ n = 2 ซึ่งจะแสดงผลลัพธ์ดังนี้:

 ##
 ##
#  #
 ##

อาจเป็นรหัสนี้

ฉันคิดว่าอาจมีอีกมากที่จะได้รับจากการสร้างสตริงจนถึงจุดกึ่งกลางจากนั้นกลับรายการ แน่นอนว่าเราต้องแทรก / ลบช่องว่างถ้า n เป็นเลขคี่ (หรือใช้ thin-space: p)

Ungolfed

$a = <> -1;                          # Subtracting one is very useful! 
$\ = "#\n";                          # Every line ends with a '#' let perl provide.  
$x=$_ = " " x $a. "#" x $a;          # The horiz line (one short)  
print;                               # print it plus the extra #
if(s/^( *)  #*/$1 #  $1 /){print}    # create a hole and remove a leading space(if n=2 this fails)
while (s/ #/#  /){                   # make the hole bigger      
    print;                           # and print (with a trailing #)
}
$z=$_;                               # store $_ for later use
for (1 .. $a) {                      # nice that we don't have to do 2..$a but not golf-nice  
  $_ =$z;                            # restore $_ (we could use $z but since we have
  print;                             # to restore somewhere, doing  it here saves us bytes)
}
while (s/#  (\s{$a})/ #$1/){         # now move the # to the right and reduce the trailing spaces  
  print;
}
print $x;                            # and finish...

ฉันคิดว่านี่น่าจะเป็นสนามกอล์ฟอีกเล็กน้อยนอกเหนือจากการเปลี่ยนแปลงที่สำคัญเช่นการผลักดัน$@และการพิมพ์ในตอนท้าย

[เว้นวรรครอบกอล์ฟ..และย้ายการพิมพ์ก่อนกำหนดในสองกรณีประหยัดเป็นอัฒภาค]


บันทึกแล้ว 20 ไบต์เรียงลำดับคำสั่งใหม่TIOทำไม\sและไม่ใช่แค่ช่องว่างใน regex ล่าสุด
Nahuel Fouilleul


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