몇 걸음 걸었습니까?


14

간단한 만보계는 반대쪽에 두 개의 스위치 (x = 0 및 x = l) 가있는 진자로 모델링 할 수 있습니다 . 진자가 원거리 스위치와 접촉 할 때, 어셈블러는 반 걸음 걸렸다 고 가정 할 수 있습니다. 니어 스위치에 닿으면 단계가 완료됩니다.

진자의 위치를 ​​나타내는 정수 목록이 주어지면 만보계에 기록 된 전체 단계 수를 결정하십시오.

입력

  • 트랙 길이 인 l > 0 정수 .

  • 매번 만보계 진자의 위치를 ​​나타내는 정수 목록.

산출

전체 단계 수를 측정했습니다. 진자가 원거리 스위치 (x> = 1)에 접촉 한 다음 근접 스위치 (x <= 0)에 접촉 할 때 단계가 수행됩니다.

테스트 사례

8, [8, 3, 0, 1, 0, 2, 2, 9, 4, 7]
1

진자는 t = 0에서 x = 8에서 원거리 스위치와 즉시 접촉합니다. 그런 다음 t = 2 및 t = 4에서 니어 스위치를 터치하여 한 단계를 완료합니다. 그런 다음 t = 8에서 x = 9에서 원거리 스위치에 다시 닿지 만 근거리 스위치에는 다시 닿지 않습니다.

1, [1, 5, -1, -4, -1, 1, -2, 8, 0, -4]
3

15, [10, -7, -13, 19, 0, 22, 8, 9, -6, 21, -14, 12, -5, -12, 5, -3, 5, -15, 0, 2, 11, -11, 12, 5, 16, 14, 27, -5, 13, 0, -7, -2, 11, -8, 27, 15, -10, -10, 4, 21, 29, 21, 2, 5, -7, 15, -7, -14, 13, 27]
7

7, [5, 4, 0]
0

7, [5, 8, 6, 1, 2] 
0   

1
무엇에 대해 7, [5, 4, 0]? 0 또는 1입니까? 즉, 스윙이 항상 "전장"이라고 가정합니까? 아니면 7, [5, 8, 6, 1, 2]? 0 또는 1입니까?
Charles

1
@NotthatCharles가 추가되었습니다.
lirtosiast

나는 단계가 항상 있다고 가정합니다 : 먼 끝에 접촉 한 다음 니어 엔드. 즉, 니어 엔드, 파 엔드는 전체 단계가 아닙니다. 따라서 입력 8, [0 8 0 8]1하지 말아야 2합니다. 제가 맞습니까?
Luis Mendo

@DonMuesli 예.
lirtosiast

답변:


4

CJam, 27 24 바이트

l~:Xfe<0fe>_[XT]:Y--Y/,(

입력 형식은 진자 위치 목록이며 l한 줄로 표시됩니다.

여기에서 테스트하십시오.

설명

l~     e# Read and evaluate input.
:X     e# Store track length in X.
fe<    e# Clamp each position to X from above.
0f>    e# Clamp each position to 0 from below.
_      e# Duplicate.
[XT]   e# Push the array [X 0].
:Y     e# Store it in Y.
-      e# Set subtraction from the clamped input list. This gives all the
       e# intermediate values.
-      e# Another set subtraction. Remove intermediate values from input list.
Y/     e# Split remaining list around occurrences of ...X 0...
,(     e# Count them and decrement. This is the number of times the pendulum
       e# moved from X to 0.

2

MATL , 22 바이트

>~2G0>~-XzY'nw1)0<-H/k

이 사용하는 최신 버전 (14.0.0) 언어 / 컴파일러를.

입력은 챌린지와 동일한 순서와 형식으로 개행으로 구분됩니다.

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

설명

>~     % take the two inputs implicitly. Generate an array that contains true 
       % where the second input (array of positions) is >= the first input (l)
2G     % push second input (positions) again
0      % push a 0
>~     % true where the second input (array of positions) is <= 0
-      % subtract: array of 1, -1 or 0
Xz     % discard the 0 values
Y'     % run-length encoding: push values and number of repetitions
n      % length of the latter array: number of half-steps, perhaps plus 1
w1)    % swap. Get first element
0<     % true if that element is -1. We need to discard one half-step then
-      % subtract
H/k    % divide by 2 and round down

1

자바 스크립트 ES6 57 바이트

(t,a)=>a.map(a=>a<t?a>0?'':0:1).join``.split`10`.length-1

-4 주셔서 감사합니다 @NotThatCharles


1
왜 분할하지 /10/않습니까?
Charles

@NotthatCharles 나는 작동하지 않는다고 확신했지만 그냥 시도해 보았습니다. -감사합니다
Charlie Wynn

4
한 찰스가 다른;)
찰스가 아니었다

1

펄, 28 바이트

에 +1 포함 -p

STDIN에서 공백으로 구분 된 하나의 긴 행으로 입력을 실행하면 첫 번째 숫자는 길이입니다.

perl -p steps.pl <<< "8 8 3 0 1 0 2 2 9 4 7"

steps.pl:

s; ;$'>=$_..$'<1;eg;$_=y;E;

perl flip-flop 연산자를 사용하고 false로 리턴되는 횟수를 계산합니다.


1

Pyth, 18 바이트

/.:@J,Q0m@S+Jd1E2J

테스트 스위트

설명:

/.:@J,Q0m@S+Jd1E2J
                      Implicit: Q is the length of the track.
    J,Q0              Set J to [Q, 0]
        m      E      Map over the list
           +Jd        Add the current element to J
          S           Sort
         @    1       Take the middle element.
                      This is the current element, 
                      clamped above by Q and below by 0.
   @J                 Filter for presence in J.
 .:             2     Form 2 element substrings
/                J    Count occurrences of J.

0

루비, 42

->i,a{r=!0
a.count{|v|r^r=v>=i||r&&v>0}/2}

r로 시작합니다 false. 우리 r는 트랙의 각 끝에서 토글 하여 카운트에 추가합니다. 그런 다음 카운트를 반으로 내림 (내림차순)하여 단계 수를 얻습니다.



0

파이썬 3, 82

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

아직 슈퍼 골프가 아닙니다.

def f(x,s):
 c=l=0
 for a in s:
  if a>=x:l=x
  elif a<1:c+=l==x;l*=l!=x
 return c

테스트 사례 :

assert f(8, [8, 3, 0, 1, 0, 2, 2, 9, 4, 7]) == 1
assert f(1, [1, 5, -1, -4, -1, 1, -2, 8, 0, -4]) == 3
assert f(15, [10, -7, -13, 19, 0, 22, 8, 9, -6, 21, -14, 12, -5, -12, 5, -3, 5, -15, 0, 2, 11, -11, 12, 5, 16, 14, 27, -5, 13, 0, -7, -2, 11, -8, 27, 15, -10, -10, 4, 21, 29, 21, 2, 5, -7, 15, -7, -14, 13, 27]) == 7

0

클로저, 64 바이트

#(count(re-seq #"10"(apply str(for[i %2](condp > i 1 0 %""1)))))

값이 0 0보다 작거나 같고 길이가 크거나 같고 1다른 값은 빈 문자열에 매핑합니다 "". 그런 다음 문자열에 연결되고 발생 횟수 "10"가 계산됩니다.


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