Znajdź najdłuższą serię prawdy na liście booleanów. Zwróć tę samą listę, a wszystkie inne prawdy sfałszowane.
Wejście wyjście
Lista; dowolny zwykły format (np. lista rozdzielana jako ciąg).
Detale
Prawda i fałsz mogą być wszystkim, czego Twój język używa do tych wartości, lub liczbami całkowitymi 1 i 0. Jeśli używasz pojedynczych znaków, lista może być konkatenacją (np 10001
.).
Jeśli istnieje remis dla najdłuższego biegu, utrzymuj wszystkie wiązania wiązania prawdziwe, i fałszuj wszystkie krótsze przebiegi.
Przykłady
input ↦ output
1,0,1,0,1 ↦ 1,0,1,0,1
1,1,0,1,1,0,1 ↦ 1,1,0,1,1,0,0
1,1,0,1,1,1,0,1,1 ↦ 0,0,0,1,1,1,0,0,0
1,1,1 ↦ 1,1,1
0,0,1 ↦ 0,0,1
0,0 ↦ 0,0
1,1,1,0,0,0,1,1,1,1,0,1,0,0,1,1,0,1,1,1,1,0,0,1,0 ↦ 0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0
(bezpośrednio z /programming//q/37447114 )
code-golf
array-manipulation
msh210
źródło
źródło
Haskell,
59,58,55, 64 bajtówZabawna uwaga, działa to na dowolnej liście wartości gdzie
falsy < truthy
. WięcFalse/True
,0/1
,'f'/'t'
, itd.Uwaga:
Jak zauważyło kilka osób (w tym
@proud haskeller
i@nimi
), poprzednia wersja nie powiodła się na liście wszystkich wartości fałszowania. Dodanie.([1<2]:)
poprawiło to, zgodnie z sugestią@proud haskeller
. Na razie pozostawiam to samo wyjaśnienie, ponieważ myślę, że nadal ma sens. Jeśli ktoś komentuje i poprosi o wyjaśnienie edycji, dokonam edycji.Wyjaśnienie:
Najpierw odinstaluję bez
group
, a następnie dodam z powrotem. Po pierwsze, stwierdzam, że słowa są często łatwiejsze dla oczu niż symboli, więc dokonam kilku podstawień. (Zauważ, że=<<
jest to „klasyczne”, więc ma inne zastosowanie do list i funkcji. Dzwoniębind
do wersji=<<
funkcji).Ostatnie szczegóły są takie, że
x <$ list
zastępuje każdy elementlist
zx
igroup list
dzielilist
się na kawałki równych elementów. Takgroup [1, 1, 2, 3, 3, 3] == [[1, 1], [2], [3, 3, 3]]
.Podsumowując, funkcja dzieli listę wartości na grupy tylko prawda i grupy tylko fałsz. Następnie dla każdej grupy zamień każdy element na wynik instrukcji
this is the biggest group
(największa grupatrue
będzie największa) i połącz grupy.Cztery bajty zapisane przez
@Zgarb
źródło
(\y->(maximum g==y)<$y)
z((<$)=<<(==maximum g))
. Nie przetestowałem tego jednak.f
funkcją bez punktów((=<<)=<<(=<<)(<$).(==).maximum).group
. Oszczędza trzy bajty i jest całkowicie nieczytelny!b=(=<<);b b(b(<$).(==).maximum).group
jest jeszcze jeden bajt krótszy. Nigdy wcześniej nie widziałem czegoś takiego w golfie w Haskell :)(:[t])
przed maksimum lub coś podobnegoSiatkówka oka,
474336Wypróbuj online! lub wypróbuj wszystkie przypadki testowe
Dzięki msh210 za grę w golfa 4 bajty!
Wielkie podziękowania dla Martina za 7 bajtów!
Wyjaśnienie:
Zamień wszystkie
0
s na!
s. Robi się to, aby dopasować grupy1
s, tak jak teraz,1!
i!1
będą miały\b
między nimi granicę słowa ( ), która również pasuje do początku lub końca łańcucha.Jest to opcja konfiguracji mówiąca, że po zastosowaniu wyrażenia regularnego po kliknięciu wstecz na dane wejściowe, w każdym dopasowaniu tłumaczy każdy drukowany znak ascii na
0
znak.Ten wyrażenie regularne pasuje do grup
1
s otoczonych zerami, ale nie może pasować do1
następnej po sobie w dowolnym miejscu ciągu. Są to nie maksymalne grupy, które zostaną sfałszowane. Ponadto, pasuje to również do!
znaków, które dodaliśmy, aby przekonwertować je z powrotem na0
s.źródło
MATL, 14 bajtów
Wypróbuj online!
Zmodyfikowana wersja ze wszystkimi przypadkami testowymi
Wyjaśnienie
źródło
Python 2, 62 bajty
Przetestuj na Ideone .
Jak to działa
s.split('0')
Dzieli ciąg wejściowy s do tras zera lub więcej 1 „sDla każdego przebiegu t sprawdzamy, czy
t+'1'
jest podciągiem s .Jeśli tak, przebieg nie jest maksymalny,
t+'1'in s
zwróć True ,1-(t+'1'in s)
zwróć 1 - True = 0, a przebieg zostanie zastąpiony biegiem 0 tej samej długości.Jeśli tak nie jest, bieg jest maksymalny,
t+'1'in s
zwraca False ,1-(t+'1'in s)
zwraca 1 - False = 1, a bieg jest zastępowany biegiem 1 tej samej długości, tj. Sam.Wreszcie
'0'.join
przywraca wszystkie usunięte 0 .źródło
J, 25 bajtów
Jest to czasownik monadyczny, który przyjmuje i zwraca tablicę 0-1. Użyj tego w ten sposób:
Wyjaśnienie
źródło
;.
.Pyth,
26242321 bajtówZestaw testowy.
1/0
lubtrue/false
w danych wejściowych.true/false
w wyniku.Wyjaśnienie
Poprzednie 23 bajty
Zestaw testowy.
1/0
lubtrue/false
w danych wejściowych.1/0
w wyniku.Poprzednie 24 bajty
Zestaw testowy.
1/0
lubtrue/false
w danych wejściowych.1/0
w wyniku.Poprzednie 26 bajtów
Zestaw testowy.
1/0
lubtrue/false
w danych wejściowych.1/0
w wyniku.źródło
Jr.b,N&YNrQ8)9qReSJJ
lubJrm,hd*FdrQ8 9qReSJJ
. Obie wersje oszczędzają jeden bajt. Lub jeszcze bardziej szalonyJrXR1*FdrQ8 9qReSJJ
i uratuj dwa. ;-)Oracle SQL 12.1,
137135 bajtówNie grał w golfa
Wprowadź użyj pojedynczych znaków. Np .: „1100111”
źródło
Mathematica ,
4641Działa na listach
0
i1
. Myślałem, że poradziłem sobie całkiem dobrze, dopóki nie spojrzałem na inne odpowiedzi!Wyjaśnienie dotyczące wersji 46 znaków; Będę aktualizować, gdy nie będę mógł go dalej ulepszać.
Poproszono o wyjaśnienie tego kodu.
Niekodowy ekwiwalent golfa (przy użyciu formularzy operatora w wersji 10) to:
Oznacza to funkcję złożoną z pięciu kroków (podfunkcji) zastosowanych w kolejności od góry do dołu.
Split
: rozbicie na serie identycznych elementów: {1,1,0,1,1,0,1} ↦ {{1,1}, {0}, {1,1}, {0,0}}Map[# Tr@# &]
: Dla każdej podlisty (Map
) pomnóż ją (#
) przez jej sumę (ślad wektorowyTr
): {1,1} ↦ {2, 2}# - Max[1, #] &
odejmij od każdego elementu maksymalną wartość pojawiającą się w dowolnym miejscu na liście list lub jeden, w zależności od tego, która wartość jest wyższa. (Ten obsługuje wielkość liter wszystkich zer).UnitStep
: równa 0 dla x <0 i 1 dla x> = 0, stosowane do każdego elementu.Apply[Join]
: połącz podlisty w jedną listę. Można to również zrobić za pomocąFlatten
lubCatenate
, ale w skrócieJoin@@
jest bardziej zwięzły.źródło
C,
135129 bajtówWypróbuj online
Nie golfił
źródło
JavaScript (ES6), 56 bajtów
Działa poprzez sprawdzanie wszystkich przebiegów 1s i zastępowanie znaków zerami, chyba że przebieg jest (równie) najdłuższy, mierzony przez przeszukiwanie ciągu pod kątem dłuższego ciągu 1s.
Poprzednie 72-bajtowe rozwiązanie rekurencyjne:
Nie robi nic, jeśli nie ma serii 1 (tzn. Najwyżej pojedynczych 1). W przeciwnym razie odejmuje jeden
1
z każdego1
lub jednego z nich , a następnie wywołuje się rekurencyjnie w krótszych seriach, a następnie dodaje jeden z1
powrotem w przypadku (obecnie równie najdłuższych) serii. Liczba wywołań rekurencyjnych jest o jeden mniejsza niż długość najdłuższego przebiegu.źródło
Julia, 51 bajtów
Wypróbuj online!
Jak to działa
replace
wyszukuje wszystkie przebiegi jednego lub więcej 1 w ciągu wejściowym s poprzez wyrażenie regularner"1+"
i wywołuje lambda wt->map(c->c-contains(s,"1"t),t)
celu ustalenia ciągu zastępującego.Mapa lambda obejmuje
c->c-contains(s,"1"t)
wszystkie postacie z serii t .Jeśli
"1"t
(konkatenacji) jest podłańcuchem s , bieg nie jest maksymalna,contains
powraca prawdziwa ic-contains(s,"1"t)
powraca „1” - PRAWDA = „0” , zastępując wszystkie 1 „S w tym cyklu z 0 ” S.Jeśli
"1"t
(konkatenacja) nie jest podciągiem s , przebieg jest maksymalny,contains
zwraca false ic-contains(s,"1"t)
zwraca „1” - false = „1” , pozostawiając przebieg niezmodyfikowany.źródło
APL, 22 znaki
W języku angielskim (od prawej do lewej w blokach):
źródło
Java 8, 205 bajtów
To jest wyrażenie lambda dla
Function<String,String>
:wejście / wyjście to miejsce,
String
gdzie prawda jest reprezentowana przez 1, a fałsz jest reprezentowany przez 0. Nie ma znaków ograniczających oddzielających wartości.kod z wyjaśnieniem:
zobacz ideone dla przypadków testowych
źródło
Clojure, 137 bajtów
Najpierw dzieli dane wejściowe na kolejne zera i jedynki i mapuje je na „krotki” pierwszego elementu partycji i liczbę elementów. Następnie powtarza potrzebną liczbę zer lub jedynek, w zależności od tego, czy jest to sekwencja jedności, czy nie.
Mniej golfa:
źródło
Perl 5, 68 bajtów
67, plus 1 za
-pe
zamiast-e
Oczekuje i drukuje ciąg (konkatenację) zera i jedynki.
źródło