Quanti passi ho fatto?


14

Un semplice contapassi può essere modellato da un pendolo con due interruttori sui lati opposti: uno a x = 0 e uno a x = l . Quando il pendolo contatta l'interruttore lontano, si può presumere che l'ambulatore abbia compiuto mezzo passo. Quando contatta l'interruttore vicino, il passaggio è completato.

Dato un elenco di numeri interi che rappresentano le posizioni del pendolo, determinare il numero di passi completi registrati sul contapassi.

Ingresso

  • Un numero intero l > 0, la lunghezza della traccia.

  • Un elenco di numeri interi che rappresentano ogni volta le posizioni del pendolo del pedometro.

Produzione

Il numero di passi completi misurato. Viene fatto un passo quando il pendolo contatta l'interruttore lontano (x> = l) e quindi l'interruttore vicino (x <= 0).

Casi test

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

Il pendolo entra immediatamente in contatto con l'interruttore lontano su x = 8 at t = 0. Quindi tocca l'interruttore vicino at = 2 et = 4, completando un passo. Successivamente, tocca di nuovo l'interruttore lontano in x = 9 at t = 8, ma non tocca mai più l'interruttore vicino.

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
Che dire 7, [5, 4, 0]? È 0 o 1? Cioè - pensi che uno swing sia sempre "a figura intera"? Oppure 7, [5, 8, 6, 1, 2]? È 0 o 1?
Non che Charles

1
@NotthatCharles Aggiunto.
lirtosiast

Presumo che un passo sia sempre: contattare da lontano, quindi vicino. Cioè: vicino, quindi lontano non è un passo completo. Quindi input 8, [0 8 0 8]dovrebbe dare 1, no 2. Ho ragione?
Luis Mendo,

@DonMuesli Sì.
Lirtosiast

Risposte:


4

CJam, 27 24 byte

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

Il formato di input è l'elenco delle posizioni del pendolo seguito da luna sola riga.

Provalo qui.

Spiegazione

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 byte

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

Questo utilizza la versione corrente (14.0.0) del linguaggio / compilatore.

Gli input sono nello stesso ordine e formato della sfida, separati da una nuova riga.

Provalo online!

Spiegazione

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

Perl, 28 byte

Include +1 per -p

Esegui con l'input come una lunga riga di numeri interi separati da spazio su STDIN, il primo numero è la lunghezza:

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

steps.pl:

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

Utilizza l'operatore flip-flop perl e conta il numero di volte che ritorna su falso


1

Pyth, 18 byte

/.:@J,Q0m@S+Jd1E2J

Suite di test

Spiegazione:

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

Ruby, 42

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

rinizia come false. Attiviamo rciascuna estremità della traccia e la aggiungiamo al nostro conteggio. Quindi, dimezza il conteggio (arrotondamento per difetto) per ottenere il numero di passaggi.


0

Retina, 34

-1*

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

Provalo online! o provalo con l'input decimale .

Prende l'input in unario, i numeri unari negativi vengono considerati come -111...e zero è la stringa vuota. Conta il numero di volte in cui appare il primo numero seguito da uno zero. Utilizza un gruppo atomico per garantire che le partite siano minime (purtroppo i gruppi atomici non si stanno catturando, quindi deve essere racchiuso in un altro gruppo ...).


0

Python 3, 82

Salvato 2 byte grazie a DSM.

Non ancora 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

Casi 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

0

Clojure, 64 byte

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

Mappe valori inferiori o uguali a zero 0, maggiore o uguale a lunghezza 1e altri su una stringa vuota "". Questo viene quindi concatenato a una stringa e "10"vengono contate le occorrenze di .


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.