Tôi đã đi được bao nhiêu bước?


14

Một máy đếm bước đơn giản có thể được mô hình hóa bằng một con lắc có hai công tắc ở hai phía đối diện, một tại x = 0 và một tại x = l . Khi con lắc tiếp xúc với công tắc xa, xe cứu thương có thể được coi là đã thực hiện nửa bước. Khi nó liên lạc với công tắc gần, bước hoàn thành.

Đưa ra một danh sách các số nguyên biểu thị các vị trí của con lắc, xác định số bước đầy đủ được ghi trên máy đếm bước.

Đầu vào

  • Một số nguyên l > 0, độ dài của rãnh.

  • Một danh sách các số nguyên đại diện cho các vị trí của con lắc của người bán hàng mỗi lần.

Đầu ra

Số lượng các bước đầy đủ đo. Một bước được thực hiện khi con lắc tiếp xúc với công tắc xa (x> = l) và sau đó là công tắc gần (x <= 0).

Các trường hợp thử nghiệm

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

Con lắc ngay lập tức tiếp xúc với công tắc xa tại x = 8 tại t = 0. Sau đó, nó chạm vào công tắc gần ở t = 2 và t = 4, hoàn thành một bước. Sau đó, nó chạm vào công tắc xa một lần nữa tại x = 9 tại t = 8, nhưng nó không bao giờ chạm vào công tắc gần nữa.

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
Thế còn 7, [5, 4, 0]? Đó là 0 hay 1? Đó là - bạn có cho rằng một chiếc xích đu luôn luôn "dài hết cỡ" không? Hay là 7, [5, 8, 6, 1, 2]? Đó là 0 hay 1?
Không phải Charles

1
@NotthatCharles Đã thêm.
lirtosiast

Tôi giả sử một bước luôn là: liên hệ ở cuối, sau đó gần cuối. Đó là: gần kết thúc, sau đó kết thúc xa không phải là một bước đầy đủ. Vì vậy, đầu vào 8, [0 8 0 8]nên cho 1, không 2. Tôi có đúng không?
Luis Mendo

@DonMuesli Có.
lirtosiast

Câu trả lời:


4

CJam, 27 24 byte

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

Định dạng đầu vào là danh sách các vị trí con lắc theo sau l trên một dòng duy nhất.

Kiểm tra nó ở đây.

Giải trình

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 byte

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

Cái này sử dụng phiên bản hiện tại (14.0.0) của ngôn ngữ / trình biên dịch.

Các đầu vào có cùng thứ tự và định dạng như trong thử thách, được phân tách bằng một dòng mới.

Hãy thử trực tuyến!

Giải trình

>~     % 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

Perl, 28 byte

Bao gồm +1 cho -p

Chạy với đầu vào dưới dạng một dòng dài các số nguyên được phân tách bằng dấu cách trên STDIN, số đầu tiên là độ dài:

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

steps.pl:

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

Sử dụng toán tử flip-flop và đếm số lần nó trả về false


1

Bình thường, 18 byte

/.:@J,Q0m@S+Jd1E2J

Bộ kiểm tra

Giải trình:

/.:@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

Ruby, 42

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

rbắt đầu như false. Chúng tôi chuyển đổi rở mỗi đầu của bản nhạc và thêm nó vào số của chúng tôi. Sau đó, giảm một nửa số đếm (làm tròn xuống) để có được số bước.


0

Võng mạc, 34

-1*

^(1*)((?>.*?\1.*? \D))*.*
$#2

Hãy thử trực tuyến! hoặc thử nó với đầu vào thập phân .

Đưa đầu vào bằng số unary, số unary âm được coi là -111...và 0 là chuỗi rỗng. Đếm số lần mà số đầu tiên xuất hiện theo sau là số không. Sử dụng một nhóm nguyên tử để đảm bảo rằng các trận đấu là tối thiểu (đáng buồn là các nhóm nguyên tử không bị bắt giữ nên nó phải được bọc trong một nhóm khác ...).


0

Con trăn 3, 82

Đã lưu 2 byte nhờ DSM.

Chưa chơi golf.

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

Các trường hợp thử nghiệm:

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

Clojure, 64 byte

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

Các giá trị của bản đồ có giá trị nhỏ hơn hoặc bằng 0 0, lớn hơn hoặc bằng với chiều dài 1và các chuỗi khác thành một chuỗi trống "". Điều này sau đó được nối với một chuỗi và các lần xuất hiện "10"được tính.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.