Wie viele Schritte bin ich gegangen?


14

Ein einfaches Pedometer kann durch ein Pendel mit zwei Schaltern auf gegenüberliegende Seiten-Eins bei x = 0 und einem bei x = modelliert werden l . Wenn das Pendel den Fernschalter berührt, kann davon ausgegangen werden, dass der Ambulator einen halben Schritt gemacht hat. Wenn es den Near-Schalter berührt, ist der Schritt abgeschlossen.

Bestimmen Sie anhand einer Liste von Ganzzahlen, die die Positionen des Pendels darstellen, die Anzahl der auf dem Schrittzähler aufgezeichneten Vollschritte.

Eingang

  • Eine ganze Zahl l > 0 ist die Länge der Spur.

  • Eine Liste von Ganzzahlen, die die Positionen des Pedometerpendels zu jedem Zeitpunkt darstellen.

Ausgabe

Die Anzahl der gemessenen Vollschritte. Ein Schritt wird ausgeführt, wenn das Pendel den Fernschalter (x> = 1) und dann den Nahschalter (x <= 0) berührt.

Testfälle

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

Das Pendel berührt sofort den Fernschalter bei x = 8 bei t = 0. Dann berührt es den Near-Schalter bei t = 2 und t = 4 und vollendet einen Schritt. Danach berührt es den Fernschalter erneut bei x = 9 bei t = 8, aber es berührt den Nahschalter nie wieder.

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
Was ist 7, [5, 4, 0]? Ist das 0 oder 1? Das heißt - nehmen Sie an, dass eine Schaukel immer "in voller Länge" ist? Oder 7, [5, 8, 6, 1, 2]? Ist das 0 oder 1?
Nicht dass Charles

1
@NotthatCharles Hinzugefügt.
Lirtosiast

Ich nehme an, ein Schritt ist immer: Kontakt am fernen Ende, dann am nahen Ende. Das heißt: nahes Ende, dann ist fernes Ende kein vollständiger Schritt. Also 8, [0 8 0 8]sollte Input geben 1, nicht 2. Hab ich recht?
Luis Mendo

@ DonMuesli Ja.
Lirtosiast

Antworten:


4

CJam, 27 24 Bytes

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

Das Eingabeformat ist die Liste der Pendelpositionen, gefolgt von leiner einzelnen Zeile.

Teste es hier.

Erläuterung

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 Bytes

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

Dies verwendet die aktuelle Version (14.0.0) der Sprache / des Compilers.

Die Eingaben erfolgen in der gleichen Reihenfolge und im gleichen Format wie bei der Abfrage, getrennt durch eine neue Zeile.

Probieren Sie es online!

Erläuterung

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

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

Danke @NotThatCharles für -4


1
Warum nicht aufteilen /10/?
Nicht dass Charles

@NotthatCharles Ich war mir so sicher, dass es nicht funktioniert hat, habe es einfach ausprobiert und es ist großartig! - Danke
Charlie Wynn

4
Ein Charles zum anderen;)
Nicht dass Charles

1

Perl, 28 Bytes

Beinhaltet +1 für -p

Führen Sie die Eingabe als eine lange Zeile mit durch Leerzeichen getrennten Ganzzahlen in STDIN aus. Die erste Zahl ist die Länge:

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

steps.pl:

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

Verwendet den Perl-Flip-Flop-Operator und zählt, wie oft false zurückgegeben wird


1

Pyth, 18 Bytes

/.:@J,Q0m@S+Jd1E2J

Testsuite

Erläuterung:

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

Rubin, 42

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

rbeginnt als false. Wir schalten ran jedem Ende der Spur um und addieren es zu unserer Zählung. Halbieren Sie dann die Zählung (Abrundung), um die Anzahl der Schritte zu erhalten.


0

Retina, 34

-1*

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

Probieren Sie es online! oder versuche es mit dezimaleingabe .

Eingaben in unären, negativen unären Zahlen werden behandelt als -111...und Null ist die leere Zeichenkette. Zählt, wie oft die erste Zahl gefolgt von einer Null angezeigt wird. Verwendet eine Atomgruppe, um sicherzustellen, dass die Übereinstimmungen minimal sind (leider sind Atomgruppen nicht erfassbar, daher muss sie in eine andere Gruppe eingeschlossen werden ...).


0

Python 3, 82

2 Bytes dank DSM gespart.

Noch nicht super golfen.

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

Testfälle:

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 Bytes

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

Ordnet Werte kleiner oder gleich Null zu 0 , größer oder gleich Länge 1und andere einer leeren Zeichenfolge zu "". Dies wird dann zu einer Zeichenfolge verkettet und das Auftreten von "10"wird gezählt.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.