একটি প্লুটো ফ্লাইবাই সম্পাদন করুন


21

অভিনন্দন! নতুন দিগন্ত 2 প্রকল্পে কাজ করতে আপনাকে নাসা সবেমাত্র ভাড়া নিয়েছে।

দুঃখের বিষয়, সম্প্রতি এখানে বিশাল বাজেটের কাটা পড়েছে, তাই শীর্ষস্থানীয় ব্যবস্থাপনার পরিকল্পনা করা পুরো প্লুটো ফ্লাইবাইকে নকল করার সিদ্ধান্ত নিয়েছে (যেমন তারা 70 এর দশকে চাঁদের অবতরণের জন্য করেছিলেন)।

আপনার কাজটি এমন একটি প্রোগ্রাম লিখতে হবে যা ফর্ম্যাটটিতে একটি তারিখ হিসাবে ইনপুট হিসাবে গ্রহণ yyyymmddকরবে এবং এই তারিখের জন্য প্লুটোর একটি জাল ছবি সরবরাহ করবে। আপনি অনুমান করতে পারেন যে প্রবেশ তারিখটি 2015 বা 2016-এ হবে।

ফটোগ্রাফটি ASCII অক্ষরের একটি 15x15 গ্রিড। গ্রিডের অক্ষরগুলির রেঞ্জের মধ্যে তাদের x- এবং y- স্থানাঙ্ক রয়েছে [-7, 7]- (-7, -7)নীচের অংশে ডানদিকে থাকা অক্ষরটি নীচে বাম অক্ষরটি থাকে (7, 7)

ছবিটি নিম্নলিখিত নিয়মের সাথে গণনা করা হবে:

  • 25/12/2015 এ প্রোবটি প্লুটোের নিকটতম হবে
  • dপ্লুটো এর দূরত্ব এই সূত্র দ্বারা দেওয়া হয়েছে:square root of ((difference in days to christmas) ^ 2 + 10)
  • rফটোতে প্লুটোর ছবির ব্যাসার্ধটি দিয়েছেন:22 / d
  • (x, y)গ্রিডে স্থানাঙ্ক সহ একটি অক্ষর সেট করতে হবে #যদি তা x^2 + y^2 <= r^2; অন্যথায় এটি অবশ্যই স্থান নির্ধারণ করতে হবে।
  • সেখানে অবস্থানের সময়ে বড় হয় (-3, -5), (6, 2), (-5, 6), (2, 1), (7, -2)। তারাগুলি একটি বিন্দু দ্বারা প্রতিনিধিত্ব করা হয় .এবং সেগুলি অবশ্যই প্লুটো দ্বারা লুকানো থাকে।

আরও একটি বিষয়: নাসা বোর্ড এই সিদ্ধান্তে পৌঁছেছে যে প্লুটোতে জীবন আবিষ্কারের ফলে সম্ভবত বাজেটের পরিমাণ বৃদ্ধি পাবে। আপনার প্রোগ্রামটির পরে প্লুটোতে জীবনের চিহ্ন যুক্ত করা উচিত:

  • প্লুটো-এর দূরত্ব যখন <= 4 হয়, তখন স্থানাঙ্কে প্লুটোনিয়ান যুক্ত করুন (-3,-1):(^_^)

ইনপুট জন্য উদাহরণস্বরূপ ফটোগ্রাফ 20151215: (আপনার কোডে এই কোডের মতো সমস্ত নতুন লাইন থাকা উচিত)

               

    .          


       #      .
      ###      
     #####     
      ###.     
       #     . 



  .            

ইনপুট জন্য ফটোগ্রাফ 20151225:

               
    #######    
   #########   
  ###########  
 ############# 
 #############.
 ###(^_^)##### 
 ############# 
 ############# 
 ############# 
 ############# 
  ###########  
   #########   
  . #######    

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

এখানে চিত্র বর্ণনা লিখুন

এটি কোড গল্ফ, তাই বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী!


1
আমি যে ASCII- আর্ট-অঙ্কনের ভাষা নিয়ে কাজ করছি তার পক্ষে এটি একটি নিখুঁত চ্যালেঞ্জ হত। সম্ভবত আমি এটি শেষ করে এটি দিয়ে একটি উত্তর পোস্ট করব। :)
ETH প্রোডাকশনস

1
@ সুপারচাফউইন আমি `এর পক্ষে পক্ষে অপসারণ করেছি <pre><code>; যদি আপনি এটি পছন্দ না করেন তবে নির্দ্বিধায় ফিরে যান।
জাস্টিন

1
You can assume the entered date will be in the year 2015 or 2016.তবে তারপরে কেন এক বছর নির্দিষ্ট করবেন?
mınxomaτ

আমি কি 2015/12/25 ফর্মটিতে তারিখগুলি নিতে পারি?
ইন্ট্রিপিডকোডার

উত্তর:


3

জাভাস্ক্রিপ্ট (ES6), 237 বাইট

f=(n)=>(t=new Date('201'+n[3],n[4]+n[5],n[6]+n[7])/864e5-403805/24,r=484/(t*t+10),(g=(i)=>(++i<8?(h=(j)=>(i*i+j*j<=r?r>30.25&!~i&&'(^_^)'[j+3]||'#':~'p-3-5p62p-56p21p7-2'.indexOf('p'+j+i)?'.':' ')+(++j<8?h(j):''))(-7)+'\n'+g(i):''))(-8))

লাইভ ডেমো । ফায়ারফক্সে চালান।

মূল সংস্করণ

f=function(n) {
    t = (new Date('201'+n[3],''+n[4]+n[5],''+n[6]+n[7]) // Find the time difference in milliseconds,
    - new Date(2015,12,25)) / 864e5;                    // then divide by 86400000 to convert to days.

    r=22 / Math.sqrt(t*t+10);                           // Calculate the radius.

    s=[]; // s is the array that contains each line as a string.

    for(i=-7;i<8;i++)               // Loop through rows.
        for(j=-7,s[i+7]='';j<8;j++) // Loop through columns, appending one character per column.
                                    // s is zero based, so add 7 to the row.
            s[i+7]+=i*i+j*j<=r*r ?  // Choose which character to add to s. 
            (r>5.5&i==-1&&'(^_^)'[j+3]||'#') :  // Add a '#' if the position is inside the radius.
                                                // If distance < 4, then the radius > 5.5
                                                // Then add the face at the right position.
            {'-3-5':1,'62':1,'-56':1,'21':1,'7-2':1} // Add the stars if outside. Create an associative array.
            [j+''+i]?'.':' ';                        // If i concat j is in the array, the expression will be 1, 
                                                     // which is truthy, else it will be undefined, which is falsey.
    return s.join`\n` // Join all the rows with a new-line.
}

golfing

এটি গল্ফ মজা ছিল।

আমার একটি ডেট অবজেক্ট তৈরি করার দরকার নেই, তাই 13 বাইট সংরক্ষণের জন্য আমি মিলি সেকেন্ডে মানটি হার্ডকোড করেছি:

t=(new Date('201'+n[3],n[4]+n[5],n[6]+n[7])-new Date(2015,12,25))/864e5 // Before
t=new Date('201'+n[3],n[4]+n[5],n[6]+n[7])/864e5-403805/24 // After

9 টি বাইটগুলি অপসারণের জন্য সীমাবদ্ধ স্ট্রিংয়ের সাথে সহযোগী অ্যারে প্রতিস্থাপন করুন:

{'-3-5':1,'62':1,'-56':1,'21':1,'7-2':1}[j+''+i]?'.':' ' // Before
~'p-3-5p62p-56p21p7-2'.indexOf('p'+j+i)?'.':' ' // After

বৃহত্তম রিফেক্টরটি নেস্টেড, পুনরাবৃত্তির সাথে লুপগুলির জন্য প্রতিস্থাপন ছিল আইআইএফই এর 10 বাইট ছুঁড়ে ফেলা হয়েছে:

s=[];for(i=-7;i<8;i++)for(j=-7,s[i+7]='';j<8;j++)s[i+7]+= /* Chooses char at i,j */ ;return s.join`\n` // Before
(g=(i)=>(++i<8?(h=(j)=>( /* Chooses char at i,j */ )+(++j<8?h(j):''))(-7)+'\n'+g(i):''))(-8) // After

আমিও মুক্তি পেয়েছি Math.sqrt 8 বাইট জন্য ।

r=22/Math.sqrt(t*t+10),(g=(i)=>(++i<8?(h=(j)=>(i*i+j*j<=r*r?r>5.5 // Before
r=484/(t*t+10),(g=(i)=>(++i<8?(h=(j)=>(i*i+j*j<=r?r>30.25 // After

সমস্যা

আমি কেবলমাত্র 2015/12/24 এর নিকটতম তারিখটি পরিবর্তন করে পরীক্ষার কেসগুলির জন্য সঠিক ফটোগ্রাফ পেতে পারি এবং সমস্যাটি আমার কোড বা প্রশ্নের মধ্যে রয়েছে কিনা তা আমি জানি না। দয়া করে পরিষ্কার করুন এবং আমি আমার উত্তর আপডেট করব।

2015/12/25-এর পার্থক্যগুলি ব্যবহার করে এখানে আমার ফলাফল।

সম্পাদনা করুন: ক্রিসমাসকে নিকটতম তারিখ হিসাবে ব্যবহার করার জন্য আপডেট করা উত্তর।

"20151215" এর জন্য ছবি:

                   

        .          


           #      .
          ###      
         #####     
          ###.     
           #     . 



      .            
                   

"20151225" এর জন্য ছবি:

                   
        #######    
       #########   
      ###########  
     ############# 
     #############.
     ###(^_^)##### 
     ############# 
     ############# 
     ############# 
     ############# 
      ###########  
       #########   
      . #######    
                   

আমার দুটি উদাহরণ ভুল ছিল (সেখানে একদিনের শিফট ছিল), আমি তাদের প্রশ্নে সংশোধন করেছি। এটি নির্দেশ করার জন্য ধন্যবাদ!
আর্নাউড

3

সি # 4.0, 393 বাইট

string p(string s){int i=Convert.ToInt32(s),Y=i/10000,m,x,y;s="";i-=Y*10000;m=i/100;i-=m*100;double d=Math.Sqrt(Math.Pow((new DateTime(2015,12,25)-new DateTime(Y,m,i)).Days,2)+10);string o,k=".-3-5.62.-56.21.7-2";for(y=-7;y<8;y++){for(x=-7;x<8;x++){o="#";if(d<=4&&x==-3&&y==-1){o="(^_^)";x+=4;}s+=Math.Pow(x,2)+Math.Pow(y,2)<=Math.Pow(22/d,2)?o:k.Contains("."+x+y)?".":" ";}s+="\n";}return s;}

উদাহরণ:

string userInput = Console.ReadLine();
Console.WriteLine(p(userInput));

আউটপুট:

20151216


    .


      ###     .
     #####
     #####
     #####
      ###    .



  .

20151224

     #####
   #########
  ###########
  ###########
 #############.
 ###(^_^)#####
 #############
 #############
 #############
  ###########
  ###########
   #########
  .  #####

2

সিজেম, 165 বাইট

q'-%:i~\0\({X1=29W$2%-X7<X+2%30+?+}fX+\2%-359 6?+:DD*A+mq:Z22Z/_*:R-7:Y];F{-7:X;F{XX*YY*+R>XYF*+[-78II+85H-23]#)'.S?Z4<Y-1=X-4>X2<&&&X-3="(^_^)"L?'#??X):X;}*NY):Y;}*

প্রথম অংশটি দিনের পার্থক্য গণনা করে এবং Dভেরিয়েবলে সঞ্চয় করে । বাকি একটি ডবল লুপ যে মাধ্যমে iterates হয় XএবংY

এটি এখানে পরীক্ষা করুন

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