다음 표 ( 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로 매핑합니다. , 6 및 7 .
이제 우리는 해왕성 뒤에 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
는 다음을 수행합니다.
- 이름을 가지고 (
k
)을 - 처음 두 글자로 줄입니다 (
k[0]+k[1]
)로 줄입니다. - 정규식 일치를 사용하여 수은에서 해당 거리를 10000으로 나눈 값을 찾습니다 (예 : “지구”정규식은
Ea(\d*)
) - 값에 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 차원 함수를 만듭니다.
당신은 할 수 있습니다 온라인으로보십시오 !