แสดงพลูโต Flyby


21

ขอแสดงความยินดี! คุณเพิ่งได้รับการว่าจ้างจากองค์การนาซ่าเพื่อทำงานในโครงการ Horizons 2 ใหม่

น่าเสียดายที่มีการตัดงบประมาณจำนวนมากเมื่อเร็ว ๆ นี้ดังนั้นผู้บริหารระดับสูงจึงตัดสินใจปลอมพลูโตพลูโตตามแผนที่วางไว้ทั้งหมด

งานของคุณคือการเขียนโปรแกรมที่จะยอมรับเป็นข้อมูลวันที่ในรูปแบบyyyymmddและจะให้ภาพปลอมของพลูโตสำหรับวันนี้ คุณสามารถสันนิษฐานได้ว่าวันที่ที่ป้อนจะเป็นปี 2558 หรือ 2559

ภาพถ่ายเป็นตารางขนาด 15x15 ของอักขระ ASCII ตัวอักษรในตารางมีแกน X และพิกัด-Y ในช่วงของพวกเขา[-7, 7]- ตัวอักษรบนซ้ายที่ในขณะที่ตัวละครล่างขวาที่(-7, -7)(7, 7)

ภาพถ่ายจะถูกคำนวณด้วยกฎต่อไปนี้:

  • โพรบจะใกล้เคียงกับพลูโตมากที่สุดในวันที่ 25/12/2558
  • ระยะทาง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-art-drawing ที่ฉันกำลังทำอยู่ บางทีฉันอาจโพสต์คำตอบด้วยหลังจากเสร็จแล้ว :)
ETHproductions

1
@SuperChafouin ฉันลบ`s ในความโปรดปรานของ<pre><code>; อย่าลังเลที่จะย้อนกลับไปหากคุณไม่ชอบ
Justin

1
You can assume the entered date will be in the year 2015 or 2016.แต่ทำไมระบุปีเลย
mınxomaτ

ฉันสามารถใช้วันที่ในแบบฟอร์ม 2015/12/25 ได้ไหม
intrepidcoder

คำตอบ:


3

JavaScript (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))

การสาธิตสด ทำงานใน Firefox

รุ่นเดิม

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.
}

กอล์ฟ

นี่สนุกกับการเล่นกอล์ฟ

ฉันไม่จำเป็นต้องสร้างวัตถุ Date ดังนั้นฉันจึงเข้ารหัสค่าเป็นมิลลิวินาทีเพื่อประหยัด 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

Refactor ที่ใหญ่ที่สุดคือการแทนที่ลูปด้วยIIFE ที่ซ้อนกันและเรียกซ้ำเพื่อกำจัด 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":

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

ตัวอย่างที่สองของฉันผิด (มีการเลื่อนหนึ่งวัน) ฉันได้แก้ไขพวกเขาในคำถาม ขอบคุณสำหรับการชี้!
Arnaud

3

C # 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

CJam, 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 ผ่านและXY

ทดสอบที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.