내가 바다에서 길을 잃어 버리도록 도와주세요!


11

소개

오늘 나는 나의 카누와 함께 혼자 낚시를 갔다. 불행히도 나는 잠들었 고 시내가 나를 데려 갔다. 나는 노를 잃었다. 나는 해안을 볼 수 없으므로 멀리 있어야합니다!

휴대 전화를 가지고 있지만 짠 물에 젖어 고장이 나고, 마이크와 전화 스피커가 깨져서 말을하거나들을 수 없지만 해안 해변에있는 친구에게 SMS를 보낼 수 있습니다!

내 친구는 매우 강력한 횃불을 가지고 있으며 대나무 지팡이 위에 그것을 올려서 올바른 방향을 보여 주지만 노가 없기 때문에 줄을 뛸 수 없으므로 거리를 알려 주어야합니다. 날 잡아!

내 친구는 그가 횃불을 해수면에서 11.50 미터로 유지하고 있다고 말했는데, 수평선 위로 바로 빛을 볼 수 있습니다. 이제는 학교에서 지구의 반지름이 해수면에서 6371km가되어야한다는 것을 기억하고, 카누에 앉아서 내 눈도 해수면이라고 가정 할 수 있습니다.

직무

전류가 순간적으로 저를 움직이고 있기 때문에 친구가 때때로 횃불을 높이고 있습니다 (현재 12.30 미터). 친구의 위치와의 거리를 계산하는 데 도움이되는 전체 프로그램이나 기능을 작성하십시오!

다음은 다이어그램이 아닙니다 (확대 할 수 없음).

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

레이블 M이 있는 주황색 점 은 나이고 레이블 이있는 빨간색 점 T은 토치입니다. 녹색 라인 사이의 직선 거리 MT

입력

표준 입력 h에서 해수면 의 토치 높이 를 미터 단위로 가져옵니다 . 수평선 바로 위에 보이는 것은 소수점 이하 두 자릿수 (정확도 1 센티미터 또는 0.01 미터)의 부동 소수점 숫자 형태입니다. 범위는 0에서 100까지입니다.

산출

녹색 선의 유클리드 길이를 정확도 1cm로 반환해야합니다. 예를 들어 미터로 출력하는 경우 소수점 이하 두 자리 이상이어야합니다. 출력은 미터 또는 킬로미터가 될 수 있지만 정확도를 존중합니다.

테스트 사례 :

미터 단위의 모든 값.

11.5 > 12105.08
13.8 > 13260.45

규칙

가장 짧은 코드가 승리합니다.


결과가 수학적으로 정확해야합니까, 아니면 처음 두 소수가 괜찮다면 괜찮습니까? 나는 hxh가 2xRxh에 비해 작고 작은 거리에서 무시 될 수 있음을 의미합니다. (R은 지구의 반경이고 h는 토치의 높이입니다).
Osable

@ 사용 가능한 처음 2 자리는 미터로 출력하면 괜찮습니다
Mario

입력 범위는 무엇입니까?
Osable

@ 입력을 0에서 100 사이로 간주 할 수 있습니다 (이 경우에는 필요하거나 너무 많이 포함 할 수도 있음).
마리오

1
Coast Guard Stack Exchange를 사용해 보셨을 것입니다. 코드 golferse는 바다에서 벗어날 수 없습니다.
corsiKa

답변:


4

05AB1E ,13 12 10 바이트

Emigna 덕분에 2 바이트를 절약했습니다.

지구가 국지 평면이라는 OP의 가정을 사용하여 호출 할 삼각 함수가 없기 때문에 05AB1E 솔루션을 만들 수 있습니다.

•1#oC•+¹*t

           For understanding purposes input is referred to as 'h'
•1#oC•     Push 12742000 [ = 2*R, where R is the radius of earth]
      +    Compute 2*R+h
       ¹*  Multiply by h. Result is (2*R*+h)*h
         t Take the square root of it and implicitly display it

온라인으로 사용해보십시오!


1
12742000로 작성 가능•1#oC•
Emigna

참고로,이 9 바이트했을 것이다 : •1#oC•+*t2sable
Emigna

문자열이 214 숫자 로 묘사되어 있습니까? 05AB1E는 때때로 이러한 특수 기능에 대한 문서가 부족합니다. 좋은 2sable 답변도 있습니다. 나는 며칠 전에 그것에 대해 알았지만이 질문에 그것을 사용하는 것에 대해서는 생각하지 않았습니다.
Osable

옳은. 214 번으로 인코딩 된 10 진수입니다.
Emigna

결과는 삼각법으로도 얻을 수 있지만 아마도 더 길 수 있습니다.
마리오

4

파이썬, 34 26 바이트 :

( Osable 덕분에 -8 바이트! )

lambda i:(i*(i+12742))**.5

익명의 람다 함수. 킬로미터 단위로 입력하고 킬로미터 단위로 출력합니다. 로 호출하십시오 print(<Function Name>(<Input>)).


lambda i:(i*(i+12742))**.5더 짧을 것입니다.
Osable

트윗 담아 가기 나는 단지 그렇게하려고했다. :)
R. Kap

i12742와 12742 사이의 불일치를 고려하여 수학적 허용 오차가있는 경우 표현을 단축 할 수 있습니다.(i*12742)**.5
Osable

결과가 잘못되었습니다. 11.5m-> ~ 12km 대신 ~ 380km
GB

@GB 프로그램은 입력을 킬로미터로 읽습니다.
Osable

4

PHP, 34 바이트

<?=sqrt((12742e3+$h=$argv[1])*$h);

고장

   r^2+x^2=(r+h)^2      # Pythagoras base
   r^2+x^2=r^2+2rh+h^2  # right term distributed
       x^2=    2rh+h^2  # -r^2
       x =sqrt(2rh+h^2) # sqrt

지금까지 이것은 구 Mathematica 답변과 동일합니다.

sqrt(2*6371e3*$h+$h*$h) # to PHP
sqrt(14742e3*$h+$h+$h)  # constants combined
sqrt((14742e3+$h)*$h)   # conjugation to save a byte
((14742e3+$h)*$h)**.5   # same size

이제 남은 일은 입력 =$argv[1]과 출력 을 추가하는 <?=것입니다.


4

dc, 16 11 바이트 :

?d12742+*vp

명령 행을 통해 킬로미터 단위로 입력하라는 프롬프트를 표시 한 다음 거리를 킬로미터 단위로 출력합니다.

설명

?           # Prompt for input
 d          # Duplicate the top-of-stack value
  12742     # Push 12,742 onto the stack
       +    # Pop the top 2 values of the stack and push their sum
        *   # Pop top 2 values of the stack and push their product
         v  # Pop the remaining value and push the square root
          p # Output the result to STDOUT

이것은 다음을 활용합니다.

((6371+h)**2-6371**2)**.5 
=> ((6371**2+12742h+h**2)-6371**2)**0.5 
=> (h**2+12742h)**0.5 
=> (h*(h+12742))**0.5


4

하스켈, 22 바이트

d h=sqrt$h*(h+12742e3)

용법:

Prelude> d 11.5
12105.087040166212

포인트 프리 : (23 바이트)

sqrt.((*)=<<(+12742e3))

3

R, 29 바이트

h=scan();sqrt(h^2+2*h*6371e3)

stdin에서 입력을받습니다.


몇 바이트 더 짧은입니다 (h=scan())*(1+12742e3/h)^.5.
Flounderer

2

수학, 16 바이트

이 중 하나는 킬로미터 단위의 입력 및 출력 모두에서 작동합니다.

(12742#+#*#)^.5&
((12742+#)#)^.5&

이것은 피타고라스를 문제에 간단히 적용한 것입니다.

   x*x + R*R = (R+h)*(R+h)
=> x*x = (R+h)*(R+h) - R*R
       = R*R + 2*R*h + h*h - R*R
       = 2*R*h + h*h
=>   x = √(2*R*h + h*h)

2

젤리, 젤리 코드 페이지에서 9 바이트

나는 골프 언어로 프로그램을 작성하기로 결정했습니다. 실제로 다른 사람들이 사용하는 것보다 더 효율적인 알고리즘을 찾았습니다 (적어도 문제의 것과 같은 짧은 거리 이상). 젤리가 압축 할 수없는 리터럴 부동 소수점 숫자가 필요하므로 피타고라스 그것은.

+“Ȯịż’×µ½

설명:

 “Ȯịż’     12742000, compressed base-250
+          add to argument
      ×    multiply with original argument
       µ   separator to avoid what would otherwise be a parsing ambiguity
        ½  square root everything seen so far
           implicit output at EOF

µ구분 기호 의 필요성이 나에게 영향을 주지만 필연적이라고 생각합니다. Jelly는 이미 많은 명령에 필요한 인수를 추측 할 수있어 05AB1E 이상의 바이트를 이미 저장했지만이 경우 끝까지 정확하게 추측 할 수 없으므로 힌트를 주어야했습니다.

젤리, 젤리 코드 페이지에서 7 바이트

דȮịż’½

다른 답변 에서 설명했듯이 피타고라스 근사에 대한 시리즈 근사는 실제로 질문에 포함 된 길이에 대해 더 나은 결과를 생성하며 (적어도 예제 출력에 더 가깝습니다) 더 짧은 공식도 있습니다. 내가 쓰는 동안 사전에 12742000의 제곱근을 계산하는 대신 숫자에 12742000을 곱한 다음 동시에 제곱근을 곱할 수 있음을 깨달았습니다. 이것은 기본적으로 추가없이 다른 수식과 동일하므로 추가를 제거하여 이전 프로그램에서 생성 할 수 있습니다. 이렇게하면 2 바이트가 절약됩니다. 이제는 명확하게 구문 분석하므로 µ더 이상 필요하지 않습니다 .


h의 범위에서 센티미터 (요청 된 출력 참조)를 보면 동일한 값을 산출하지 않기 때문에이 최적화를 사용하지 않기로 결정했습니다. 또한 05AB1E에서 2 바이트를 절약 할 수 있습니다.
Osable

최적화를 통해 12105.081577585506 및 13260.452480967608의 출력을 얻습니다. 그것들은 테스트 케이스의 출력에 매우 가깝고 반올림됩니다. 없으면 12105.087040166212 및 13260.459661716106이 더 멀어집니다. 다른 답변에서 언급했듯이 최적화는 취소 할 것이없는 것이 아니라 서로를 크게 취소하는 두 가지 오류가 포함되어 있기 때문에 최적화 된 코드보다 정확한 값에 가깝습니다.

검토 대기열에서 "열린 채로두기"로 방금 투표 했으므로 의견에 설명을 요청한 질문에 대한 답변을 알고 있다고 생각합니다. 그러므로 질문이 모호하지 않도록 편집하십시오.
피터 테일러

1
문제는 분명합니다. 저자는 탐색을 돕기 위해 친구와의 거리를 알아야합니다. 그는 토치의 위치를 ​​0.1 미터의 정확도로 결정할 수 있습니다 (우리는 이야기에서 이것을 결정할 수 있습니다). 이것은 필연적으로 현재 거리에서 출력으로부터 약 1 미터의 불확실성을 줄 것입니다 (참고 : 저자는 표류하고 있으므로 매우 빠르게 이동할 가능성이 거의 없습니다 ...). 따라서 대략적으로 정확한 것은 허용됩니다. 문제의 일부는이 상황에서 얼마나 정확한지 결정하는 것입니다!

1
요청 된 출력은 소수점 2 자리를 미터로 표시합니다. 따라서 정확도는 1 센티미터입니다. 이 질문에 대한 의견에서 OP는 h가 100까지 올라갈 수 있다고 말했다. h = 100이면 원래 알고리즘과 14 센티미터의 불일치가 있습니다.
Osable

2

루비, 23

23 바이트 (Km)

->h{(h*h+h*12742)**0.5}

25 바이트 (m)

->h{(h*h+h*12742e3)**0.5}

1

Tcl, 49 바이트 :

set A [get stdin];puts [expr ($A*($A+12742))**.5]

글쎄, 나는 Tcl을 처음 접했으므로 골프를 즐기기위한 팁은 높이 평가됩니다. 다른 답변과 마찬가지로 킬로미터 단위의 명령 줄 입력 프롬프트와 킬로미터 단위의 출력 프롬프트가 표시됩니다. 본질적으로 기존 dcpython답변 의 Tcl 적응 .


GET 누락
sergiol

1

x86_64 + SSE 기계 코드, 16 바이트

프로그램의 바이트는 왼쪽 (16 진수)에 있으며 오른쪽에는 디스 어셈블이있어 조금 더 읽기 쉽습니다. 이것은 단 정밀도 부동 소수점 숫자를 가져오고 리턴하는 함수에 대해 일반적인 x86_64 규칙을 따르는 함수입니다 (% xmm0에서 인수를 가져 와서 동일한 레지스터에 응답을 리턴하고 % xmm1 및 % eax를 임시로 사용함). C 프로그램이 사용하는 것과 동일한 호출 규칙이므로 C 프로그램에서 직접 함수를 호출 할 수 있습니다. 이는 테스트 방법입니다.

b8 80 19 5f 45          mov    $0x455f1980,%eax
66 0f 6e c8             movd   %eax,%xmm1
0f 51 c0                sqrtps %xmm0,%xmm0
0f 59 c1                mulps  %xmm1,%xmm0
c3                      retq

그럼에도 불구하고 분해하더라도 여전히 설명이 필요합니다. 먼저 공식에 대해 논의 할 가치가 있습니다. 대부분의 사람들은 지구의 곡률을 무시하고 피타고라스의 공식을 사용하여 거리를 측정합니다. 나도하고 있지만 시리즈 확장 근사법을 사용하고 있습니다. 나는 입력의 첫 번째 힘과 관련된 용어만을 취하고,이 짧은 거리에서 매우 작은 영향을 미치는 세 번째, 다섯 번째, 일곱 번째 등의 힘을 무시합니다. (피타고라스 근사값은 낮은 값을 제공하지만, 시리즈 확장의 후자는 값을 줄이는 데 도움이됩니다. 따라서 근사값을 잘못된 방향으로 밀어 넣는 작은 요인을 무시하면 실제로 얻을 수 있습니다. 덜 정확한 공식을 사용하면보다 정확한 결과를 얻을 수 있습니다.) 공식은 √12742000 × √h입니다.0x455f1980.

사람들을 혼란스럽게 할 수있는 다음 것은 제곱근과 곱셈에 벡터 명령어를 사용하는 이유입니다. %xmm0그리고 %xmm1네 개의 단 정밀도 부동 소수점 숫자를 각각 저장할 수있는, 내가 네에서 운영하고있다. 여기서의 추론은 실제로 간단합니다. 인코딩은 해당 스칼라 명령보다 1 바이트 짧습니다. 따라서 FPU가 일반적인 골프 언어 알고리즘을 매우 연상시키는 방법으로 2 바이트를 절약하기 위해 추가 작업 제곱근과 0을 곱할 수 있습니다. (나는 채팅에서 x86 어셈블러를 골프 어셈블러의 골프 언어라고 불렀지 만 여전히 그것에 대해 마음을 바꾸지 않았습니다.)

거기에서, 알고리즘은 매우 간단합니다 : 부하 %xmm1를 통해 √12742000와 %eax곱셈, 제곱근을 인수 (세의 제로)의 해당 요소 (것 메모리에서로드 바이트 이하의 측면에서 짧은) %xmm1%xmm0(우리는 단지 관리 첫 번째 요소에 대해)를 반환하십시오.


1

Minkolang v0.15, 22 바이트

ndd*$r'12742000'*+1MN.

온라인으로 사용해보십시오!

n                               gets input in the form of a number
 dd                             duplicates it twice
   *                            multiplies 2 of the duplicates with each other
                                STACK: [h, h*h]
    $r                          swap top two stack values
                                STACK: [h*h, h]
      '12742000'*               push this number and multiply the original input by it
                                STACK: [h*h, h*12742000]
                 +1M            adds the two values and takes their square root
                                STACK: [sqrt(h*h+h*12742000)]
                    N.          output as a number and end program

1

자바 스크립트 (ES6), 31 25 바이트

미터 단위로 값을 표시합니다

//the actual code 
f=h=>(h*h+12742e3*h)**0.5


console.log(f(11.5));
console.log(f(13.8));

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