プルートフライバイを実行する


21

おめでとうございます!新しいHorizo​​ns 2プロジェクトに取り組むために、NASAに雇われました。

悲しいことに、最近大幅な予算削減が行われたため、経営陣は計画されていたuto王星のフライバイ全体を偽造することにしました(70年代の月面着陸の場合と同様)。

あなたの仕事は、フォーマットとして日付を入力として受け入れyyyymmdd、この日付のPl王星の偽の写真を提供するプログラムを書くことです。入力された日付は2015年または2016年になります。

写真はASCII文字の15x15グリッドです。グリッド上の文字の範囲内にx座標とy座標があります。[-7, 7]左上の文字はで(-7, -7)、右下の文字はにあり(7, 7)ます。

写真は次のルールで計算されます。

  • プローブは、2015年12月25日にPl王星に最も近くなります
  • dPl王星までの距離は次の式で与えられます。square root of ((difference in days to christmas) ^ 2 + 10)
  • r写真上のPl王星の画像の半径は次のように与えられます:22 / d
  • (x, y)グリッド上の座標を持つ文字を設定する必要があります# ifx^2 + y^2 <= r^2 ; それ以外の場合は、スペースに設定する必要があります。
  • 位置での星があり(-3, -5)(6, 2)(-5, 6)(2, 1)(7, -2)。星はドット.で表され、もちろんPl王星によって隠されています。

もう1つ:NASA理事会は、Pl王星での生命の発見が大幅な予算増加につながる可能性が高いという結論に達しました。その後、プログラムはPl王星に生命の手がかりを追加する必要があります。

  • Pl王星までの距離が4以下の場合、座標にプルトニアンを追加します(-3,-1)(^_^)

入力用の写真の例20151215:(このコードと同様に、コードにはすべての改行が必要です)

               

    .          


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



  .            

入力用写真20151225

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

比較として、ニューホライズンズが撮影したPl王星の衛星ハイドラの写真を次に示します。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の形式で日付を取ることはできますか?
イントレピッドコーダー

回答:


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

最大のリファクタリングは、forループをネストされた再帰的な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」の写真:

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

私の2つの例は間違っていました(1日シフトがありました)、私は質問でそれらを修正しました。それを指摘してくれてありがとう!
アルノー

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変数に保存します。残りはを反復処理し、二重ループであるXY

ここでテストしてください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.