Zainspirowany i na pamiątkę mojego drogiego przyjaciela i kolegi,
Dan Baronet , 1956-2016. ODP
Znalazł najkrótsze możliwe rozwiązanie APL do tego zadania:
Zadanie
Biorąc pod uwagę listę boolowską, policz liczbę końcowych wartości prawdy.
Przykładowe przypadki
{}
→ 0
{0}
→ 0
{1}
→ 1
{0, 1, 1, 0, 0}
→ 0
{1, 1, 1, 0, 1}
→ 1
{1, 1, 0, 1, 1}
→ 2
{0, 0, 1, 1, 1}
→ 3
{1, 1, 1, 1, 1, 1}
→ 6
01100
?Odpowiedzi:
Dyalog APL,
62 bajtyPrzetestuj na TryAPL .
Jak to działa
⊥ (uptack, dyadic: decode) wykonuje konwersję bazy. Jeśli lewy operand jest wektorem, dokonuje konwersji mieszanej bazy, co jest idealne do tego zadania.
Dla wektora bazowego b = b n , ⋯, b 0 i wektora cyfry a = a n , ⋯, a 0 , b ⊥ a konwertuje a na mieszaną zasadę b , tzn. Oblicza b 0 ⋯ b n-1 a n + ⋯ + b 0 b 1 a 2 + b 0 a 1 + a 0 .
Teraz ⍨ (tyldy dieresis, dojazdy) modyfikuje operatora w lewo w następujący sposób. W kontekście monadycznym wywołuje operatora z jednakowymi argumentami po lewej i prawej stronie.
Na przykład, ⊥⍨ jest zdefiniowana jako ⊥ , który oblicza 0 ⋯ n + ⋯ + A 0 1 2 + A 0 1 + A 0 , przy czym suma wszystkich skumulowanych produktów od prawej do lewej .
W przypadku k końcowych, k produktów po prawej stronie ma wartość 1, a wszystkie pozostałe mają wartość 0 , więc ich suma jest równa k .
źródło
b⊥b
i poddawaliśmy⊥⍨b
się nieskończonemu przyspieszaniu.JavaScript (ES6), 21 bajtów
Przypadki testowe
Pokaż fragment kodu
źródło
f(l)+1
zwraca wartość> 2
?l.pop()?(l.pop()?(l.pop()?(...etc...)+1:0)+1:0)+1:0
.Galaretka , 4 bajty
Wypróbuj online! lub Zweryfikuj wszystkie przypadki testowe.
W przypadku, gdy lista jest pusta, istnieje kilka ciekawych spostrzeżeń. Po pierwsze, kodowanie długości pustej listy
[]
zwraca kolejną pustą listę[]
. Następnie wycofuję ostatni element z tego, używającṪ
powrotów ogona0
zamiast pary,[value, count]
które są zwykłymi elementami tablicy zakodowanej na całej długości. Następnie produktP
zwraca,0
gdy zostanie wywołany,0
co jest oczekiwanym rezultatem.Wyjaśnienie
źródło
ŒgṪS
działa!Ṫ
w galarecie jest zaimplementowany jako:lambda z: iterable(z).pop() if iterable(z) else 0
.iterable
wywołany na liście po prostu zwraca listę, a pusta lista jest oczywiście fałszem.Brachylog ,
765 bajtówWypróbuj online!
Wyjaśnienie
Ponieważ
@] - Suffix
zaczyna się od największego sufiksu aż do najmniejszego, najpierw znajdzie najdłuższy bieg.źródło
CJam (8 bajtów)
Zestaw testów online
Sekcja
źródło
Haskell,
2625 bajtówStosowanie:
Wersja Pointfree (26 bajtów):
Użycie listy liczb całkowitych zamiast listy bool (21 bajtów, dzięki Christian Sievers):
Stosowanie:
Wersja Pointfree (25 bajtów)
źródło
foldl
pomysł działa za%b=b*(a+1)
Siatkówka ,
75 bajtówWypróbuj online! (Pierwszy wiersz włącza pakiet testowy oddzielony od linii).
Zdefiniowanie formatu wejściowego dla Retina nie jest całkowicie jednoznaczne. Ponieważ Retina nie ma żadnego rodzaju pojęcia oprócz ciągów (a także żadnej wartości, której można by użyć do naszej zwykłej definicji prawdy i fałszu), zwykle używam
0
i1
(lub ogólnie czegoś pozytywnego), aby odpowiadać prawdzie i fałszowi, ponieważ reprezentują one odpowiednio zero lub niektóre dopasowania.W przypadku reprezentacji jednoznakowych nie potrzebujemy również separatora dla listy (co w pewnym sensie jest bardziej naturalną reprezentacją listy dla języka, który ma tylko ciągi znaków). Adám potwierdził, że jest to akceptowalny format wejściowy.
Jeśli chodzi o sam regex, dopasowuje od
r
ight do lewej i\G
zakotwicza każde dopasowanie do poprzedniego. Dlatego liczy się to, ile1
s możemy dopasować od końca łańcucha.źródło
05AB1E ,
121065 bajtówZaoszczędzono 1 bajt dzięki carusocomputing .
Wypróbuj online!
Wyjaśnienie
źródło
0¡¤g
ma cztery bajty.J0¡¤g
jest też jeszcze krótszy;).Î
obsłużyć puste dane wejściowe, ale nadal jest to bajt zapisany dzięki :)Python, 31 bajtów
źródło
Galaretka , 4 bajty
TryItOnline! lub wszystkie testy
W jaki sposób?
źródło
MATL , 4 bajty
Wypróbuj online!
źródło
Mathematica,
2524 bajtówźródło
FromDigits[b=Boole@#,MixedRadix@b]&
(35 bajtów).Pyth, 6 bajtów
Wypróbuj tutaj!
Dołącza 0, odwraca i znajduje indeks pierwszego 0
źródło
C90 (gcc), 46 bajtów
Dane wejściowe są za pomocą argumentów wiersza poleceń (jedna liczba całkowita na argument), dane wyjściowe za pomocą kodu wyjścia .
Wypróbuj online!
Jak to działa
r jest zmienną globalną. Domyślny typ to int, a ponieważ jest globalny, domyślnie przyjmuje wartość 0 .
Argument funkcji c również domyślnie ma wartość int . Będzie zawierał liczbę całkowitą n + 1 dla tablic n booleanów; pierwszy argument main jest zawsze ścieżką do pliku wykonywalnego.
Argument funkcji v jest zadeklarowany jako
int**
. Rzeczywistym typem v będziechar**
, ale ponieważ zbadamy tylko najmniej znaczący bit każdego argumentu, aby odróżnić znaki 0 (punkt kodowy 48 ) i 1 (punkt kodowy 49 ) od siebie, nie będzie to miało znaczenia dla little-endian maszynyPętla while zmniejsza wartość c i porównuje ją z wartością 0 . Gdy c osiągnie wartość 0 , wyrwiemy się z pętli. Jest to konieczne tylko wtedy, gdy tablica nie zawiera 0 „s.
Dopóki
0<--c
zwraca 1 , bierzemy c- ty argument wiersza poleceń (v[c]
) i wyodrębniamy jego pierwszy znak, usuwając odwołanie ze wskaźnika (*
). Bierzemy bitowe AND logicznej0<--c
i punkt kodowy znaku (i trzy bajty śmieci po nim), więc warunek zwróci 0, gdy napotka się 0 , zrywając z pętli.W pozostałym przypadku, gdy argumentami wiersza poleceń są 1 ,
r++
zwiększa r o 1 , licząc w ten sposób liczbę końcowych 1 .Na koniec
c=r
przechowuje obliczoną wartość r in c . Przy ustawieniach domyślnych kompilator optymalizuje i usuwa przypisanie; faktycznie generujemovl %eax, -4(%rbp)
instrukcję. Ponieważret
zwraca wartość rejestru EAX, generuje to pożądane wyjście.Zauważ, że ten kod nie działa z C99, który zwraca 0 z main, jeśli osiągnięty jest koniec main .
źródło
argc
przynajmniej1
zargv[0]
nazwą pliku)? Możesz zapisać jeden bajt--c&&
zamiast0<--c&
. Kod wyjścia gcc jest pobierany zargc
? Schludny.*v[c]
jest punktem kodowym 1 lub 0 , więc jest to 49 lub 48, a zatem zawsze prawdziwe.k, 6 bajtów
Ta kompozycja funkcji przekłada się na
sum mins reverse
inq
, bardziej czytelne rodzeństwo języka, w którym min jest ruchomym minimum.źródło
J,
93 bajtyJest to zwrotna konwersja mieszanej zasady. Ponieważ jest to to samo, co konwersja mieszanej zasady. Jeszcze raz.
Przypadki testowe
źródło
R,
40 3925 bajtówCałkowicie przerobione rozwiązanie dzięki @Dason
Odczytaj dane wejściowe ze standardowego wejścia, odwróć wektor i jeśli pierwszy element jest
!=0
następnie wypisywany na pierwszą długość kodowania długości przebiegu (rle
), w przeciwnym razie0
.źródło
ifelse(r$v,r$l,0)[1]
. (Vectorized if, a następnie weź pierwszy element.)Haskell, 24 bajty
Iteruje po liście, dodając po jednym dla każdego elementu, resetując się
0
po trafieniu w aFalse
.16 bajtów z wejściem 0/1:
Gdyby lista nie była pusta, moglibyśmy uzyskać 14 bajtów:
To oblicza skumulowany produkt z tyłu, a następnie sumuje je. Skumulowany iloczyn pozostaje 1, aż do trafienia 0, a następnie staje się 0. Więc 1 odpowiada końcowym 1.
źródło
Pyke,
106 bajtówWypróbuj tutaj!
źródło
C # 6,
10372 bajtyKorzystanie z listy nieogólnej bije listę ogólną o 1 bajt lol
-31 bajtów dzięki Scott
źródło
int
s, możesz uciecint a(int[] l)=>l.Reverse().TakeWhile(i=>i>0).Sum();
Func<bool[], int>
dla 57 bajtów, tj.using System.Linq;l=>l.Reverse().TakeWhile(x=>x).Count();
Python, 37 bajtów
źródło
DASH , 16 bajtów
To nie jest najkrótsze możliwe rozwiązanie DASH, ale na mnie działa błąd. Zamieszczam to nowatorskie podejście na swoim miejscu.
Stosowanie:
Wyjaśnienie
źródło
Scala, 25 bajtów
Nie golfowany:
Odwraca listę, dodaje 0 i znajduje pierwszy indeks 0, czyli liczbę elementów przed pierwszym 0
źródło
Partia, 57 bajtów
Pobiera dane wejściowe jako parametry wiersza polecenia. Działa poprzez pomnożenie akumulatora przez bieżącą wartość przed dodaniem go, tak aby wszelkie zera w wierszu poleceń zresetowały licznik. Zauważ, że
%%n
to nie to samo co zmiennan
lub%n%
.źródło
GolfSharp, 14 bajtów
źródło
Java 7, 62 bajty
Kod niepoznany i testowy:
Wypróbuj tutaj.
Wynik:
źródło
Perl 5.10, 22 bajty
21 bajtów + 1 bajt na
-a
flagę. Ponieważ wyrażenie oparte na wyrażeniach regularnych zostało wykonane ...: sWartości wejściowe dla tablicy muszą być oddzielone spacją.
Wypróbuj online!
źródło
perl -E '$_++while pop;say' 0 1 1 0 1 1 1
ale to nic nie daje0
(nie jestem pewien, czy to jest problem!)Perl, 22 bajty
21 bajtów kodu + 1 bajt na
-p
flagę.Aby uruchomić:
(Faktycznie, format danych wejściowych nie ma znaczenia dużo:
0110111
,0 1 1 0 1 1 1
,[0,1,1,0,1,1,1]
itd. By wszystkie prace)Wersja 18- bajtowa z @Dom Hastings, ale wymaga podania danych wejściowych jako ciągu 0 i 1, co jest niedozwolone:
źródło
;
sztuczkę :) Jeśli format jest ciągłym ciągiem:perl -pE '/1*$/;$_=length$&' <<< '0110111'
przez 18 nie jestem pewien, czy to zgina reguły, czy nie ...PHP, 50 bajtów
Dziwnie, moja pierwsza próba z wyrażeniem regularnym okazała się krótsza niż moja próba z tablicami ...
Użyj takich jak:
źródło
Ruby
3732 bajtyTworzy anonimową funkcję, która znajduje najbardziej prawą instancję fałszywej wartości i liczy wielkość podtablicy zaczynając od tej wartości.
Używa wartości
!0
false, ponieważ 0 to prawdziwe wartości Rubiego.rindex
znajduje ostatni indeks wartości w tablicy.Zastosowanie :
Zwraca 1
Jeśli pozwolono mi na przekazanie ciągu 0 i 1 jako parametrów wiersza poleceń (co nie jest tym, w jaki sposób ruby reprezentuje listy wartości logicznych), mógłbym sprowadzić go do 24:
Używa wyrażeń regularnych i wypisuje długość łańcucha zwróconego przez wyrażenie regularne
/(1*)\z/
, gdzie\z
jest koniec łańcucha.$*[0]
jest pierwszym przekazywanym argumentem i jest łańcuchem zer i jedynek.Stosowanie:
Zwraca 1.
źródło