आलू को छील लें


20

यह एक आलू है:

  @@
 @@@@
@@@@@@
@@@@@@
 @@@@
  @@

अधिक आम तौर पर, एक आकार एन आलू को निम्नलिखित आकार के रूप में परिभाषित किया गया है:

यदि N सम है, तो यह 2 केन्द्रित @प्रतीक है, उसके बाद 4 केन्द्रित @प्रतीक, उसके बाद 6 केन्द्रित @प्रतीक, सभी तरह से N केन्द्रित @चिन्ह है; फिर, एन केंद्रित @प्रतीकों, एन -2 केंद्रित @प्रतीकों के बाद, सभी तरह से नीचे 2.
यदि एन विषम है, तो आकार एन आलू एक ही तरीके से ऊपर वर्णित के रूप में उत्पन्न होता है, लेकिन हम @2 के बजाय 1 प्रतीक से शुरू करते हैं ।

शीर्ष दाएं कोने में शुरू करके आलू को छील दिया जाता है, और @प्रत्येक कदम पर एक चिह्न हटाकर , एक वामावर्त फैशन में जा रहा है। उदाहरण के लिए, आकार -3 आलू को छीलना इस तरह दिखता है:

 @
@@@
@@@
 @

​
@@@
@@@
 @

 ​
 @@
@@@
 @

  ​
 @@
 @@
 @

 ​
 @@
 @@
 ​

 ​
 @@
 @
 ​

​
 @
 @
 ​

 ​
​
 @
 ​


चुनौती

एक प्रोग्राम लिखें, जो, पूर्णांक इनपुट दिया जाता है, उस आकार के आलू को छीलने के सभी चरणों को प्रदर्शित करता है।
अनुगामी व्हॉट्सएप / नईलाइनों की अनुमति है।

स्कोरिंग

यह ; बाइट्स में सबसे छोटा कोड जीतता है।


नमूना परीक्षण मामले

एन = 2

@@
@@

@
@@


@@


 @



एन = 7

   @   
  @@@  
 @@@@@ 
@@@@@@@
@@@@@@@
 @@@@@ 
  @@@  
   @   


  @@@  
 @@@@@ 
@@@@@@@
@@@@@@@
 @@@@@ 
  @@@  
   @   


   @@  
 @@@@@ 
@@@@@@@
@@@@@@@
 @@@@@ 
  @@@  
   @   


   @@  
  @@@@ 
@@@@@@@
@@@@@@@
 @@@@@ 
  @@@  
   @   


   @@  
  @@@@ 
 @@@@@@
@@@@@@@
 @@@@@ 
  @@@  
   @   


   @@  
  @@@@ 
 @@@@@@
 @@@@@@
 @@@@@ 
  @@@  
   @   


   @@  
  @@@@ 
 @@@@@@
 @@@@@@
  @@@@ 
  @@@  
   @   


   @@  
  @@@@ 
 @@@@@@
 @@@@@@
  @@@@ 
   @@  
   @   


   @@  
  @@@@ 
 @@@@@@
 @@@@@@
  @@@@ 
   @@  



   @@  
  @@@@ 
 @@@@@@
 @@@@@@
  @@@@ 
   @   



   @@  
  @@@@ 
 @@@@@@
 @@@@@@
  @@@  
   @   



   @@  
  @@@@ 
 @@@@@@
 @@@@@ 
  @@@  
   @   



   @@  
  @@@@ 
 @@@@@ 
 @@@@@ 
  @@@  
   @   



   @@  
  @@@  
 @@@@@ 
 @@@@@ 
  @@@  
   @   



   @   
  @@@  
 @@@@@ 
 @@@@@ 
  @@@  
   @   




  @@@  
 @@@@@ 
 @@@@@ 
  @@@  
   @   




   @@  
 @@@@@ 
 @@@@@ 
  @@@  
   @   




   @@  
  @@@@ 
 @@@@@ 
  @@@  
   @   




   @@  
  @@@@ 
  @@@@ 
  @@@  
   @   




   @@  
  @@@@ 
  @@@@ 
   @@  
   @   




   @@  
  @@@@ 
  @@@@ 
   @@  





   @@  
  @@@@ 
  @@@@ 
   @   





   @@  
  @@@@ 
  @@@  
   @   





   @@  
  @@@  
  @@@  
   @   





   @   
  @@@  
  @@@  
   @   






  @@@  
  @@@  
   @   






   @@  
  @@@  
   @   






   @@  
   @@  
   @   






   @@  
   @@  







   @@  
   @   







   @   
   @   








   @   
 ​
 ​
 ​
 ​  


सूची

के आधार पर है, तो यह संख्या एक प्रमुख?


5
PPCG में आपका स्वागत है! अच्छा पहला सवाल, वैसे।
7

1
क्या व्हॉट्सएप / न्यूलाइन की अनुगामी अनुमति है?
लोवोजो

1
मेरे पास रेटिना कौशल नहीं है, लेकिन मुझे यह देखने में दिलचस्पी होगी - यदि यह संभव है।
जेरी यिर्मयाह

@JamesHolderness धन्यवाद! मैंने तय कर लिया है।
वामीरगद्किन

जवाबों:


5

पर्ल, 129 बाइट्स

कोड + -nध्वज के 128 बाइट्स ।

$p=($r=$"x$n++."@"x$_.$/).$p.$r,$_-=2while$_>0;say$_=$p;say y/A/ /r while s/(^| )A(.*
? *)@/$1 $2A/m||s/@( *
?.*)A/A$1 /||s/@/A/

-nEइसे चलाने के लिए आपको झंडे की आवश्यकता होगी :

perl -nE '$p=($r=$"x$n++."@"x$_.$/).$p.$r,$_-=2while$_>0;say$_=$p;say y/A/ /r while s/(^| )A(.*
? *)@/$1 $2A/m||s/@( *
?.*)A/A$1 /||s/@/A/' <<< 7

स्पष्टीकरण: (मेरे पास एक पल होने पर मैं उन्हें और विस्तार दूंगा)
पहला भाग, $p=($r=$"x$n++."@"x$_.$/).$p.$r,$_-=2while$_>0;प्रारंभिक आलू उत्पन्न करता है: यह आलू की मध्य रेखा से शुरू होता है, और प्रत्येक पुनरावृत्ति पर दो लाइनें जोड़ता है: पिछले स्ट्रिंग से पहले एक, एक उपरांत। ध्यान दें कि $"एक स्थान है, और चूंकि $nइसे प्रारंभ नहीं किया गया है, यह 0 से शुरू होता है, और $/एक नई रेखा है।

इस बारे में कहने के लिए say$_=$p;कि प्रारंभिक आलू को प्रिंट करते समय बहुत कुछ नोट करें $_(जो बाद में हेरफेर करना आसान होगा)।

अंत में, say y/A/ /r while s/(^| )A(.*\n? *)@/$1 $2A/m||s/@( *\n?.*)A/A$1 /||s/@/A/आलू को छील लें। अंतिम स्थिति जहां @हटा दिया गया था, इसमें एक A(यह मनमाना है, यह कोई भी प्रतीक हो सकता है)। इसलिए प्रत्येक पुनरावृत्ति में Aएक स्थान के साथ प्रतिस्थापित करने के लिए, और इस बीच में @एक के साथ अगले की जगह लेने में शामिल है A। यह दो रेगेक्स के लिए धन्यवाद किया जाता है: s/(^| )A(.*\n? *)@/$1 $2A/mजब Aआलू के बाईं ओर होता है ( A(.*\n? *)@दाएं या नीचे जाने की अनुमति देता है), और s/@( *\n?.*)A/A$1 /जब Aदाईं ओर होता है ( @( *\n?.*)Aऊपर या बाईं ओर जाने की अनुमति देता है)। s/@/A/पहले @को एक से बदल देता है A(वह इनिशियलाइज़ेशन है)। चूंकि हमारे पास हमेशा एक Aस्ट्रिंग होती है, हमें इसे प्रिंट करते समय एक स्थान के साथ बदलने की आवश्यकता होती है, यही वह y/A/ /rहै।


बस आंखों के लिए , एनिमेटेड संस्करण काफी अच्छा लगता है: (एक टर्मिनल में चलाने के लिए, यह लगभग एक ही कोड है लेकिन इसके साथ clearऔर sleep)

perl -nE 'system(clear);$p=($r=$"x$n++."@"x$_.$/).$p.$r,$_-=2while$_>0;say$_=$p;select($,,$,,$,,0.1),system(clear),say y/A/ /r while(s/(^| )A(.*\n? *)@/$1 $2A/m||s/@( *\n?.*)A/A$1 /||s/@/A/)&&/@/' <<< 10

1
यह भी खूब रही! मैंने एक एनिमेटेड कार्यक्रम देखने का इतना मज़ा कभी नहीं लिया है :)
VarmirGadkin 22

3

Befunge, 319 254 बाइट्स

&:00p1+:40p2/10p>:40g%20p:40g/30p\:10g30g`:!00g:2%!-30g-*\30g*+:20g1+v
+10g-::40g\-*2*30g+\-1+00g2%!+\00g2/1++20g-:::40g\-*2*+30g-\4*00g2*-v>
v+1\,-**2+92!-g02g00**84+1`\+*`g02g01\*!`g02g01+**!-g02\`g03:/2g00-4<
>:40g00g:2%+*`!#v_$1+:55+,00g::*1-2/+`#@_0

इस एल्गोरिथ्म के लिए प्रेरणा जितना संभव हो उतना शाखाकरण से बचने की कोशिश करना था, क्योंकि निष्पादन का एक भी रास्ता आमतौर पर गोल्फ के लिए आसान है। कोड इस प्रकार सिर्फ दो छोरों से मिलकर बनता है: छीलने की प्रक्रिया के फ्रेम पर चलने वाला बाहरी लूप, और आंतरिक लूप प्रत्येक फ्रेम के लिए आलू का प्रतिपादन करता है।

रेंडरिंग लूप अनिवार्य रूप से वर्णों के एक अनुक्रम को आउटपुट कर रहा है, प्रत्येक पुनरावृत्ति के लिए वर्ण एक अधिक जटिल सूत्र द्वारा निर्धारित किया जा रहा है जो छीलने की प्रक्रिया की फ़्रेम संख्या और आउटपुट अनुक्रम के सूचकांक को लेता है और @एक स्थान, या एक रिटर्न देता है आवश्यक के रूप में, newline।

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


1
वाह, यह सुंदर है।
416E64726577

2

पायथन 3.5.1, 520 बाइट्स

n=int(input())L=lenR=rangeP=printdefg(a,b):f=list(a)ifb:foriinR(L(f)):iff[i]=="@":f[i]=""breakelse:foriinR(L(f)-1,-1,-1):iff[i]=="@":f[i]=""breakreturn"".join(f)l=[]s=(2-n%2n)*(((n-2n%2)/2)1)i=2-n%2whilei<=n:l.append("@"*i)i=2j=L(l)-1whilej>=0:l.append(l[j])j-=1y=[rforrinR(int((L(l)/2)-1),-1,-1)]forhinR(L(y)-1,-1,-1):y.append(y[h])defH(q):foreinR(L(l)):P((""*y[e])q[e])P("")H(l)k=0m=0whilek<s:fortinR(L(l)):if'@'inl[t]andm%2==0:l[t]=g(l[t],True)k=1H(l)if'@'inl[t]andm%2==1:l[t]=g(l[t],False)k=1p=l[:]p.reverse()H(p)m=1

व्याख्या

मूल विचार: प्रत्येक पंक्ति को पुनरावृत्त करने और बाईं ओर के वर्ण को हटाने और प्रत्येक वर्ण को दाहिने वर्ण को हटाने के बीच वैकल्पिक करते हुए, जबकि अभी भी @शेष हैं।

n=int(input())
L=len
R=range
P=print
# g() returns a line in the potato with leftmost or rightmoxt '@' removed
def g(a,b):
    f=list(a)
    if b:
        for i in R(L(f)):
            if f[i]=="@":
                f[i]=" "
                break
    else:
        for i in R(L(f)-1,-1,-1):
            if f[i]=="@":
                f[i]=" "
                break
    return "".join(f)

l=[]
# s is the total number of '@'s for size n
s=(2-n%2+n)*(((n-2+n%2)/2)+1)
i=2-n%2

# store each line of potato in l
while i<=n:
    l.append("@"*i)
    i+=2
j=L(l)-1
while j>=0:
    l.append(l[j])
    j-=1

# this is used for spacing
y=[r for r in R(int((L(l)/2)-1),-1,-1)]
for h in R(L(y)-1,-1,-1):
    y.append(y[h])

# print the potato
def H(q):
    for e in R(L(l)):
        P((" "*y[e])+q[e])
    P("\n")

H(l)
k=0
m=0

# while there are still '@'s either
# go down the potato removing leftmost '@' 
# go up the potato removing rightmost '@'
while k<s:
    for t in R(L(l)):
        if '@' in l[t] and m%2==0:
            l[t]=g(l[t],True)
            k+=1
            H(l)               
        if '@' in l[t] and m%2==1:
            l[t]=g(l[t],False)
            k+=1
            p=l[:]
            p.reverse()
            H(p)
    m+=1

कुल मिलाकर एक सीधी प्रक्रिया पर एक उदास प्रयास।

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