Berapa langkah saya berjalan?

14

Pedometer sederhana dapat dimodelkan dengan pendulum dengan dua sakelar di sisi yang berlawanan — satu di x = 0 dan satu di x = l . Ketika pendulum menghubungi tombol jauh, ambulator dapat diasumsikan telah mengambil setengah langkah. Saat kontak dengan sakelar dekat, langkahnya selesai.

Diberikan daftar bilangan bulat yang mewakili posisi bandul, tentukan jumlah langkah penuh yang dicatat pada pedometer.

Memasukkan

  • Integer l > 0, panjang trek.

  • Daftar bilangan bulat yang mewakili posisi pendulum pedometer setiap kali.

Keluaran

Jumlah langkah penuh yang diukur. Sebuah langkah diambil ketika pendulum menghubungi saklar jauh (x> = l) dan kemudian sakelar dekat (x <= 0).

Uji kasus

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

Pendulum segera melakukan kontak dengan sakelar jauh di x = 8 pada t = 0. Kemudian menyentuh saklar dekat pada t = 2 dan t = 4, menyelesaikan satu langkah. Setelah itu, ia menyentuh lagi saklar jauh pada x = 9 pada t = 8, tetapi itu tidak pernah menyentuh saklar dekat lagi.

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   
lirtosiast
sumber
1
Bagaimana dengan 7, [5, 4, 0]? Apakah itu 0 atau 1? Yaitu - apakah Anda menganggap bahwa ayunan selalu "panjang penuh"? Atau 7, [5, 8, 6, 1, 2]? Apakah itu 0 atau 1?
Bukan berarti Charles
1
@NotthatCharles Ditambahkan.
lirtosiast
Saya menganggap langkah selalu adalah: kontak di ujung, kemudian dekat ujung. Yaitu: ujung dekat, maka ujung jauh bukan langkah penuh. Jadi masukan8, [0 8 0 8] harus memberi 1, bukan 2. Apakah saya benar?
Luis Mendo
@ DonMuesli Ya.
lirtosiast

Jawaban:

4

CJam, 27 24 byte

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

Format input adalah daftar posisi pendulum diikuti oleh lpada satu baris.

Uji di sini.

Penjelasan

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.
Martin Ender
sumber
2

MATL , 22 byte

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

Ini menggunakan versi saat ini (14.0.0) dari bahasa / kompiler.

Input dalam urutan dan format yang sama dengan tantangan, dipisahkan oleh baris baru.

Cobalah online!

Penjelasan

>~     % 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
Luis Mendo
sumber
1

Javascript ES6 57 byte

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

Terima kasih @NotThatCharles untuk -4

Charlie Wynn
sumber
1
Mengapa tidak berpisah /10/?
Bukan berarti Charles
@NotthatCharles Saya sangat yakin itu tidak berhasil, coba saja dan ini luar biasa! - terima kasih
Charlie Wynn
4
Satu Charles ke lainnya;)
Bukan berarti Charles
1

Perl, 28 byte

Termasuk +1 untuk -p

Jalankan dengan input sebagai satu garis panjang bilangan bulat yang dipisahkan ruang pada STDIN, angka pertama adalah panjang:

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

steps.pl:

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

Menggunakan operator perl flip-flop dan menghitung berapa kali ia kembali ke false

Ton Hospel
sumber
1

Pyth, 18 byte

/.:@J,Q0m@S+Jd1E2J

Suite uji

Penjelasan:

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

Ruby, 42

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

rdimulai sebagai false. Kami beralih rdi setiap ujung trek, dan menambahkannya ke hitungan kami. Kemudian, belah dua hitungan (pembulatan ke bawah) untuk mendapatkan jumlah langkah.

Bukan itu Charles
sumber
0

Retina, 34

-1*

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

Cobalah online! atau coba dengan input desimal .

Mengambil input dalam unary, bilangan negatif unary diperlakukan sebagai -111...dan nol adalah string kosong. Menghitung berapa kali angka pertama muncul diikuti dengan nol. Menggunakan grup atom untuk menjamin bahwa kecocokannya minimal (sayangnya grup atom tidak dapat ditangkap sehingga harus dibungkus dengan grup lain ...).

FryAmTheEggman
sumber
0

Python 3, 82

Disimpan 2 byte berkat DSM.

Belum super 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

Kasus uji:

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
Morgan Thrapp
sumber
0

Clojure, 64 byte

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

Nilai Maps kurang dari atau sama dengan panjang nol hingga 0, lebih besar atau sama dengan 1dan lainnya untuk string kosong "". Ini kemudian digabungkan ke string dan kemunculan "10"dihitung.

NikoNyrh
sumber