Twoim dzisiejszym zadaniem jest napisanie programu lub funkcji, która pobiera tablicę liczb całkowitych i liczy liczbę razy, odczytując od lewej do prawej, że wartość się zmienia. Łatwiej to pokazać na przykładzie:[1 1 1 2 2 5 5 5 5 17 3] => [1 1 1 **2** 2 **5** 5 5 5 **17** **3**] => 4
Przypadek testowy:
Input | Output
[] | 0
[0] | 0
[0 1] | 1
[0 0] | 0
[1 2 3 17] | 3
[1 1 1 2 2 3] | 2
[-3 3 3 -3 0] | 3
To jest golf golfowy , wygrywa najmniej bajtów!
False
zamiast tego jest drukowany?2+False
i popełniam błędy, to nie jest w porządku, ale jeśli tak2
, to w porządku.0
akceptowalne?Odpowiedzi:
MATL , 2 bajty
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
źródło
Python 3 , 38 bajtów
Wypróbuj online!
źródło
maximum recursion depth exceeded
.y>()
zmieni się na False , więc poniższy kodand
nie zostanie wykonany.Haskell , 33 bajty
Wypróbuj online!
Bonus: nieco ciekawa bezcelowa wersja arytmetyczna (44 bajty)
Wypróbuj online!
Biorąc pod uwagę wejście
[1,1,4,3,3,3]
, najpierw wziąć różnicę sąsiednich wpisów ([0,3,-1,0,0]
), wówczasabs
wartość olute:[0,3,1,0,0]
. Biorąc zero do potęgi każdego elementu za pierwszym razem[1,0,0,1,1]
, a drugi raz odwraca listę:[0,1,1,0,0]
((1-)
działałoby tutaj również zamiast(0^)
). Wreszcie bierzemysum
listę, aby uzyskać2
.źródło
Python 2 , 42 bajty
Wypróbuj online!
źródło
Brain-Flak , 50 bajtów
Wypróbuj online!
Nie wyprowadza nic dla 0, co w uderzeniu mózgu jest równoważne. Jeśli jest to nie do przyjęcia, dodaj to do
+4
bajtów:({})
Wyjaśnienie:
źródło
-0+1 = 1
Brain-Flak , 50 bajtów
Wypróbuj online!
źródło
Haskell , 35 bajtów
-8 bajtów dzięki H.PWiz.
Wyprzedzony przez rekurencyjną wersję . Haskell jest prawie najlepszy w rekurencji i mi tego brakowało. > _ <
Wypróbuj online!
Byłoby wspaniale, gdyby ktoś wymyślił, jak zastosować tę wskazówkę .
Alternatywne rozwiązanie, 36 bajtów
Wypróbuj online!
źródło
uncurry
funkcja działała , potrzebujesz funkcjif
. Jestsum.map fromEnum.(zipWith(/=)=<<tail)
to prawdopodobnie najbliższe, ale nie będzie działać[]
i ma 37 bajtów ..Java (OpenJDK 8) , 65 bajtów
Nie tak krótki, jak bym chciał, ale to po prostu Java dla Ciebie.
Testuj, przekazując tablicę jako listę rozdzielaną przecinkami.
Wypróbuj online!
źródło
a->{int s=0,p=a[0];for(int n:a)s+=p==(p=n)?0:1;return s;}
(57 bajtów).a->{int s=0;for(int i:a)s+=a[0]!=(a[0]=i)?1:0;return s;}
Łuska , 3 bajty
Wypróbuj online!
Wyjaśnienie
źródło
Ohm v2 , 3 bajty
Wypróbuj online!
Wyjaśnienie
źródło
sign
wbudowanego!Wolfram Language (Mathematica) , 23
242629bajtyWypróbuj online!
Split[]
.małe wyjaśnienie:
Split
podzieli tablicę na listę list (tych samych elementów), czyli zamienia się{1, 2, 2, 3, 1, 1}
w{{1}, {2, 2}, {3}, {1, 1}}
. Tak więcLength@Split@#
jest ilość kolejnych segmentów.Max[*****-1, 0]
służy do radzenia sobie z{}
danymi wejściowymi.źródło
Max[Length@Split@#-1,0]&
Length@Split@#~Max~1-1&
Siatkówka ,
242116 bajtówDzięki @MartinEnder za -3 bajty i zauważenie błędu
-1 bajt dzięki @tsh
-4 bajty dzięki @Leo
Wypróbuj online!
źródło
Symboliczny Python ,
120117 bajtówZmieniono w golfa 3 bajty, usuwając jawny rzut na liczbę całkowitą (przy użyciu unary
+
) dla zmiennej licznika - oznacza to, że jeśli nie ma żadnych zmian w tablicy, wyjście będzieFalse
zamiast0
, ale jest to dozwolone przez meta .Wypróbuj online!
źródło
Galaretka , 3 bajty
Wypróbuj online!
Jak to działa
źródło
K (oK) , 8 bajtów
Rozwiązanie:
Wypróbuj online!
Przykłady:
Wyjaśnienie:
Interpretowane od prawej do lewej:
źródło
05AB1E , 3 bajty
Wypróbuj online!
źródło
Łuska , 4 bajty
Wypróbuj online!
źródło
R , 24 bajty
Wypróbuj online!
Taki sam jak odpowiedź MATL, po prostu użyty,
sum(!!diff))
ponieważ nie mannz
.źródło
rle
będzie krótsze, ale nie,length(rle()$v)
używa zbyt wielu znaków i jest wyłączone o jeden.sum(rle()$v|1)
zamiast tegolength
. :)Cubix , 24 bajty
Wypróbuj online
Zauważ, że Cubix używa 0, aby wskazać, że nie ma już żadnych danych wejściowych, więc 0 nie może być na liście.
Wyjaśnienie
Rozłożony:
Zaczynamy od
0
, wypychając licznik (zainicjowany za pomocą0
) i pierwsze wejście (I
) na stos.Następnie wchodzimy w pętlę. Przy każdej iteracji pętli otrzymujemy kolejne dane wejściowe za pomocą
I
. Jeśli wynosi 0, zabrakło nam danych wejściowych, więc obracamy licznik do góry (p
),O
utput i exit (@
).W przeciwnym razie bierzemy różnicę z dwóch górnych elementów. Jeśli jest niezerowy, obracamy licznik do góry, zwiększamy go i obracamy z powrotem do dołu za pomocą
p)q
. Następnie zaznaczamy różnicę;
przed przejściem do następnej iteracji.Wszystkie postacie niewymienione tutaj są tylko kontrolą. W programach Cubix jest ich wiele.
źródło
0
na(
, ale to się nie powiedzie przy pustym wejściu.Brain-Flak , 50 bajtów
Wypróbuj online!
Ponieważ wszyscy publikują swoje 50-bajtowe rozwiązania tutaj są moje (mam 48-bajtowe, ale była to prosta modyfikacja DjMcMayhem, więc czułem, że warto opublikować)
Wyjaśnienie
Ta odpowiedź w szerokim zakresie wykorzystuje anulowanie wartości.
Wygląda na to, że nie grał w golfa
Tutaj obliczamy deltę, aż na stosie pozostanie jeden element, za każdym razem, gdy gromadzimy jedną wartość z wewnętrznej pętli, jeśli delta nie jest równa zero.
Jest to dość prosty sposób na zrobienie tego.
Aby uczynić tego golfa, zaczynamy anulować wartość. Pierwszym i tym, który powinien być oczywisty dla każdego zahartowanego golfisty, jest wysokość stosu. Jest to dobrze znany fakt
jest taki sam jak
Gdy wartości są modyfikowane o jeden, to samo obowiązuje. To nam daje
Możesz zauważyć, że to nawet nie uratowało nam bajtów, ale nie przejmuj się, że stanie się to bardziej przydatne w miarę upływu czasu.
Możemy wykonać kolejną redukcję, jeśli zobaczysz oświadczenie
możesz to zredukować do
Działa to, ponieważ jeśli wejdziemy w pętlę
[(...)]
i{}
anulujemy, a jeśli nie, wartość[(...)]
już była zero na pierwszym miejscu i nie trzeba jej anulować. Ponieważ w kodzie mamy ten wzorzec, możemy go zmniejszyć.To zaoszczędziło nam 2 bajty, ale także umieściło obok siebie dwa neg. Można je połączyć, aby uratować nam kolejne 2.
I to jest nasz kod.
źródło
Perl 6 , 18 bajtów
Sprawdź to
Rozszerzony:
źródło
Gaia , 2 bajty
Wypróbuj online!
To nadużywa błędu (lub funkcji?) Gai, że kodowanie długości przebiegu nie bierze pod uwagę ostatniego ciągu elementów. Pamiętaj, że dwukrotnie sprawdziłem, działa dla wszystkich przypadków testowych.
ė
- Kodowanie długości przebiegu (z wadą opisaną powyżej).l
- długośćźródło
JavaScript (ES6), 35 bajtów
źródło
f=([a,...b])=>1/a?!!(a-b[0])+f(b):0
Pyth, 5 bajtów
Zestaw testowy.
Wyjaśnienie:
źródło
APL (Dyalog) , 8 bajtów
Wypróbuj online!
W jaki sposób?
⊃,⊢
- lista, z pierwszą wartością powtarzaną dla przypadku pojedynczego elementu2≠/
- lista zmian, nie równa dla każdych 2 elementów+/
- sumaźródło
Perl 5 , 37 + 2 (
-ap
) = 39 bajtówWypróbuj online!
źródło
J, 10 bajtów
Infiksy o długości 2 ... czy są nierówne?
2 ~:/\ ]
Zsumuj wynikową listę
0
s i1
s:+/
Wypróbuj online!
źródło
[:+/0=-/\
powinien działać dla Myślę, że 9 bajtów.Ruby , 31 bajtów
Wypróbuj online!
źródło
.drop(1)
możesz zrobić[1..-1]
drop
zwraca Enumerator, a nie Array, więc to nie działa.size
tablicy?C (gcc 5.4.0), 61 bajtów
Wypróbuj online!
f
jest funkcją przenoszącą długość tablicy i wskaźnik do pierwszego elementu tablicy i zwracającą liczbę zmian w tablicy;To przesłanie wykorzystuje nieokreślone zachowanie (
*p++!=*p
, p jest używane dwukrotnie w wyrażeniu, w którym zostało zmienione), które działa na moim komputerze (gcc 5.4.0) i na TIO, ale może nie działać na innych implementacjach lub wersjach.Wyjaśnienie:
źródło
05AB1E , 3 bajty
Wypróbuj online!
Alternatywa dla odpowiedzi Erika.
źródło