একটি স্পিনিং পিনহিল আঁকুন


30

আপনি যে মজাদার পিনউইলগুলিকে আঘাত করেছিলেন সেগুলি মনে রাখবেন এবং সেগুলি গোল-গোল করে স্পিন করে? কোড এক!

একটি পিনউইলে \ | / _এর কেন্দ্র এবং বাহু আঁকার অক্ষরের সেট থাকবে । একটি সম্ভাব্য পিনউইল এর মতো দেখতে পেল:

    |
    |
    |_ ___
 ___|_|
      |
      |
      |

তবে এমন পিনউইল কী যা ঘুরতে পারে না? মজা নেই! প্রতীকগুলি পুনরায় সাজিয়ে আমরা এটি স্পিন করতে পারি:

      /
\    /
 \  /
  \/\
   \/\
   /  \
  /    \
 /

চ্যালেঞ্জটি হ'ল এমন একটি প্রোগ্রাম তৈরি করা যা তিনটি পূর্ণসংখ্যার সময় নেয় এবং নীচে বর্ণিত হিসাবে একটি পিনহিল আউটপুট দেয়। এর মধ্যে প্রথমটি হ'ল অস্ত্রগুলির সংখ্যা, দ্বিতীয়টি পিনহিলের বাহুর দৈর্ঘ্য এবং তৃতীয়টি এটি ঘনির কাঁটার বিপরীতে এক-অষ্টম বার স্পিন করবে তার সংখ্যা।

আপনি নিম্নলিখিত অনুমান করতে পারেন:

  • অস্ত্রের সংখ্যা সর্বদা 0, 1, 2, 4 বা 8 হবে।
  • সমস্ত অস্ত্র একে অপরের থেকে পৃথকভাবে পৃথক করা হবে।
  • পিনউইলের প্রাথমিক অবস্থানটির কেন্দ্রস্থলটি এর মতো থাকবে:

     _
    |_|
    
  • যদি অস্ত্রের সংখ্যা 1 হয় তবে আপনি সিদ্ধান্ত নিতে পারেন বাহুটির দিকটি কোন দিকে।

  • যদি অস্ত্রের সংখ্যা 2 হয় তবে আপনি অস্ত্রটিকে উল্লম্ব বা অনুভূমিকভাবে বিন্দুতে সিদ্ধান্ত নিতে পারেন।

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

এখানে কিছু উদাহরন:

0 2 1

 _
|_|

/\
\/

1 3 2

|
|
|_
|_|

   /
  /
 /
/\
\/

 _ ___
|_|

2 2 0

   _ __
__|_|

8 4 1

 \   |    /
  \  |   /
   \ |  /
    \|_/____
 ____|_|
     / |\
    /  | \
   /   |  \
  /    |   \

     |   /
 \   |  /
  \  | /
   \ |/
____\/\____
     \/\
     /| \
    / |  \
   /  |   \
  /   |

এটি কোড গল্ফ, তাই সংক্ষিপ্ততম কোড জয়ী। শুভকামনা!


আউটপুটে কোনও পেছনের নতুন লাইন থাকতে পারে?
usandfriends

চলমান নিউলাইনগুলি পরিমাণ সম্পর্কিত কোনও সীমাবদ্ধতা ছাড়াই অনুমোদিত।
টিএনটি

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

আউটপুটে শীর্ষস্থানীয় স্থানগুলির সংখ্যা পিনহিলের কেন্দ্রের অবস্থানের সাথে সম্পর্কিত, যার অবস্থান একাধিক স্থান দ্বারা স্থানান্তরিত হওয়া উচিত নয়। যদি পিনউইলটির আবর্তনের ফলে আউটপুটে পরে পিনহিলের কেন্দ্রের বাম দিকে শেষ হয়ে যায় (যেমন ইনপুট 1 3 5এবং আর্মটি প্রাথমিকভাবে পয়েন্ট করা হয়) তবে এর জন্য উপযুক্ত স্থানগুলিকে পূর্ববর্তী আউটপুটগুলিতে চাপানো দরকার।
টিএনটি

উত্তর:


4

পাইথন 2 535 517 473 468 বাইট

@ ইস্টারলি কালি ধন্যবাদ 5 বাইট সংরক্ষণ করা!

ইনপুটটি কমা দ্বারা পৃথক হওয়া প্রত্যাশিত (যেমন, numArms, আর্মলেন্থ, numRots)

গল্ফ সংস্করণ

n,l,t=input()
b=[7,3,1,5,0,4,2,6][:n]
w=5+2*l
h=w-3
X=w/2
Y=h/2-1
z=range
d=[0,1,1,1,0,-1,-1,-1]
for j in z(t+1):
 g=[[' 'for _ in[1]*w]for _ in[1]*h];a=j%2;b=[(k+1)%8for k in b];print''
 if a:g[Y][X:X+2]='/\\';g[Y+1][X:X+2]='\\/'
 else:g[Y][X+1]='_';g[Y+1][X:X+3]='|_|'
 for k in b:k=k+8*a;x=[0,2,3,3,2,0,-1,-1,0,1,2,2,1,0,-2,-1][k]+X;y=[0,0,0,2,2,2,1,0,-1,-1,0,1,2,2,0,0][k]+Y;exec"g[y][x]='|/_\\\\'[k%4];x+=d[k%8];y+=d[(k-2)%8];"*l
 for k in z(h):print''.join(g[k])

অবহেলিত সংস্করণ

numArms, armLength, rotAmount = input()

# Choose which arms to draw
arms = [0,4,2,6,1,5,3,7][:numArms]
for i in xrange(rotAmount+1):

    # Set up the grid spacing
    maxWidth = 5 + 2 * armLength
    maxHeight = 2 + 2 * armLength
    grid = [[' ' for x in xrange(maxWidth)] for y in xrange(maxHeight)]

    # Add the base square
    angle = i%2
    startX = len(grid[0])/2
    startY = len(grid)/2 - 1
    if angle:
        grid[startY][startX:startX+2] = '/\\'
        grid[startY+1][startX:startX+2] = '\\/'
    else:
        grid[startY][startX+1] = '_'
        grid[startY+1][startX:startX+3] = '|_|'

    for armNum in arms:
        # Determine where this arm starts
        armIdx = armNum + 8*angle;
        armX = [0,2,3,3,2,0,-1,-1,0,1,2,2,1,0,-2,-1][armIdx] + startX
        armY = [0,0,0,2,2,2,1,0,-1,-1,0,1,2,2,0,0][armIdx] + startY

        # Determine the direction it travels
        d = [0,1,1,1,0,-1,-1,-1]
        dirX = [0,1,1,1,0,-1,-1,-1][armIdx%8]
        dirY = [-1,-1,0,1,1,1,0,-1][(armIdx)%8]
        sym = '|/_\\'[armIdx%4]

        # Draw the arm
        for i in xrange(armLength):
            grid[armY][armX] = sym
            armX += dirX
            armY += dirY

    # Increment which arms to draw next
    arms = [(a+1)%8 for a in arms]
    for i in xrange(len(grid)):
        print ''.join(grid[i])
    print ''

ব্যাখ্যা

খুব সহজ যখন এটি ভেঙে গেছে। প্রথমে কত বড় গ্রিডের প্রয়োজন তা নির্ধারণ করুন, তারপরে বেস স্কোয়ার বা হীরাটি প্লট করুন।

প্রতিটি বাহুর শুরু অবস্থান, প্রতীক এবং দিক বর্গ এবং হীরা বেসের জন্য সম্ভাব্য 8 টি বাহুর প্রতিটি জন্য হার্ডকোডযুক্ত। তারপরে এগুলি অঙ্কন করা যথেষ্ট সহজ।

সমস্ত কিছু ঘোরানোর জন্য, আমি কেবল বর্গাকার এবং হীরার ভিত্তির মধ্যে স্যুইচ করি, তারপরে প্রতিটি বাহুকে বাড়িয়ে, একবার ঘড়ির কাঁটার দিকে ঘোরাই।


আপনি শূণ্যস্থান স্থানে মত অপসারণ করতে পারেন ' ' forথেকে ' 'for', ] forথেকে ]for', 8 জন্য 8for', print ''থেকে print''
Rɪᴋᴇʀ

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