Сколько шагов я прошел?


14

Простой шагомер можно смоделировать с помощью маятника с двумя переключателями на противоположных сторонах - один при x = 0 и один при x = l . Когда маятник соприкасается с дальним переключателем, можно предположить, что амбулатор сделал полшага. Когда он соприкасается с ближним переключателем, шаг завершен.

Учитывая список целых чисел, представляющих положения маятника, определите количество полных шагов, записанных на шагометре.

вход

  • Целое число l > 0, длина дорожки.

  • Список целых чисел, представляющих положения маятника шагомера в каждый момент времени.

Выход

Количество полных шагов измеряется. Шаг делается, когда маятник контактирует с дальним переключателем (x> = l) и затем с ближним переключателем (x <= 0).

Контрольные примеры

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

Маятник немедленно вступает в контакт с дальним выключателем при x = 8 при t = 0. Затем он касается ближнего переключателя при t = 2 и t = 4, выполняя один шаг. После этого он снова касается дальнего переключателя при x = 9 при t = 8, но никогда больше не касается ближнего переключателя.

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?
Не то, чтобы Чарльз

1
@NotthatCharles Добавлено.
lirtosiast

Я предполагаю, что шаг всегда таков: контакт в дальнем конце, затем в ближнем конце. То есть: ближний конец, то дальний конец не полный шаг. Так что вклад 8, [0 8 0 8]должен дать 1, а не 2. Я прав?
Луис Мендо

@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

Javascript ES6 57 байт

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

Спасибо @NotThatCharles за -4


1
Почему бы не разделить на /10/?
Не то, чтобы Чарльз

@NotthatCharles Я был уверен, что это не сработало, просто попробовал, и это здорово! - спасибо
Чарли Уинн

4
Один Чарльз другому;)
Не то чтобы Чарльз

1

Perl, 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 и подсчитывает, сколько раз он возвращается в 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

Сетчатка, 34

-1*

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

Попробуйте онлайн! или попробуйте с десятичным вводом .

Принимает ввод в унарных, отрицательные унарные числа обрабатываются как -111...и ноль - пустая строка. Подсчитывает количество раз, когда появляется первое число, за которым следует ноль. Использует атомарную группу, чтобы гарантировать, что совпадения минимальны (к сожалению, атомарные группы не захватываются, поэтому их нужно поместить в другую группу ...).


0

Python 3, 82

Сохранено 2 байта благодаря DSM.

Еще не супер гольф.

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

Clojure, 64 байта

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

Сопоставляет значения, меньшие или равные от нуля до 0, превышающие или равные по длине 1и другие, с пустой строкой "". Затем он соединяется со строкой, и вхождения "10"подсчитываются.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.