Ile kroków przeszedłem?

14

Prosty krokomierz można modelować za pomocą wahadła z dwoma przełącznikami po przeciwnych stronach - jednym przy x = 0 i jednym przy x = l . Gdy wahadło zetknie się z przełącznikiem dalekim, można założyć, że ambulator zrobił pół kroku. Gdy zetknie się z przełącznikiem Near, krok jest zakończony.

Biorąc pod uwagę listę liczb całkowitych reprezentujących pozycje wahadła, określ liczbę pełnych kroków zarejestrowanych na krokomierzu.

Wejście

  • Liczba całkowita l > 0, długość ścieżki.

  • Lista liczb całkowitych reprezentujących pozycje wahadła krokomierza za każdym razem.

Wynik

Zmierzona liczba pełnych kroków. Krok jest podejmowany, gdy wahadło styka się z przełącznikiem dalekiego zasięgu (x> = l), a następnie przełącznikiem bliskim (x <= 0).

Przypadki testowe

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

Wahadło natychmiast kontaktuje się z przełącznikiem dalekiego zasięgu przy x = 8 przy t = 0. Następnie dotyka przełącznika near w punkcie t = 2 it = 4, wykonując jeden krok. Następnie ponownie dotyka przełącznika dalekiego przy x = 9 przy t = 8, ale nigdy więcej nie dotyka przełącznika bliskiego.

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
źródło
1
Co 7, [5, 4, 0]? Czy to 0 czy 1? To znaczy - czy zakładasz, że huśtawka jest zawsze „na całej długości”? Czy 7, [5, 8, 6, 1, 2]? Czy to 0 czy 1?
Nie, że Charles
1
@NotthatCharles Dodano.
lirtosiast
Zakładam, że zawsze krokiem jest: kontakt na drugim końcu, a następnie na końcu. Oznacza to, że: koniec, koniec nie jest pełnym krokiem. Więc wkład 8, [0 8 0 8]powinien dać 1, a nie 2. Mam rację?
Luis Mendo
@DonMuesli Tak.
lirtosiast

Odpowiedzi:

4

CJam, 27 24 bajtów

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

Format wejściowy to lista pozycji wahadła, po której następuje l pojedynczy wiersz.

Sprawdź to tutaj.

Wyjaśnienie

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
źródło
2

MATL , 22 bajty

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

Używa bieżącej wersji (14.0.0) języka / kompilatora.

Dane wejściowe są w tej samej kolejności i formacie co w wyzwaniu, oddzielone znakiem nowej linii.

Wypróbuj online!

Wyjaśnienie

>~     % 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
źródło
1

JavaScript ES6 57 bajtów

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

Dzięki @NotThatCharles za -4

Charlie Wynn
źródło
1
Dlaczego nie podzielić /10/?
Nie, że Charles
@NotthatCharles Byłem pewien, że to nie działa, po prostu spróbowałem i jest świetnie! - dzięki
Charlie Wynn
4
Jeden Karol do drugiego;)
Nie, że Charles
1

Perl, 28 bajtów

Obejmuje +1 dla -p

Uruchom z wejściem jako jedną długą linię liczb całkowitych oddzielonych spacją na STDIN, pierwsza liczba to długość:

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

steps.pl:

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

Używa operatora przerzucania perla i odlicza liczbę razy, gdy powraca do wartości false

Ton Hospel
źródło
1

Pyth, 18 bajtów

/.:@J,Q0m@S+Jd1E2J

Zestaw testowy

Wyjaśnienie:

/.:@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
źródło
0

Ruby, 42 lata

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

rzaczyna się jako false. Przełączamy się rna każdym końcu toru i dodajemy go do naszej liczby. Następnie zmniejsz o połowę liczbę (zaokrąglając w dół), aby uzyskać liczbę kroków.

Nie ten Charles
źródło
0

Retina, 34

-1*

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

Wypróbuj online! lub spróbuj z wprowadzeniem dziesiętnym .

Pobiera dane wejściowe w postaci jednoargumentowej, ujemne liczby jednoargumentowe są traktowane jak, -111...a zero jest pustym ciągiem. Zlicza, ile razy pojawia się pierwsza liczba, a po niej zero. Używa grupy atomowej, aby zagwarantować, że dopasowania są minimalne (niestety grupy atomowe nie przechwytują, więc musi być zawinięte w inną grupę ...).

FryAmTheEggman
źródło
0

Python 3, 82

Zaoszczędzono 2 bajty dzięki DSM.

Jeszcze nie super golfa.

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

Przypadki testowe:

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
źródło
0

Clojure, 64 bajty

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

Odwzorowuje wartości mniejsze lub równe od zera do 0, większe niż lub równe długości do 1i inne do pustego ciągu "". Jest to następnie łączone w ciąg i "10"liczone są wystąpienia .

NikoNyrh
źródło