나이 스미스의 규칙


12

Naismith의 규칙 은 거리와 상승에 따라 산책이나 하이킹에 필요한 시간을 계산하는 데 도움이됩니다.

경로를 따라 균등하게 이격 된 지점에서 고도가 비어 있지 않은 목록과 해당 경로의 총 거리 (미터)가 주어지면 Naismith의 규칙에 따라 필요한 시간을 계산해야합니다.

Naismith의 규칙은 5km마다 1 시간, 600m 상승 시마다 1 시간을 허용해야한다는 것입니다.

입력은 음수가 아닌 정수로 구성되는 미터 단위로 가져와야하며 출력은 일관되게 몇 시간 또는 몇 분 (둘다는 아님)이어야하며, 해당하는 경우 10 진수를 제공 할 수 있어야합니다 (부동 소수점 부정확도는 양호 함) .

예를 들면 다음과 같습니다.

[100, 200, 400, 200, 700, 400], 5000

처음 두 요소의 [100, 200]경우 10 분인 100 미터의 상승이 있습니다. 으로 [200, 400]당신은 20 분입니다 상승의 200 미터가, [400, 200]시간이 그것에 대해 추가되지 않도록 상승하지 않습니다. [200, 700]50 분인 500 미터의 상승이며, 마지막 [700, 400]으로 상승하지 않습니다. 5km 거리에 1 시간이 추가됩니다. 총 140 분 또는 2.333 ... 시간입니다.

테스트 사례

[0, 600] 2500 -> 1.5 OR 90
[100, 200, 300, 0, 100, 200, 300] 10000 -> 2.8333... OR 170
[40, 5, 35] 1000 -> 0.25 OR 15
[604] 5000 -> 1 OR 60
[10, 10, 10] 2000 -> 0.4 OR 24
[10, 25, 55] 1000 -> 0.275 OR 16.5

테스트 케이스 출력은 모두 전체 결과를 가지고 있습니다. 의도적 인 것입니까? 입력이 유사 [10], 5125하거나 [10, 25, 55], 1000유효하며 처리되어야합니까?
sundar-복원 모니카

@ sundar 그렇습니다.
Okx

[10, 25, 55], 1000 -> 0.275 OR 16.5
Khuldraeseth na'Barya

답변:


6

R ,  44  43 42 바이트

function(A,D)sum(pmax(0,diff(A)),D*.12)/10

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

pmax여러 개의 다른 답변 을 사용하여 -1 바이트

입력을 A향기 및 D자세 로 취하고 시간을 분 단위로 반환합니다.

function(A,D)                                 # take Ascent and Distance
                        diff(A)               # take successive differences of ascents
                 pmax(0,       )              # get the positive elements of those
                                 D*.12        # multiply distance by 0.12
             sum(               ,     )       # take the sum of all elements
                                       /10    # and divide by 10, returning the result


함수를 사용하는 대신 pryr :: f (sum (pmax (0, diff (A)), D * .12) / 10)를 사용하여 4 바이트를 더 얻을 수 있습니다
Shayne03

@ Shayne03은 기술적 으로이 답변을 "R + pryr"로 변경하여 사이트 규칙에서 기본 R과 다른 언어로 간주하므로 그대로 유지하겠습니다. 그래도 제안 해 주셔서 감사합니다!
주세페

설명은 언덕 모양입니다
user70585


2

05AB1E , 15 바이트

¥ʒ0›}OT÷s₄;6//+

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

시간을 분 단위로 반환합니다.

설명

              + # sum of ...
¥ʒ0›}OT÷        # the sum of positive deltas of the altitude divided by 10
        s₄;6//  # the distance divided by 83.33333333 (500/6, or the amount of meters per minute) 

내가 생각했던 것과 거의 똑같습니다. 내가 가진 유일한 차이점은 ₄12//대신했습니다 ₄;6//. 나에게서 명백한 +1.
Kevin Cruijssen


2

파이썬 2, 62 60 바이트

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

lambda e,d:sum((a-b)*(a>b)for a,b in zip(e[1:],e))*.1+d*.012

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

시간을 분 단위로 반환합니다.

# add all increasing slope differences together
sum(
    # multiply the difference by 0 if a<b, else by 1
    (a-b)*(a>b)
                # create a list of pairs by index, like [(1,0), (2,1) ...(n, n-1)]
                # then interate thru the pairs where a is the higher indexed item and b is the lower indexed item
                for a,b in zip(e[1:],e)
    )
    # * 60 minutes / 600 meters == .1 min/m
    *.1 
    # 60 minutes / 5000 meters = .012 min/m
    +d*.012


2

펄 6 ,45 39 37 바이트

Jo King 덕분에 6 바이트가 절약되었습니다.

nwellnhof 덕분에 2 바이트가 절약되었습니다.

(둘 다 고마워, 이것은 더 이상 내 원래의 제출물처럼 보이지 않습니다 :).)

*.&{sum (.skip Z-$_)Xmax 0}/600+*/5e3

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

첫 번째 인수는 입면도가있는 목록이고 두 번째 인수는 트레킹의 길이입니다.

모든 것은 WhateverCode입니다. 표현식이 그렇게 인식되면 각각 *하나의 인수입니다.

에서에서 *.&{sum (.skip Z-$_)Xmax 0}/600첫 번째 인수 (의 첫 번째 발생 *)를 가져 와서 메소드와 같은 구문으로 블록을 사용합니다 .&{}. 블록은 하나의 인수 (목록)를 취하는데 , 첫 번째 요소가없는 목록도 $_마찬가지 .skip입니다. 를 사용하여 요소별로 원래 배열을 뺍니다 Z-. 더 짧은 목록이 고갈되면 압축이 중지됩니다.

그런 다음 교차 곱 연산자를 사용합니다 X. list X(op) list첫 번째 요소가 왼쪽 목록에 있고 두 번째 요소가 오른쪽에있는 가능한 모든 쌍을 작성하고 그 (op)위에 연산자 를 사용합니다. 결과는 Seq (원샷 목록)로 반환됩니다. 그러나 오른쪽 목록에는 하나의 요소 0 만 있으므로 * max 0요소별로 만 수행 됩니다. 따라서 트레킹의 오름차순 부분 만 계산합니다. 그런 다음 합산하여 600으로 나눕니다.

그런 다음 두 번째로 발생하는 */5e3위치 를 추가 *하고 두 번째 인수이므로 5000으로 나눕니다. 그 합은 시간 (시간)입니다. (이는 곱해야 할 때보 다 몇 분이 걸리는 시간보다 효율적이며 *, WhateverStar와 공백으로 구분해야합니다 *.)



@ JoKing, X감사합니다.
Ramillies

1
실제로, 우리는 X/합계를 10으로 나누어서 마지막 을 피할 수 있습니다 . 39 바이트
Jo King

WhateverCode를 사용하여 37 바이트.&{}(시간을 반환)
nwellnhof

2

oK , 21 바이트

{y+/0|1_-':x}..1.012*

온라인으로 사용해보십시오! 파싱 버그 남용 .1.012과 같은입니다 .1 .012.

              .1.012* /a = [0.1 * input[0], 0.012 * input[1]]
{           }.        /function(x=a[0], y=a[1])
      1_-':x          /  a = subtract pairs of elements from x
    0|                /  a = max(a, 0) w/ implicit map
 y+/                  /  y + sum(a)

streester 덕분에 -1 입니다.

k , 23 바이트

{.1*(.12*y)++/0|1_-':x}

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


{y+/0|1_-':x}..1.012*21 바이트? 으로 누산기를 시작하십시오 y.
streetster

과연! k 코드에 비슷한 향상을 적용했지만 불행히도 내가 가지고있는 k 인터프리터 (2016.08.09)는 그 방식으로 누적기를 시작하는 것을 좋아하지 않습니다. :/
zgrep



1

Pyth , 15 바이트

c+*E.12s>#0.+QT

전체 프로그램은 첫 번째 인수로 높이 세트를, 두 번째로 거리를 예상합니다. 시간을 분 단위로 반환합니다.

여기 에서 온라인으로 시도 하거나 모든 테스트 사례를 한 번에 확인 하십시오 .

c+*E.12s>#0.+QT   Implicit: Q=input 1, E=input 2
           .+Q    Take the differences between each height point
        >#0       Filter to remove negative values
       s          Take the sum
  *E.12           Multiply the distance by 0.12
 +                Add the two previous results
c             T   Divide the above by 10, implicit print

1

APL (Dyalog Unicode) , 21 20 18 바이트

.1×.12⊥⎕,-+/0⌊2-/

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

1st ⎕= 높이 / 깊이, 2nd ⎕= 거리 로 입력 (오른쪽에서 왼쪽으로)을받는 전통적인 기능 .

덕분에 대한 @ngn하는 마법사 인 3 바이트를.

작동 방식 :

.1×.12⊥⎕,-+/0⌊2-/  Function;
                   Append 0 to the heights vector;
              2-/  ⍝ Pairwise (2) differences (-/);
            0      Minimum between 0 and the vector's elements;
          +/       ⍝ Sum (yields the negated total height);
         -         ⍝ Subtract from;
   .12⊥⎕,          ⍝ Distance × 0.12;
.1×                ⍝ And divide by 10;

"wizard"에 감사합니다 :) 테스트하기 위해 표현식을 여러 번 복사 할 필요가 없습니다 . 대신 tradfn에 넣으십시오 . ,0불필요 합니다. 문제가되는 테스트는 ,604아닙니다.604
ngn

참조 그건 당신이 마법사있는 이유. 전적으로 내 잘못을 표현 여러 번 부분입니다 복사, 난 그냥 교체 함께 기존 코드 와 tradfn 머리글 / 바닥 글을 넣어 너무 게으른했다. ,0하지만 비트? 금.
J. Sallé

0

자바 8, 89 바이트

a->n->{int s=0,p=0,i=a.length;for(;i-->0;p=a[i])s+=(p=p-a[i])>0?p:0;return s/10+n/500*6;}

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

설명:

a->n->{                   // Method with integer-array and integer parameter and integer return-type
  int s=0,                //  Sum-integers, starting at 0
      p=0,                //  Previous integer, starting at 0
  i=a.length;for(;i-->0;  //  Loop `i` backwards over the array
                 ;        //    After every iteration:
                  p=a[i]) //     Set `p` to the current value for the next iteration
    s+=(p=p-a[i])>0?      //   If the previous minus current item is larger than 0:
         p                //    Add that difference to the sum `s`
        :                 //   Else:
         0;               //    Leave the sum the same
   return s/10            //  Return the sum integer-divided by 10
          +n/500*6;}      //  Plus the second input divided by 500 and then multiplied by 6


0

Stax , 17 바이트

ü;█y☼òΓ▀ßîP<<╪⌠öß

staxlang.xyz에서 실행하고 디버그하십시오!

압축을 푼 버전에서만 바이트를 저장하지만 모든 입력을 부동으로 취합니다. 즉흥적으로; 방금 코드 골프로 돌아 왔을 때, 나는 다소 녹슬 었습니다.

압축 해제 (20 바이트) 및 설명 :

0!012*s:-{0>f{A/m|++
0!012*                  Float literal and multiplication for distance
      s                 Swap top two stack values (altitudes to the top)
       :-               List of deltas
         {0>f           Filter: keep only positive changes
             {A_m       Map: divide all ascents by 10
                 |++    Add these times to that for horizontal travel
                        Implicit print

0!012*s:-{0>f{A_:m|++ 압축되지 않은 21 바이트와 여전히 압축 된 21 바이트에 대한 적분 입력에 사용됩니다.

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