আলু খোসা ছাড়ুন


20

এটি একটি আলু:

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

আরও সাধারণভাবে, একটি আকার এন আলু নিম্নলিখিত আকার হিসাবে সংজ্ঞায়িত করা হয়:

যদি এন সমান হয় তবে এটি 2 কেন্দ্রিক @চিহ্ন, 4 টি কেন্দ্রিক @চিহ্ন এবং তারপরে 6 কেন্দ্রীক @প্রতীক, সমস্ত এন এন কেন্দ্রিক @প্রতীক পর্যন্ত; তারপরে, এন-কেন্দ্রিক @চিহ্নগুলি, তারপরে এন -২ কেন্দ্রিক @চিহ্নগুলি অনুসরণ করে সমস্ত উপায়ে ২-এ নেমে যায়
N এন যদি বিজোড় হয় তবে একটি আকারের এন আলু উপরে বর্ণিতভাবে একইভাবে উত্পন্ন হয় তবে আমরা @2 টির পরিবর্তে 1 টি প্রতীক দিয়ে শুরু করি ।

উপরের ডান দিকের কোণে শুরু করে এবং প্রতি ঘণ্টায় একটি @চিহ্ন সরিয়ে , একটি ঘড়ির কাঁটার বিপরীতে ফ্যাশনে একটি আলু খোসা ছাড়ানো হয় । উদাহরণস্বরূপ, আকার -3 আলুর খোসা ছাড়ানো দেখতে এটির মতো দেখাচ্ছে:

 @
@@@
@@@
 @

​
@@@
@@@
 @

 ​
 @@
@@@
 @

  ​
 @@
 @@
 @

 ​
 @@
 @@
 ​

 ​
 @@
 @
 ​

​
 @
 @
 ​

 ​
​
 @
 ​


চ্যালেঞ্জ

একটি প্রোগ্রাম লিখুন, এটি একটি পূর্ণসংখ্যার ইনপুট দেওয়া হয়, সেই আকারের আলু ছোলার সমস্ত পদক্ষেপ প্রদর্শন করে।
ট্রেলিং হোয়াইটস্পেস / নিউলাইন অনুমোদিত।

স্কোরিং

এটি ; বাইটস মধ্যে সংক্ষিপ্ত কোড।


নমুনা পরীক্ষার কেস

এন = 2

@@
@@

@
@@


@@


 @



এন = 7

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


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


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


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


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


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


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


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


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



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



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



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



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



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



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




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




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




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




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




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




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





   @@  
  @@@@ 
  @@@@ 
   @   





   @@  
  @@@@ 
  @@@  
   @   





   @@  
  @@@  
  @@@  
   @   





   @   
  @@@  
  @@@  
   @   






  @@@  
  @@@  
   @   






   @@  
  @@@  
   @   






   @@  
   @@  
   @   






   @@  
   @@  







   @@  
   @   







   @   
   @   








   @   
 ​
 ​
 ​
 ​  


তালিকা

এই সংখ্যাটির উপর ভিত্তি করে কি প্রাথমিক?


5
পিপিসিজিতে আপনাকে স্বাগতম! ভাল প্রথম প্রশ্ন, যাইহোক।
ক্লিমেজিক

1
পিছনে সাদা স্থান / নিউলাইন অনুমোদিত?
লুভজো

1
আমার কাছে রেটিনা দক্ষতা নেই তবে আমি এটি দেখতে আগ্রহী - যদি এটি সম্ভব হয়।
জেরি যেরেমিয়া

টুইটারে আমি এটা স্থির করেছি।
ভার্মিরগাদকিন

উত্তর:


5

পার্ল, 129 বাইট

128 বাইট কোড + -nপতাকা।

$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
এটা অসাধারণ! আমি কোনও অ্যানিমেটেড প্রোগ্রাম দেখতে এত মজা
পাইনি

3

বেফুঞ্জ, 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

এই অ্যালগরিদমের অনুপ্রেরণা ছিল যতটা সম্ভব শাখা প্রশাখা করা এবং এড়ানো, যেহেতু মৃত্যুর একক পথ সাধারণত গল্ফের পক্ষে সহজ। কোডটি কেবল দুটি লুপের সমন্বয়ে গঠিত হয়: পিলিং প্রক্রিয়াটির ফ্রেমের উপরে বহিরাগত লুপটি পুনরাবৃত্তি হয় এবং প্রতিটি ফ্রেমের জন্য আলু রেন্ডার করে অভ্যন্তরীণ লুপটি।

রেন্ডারিং লুপটি কেবলমাত্র অক্ষরের একটি অনুক্রম আউটপুট করে থাকে, প্রতিটি পুনরাবৃত্তির জন্য অক্ষরটি একটি জটিল জটিল সূত্র দ্বারা নির্ধারিত হয় যা পিলিং প্রক্রিয়াটির ফ্রেম সংখ্যা এবং আউটপুট অনুক্রমের সূচি নেয় এবং হয় কোনও @, একটি স্থান, বা একটি নতুন লাইন, প্রয়োজন হিসাবে।

এটি অনলাইন চেষ্টা করুন!


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

একটি সোজা পদ্ধতিতে সামগ্রিকভাবে একটি দুঃখজনক প্রচেষ্টা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.