두 행성의 이름이 주어지면 거리를 줘 사용하여 두 행성의 이름을 사용하고 두 행성

다음 표 ( source )를 사용하여 두 행성의 이름을 사용하고 두 행성 사이의 거리를 반환하는 코드를 작성하십시오.

+-------------------+---------------+
|      Planets      | Distance (km) |
+-------------------+---------------+
| Mercury -> Venus  |      50290000 |
| Venus -> Earth    |      41400000 |
| Earth -> Mars     |      78340000 |
| Mars -> Jupiter   |     550390000 |
| Jupiter -> Saturn |     646270000 |
| Saturn -> Uranus  |    1448950000 |
| Uranus -> Neptune |    1627450000 |
| Neptune -> Pluto  |    1405380000 |
+-------------------+---------------+

예, 입력 후 출력 :

Mercury, Mars
170030000
Neptune, Jupiter
-3722670000
Earth, Earth
0

목성이 해왕성 앞에 오기 때문에 음의 부호를 주목하십시오. 또한 모두 정수입니다.

명왕성은 포함되지 않아도됩니다 (주로 이상한 궤도 때문에 거리를 계산하기가 어렵습니다. 주어진 거리는 내 계산이지만 명왕성이 모두 유명하기 때문에 …).

행성 사이의 거리로 나는 궤도를 의미합니다-나는 날짜를 기대하지 않고 그들이 어디에 있는지 운동하지 않습니다.

이것은 코드 골프, 가장 짧은 코드 승리입니다.



답변

CJam, 54 51 44 바이트

2{"X84VT:Z/3KD'Y->>6\ Ta "3/r26b93%=70be4}*-

CJam 통역사 에서 온라인으로 사용해보십시오 .

생각

간단한 해싱 함수를 사용하여 8 개의 행성을 모두 식별합니다. 각 이름을 코드 포인트의 배열로 고려하여 기준 26에서 정수로 변환하고 결과 modulo 93을 취한 다음 modulo 8, Mercury , Venus , Earth 등을 2 , 4 , 0 , 1 , 3 , 5로 매핑합니다. , 67 .

이제 우리는 해왕성 뒤에 320,000km 떨어진 지점을 선택하고 그 지점까지의 8 개 행성의 거리를 계산합니다. 4 개의 후행 0을 삭제하고 행성을 위에서 8 개의 인덱스에 맞도록 재정렬 한 후 배열을 얻습니다.

[435172 427338 444341 372299 439312 307672 162777 32]

기본 70의 각 정수를 인코딩하면 다음과 같은 결과가 나타납니다.

[
   [1 18 56 52] [1 17 14 58] [1 20 47 51] [1 5 68 39]
   [1 19 45 62] [  62 55 22] [  33 15 27] [       32]
]

인접한 두 자리 숫자 (A B)((A-1) (B+70)) 모든 정수를 인쇄 가능한 ASCII 문자로 인코딩 할 수 있도록 위의 배열을 수정할 수 있습니다.

["X84" "VT:" "Z/3" "KD'" "Y->" ">6\\" " Ta" " "]

암호

2{                         e# Do twice:
  "X84VT:Z/3KD'Y->>6\ Ta " e#   Push that string.
  3/                       e#   Chop it into chunks of length 3.
  r                        e#   Read a token from STDIN.
  26b                      e#   Convert from base 26 to integer.
  93%                      e#   Take the result modulo 93.
  =                        e#   Retrieve the chunk at that index.
  70b                      e#   Convert from base 70 to integer.
  e4                       e#   Multiply by 10,000.
}*                         e#
-                          e# Subtract the two results.

답변

파이썬 2 149 147 142 138 128 123 119 바이트

간단한 조회를 사용하여 사용할 거리를 알아 내십시오. 🙂 익명 함수를 정의하므로이를 사용하려면 이름을 지정해야합니다.

많은 바이트를 절약 한 아이디어에 대한 Sp3000에 감사합니다!

lambda*x:int.__sub__(*[[0,5029,9169,17003,72042,136669,281564,444309]['MeVeEaMaJuSaUr'.find(k[:2])/2]for k in x])*~9999

가독성을 위해 적절하게 들여 쓰기 및 언 골프 처리

def f(*x):
 d=0,5029,9169,17003,72042,136669,281564,444309
 a,b=[d['MeVeEaMaJuSaUr'.find(k[:2])/2]for k in x]
 print(b-a)*10000

이렇게 전화하십시오 :

f("Mercury","Mars")    -> 170030000
f("Neptune","Jupiter") -> -3722670000L

답변

도입부 190 174 151 바이트

안내를 해주신 Fatalize에게 감사드립니다.

g(A,X):-sub_atom(A,2,2,_,B),member(B:X,[rc:0,nu:5029,rt:9169,rs:17003,pi:72042,tu:136669,an:281564,pt:444309]).
s(A,B,R):-g(A,X),g(B,Y),R is(Y-X)*10^4.

$ gprolog --consult-file src.pro
| ?- s('Mercury','Mars',R).
R = 170030000 ?
yes
| ?- s('Neptune','Jupiter',R).
R = -3722670000 ?
yes
| ?- s('Earth','Earth',R).
R = 0 ?
yes

답변

자바 스크립트 (ES6) 115 110 바이트

(x,y,g=k=>"Me0Ve5029Ea9169Ma17003Ju72042Sa136669Ur281564Ne444309".match(k[0]+k[1]+"(\\d*)")[1]*1e4)=>g(y)-g(x)

이것은 익명 함수이므로 변수에 저장해야합니다 (f=...; f("Earth", "Mercury") ) 하거나 괄호로 묶은 표현식 ()으로 사용해야합니다 (...)("Earth", "Mercury").

그 지저분한 끈은 각 행성의 처음 두 글자이며, 수성으로부터의 행성 거리 (10000으로 나누어 공간 절약)가 뒤 따릅니다. 내부 함수 g는 다음을 수행합니다.

  1. 이름을 가지고 (k )을
  2. 처음 두 글자로 줄입니다 (k[0]+k[1] )로 줄입니다.
  3. 정규식 일치를 사용하여 수은에서 해당 거리를 10000으로 나눈 값을 찾습니다 (예 : “지구”정규식은 Ea(\d*) )
  4. 값에 10000을 곱합니다 (1e4 )을 결과를 반환합니다.

한 수은 거리를 다른 수은 거리에서 빼면 행성 사이의 거리를 얻습니다.


답변

자바, 274 272 264 바이트 (명왕성을 포함!)

  void p(String p,String l){String q="MeVeEaMaJuSaUrNePl";int w=q.indexOf(p.substring(0,2))/2,e=q.indexOf(l.substring(0,2))/2,m=1,t=e,d[]={5029,4140,7834,55039,64627,144895,162745,140538};long h=0;if(w>e){e=w;w=t;m=-1;}for(;e-->w;)h+=d[e]*1e4;System.out.print(h*m);}

입출력:

p("Mercury","Mars") --> 170030000
p("Mars","Mercury") --> -170030000
p("Earth","Earth")  --> 0

간격과 탭 :

void p(String p,String l){
    String q="MeVeEaMaJuSaUrNePl";
    int w=q.indexOf(p.substring(0,2))/2,
      e=q.indexOf(l.substring(0,2))/2,
      m=1,
      t=e,
      d[]={5029,4140,7834,55039,64627,144895,162745,140538};
    long h=0;
    if(w>e){
        e=w;
        w=t;
        m=-1;
    }
    for(;e-->w;)
        h+=d[e]*1e4;
    System.out.print(h*m);
}

답변

파이썬, 118 바이트

n=lambda x:(5029,9169,17003,72042,136669,281564,444309,0)["VeEaMaJuSaUrNe".find(x[:2])/2]*10000
f=lambda a,b:n(b)-n(a)

n Mercury에서 거리를 반환하는 함수입니다.

문자열 "VeEaMaJuSaUrNe"Mercury를 제외한 모든 행성 이름의 처음 두 문자입니다 . find수은을 찾을 수 없으므로 -1을 반환합니다. -1/2는 여전히 -1이므로 튜플의 마지막 요소 인 0입니다.

간단한 테스트 코드 :

test = (
    ("Mercury","Venus",50290000),
    ("Venus","Earth",41400000),
    ("Earth","Mars",78340000),
    ("Mars","Jupiter",550390000),
    ("Jupiter","Saturn",646270000),
    ("Saturn","Uranus",1448950000),
    ("Uranus","Neptune",1627450000),
    #("Neptune","Pluto",1405380000),
    ("Mercury","Mars",170030000),
    ("Neptune","Jupiter",-3722670000),
    ("Earth","Earth",0))

for a, b, expect in test:
    print a, "->", b, "=", expect
    assert f(a, b) == expect, f(a, b)

답변

APL, 97 95 85 바이트

{1E4×-/(0 5029 9169 17003 72042 136669 281564 444309[{⍵≡'Mars':4⋄'MVEmJSUN'⍳⊃⍵}¨⍵⍺])}

이것은 원 행성을 왼쪽 인수로, 목적지 행성을 오른쪽으로 취하는 명명되지 않은 2 차원 함수를 만듭니다.

당신은 할 수 있습니다 온라인으로보십시오 !