명왕성 비행을 수행


21

축하합니다! NASA가 새 Horizons 2 프로젝트를 수행하기 위해 방금 고용했습니다.

안타깝게도 최근 예산이 크게 삭감되었으므로 최고 경영진은 계획된 명왕성 비행을 모두 70 년대의 달 착륙과 마찬가지로 위조하기로 결정했습니다.

당신의 임무는 형식으로 날짜를 입력으로 받아 yyyymmdd들여이 날짜에 대한 명왕성 가짜 사진을 제공하는 프로그램을 작성하는 것 입니다. 입력 한 날짜가 2015 년 또는 2016 년이라고 가정 할 수 있습니다.

사진은 15x15 그리드의 ASCII 문자입니다. 그리드의 문자는 범위 내에서 x 및 y 좌표를 갖습니다. [-7, 7]왼쪽 위 문자는 (-7, -7)오른쪽 에 있고 오른쪽 아래 문자는에 (7, 7)있습니다.

사진은 다음 규칙에 따라 계산됩니다.

  • 프로브는 2015 년 12 월 25 일에 명왕성에 가장 가깝습니다.
  • d명왕성까지 의 거리는 다음 공식으로 주어진다 :square root of ((difference in days to christmas) ^ 2 + 10)
  • r사진에서 명왕성의 이미지 반경 은 다음과 같습니다.22 / d
  • (x, y)그리드에 좌표가있는 문자는 #if 로 설정해야 합니다 x^2 + y^2 <= r^2. 그렇지 않으면 공간으로 설정해야합니다.
  • 위치에 별이있다 (-3, -5), (6, 2), (-5, 6), (2, 1), (7, -2). 별은 점으로 표시되며 .물론 명왕성에 의해 숨겨져 있습니다.

한 가지 더 : NASA위원회는 명왕성에서의 삶의 발견이 상당한 예산 증가를 초래할 것이라는 결론에 도달했습니다. 그런 다음 프로그램에서 명왕성에 대한 실마리를 추가해야합니다.

  • 명왕성까지의 거리가 <= 4 인 경우 좌표에 플루토 니안을 추가합니다 (-3,-1).(^_^)

입력 사진 예 20151215: (이 코드와 마찬가지로 코드에는 모든 줄 바꿈이 있어야합니다)

               

    .          


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



  .            

입력 사진 20151225:

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

New Horizons가 찍은 Pluto의 위성 Hydra의 사진입니다. ASCII 아트에서는 차이점이 거의 눈에 띄지 않습니다.

여기에 이미지 설명을 입력하십시오

이것은 코드 골프이므로 바이트 단위의 가장 짧은 코드가 이깁니다!


1
이것은 내가 작업중 인 ASCII 아트 드로잉 언어에 대한 완벽한 도전이었습니다. 아마도 완료된 후에 답변을 게시 할 것입니다. :)
ETHproductions

1
@SuperChafouin 나는 `찬성 하여 s를 제거했다 <pre><code>. 마음에 들지 않으면 롤백하십시오.
저스틴

1
You can assume the entered date will be in the year 2015 or 2016.그렇다면 왜 1 년을 지정해야합니까?
mınxomaτ

2015/12/25 형식으로 날짜를 입력 할 수 있습니까?
intrepidcoder

답변:


3

자바 스크립트 (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.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"의 사진 :

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

내 두 가지 예가 잘못되었습니다 (하루에 교대가 있었음). 문제에서 수정했습니다. 지적 해 주셔서 감사합니다!
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변수에 저장합니다 . 나머지를 반복 더블 루프 XY.

여기에서 테스트

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.