प्लूटो फ्लाईबी का प्रदर्शन करें


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- कला-ड्राइंग भाषा, जिस पर मैं काम कर रहा हूं, के लिए एक सही चुनौती होगी। शायद मैं इसके साथ एक उत्तर पोस्ट करूंगा जब यह समाप्त हो जाएगा। :)
ETHproductions

1
@SuperChafouin मैंने `s को इसके पक्ष में हटा दिया <pre><code>; यदि आपको यह पसंद नहीं है तो वापस लुढ़कने के लिए स्वतंत्र महसूस करें।
जस्टिन

1
You can assume the entered date will be in the year 2015 or 2016.लेकिन फिर एक साल क्यों निर्दिष्ट करें?
mınxomaτ

क्या मैं फॉर्म 2015/12/25 में तारीखें ले सकता हूं?
intrepidcoder

जवाबों:


3

जावास्क्रिप्ट (ईएस 6), 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.
}

गोल्फ

यह गोल्फ के लिए मजेदार था।

मुझे दिनांक ऑब्जेक्ट बनाने की आवश्यकता नहीं है, इसलिए मैंने 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.sqrt8 और बाइट्स के लिए भी छुटकारा पाया ।

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चर में संग्रहीत करता है । बाकी एक डबल लूप है जो इसके माध्यम से पुनरावृत्ति करता है Xऔर Y

इसका परीक्षण यहां करें

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