Combien de pas ai-je parcourus?

14

Un podomètre simple peut être modélisé par un pendule avec deux commutateurs sur les côtés opposés - un à x = 0 et un à x = l . Lorsque le pendule entre en contact avec l'interrupteur éloigné, l'ambulateur peut être supposé avoir fait un demi-pas. Lorsqu'il contacte l'interrupteur proche, l'étape est terminée.

À partir d'une liste d'entiers représentant les positions du pendule, déterminez le nombre de pas complets enregistrés sur le podomètre.

Contribution

  • Un entier l > 0, la longueur de la piste.

  • Une liste d'entiers représentant les positions du pendule du podomètre à chaque fois.

Production

Le nombre de pas complets mesurés. Un pas est franchi lorsque le pendule entre en contact avec l'interrupteur éloigné (x> = l) puis l'interrupteur proche (x <= 0).

Cas de test

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

Le pendule entre immédiatement en contact avec l'interrupteur lointain à x = 8 à t = 0. Il touche ensuite l'interrupteur proche à t = 2 et t = 4, complétant une étape. Après cela, il touche à nouveau l'interrupteur éloigné à x = 9 à t = 8, mais il ne touche plus jamais l'interrupteur proche.

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
la source
1
Et alors 7, [5, 4, 0]? Est-ce 0 ou 1? C'est-à-dire - présumez-vous qu'une balançoire est toujours «pleine longueur»? Ou 7, [5, 8, 6, 1, 2]? Est-ce 0 ou 1?
Pas que Charles
1
@NotthatCharles Added.
lirtosiast
Je suppose qu'une étape est toujours: le contact à l'extrémité distante, puis à l'extrémité proche. C'est-à-dire: l'extrémité proche, puis l'extrémité éloignée n'est pas une étape complète. Donc, l'entrée 8, [0 8 0 8]devrait donner 1, non 2. Ai-je raison?
Luis Mendo
@DonMuesli Oui.
lirtosiast

Réponses:

4

CJam, 27 24 octets

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

Le format d'entrée est la liste des positions du pendule suivie de l une seule ligne.

Testez-le ici.

Explication

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
la source
2

MATL , 22 octets

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

Cela utilise la version actuelle (14.0.0) du langage / compilateur.

Les entrées sont dans le même ordre et format que dans le défi, séparées par une nouvelle ligne.

Essayez-le en ligne!

Explication

>~     % 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
la source
1

Javascript ES6 57 octets

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

Merci @NotThatCharles pour -4

Charlie Wynn
la source
1
Pourquoi ne pas vous séparer /10/?
Pas que Charles
@NotthatCharles J'étais tellement sûr que cela ne fonctionnait pas, j'ai juste essayé et c'est génial! - merci
Charlie Wynn
4
Un Charles à l'autre;)
Pas que Charles
1

Perl, 28 octets

Comprend +1 pour -p

Exécutez avec l'entrée comme une longue ligne d'entiers séparés par des espaces sur STDIN, le premier nombre est la longueur:

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

steps.pl:

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

Utilise l'opérateur de bascule perl et compte le nombre de fois qu'il revient à faux

Ton Hospel
la source
1

Pyth, 18 octets

/.:@J,Q0m@S+Jd1E2J

Suite de tests

Explication:

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

Rubis, 42

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

rcommence comme false. Nous basculons rà chaque extrémité de la piste et l'ajoutons à notre décompte. Ensuite, divisez par deux le nombre (arrondi vers le bas) pour obtenir le nombre de pas.

Pas que Charles
la source
0

Rétine, 34

-1*

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

Essayez-le en ligne! ou essayez-le avec une entrée décimale .

Prend l'entrée en unaire, les nombres unaires négatifs sont traités comme -111...et zéro est la chaîne vide. Compte le nombre de fois que le premier nombre apparaît, suivi d'un zéro. Utilise un groupe atomique pour garantir que les correspondances sont minimes (malheureusement, les groupes atomiques ne sont pas en train de capturer, il doit donc être enveloppé dans un autre groupe ...).

FryAmTheEggman
la source
0

Python 3, 82

Enregistré 2 octets grâce à DSM.

Pas encore 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

Cas de test:

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
la source
0

Clojure, 64 octets

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

Mappe des valeurs inférieures ou égales de zéro à 0, supérieures ou égales de longueur à 1et d'autres à une chaîne vide "". Ceci est ensuite concaténé en une chaîne et les occurrences de "10"sont comptées.

NikoNyrh
la source