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


11

소개

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

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

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

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

직무

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

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

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

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

입력

표준 입력 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•+*t에 2sable
— 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을 처음 접했으므로 골프를 즐기기위한 팁은 높이 평가됩니다. 다른 답변과 마찬가지로 킬로미터 단위의 명령 줄 입력 프롬프트와 킬로미터 단위의 출력 프롬프트가 표시됩니다. 본질적으로 기존 dc과 python답변 의 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.