¿Cuántos pasos caminé?

14

Un podómetro simple puede ser modelado por un péndulo con dos interruptores en lados opuestos: uno en x = 0 y otro en x = l . Cuando el péndulo contacta con el interruptor lejano, se puede suponer que el ambulador ha dado medio paso. Cuando entra en contacto con el interruptor cercano, se completa el paso.

Dada una lista de números enteros que representan las posiciones del péndulo, determine el número de pasos completos registrados en el podómetro.

Entrada

  • Un entero l > 0, la longitud de la pista.

  • Una lista de enteros que representan las posiciones del péndulo del podómetro en cada momento.

Salida

El número de pasos completos medidos. Se da un paso cuando el péndulo contacta el interruptor lejano (x> = l) y luego el interruptor cercano (x <= 0).

Casos de prueba

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

El péndulo hace contacto inmediatamente con el interruptor lejano en x = 8 en t = 0. Luego toca el interruptor cercano en t = 2 yt = 4, completando un paso. Después de eso, toca el interruptor lejano nuevamente en x = 9 en t = 8, pero nunca más toca el interruptor cercano.

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
fuente
1
¿Qué hay de 7, [5, 4, 0]? ¿Es eso 0 o 1? Es decir, ¿asume que un columpio es siempre "completo"? O 7, [5, 8, 6, 1, 2]? ¿Es eso 0 o 1?
No es que Charles
1
@NotthatCharles Añadido.
lirtosiast
Supongo que un paso siempre es: contacto en el otro extremo, luego cerca del final. Es decir: cerca del final, entonces el extremo lejano no es un paso completo. Entonces la entrada 8, [0 8 0 8]debería dar 1, no 2. ¿Estoy en lo correcto?
Luis Mendo
@DonMuesli Sí.
lirtosiast

Respuestas:

4

CJam, 27 24 bytes

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

El formato de entrada es la lista de posiciones de péndulo seguidas de luna sola línea.

Pruébalo aquí.

Explicación

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
fuente
2

MATL , 22 bytes

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

Esto usa la versión actual (14.0.0) del lenguaje / compilador.

Las entradas están en el mismo orden y formato que en el desafío, separadas por una nueva línea.

Pruébalo en línea!

Explicación

>~     % 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
fuente
1

Javascript ES6 57 bytes

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

Gracias @NotThatCharles por -4

Charlie Wynn
fuente
1
¿Por qué no dividirse /10/?
No es que Charles
@NotthatCharles Estaba tan seguro de que no funcionó, ¡simplemente lo probé y es genial! - gracias
Charlie Wynn
44
Un Charles a otro;)
No es que Charles
1

Perl, 28 bytes

Incluye +1 para -p

Ejecute con la entrada como una larga línea de enteros separados por espacios en STDIN, el primer número es la longitud:

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

steps.pl:

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

Utiliza el operador de flip-flop perl y cuenta el número de veces que vuelve a falso

Ton Hospel
fuente
1

Pyth, 18 bytes

/.:@J,Q0m@S+Jd1E2J

Banco de pruebas

Explicación:

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

Rubí, 42

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

rcomienza como false. Cambiamos ra cada extremo de la pista y lo agregamos a nuestra cuenta. Luego, reduzca a la mitad el conteo (redondeando hacia abajo) para obtener el número de pasos.

No es que Charles
fuente
0

Retina, 34

-1*

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

Pruébalo en línea! o pruébalo con entrada decimal .

Toma entrada en unario, los números unarios negativos se tratan como -111...y cero es la cadena vacía. Cuenta el número de veces que aparece el primer número seguido de un cero. Utiliza un grupo atómico para garantizar que las coincidencias sean mínimas (lamentablemente, los grupos atómicos no capturan, por lo que debe estar envuelto en otro grupo ...).

FryAmTheEggman
fuente
0

Pitón 3, 82

Guardado 2 bytes gracias a DSM.

No super golf aún.

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

Casos de prueba:

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
fuente
0

Clojure, 64 bytes

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

Asigna valores menores o iguales de cero a 0, mayores que o iguales de longitud 1y otros a una cadena vacía "". Esto se concatena a una cadena y "10"se cuentan las ocurrencias de .

NikoNyrh
fuente