ASCII आइसक्रीम


15

एक प्रोग्राम या फ़ंक्शन लिखें जो एक सकारात्मक पूर्णांक N में लेता है, और एक N × N ASCII कला स्ट्रिंग प्रिंट करता है या वापस करता है जिसका शीर्ष आधा अर्धवृत्त है (और जिसका निचला आधा नीचे की ओर इंगित त्रिकोण है, जो V's' से बना है। रिक्त स्थान का उपयोग पैडिंग के रूप में किया जाता है।

दूसरे शब्दों में, एक ASCII आइसक्रीम कोन बनाएं: (N = 17 के लिए आउटपुट)

      (((((      
    (((((((((    
  (((((((((((((  
  (((((((((((((  
 ((((((((((((((( 
 ((((((((((((((( 
(((((((((((((((((
(((((((((((((((((
VVVVVVVVVVVVVVVVV
 VVVVVVVVVVVVVVV 
  VVVVVVVVVVVVV  
   VVVVVVVVVVV   
    VVVVVVVVV    
     VVVVVVV     
      VVVVV      
       VVV       
        V        

उदाहरण

यहां एन = 1 से 5. के लिए आउटपुट हैं। ध्यान दें कि विषम एन के लिए, त्रिकोण हमेशा बड़ा आधा होना चाहिए।

V

((
VV

(((
VVV
 V 

 (( 
((((
VVVV
 VV 

 ((( 
(((((
VVVVV
 VVV 
  V  

यहाँ एक एन = 101 पास्टबिन है।

और यहाँ एक अनगढ़ भेड़िया 3 संदर्भ कार्यान्वयन है:

N = int(input())
ic = [[' '] * N for _ in range(N)]
for y in range(N//2):
    for x in range(N):
        if (x - (N - 1) / 2)**2 + (y - (N - 1) / 2)**2 < (N / 2)**2:
            ic[y][x] = '('
for y in range(N//2, N):
    for x in range(y - N//2, N - (y - N//2)):
        ic[y][x] = 'V'
for line in ic:
    print(''.join(line))

विवरण

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

स्कोरिंग

बाइट्स में सबसे कम सबमिशन जीतता है। टाईब्रेकर सबसे पुराने सबमिशन में जाता है।


6
क्या मैं केवल वही हूं जिसने शीर्षक पढ़ते समय "IceCII ASCream" सोचा था?
Sp3000

15
@ Sp3000 Jeez, मुझे आशा है कि ...
केल्विन के शौक

जवाबों:


7

सीजेएम, 46 बाइट्स

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

{:Z{Z{Z(2./:R-zYR<):P#YR-zP#+Z2./P#>SP?}/N}fY}

मेरा मानना ​​है कि यह वर्तमान में मूल विनिर्देश की बिल्कुल नकल करता है, जब मुझे इस उत्तर का उत्पादन शुरू करना आवश्यक था। गणित को मूल विनिर्देश से कम सटीक बनाकर कुछ बाइट्स को बचाने की क्षमता हो सकती है, लेकिन जब तक मुझे ऐसा करने में एक या दो से अधिक बाइट्स को बचाने का तरीका नहीं दिखता, तब तक मैं इसे छोड़ दूँगा।

व्याख्या

{               "Begin block";
  :Z{             "For each y from 0 to input-1";
    Z{              "For each x from 0 to input-1";
      Z(2./:R         "Calculate the radius as (input-1)/2.0";
      -z              "Calculate the horizontal distance from the center";
      YR<):P          "Calculate the power to raise distances to: (y<radius)+1
                       (This results in Euclidean distance being calculated for
                        the ice cream and Manhattan distance being calculated
                        for the cone)";
      #               "Raise the horizontal distance to the determined power";
      YR-zP#          "Calculate the vertical distance from the center and
                       raise it to the determined power";
      +               "Add the horizontal and vertical distances";
      Z2./P#          "Calculate the solid distance threshold and raise it to
                       the determined power";
      >SP?            "If the solid threshold is exceeded, produce a space;
                       otherwise, produce the determined power digit
                       (This results in ice cream being represented by the
                        digit '2' and the cone by the digit '1')";
    }/              "End x loop";
    N               "Produce a new line";
  }fY             "End y loop";
}               "End block";

यह प्रकट होता है उपयोग करने के लिए 2की और 1'के स्थान पर एस (के और Vकी?
मार्क रीड

@MarkReed इसकी अनुमति है। विवरण अनुभाग में अंतिम पंक्ति।
जकुबे

3

inca2 129 123 121 111 107

यह ज्यादातर अजगर उदाहरण से सूत्र का उपयोग करता है, लेकिन डबल-लूपिंग के बजाय जोट-डॉट्स और इओटास का उपयोग करता है। iफ़ंक्शन उस फ़ंक्शन के लिए परिपत्र परीक्षण jकरता है जो उस पर jot-dot को आमंत्रित करता है। और kफ़ंक्शन फ़ंक्शन के लिए त्रिकोण परीक्षण lकरता है। cसमारोह के परिणामों catenates jऔर lऔर एन × एन करने के लिए इसे नया स्वरूप दे।

संपादित करें: -6 2 मानचित्रों को 1 में मिलाएं।
संपादित करें: -2 बेकार की तरंगों को हटा दें।
संपादित करें: अच्छे टाइपस्क्रिप्ट।
संपादित करें: -10 दोहराया अभिव्यक्ति सरणी-वार लागू करें
संपादित करें: -4 कारक एक समारोह के रूप में दोहराया अभिव्यक्ति।
संपादित करें: लाइन-बाय-लाइन टिप्पणी।

q:y-(n-1)%2
i:[((n%2)^2)>+/(qx y)^2
j:(~[y%2)i.(~y)
k:2*[x>[|qy
l:(@1+~]y%2)k.(~y)
c:y y#((jn<y),ly){' (V' 

अधिक विस्तार से, प्रवेश-बिंदु वह cकार्य है जो एक तर्क को नामांकित रूप से लेता है y

c:y y#((jn<y),ly){' (V' 
         n<y            } assign y to 'n'
        jn<y            } call j(y)
              ly        } call l(y)
      ((    ),  )       } catenate the results
      (         ){' (V' } map 0 1 2 to ' ' '(' 'V'
  y y#                  } reshape to NxN

jसमारोह इसके रूप में एक ही इनपुट मूल्य प्राप्त करता है yपैरामीटर।

j:(~[y%2)i.(~y)
     y%2         } y divided by 2
    [            } floor
   ~             } iota. this generates the row indices 0..y/2
            ~y   } iota y. this generates the column indices 0..y
  (     )i.(  )  } jot-dot with the function i

यहाँ jot-dot डबल-लूप करता है। यह iफ़ंक्शन को बाएं और दाएं सरणियों (0..n / 2 और 0..n) से तत्वों के हर संयोजन के साथ बुलाता है। इसलिए iफ़ंक्शन तालिका xके y इंडेक्स के रूप yमें प्राप्त करता है, और यह x इंडेक्स के रूप में प्राप्त करता है । नाम यहाँ थोड़ा पीछे की ओर मिला :)।

i:[((n%2)^2)>+/(qx y)^2
     n%2                 } n divided by 2
    (n%2)^2              } squared
                 x y     } make a 2-element array (x,y)
                qx y     } call q on this array

कहाँ qकरता है

q:y-(n-1)%2
     n-1    } n minus 1
         %2 } divided by 2
  y-        } y minus that

वापस i

i:[((n%2)^2)>+/(qx y)^2
               (    )^2  } square the result from q(x,y)
             +/          } sum the two numbers
            >            } compare the left side (above) with the right (=> 0/1)
  [                      } floor

फर्श आवश्यक नहीं होना चाहिए। लेकिन जाहिरा तौर पर दुभाषिया में एक बग है।

lसमारोह की तरह ही काम करता है jसमारोह, एक जोत-डॉट के प्रयोग से।

l:(@1+~]y%2)k.(~y)
        y%2         } y divided by 2
       ]            } ceiling
      ~             } iota 0..ceil(y/2)-1
    1+              } add 1 => 1..ceil(y/2)
   @                } reverse => ceil(y/2)..1
               ~y   } iota y  0..y-1
  (        )k.(  )  } jot-dot using k

kसमारोह एक बूलियन 2 से बढ़ाया पैदावार इतनी मूल्यों पर बाद में आइसक्रीम मूल्यों से प्रतिष्ठित किया जा सकता मानचित्रण में,।

k:2*[x>[|qy
     x       } k's left arg
         qy  } y-(n-1)%2
        |    } abs
       [     } floor
     x       } left-hand-side again
      >      } compare 
    [        } floor (should be unnecessary)
  2*         } scale by 2

कार्रवाई में ( trटैब वर्णों को हटाने के लिए पाइपिंग जो REPL के संकेत हैं):

josh@Z1 ~/inca
$ ./inca2 <icecream | tr -d '\t'

c1
V

c2
((
VV

c3
(((
VVV
 V 

c4
 (( 
((((
VVVV
 VV 

c5
 ((( 
(((((
VVVVV
 VVV 
  V  

josh@Z1 ~/inca
$ 

2

अजगर 2, 193 192

केवल गणित का उपयोग नहीं करता है

N=input()
R=(N+1)/2;r=range(R)
s=lambda L,U:(10**U-10**L)/9
f=lambda N,m:s(0,N)+s(m,N-m)
g=lambda N,m:s(0,N)+s(m,N-m)*6
for i in r[1:]:print f(N,int(R-(2*R*i-i*i)**.5))
for i in r:print g(N,i)

s(L,U)कई प्रकार के फॉर्म लौटाता है " U-डिजाइट्स को सबसे सही Lशून्य के साथ और बाकी लोगों को"
f(N,m)एन-डिजिट नंबर देता है, जिसमें आंतरिक भाग के साथ एक एन-नंबर होता है 2और 1हर तरफ एक एम-वाइड बॉर्डर
g(N,m)भी ऐसा ही करता है, लेकिन 7'कलर' के लिए उपयोग करना आंतरिक भाग के बाद से यह शंकु की बनावट से अधिक निकटता से मेल खाता है

उत्पादन

N=8         N=9
11122111    112222211
12222221    122222221
22222222    222222222
22222222    222222222
77777777    777777777
17777771    177777771
11777711    117777711
11177111    111777111
            111171111

यह करने के लिए बहुत ही अनोखा तरीका :)
केल्विन के

यदि केवल हम आइसक्रीम भी देख सकते हैं: P
ऑप्टिमाइज़र

2

पर्ल 6, 175

बहुत अधिक गोल्फिंग के बिना सुंदर सीधा कार्यान्वयन, बस विलुप्त व्हाट्सएप / विराम चिह्न उन्मूलन:

sub MAIN($d){my$r=($d/2).Int;for 1..$r ->$n
{my$y=$n-$r;my$h=sqrt($r*$r-$y*$y).Int;my$w=2*$h+$d%2;say
' 'x($r-$h)~'('x$w};for 1..($d-$r) ->$y {say ' 'x($y-1)~'V'x($d-2*$y+2)}}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.