Kaç adım yürüdüm?


14

Basit bir pedometre, karşı tarafta iki anahtar bulunan bir sarkaçla modellenebilir - biri x = 0'da ve biri x = l'de . Sarkaç uzak anahtarla temas ettiğinde, ambülatörün yarım adım attığı varsayılabilir. Yakın anahtarla temas ettiğinde adım tamamlanır.

Sarkacın konumlarını temsil eden tamsayıların bir listesi verildiğinde, pedometrede kaydedilen tam adımların sayısını belirleyin.

Giriş

  • L > 0 tamsayısı , parçanın uzunluğu.

  • Pedometrenin sarkaçının her seferinde pozisyonlarını temsil eden bir tamsayı listesi.

Çıktı

Ölçülen tam adımların sayısı. Sarkaç uzak anahtarla (x> = l) ve sonra yakın anahtarla (x <= 0) temas ettiğinde bir adım atılır.

Test senaryoları

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

Sarkaç hemen t = 0'da x = 8 konumunda far anahtarıyla temas eder. Sonra t = 2 ve t = 4'te yakın anahtara dokunarak bir adım tamamlar. Bundan sonra, t = 8'de uzaktaki düğmeye tekrar x = 9 değerinde dokunur, ancak bir daha asla yakın düğmeye dokunmaz.

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
Ne olmuş 7, [5, 4, 0]? Bu 0 veya 1 mi? Yani - bir salıncağın her zaman “tam uzunlukta” olduğunu mu düşünüyorsunuz? Yoksa 7, [5, 8, 6, 1, 2]? Bu 0 veya 1 mi?
Charles

1
@NotthatCharles Eklendi.
lirtosiast

Her zaman bir adım olduğunu varsayıyorum: uzak uçta, sonra yakın uçta temas. Yani: yakın uç, sonra uzak uç tam bir adım değildir. Yani girdi 8, [0 8 0 8]vermemeli 1, vermemelidir 2. Doğrumuyum?
Luis Mendo

@DonMuesli Evet.
lirtosiast

Yanıtlar:


4

CJam, 27 24 bayt

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

Girdi biçimi, sarkaç konumlarının ve ardından ltek bir satırın listesidir .

Burada test edin.

açıklama

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 bayt

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

Bu , dilin / derleyicinin geçerli sürümünü (14.0.0) kullanır .

Girdiler, yeni satırla ayrılmış olarak, sınamadakiyle aynı sırada ve biçimde.

Çevrimiçi deneyin!

açıklama

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

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

-4 için teşekkürler @NotThatCharles


1
Neden ayrılmıyorsunuz /10/?
O Charles

@NotthatCharles Ben işe yaramadı o kadar emindim, sadece denedim ve harika! - teşekkürler
Charlie Wynn

4
Bir Charles diğerine;)
Charles

1

Perl, 28 bayt

İçin +1 içerir -p

Giriş ile STDIN üzerinde uzun bir boşlukla ayrılmış tamsayı satırı olarak çalıştırın, ilk sayı uzunluktur:

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

steps.pl:

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

Perl flip-flop operatörünü kullanır ve kaç kez yanlış değerine döndüğünü sayar


1

Pyth, 18 bayt

/.:@J,Q0m@S+Jd1E2J

Test odası

Açıklama:

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

rolarak başlar false. rParçanın her iki ucunda geçiş yapıyoruz ve sayımımıza ekliyoruz. Ardından, adım sayısını elde etmek için sayıyı yarıya indirin (yuvarlama).


0

Retina, 34

-1*

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

Çevrimiçi deneyin! veya ondalık girdi ile deneyin .

Tekli girdi alır, negatif tekli sayı olarak kabul edilir -111...ve sıfır boş dizedir. İlk sayının ardından kaç kez göründüğünü sayar. Eşleşmelerin asgari düzeyde olmasını garanti etmek için bir atom grubu kullanır (ne yazık ki atom grupları yakalanmadığından başka bir gruba sarılmalıdır ...).


0

Python 3, 82

DSM sayesinde 2 bayt tasarruf etti.

Süper golf değil.

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

Test senaryoları:

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 bayt

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

Değerleri sıfırdan 0küçük veya ona eşit, uzuntan eşit veya daha büyük uzunlukta 1ve diğerlerini boş bir dizeye eşler "". Bu daha sonra bir dizeye birleştirilir ve oluşumları "10"sayılır.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.