Quantos passos eu andei?


14

Um pedômetro simples pode ser modelado por um pêndulo com dois interruptores em lados opostos - um em x = 0 e outro em x = l . Quando o pêndulo entra em contato com a chave remota, presume-se que o ambulador tenha dado meio passo. Quando entra em contato com o comutador próximo, a etapa é concluída.

Dada uma lista de números inteiros representando as posições do pêndulo, determine o número de etapas completas registradas no pedômetro.

Entrada

  • Um número inteiro l > 0, o comprimento da faixa.

  • Uma lista de números inteiros representando as posições do pêndulo do pedômetro em cada momento.

Resultado

O número de etapas completas medidas. Um passo é dado quando o pêndulo entra em contato com a chave remota (x> = l) e depois a chave próxima (x <= 0).

Casos de teste

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

O pêndulo imediatamente entra em contato com a chave remota em x = 8 em t = 0. Em seguida, ele toca no interruptor próximo em t = 2 e t = 4, completando uma etapa. Depois disso, ele toca novamente no interruptor remoto em x = 9 em t = 8, mas nunca toca no interruptor próximo novamente.

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
Que tal 7, [5, 4, 0]? Isso é 0 ou 1? Ou seja - você assume que um balanço é sempre "completo"? Ou 7, [5, 8, 6, 1, 2]? Isso é 0 ou 1?
Não que Charles seja o

1
@NotthatCharles Adicionado.
precisa saber é o seguinte

Presumo que um passo seja sempre: contato no extremo oposto, depois no extremo próximo. Ou seja: o fim próximo, o fim distante não é um passo completo. Portanto, a entrada 8, [0 8 0 8]deve dar 1, não 2. Estou correcto?
Luis Mendo

@DonMuesli Yes.
precisa saber é o seguinte

Respostas:


4

CJam, 27 24 bytes

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

Formato de entrada é a lista de posições do pêndulo seguidas por luma única linha.

Teste aqui.

Explicação

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

Isso usa a versão atual (14.0.0) do idioma / compilador.

As entradas estão na mesma ordem e formato que no desafio, separadas por uma nova linha.

Experimente online!

Explicação

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

Inclui +1 para -p

Execute com a entrada como uma longa linha de números inteiros separados por espaço em STDIN, o primeiro número é o comprimento:

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

steps.pl:

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

Usa o operador de flip-flop perl e conta o número de vezes que retorna para false


1

Pitão, 18 bytes

/.:@J,Q0m@S+Jd1E2J

Suíte de teste

Explicação:

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

rcomeça como false. Alternamos rem cada extremidade da faixa e a adicionamos à nossa contagem. Em seguida, reduza pela metade a contagem (arredondamento para baixo) para obter o número de etapas.


0

Retina, 34

-1*

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

Experimente online! ou tente com entrada decimal .

Recebe entrada em números unários negativos, unários, são tratados como -111...e zero é a sequência vazia. Conta o número de vezes que o primeiro número aparece seguido de um zero. Usa um grupo atômico para garantir que as correspondências sejam mínimas (infelizmente, os grupos atômicos não são capturados, portanto, ele deve ser agrupado em outro grupo ...).


0

Python 3, 82

Economizou 2 bytes graças ao DSM.

Ainda não é super golfista.

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 teste:

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)))))

Mapeia valores menores ou iguais a zero 0, maiores ou iguais a comprimento 1e outros a uma sequência vazia "". Isso é concatenado para uma sequência e as ocorrências de "10"são contadas.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.