Bir Pluto uçuşu gerçekleştirin


21

Tebrikler! Yeni Ufuklar 2 projesi üzerinde çalışmak için NASA tarafından işe alındınız.

Ne yazık ki, son zamanlarda büyük bütçe kesintileri yaşandı, bu yüzden üst yönetim planlanan tüm Pluto uçuşunu taklit etmeye karar verdi (70'li yıllarda inişlerde olduğu gibi).

Göreviniz, formatta bir tarih girişi olarak kabul yyyymmddedecek ve bu tarih için Pluto'nun sahte bir fotoğrafını sağlayacak bir program yazmaktır . Girilen tarihin 2015 veya 2016 yılında olacağını varsayabilirsiniz.

Fotoğraf 15x15 ASCII karakterlerinden oluşan bir ızgaradır. Izgaradaki karakterlerin aralıkları içinde x ve y koordinatları vardır [-7, 7]- sol üst karakter, (-7, -7)sağ alt karakter olduğu sıradadır (7, 7).

Fotoğraf aşağıdaki kurallara göre hesaplanacaktır:

  • Prob 25/12/2015 tarihinde Pluto'ya en yakın olacak
  • dPluto'ya olan mesafe bu formülle verilmiştir:square root of ((difference in days to christmas) ^ 2 + 10)
  • rPluto’nun fotoğraftaki imajının yarıçapı şöyle:22 / d
  • Koordinatlara sahip bir karakter (x, y)ızgara üzerinde ayarlanmış olması gerekir #ise x^2 + y^2 <= r^2; Aksi takdirde boşluğa ayarlanmalıdır.
  • Pozisyonlarda yıldız vardır (-3, -5), (6, 2), (-5, 6), (2, 1), (7, -2). Yıldızlar bir nokta ile temsil edilir .ve elbette Pluto tarafından gizlenirler.

Bir şey daha var: NASA kurulu, Pluto'daki yaşam keşiflerinin büyük ölçüde bütçe artışıyla sonuçlanacağı sonucuna varmıştır. Programınız Plüton'a hayatın ipuçlarını eklemeli:

  • Pluto'ya olan mesafe <= 4 ise, koordinatlara bir plutonian ekleyin (-3,-1):(^_^)

Girdi için örnek fotoğraf 20151215: (Kodunuzda olduğu gibi kodun tümü yeni satırlara sahip olmalıdır)

               

    .          


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



  .            

Giriş için fotoğraf 20151225:

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

Bir karşılaştırma olarak, burada Yeni Ufuklar tarafından çekilmiş, Pluto uydusunun Hydra fotoğrafı. ASCII sanatımızda farklılıklar hemen hemen fark edilemez.

görüntü tanımını buraya girin

Bu kod golf, yani bayt cinsinden en kısa kod kazanıyor!


1
Bu, üzerinde çalıştığım ASCII sanat çizim dili için mükemmel bir zorluk olurdu. Belki bittikten sonra bununla bir cevap gönderirim. :)
ETHproductions

1
@ SuperChafouin Ben `lehine s kaldırıldı <pre><code>; beğenmediyseniz geri dönmekten çekinmeyin.
Justin,

1
You can assume the entered date will be in the year 2015 or 2016.Peki öyleyse neden bir yıl belirtiniz?
mınxomaτ

2015/12/25 formunda tarih alabilir miyim?
intrepidcoder

Yanıtlar:


3

JavaScript (ES6), 237 bayt

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

Canlı demo . Firefox'ta çalıştırın.

Orijinal versiyon

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

Golf

Bu golf eğlenceliydi.

Bir Date nesnesi oluşturmama gerek yok, bu yüzden 13 bayt kaydetmek için değeri milisaniye cinsinden kodladım:

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 baytı kaldırmak için ilişkisel diziyi ayrılmış bir dizeyle değiştirin:

{'-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

En büyük refaktör for döngülerini 10 byte'ı atmak için iç içe geçmiş, özyinelemeli IIFE ler ile değiştirmekti:

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

Ayrıca Math.sqrt8 bayttan da kurtuldum .

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

Sorunlar

Test vakaları için yalnızca en yakın tarihi 2015/12/24 olarak değiştirerek fotoğraf çekebildim ve sorunun kodumda mı yoksa soruda mı olduğunu bilmiyorum. Lütfen netleştirin ve cevabımı güncelleyeceğim.

İşte 2015/12/25 arasındaki farklılıkları kullanarak çıktım.

Düzenleme: Noel'i en yakın tarih olarak kullanmak için cevap güncellendi.

"20151215" için fotoğraf:

                   

        .          


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



      .            
                   

"20151225" için fotoğraf:

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

İki örneğim yanlıştı (bir günlük vardiya vardı), soruda onları düzelttim. Bunu işaret ettiğin için teşekkürler!
Arnaud

3

C # 4.0, 393 bayt

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

Örnek:

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

Çıktı:

20151216


    .


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



  .

20151224

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

2

CJam, 165 bayt

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;}*

İlk bölüm, gün farkını hesaplar ve Ddeğişkende saklar . Gerisi Xve boyunca yinelenen bir çift döngüdür Y.

Burada test et

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.