Führen Sie einen Pluto-Vorbeiflug durch

21

Herzliche Glückwünsche! Sie wurden gerade von der NASA eingestellt, um an dem neuen Horizons 2-Projekt zu arbeiten.

Leider gab es in letzter Zeit enorme Budgetkürzungen, und das Top-Management hat beschlossen, den gesamten geplanten Pluto-Vorbeiflug (wie bei den Mondlandungen in den 70er Jahren) vorzutäuschen.

Ihre Aufgabe ist es, ein Programm zu schreiben, das ein Datum im Format als Eingabe akzeptiert yyyymmddund ein gefälschtes Foto von Pluto für dieses Datum liefert. Sie können davon ausgehen, dass das eingegebene Datum im Jahr 2015 oder 2016 liegt.

Das Foto ist ein 15x15-Raster mit ASCII-Zeichen. Die x- und y-Koordinaten der Zeichen im Raster liegen innerhalb des Bereichs. Das Zeichen [-7, 7]oben links befindet sich auf, (-7, -7)während das Zeichen unten rechts auf steht (7, 7).

Das Foto wird nach folgenden Regeln berechnet:

  • Die Sonde wird am 25.12.2015 die nächste nach Pluto sein
  • Die Entfernung dzu Pluto ergibt sich aus folgender Formel:square root of ((difference in days to christmas) ^ 2 + 10)
  • Der Radius rvon Plutos Bild auf dem Foto ist gegeben durch:22 / d
  • Ein Zeichen mit Koordinaten (x, y)im Raster muss auf #if gesetzt werden x^2 + y^2 <= r^2. es muss sonst auf Leerzeichen gesetzt werden.
  • Es gibt Sterne an den Positionen (-3, -5), (6, 2), (-5, 6), (2, 1), (7, -2). Sterne werden durch einen Punkt dargestellt .und natürlich von Pluto versteckt.

Noch etwas: Der NASA-Vorstand ist zu dem Schluss gekommen, dass die Entdeckung des Lebens auf Pluto wahrscheinlich zu einer erheblichen Erhöhung des Budgets führen würde. Ihr Programm sollte dann Hinweise auf das Leben auf Pluto hinzufügen:

  • Wenn die Entfernung zu Pluto <= 4 ist, fügen Sie bei den Koordinaten einen Plutonischen hinzu (-3,-1):(^_^)

Beispielfoto für die Eingabe 20151215: (Ihr Code sollte wie dieser Code alle Zeilenumbrüche enthalten.)

               

    .          


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



  .            

Foto für die Eingabe 20151225:

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

Zum Vergleich hier ein Foto von Plutos Satelliten-Hydra, aufgenommen von New Horizons. Unterschiede sind bei unserer ASCII-Kunst kaum zu erkennen.

Bildbeschreibung hier eingeben

Das ist Code Golf, also gewinnt der kürzeste Code in Bytes!

Arnaud
quelle
1
Dies wäre eine perfekte Herausforderung für die ASCII-Zeichen-Sprache gewesen, an der ich arbeite. Vielleicht poste ich eine Antwort damit, wenn es fertig ist. :)
ETHproductions
1
@ SuperChafouin Ich habe das `s zugunsten von entfernt <pre><code>; Sie können jederzeit einen Rollback durchführen, wenn es Ihnen nicht gefällt.
Justin
1
You can assume the entered date will be in the year 2015 or 2016.Aber warum überhaupt ein Jahr angeben?
Mittwoch,
Kann ich Termine im Format 25.12.2015 vereinbaren?
intrepidcoder

Antworten:

3

JavaScript (ES6), 237 Byte

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

Live-Demo . Führen Sie in Firefox.

Originalfassung

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

Golfen

Das hat Spaß gemacht, Golf zu spielen.

Ich muss kein Date-Objekt erstellen, daher habe ich den Wert in Millisekunden fest codiert, um 13 Bytes zu sparen:

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

Ersetzen Sie das assoziative Array durch eine durch Trennzeichen getrennte Zeichenfolge, um 9 Byte zu eliminieren:

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

Der größte Umgestalter war das Ersetzen der for-Schleifen durch verschachtelte, rekursive IIFEs , um 10 Bytes zu eliminieren :

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

Ich habe auch Math.sqrtfür 8 weitere Bytes losgeworden .

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

Probleme

Ich konnte nur das richtige Foto für die Testfälle erhalten, indem ich das nächstgelegene Datum auf den 24.12.2015 änderte, und ich weiß nicht, ob das Problem in meinem Code oder der Frage liegt. Bitte klären Sie und ich werde meine Antwort aktualisieren.

Hier ist meine Ausgabe mit den Unterschieden von 2015/12/25.

Bearbeiten: Die Antwort wurde aktualisiert, um Weihnachten als nächsten Termin zu verwenden.

Fotografie für "20151215":

                   

        .          


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



      .            
                   

Fotografie für "20151225":

                   
        #######    
       #########   
      ###########  
     ############# 
     #############.
     ###(^_^)##### 
     ############# 
     ############# 
     ############# 
     ############# 
      ###########  
       #########   
      . #######    
                   
unerschrockener Kodierer
quelle
Meine beiden Beispiele waren falsch (es gab eine eintägige Verschiebung), ich habe sie in der Frage korrigiert. Danke für den Hinweis!
Arnaud
3

C # 4.0, 393 Bytes

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

Beispiel:

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

Ausgabe:

20151216


    .


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



  .

20151224

     #####
   #########
  ###########
  ###########
 #############.
 ###(^_^)#####
 #############
 #############
 #############
  ###########
  ###########
   #########
  .  #####
Peter Saliente
quelle
2

CJam, 165 Bytes

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

Der erste Teil berechnet die Tagesdifferenz und speichert sie in der DVariablen. Der Rest ist eine Doppelschleife, die durch Xund iteriert Y.

Teste es hier

Arnaud
quelle