ASCII कला अष्टकोण


22

एक इनपुट पूर्णांक को देखते हुए n > 1, एक ASCII- कला अष्टकोण का निर्माण किया जाता है, जिसकी लंबाई nपात्रों से बनी होती है। नीचे दिए गए उदाहरण देखें:

n=2
 ##
#  #
#  #
 ##

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

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

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

and so on.

आप इसे STDOUT में प्रिंट कर सकते हैं या इसे फ़ंक्शन परिणाम के रूप में वापस कर सकते हैं।

विलुप्त हो रही व्हाट्सएप की कोई भी राशि स्वीकार्य है, इसलिए जब तक पात्र उचित रूप से पंक्तिबद्ध न हो जाएं।

नियम और आई / ओ

  • इनपुट और आउटपुट किसी भी सुविधाजनक विधि द्वारा दिया जा सकता है ।
  • आप #(स्थान को छोड़कर) किसी भी मुद्रण योग्य ASCII वर्ण का उपयोग कर सकते हैं , लेकिन "पृष्ठभूमि" वर्ण स्थान (ASCII वर्ण) होना चाहिए।
  • या तो एक पूर्ण कार्यक्रम या एक समारोह स्वीकार्य हैं।
  • मानक खामियों को मना किया जाता है।
  • यह इसलिए सभी सामान्य गोल्फिंग नियम लागू होते हैं, और सबसे छोटा कोड (बाइट्स में) जीतता है।

1
क्या हम अलग-अलग आउटपुट वर्णों का उपयोग कर सकते हैं, या क्या इसे सुसंगत बनाने की आवश्यकता है?
एमिगा

@Emigna अलग-अलग किरदार ठीक हैं।
AdmBorkBork

जवाबों:


22

05AB1E , 3 बाइट्स

7ÝΛ

इसे ऑनलाइन आज़माएं!

व्याख्या

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

05AB1E कैनवास को समझने के लिए यह उत्तर देखें ।


निश्चित रूप से यह 5 बाइट्स होना चाहिए? या क्या कोड गोल्फ चुनौतियां बाइट्स और पात्रों को विनिमेय के रूप में देखती हैं
डग


ओह बढ़िया! डॉक्स लिंक के लिए धन्यवाद!
डग

> :( डेमनिट, अदनान
एएससीआईआई-केवल

11

जावास्क्रिप्ट (ईएस 6), 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'

प्रत्येक वर्ण के लिए (एक्स,y) , हम गणना करते हैं (,v) :

=w/2-|एक्स-w/2|v=w/2-|y-w/2|

अष्टकोण से संबंधित कोशिकाएँ निम्नलिखित स्थितियों में से एक को संतुष्ट करती हैं:

  • ( =0 या v=0 ) और +vn' (में नीचे लाल)
  • +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)


Wow, this is awesome! I think h+vn can be simplified to h+v>n, although I'm not sure if that helps the golfing logic at all.
Giuseppe

@Giuseppe It could indeed be simplified that way if both conditions were tested. But in the code, the cases hv=0 and hv0 are separated. However, I'm actually testing the opposite condition (n>h+v), which already is 1 byte shorter.
Arnauld

@Giuseppe Your comment prompted me to have a closer look at the formula and I finally saved a byte by writing it a bit differently. :)
Arnauld

1
heh, well your comment about hv=0 prompted me to go look at my port of your logic and save another couple of bytes!
Giuseppe

8

Charcoal, 5 bytes

GH*N#

My first answer with Charcoal!

Explanation:

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

Try it online!


3
For those who prefer verbose Charcoal, that's PolygonHollow(:*, InputNumber(), "#");.
Neil

5

Canvas, 15 14 12 bytes

/⁸⇵╷+×+:⤢n╬┼

Try it here!

Explanation:

/             a diagonal of length n
 ⁸            the input,
  ⇵           ceiling divided by 2, (storing the remainder)
   ╷          minus one
    #×        repeat "#" that many times
      +       append that to the diagonal
       :⤢n    overlap that with its transpose
          ╬┼  quad-palindromize with the overlap being the remainder stored earlier

Alternative 12-byter.


4

R, 122 117 115 bytes

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

Try it online!

Ports the logic from Arnauld's answer, specifically this revision in case there are further improvements. Another 2 bytes saved thanks to Arnauld's suggestion of inverting the logic!


-2 bytes by doing it the other way around (I can't do h*v&h+v-n in JS because & is a bitwise operator; but it's a logical one in R, so that works).
Arnauld

@Arnauld thanks!
Giuseppe



3

Powershell, 91 bytes

param($n)($s=' '*--$n+'#'*$n+'#')
--$n..0+,0*$n+0..$n|%{' '*$_+"#$(' '*(3*$n-2*$_+2))#"}
$s

2

पॉवरशेल , 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

सी (क्लैंग) , -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

बैच, 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%%#

प्रत्येक पंक्ति में दो अग्रणी स्थान को आउटपुट करता है। स्पष्टीकरण: बैच में कोई स्ट्रिंग पुनरावृत्ति ऑपरेटर नहीं है, सीमित स्ट्रिंग टुकड़ा करने की क्षमता और अंकगणितीय प्रदर्शन करने के लिए अलग-अलग बयानों की आवश्यकता होती है। इसलिए यह रिक्त स्थान में इनपुट लंबाई की एक स्ट्रिंग बनाने के लिए गोल्फ का था (बैच कम से कम #ऊपर और नीचे की रेखाओं के लिए इनका अनुवाद कर सकता है ) और फिर तिरछे उत्पन्न करने के लिए 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

एपीएल (Dyalog यूनिकोड) , 46 बाइट्स SBCS

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

यह समाधान Adám द्वारा प्रदान किया गया था - धन्यवाद!

इसे ऑनलाइन आज़माएं!

मेरा (लगभग) मूल समाधान:

एपीएल (Dyalog यूनिकोड) , 61 बाइट्स SBCS

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

इसे ऑनलाइन आज़माएं!

उसकी मदद के लिए Adám को धन्यवाद!

विचार "हीरा" को खोजने के लिए है जो आंशिक रूप से वर्ग में स्थित है और ऑक्टागोन को "आउटलाइन" करने के लिए एक किनारे का पता लगाने वाला फ़िल्टर लागू करता है।



1
आप वास्तव में यहाँ क्लासिक का उपयोग नहीं कर सकते हैं । बल्कि मेटा के अनुसार SBCS को संदर्भित करके 1 बाइट / चार की गिनती करें ।
13

@ Adám धन्यवाद! मुझे नहीं पता कि हेडर को कैसे संपादित किया जाए, क्या आप इसे मेरे लिए कर सकते हैं?
गैलेन इवानोव

हेडर को एडिट करने से आपका क्या मतलब है?
एडम

1
यहां से संपादित करें और कॉपी करें
Adám

1

पर्ल 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 में आपका स्वागत है! आप शायद इस पोस्ट में पाए गए ट्रिक्स का उपयोग करके कुछ बाइट्स यहाँ और वहाँ शेव कर सकते हैं ।
मेगो

@ मेगो येप। मैं $"इसके बजाय का उपयोग करके 4 बाइट्स को बचाने में सक्षम था " "
नाथन मिल्स

1

पर्ल 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

ऊपर नाथन मिल्स के उत्तर के आधार पर (जो कि मेरे पास टिप्पणी करने के लिए अपर्याप्त प्रतिनिधि है!)।

$e$a-16 बाइट्स को बचाने के लिए सरलीकृत किया जा सकता है ; $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


1

सी (जीसीसी) , 158 153 150 बाइट्स

  • सहेजे गए पाँच करने के लिए आठ बाइट्स धन्यवाद ceilingcat
O,c,t,g;o(n){for(O=2*~-n,t=c=O+n;t--;puts(""))for(g=c;g--;)putchar(33-(!t|t>c-2?g<n-1|g>O:t<n-1|t>O?t+O-g&&t-O-g&&~c+g+t+n+n&&c-g-t+n-3+n:g&&g<c-1));}

इसे ऑनलाइन आज़माएं!


@ceilingcat धन्यवाद।
जोनाथन फ्रेच

@ceilingcat धन्यवाद।
जोनाथन फ्रीच


0

पर्ल 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

यह रेगेक्स के जादू से काम करता है। "अगर" को केवल n = 2 के पैथोलॉजिकल मामले से निपटने की आवश्यकता है, जो अन्यथा कुछ इस तरह से आउटपुट करता है:

 ##
 ##
#  #
 ##

शायद यह दूर कोडित किया जा सकता है।

मुझे लगता है कि मध्य बिंदु तक एक स्ट्रिंग बनाने के बाद और अधिक लाभ हो सकता है, फिर इसे उल्टा कर सकता है। यदि n विषम है (या पतले स्थान का उपयोग करें: 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


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.