Скільки кроків я пройшов?


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;

Використовує оператор flip-flop perl і підраховує кількість разів, коли він повертається до false


1

Піт, 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

Пітон 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.