Wyzwanie:
Napisz funkcję lub program, który akceptuje listę wartości boolowskich i zwraca wszystkie zakresy wartości True.
Przypadki testowe:
f [F] = []
f [T] = [[0,0]]
f [T,T,F,T] = [[0,1],[3,3]]
f [F,T,T,F,F,T,T,T] = [[1,2],[5,7]]
f [F,T,T,F,F,F,T,T,T,T] = [[1,2],[6,9]]
f [T,T,F,F,F,T,T,T,T,T,T,T,T,T,T,F] = [[0,1],[5,14]]
f [F,F,T,T,F,F,F,F,F,F,F,F,T,T,T,T,T,T,T,T,F,F,F,F,F,F,F,F,F,F,F,F,F,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,T,T] = [[2,3],[12,19],[33,54],[93,94]]
Zasady:
- Możesz wybrać sposób kodowania danych wejściowych, np. Listę, tablicę, ciąg znaków itp.
- Dane wyjściowe muszą być zakodowane jako lista podobnych do list lub ciąg pokazujący takie, więc tablice, listy, krotki, macierze, wektory itp.
- Wartości boolowskie muszą być kodowane jako stałe, ale w przeciwnym razie dozwolona jest dowolna prosta konwersja T / F na pożądane stałe
- EDYCJA: ewaluacja lub podobne w czasie wykonywania jest dozwolone.
- Nie zapomnij wyjaśnić, w jaki sposób dane wejściowe są przekazywane do programu / funkcji i podaj dane wejściowe / wyjściowe dla przypadków testowych
- Konwersja do żądanego formatu wejściowego nie jest liczona
- Standardowe luki są niedozwolone
- Jeśli Twój język ma taką funkcję, jest to niedozwolone
- Nie zaakceptuję własnego zgłoszenia
- EDYCJA: Format wyjściowy jest elastyczny. Jeśli nie jest drukowana lista lub podobne, wartości zakresu muszą być oddzielone jednym znakiem nienumerycznym i oddzielnymi zakresami.
Punktacja:
- Wynik jest w bajtach, chyba że jest niezgodny z Twoim językiem (np. Kodery w języku Piet)
- Najniższy wynik wygrywa
Istnieje duża elastyczność wejścia i wyjścia, ale rozwiązania, w których T / F są zastępowane funkcjami wykonującymi całą pracę, są niedozwolone.
Debugowanie:
Jeśli piszesz swój w Haskell lub możesz wywołać go z Haskell, następujące funkcje sprawdzą twoją funkcję / program:
import Test.QuickCheck
tf = cycle [True,False]
gen l = foldl (++) [] $ map (\i -> [tf!!i | x<-[1..i]]) l
putIn (a,b) l = zipWith (||) l [(a <= p) && (p <= b) | p <- [0..length l]]
putAllIn rs len = foldr putIn [False|i<-[1..len]] rs
main = print $ quickCheck (check functionNameGoesHere)
code-golf
array-manipulation
Michael Klein
źródło
źródło
Odpowiedzi:
Pyth,
1716 bajtówWykorzystuje trochę fantazji po przypisaniu magii kontrowania wraz z kodowaniem długości przebiegu.
Pobiera dane wejściowe jako tablicę
0
s i1
s, np[1, 1, 0, 1, 0]
. Wyniki jak w wyzwaniu, np[[0, 1], [3, 3]]
.Pakiet testowy
źródło
Pyth, 18 bajtów
Zestaw testowy
Prawda jest reprezentowana jako
1
, Fałsz jako0
.Zakresy są reprezentowane łącznie.
źródło
Retina ,
823427 bajtówPusty wiersz powinien zawierać pojedynczą spację.
Dane wejściowe są ciągiem płaskim
_
dla wartości prawda i:
fałsz. Wyjście to pary rozdzielone spacjami, każda w osobnym wierszu.Wypróbuj online.
Wyjaśnienie
Ciężki golf od 82 do 27 bajtów był możliwy dzięki sprytnemu wyborowi reprezentacji prawdy i fałszu. Wybrałem znak słowny
_
, (który nie jest cyfrą) dla prawdy, i znak niebędący słowem:
, (który nie wymaga ucieczki) dla fałszu. To pozwala mi wykryć końce zakresów jako granice słów.Dopasowujemy granicę słów. Chcemy zastąpić tę granicę odpowiednim indeksem prawdziwej wartości. Zasadniczo jest to dość łatwe dzięki najnowszej
$#
funkcji Retiny , która zlicza liczbę przechwyceń grupy. Po prostu łapiemy każdą postać przed tą pozycją do grupy. Licząc te postacie, otrzymujemy pozycję. Jedynym haczykiem jest to, że końce zasięgu są teraz wyłączone o jeden. Chcemy indeks postaci przed meczem. Można to również łatwo naprawić poprzez opcjonalne dopasowanie tego,_
co nie zostało schwytane, pomijając w ten sposób jedną postać, gdy jesteśmy na końcu zakresu.Teraz zastępujemy wszystkie serie znaków podkreślenia spacją. Oznacza to, że wstawiamy spację między początkiem i końcem każdego zakresu, jednocześnie usuwając podkreślenia.
Pozostawia to dwukropek (i nadal musimy rozdzielić pary). Robimy to, dzieląc cały ciąg na linie wokół każdego jelita grubego. Te
S
substancje czynne trybie podziału, a_
pomijanie pustych segmentów tak, że nie dostają mnóstwo pustych wierszy, gdy mamy serie dwukropkami.źródło
Python 2, 69 bajtów
Przykładowe dane wyjściowe:
Bezpośrednie podejście, bez wbudowanych. Śledzi bieżącą wartość
x
i poprzednią wartośćp
. Kiedy są różne, zmieniliśmy biegi. Po przełączeniu0
na1
drukuje bieżący indeksi
. Po przełączeniu1
na0
drukuje bieżący indeks minus jeden, a następnie średnik.if
Jest dość śmierdząca. Może rekurencja byłaby lepsza,źródło
MATL , 17
1820bajtówKorzysta z bieżącej wersji (9.1.0) języka / kompilatora.
Dane wejściowe to ciąg znaków zawierający znaki
T
iF
. Dane wyjściowe to dwuwierszowa tabela, w której każda kolumna wskazuje zakres przy użyciu indeksowania 1, który jest domyślnym językiem.Dzięki Stewie Griffin za usunięcie 2 bajtów.
Przykład
Wyjaśnienie
Opiera się na prostym wyrażeniu regularnym:
źródło
Oktawa, 43 bajtów
find(diff([0,x,0]))
znajduje wszystkie pozycje, w których tablica wejściowa zmienia się między true a false. Przekształcając to w macierz 2 na n, osiągamy dwie rzeczy: zmiany z prawdy na fałsz i z fałszu na prawdę są podzielone na dwa rzędy. Umożliwia to odjęcie 1 i 2 od każdego z tych wierszy. Odejmowanie 1 od pierwszego wiersza jest konieczne, ponieważ Octave ma indeks 1, a nie zero. Odejmowanie 2 z drugiego wiersza jest konieczne, ponieważfind(diff())
znajduje pozycję pierwszej fałszywej wartości, a my chcemy ostatnią prawdziwą wartość. Część odejmowania jest możliwa tylko w Octave, a nie w MATLAB.źródło
CJam,
2725 bajtówOczekuje danych wejściowych takich jak
TTFTFT
. Wypróbuj online .Wyjaśnienie
źródło
Japt,
343125 bajtówTym razem wypróbowanie nowego podejścia naprawdę się sprawdziło.
Wypróbuj online!
Dane wejściowe to ciąg znaków
F
forfalse
iT
fortrue
. Dane wyjściowe to tablica tablic; reprezentacja ciągu sprawia, że wygląda jak pojedyncza tablica.Jak to działa
Uwaga: teraz widzę, że kilka osób wymyśliło już ten algorytm, ale odkryłem go niezależnie.
Wersja niekonkurencyjna, 22 bajty
W najnowszym zatwierdzeniu GitHub dodałem nową funkcję: interlinia
;
ustawia zmienneA-J,L
na różne wartości.A
jest ustawiony na pustą tablicę, co eliminuje potrzebę jego ręcznego tworzenia.źródło
Haskell, 74 bajty
Przykład użycia:
map(\l->(fst$l!!0,fst$last l)).wordsBy(not.snd).zip[0..] $ [True,False,True,True,False]
->[(0,0),(2,3)]
.Jak to działa:
źródło
J, 26 bajtów
Jest to bezimienny czasownik monadyczny (funkcja jednoargumentowa), który zwraca tablicę 2D lub liczby całkowite. Używa się go w następujący sposób.
Wyjaśnienie
źródło
Ruby, 39 lat
Przykładowe wywołanie:
Tak
..
Ruby reprezentuje zakresy włączające.Jedną interesującą rzeczą jest to, jak uzyskać indeks końca zakresu. To dziwne. Dynamicznie tworzę wyrażenie regularne, które pasuje do ostatniego znaku zakresu, a następnie wszystkie kolejne znaki i koniec łańcucha, aby wymusić prawidłowe dopasowanie. Następnie używam,
=~
aby uzyskać indeks tego wyrażenia regularnego w oryginalnym ciągu.Podejrzewam, że może być krótszy sposób na to w Ruby przy użyciu flag -naF.
źródło
JavaScript (ES6), 59
Funkcja anonimowa, wprowadzana jako ciąg znaków
T
iF
zwracająca dane wyjściowe jako tablicę tablicTEST
źródło
𝔼𝕊𝕄𝕚𝕟, 18 znaków / 28 bajtów
Try it here (Firefox only).
Wyjaśnienie
źródło
Haskell, 62 bajty
Pobiera na wejściu listę zer i jedynek.
Biorąc pod uwagę listę
l
, uzupełnia ją 0 po obu stronach i oblicza indeksowaną listę kolejnych par. Na przykładNastępnie wyodrębnij indeksy odpowiadające kolejnym elementom
(0,1)
i(1,0)
, które są początkami bloków 0 i 1, odejmując 1 od początków 0, aby uzyskać końce 1, i pomiń wyniki.źródło
f l=(\s->zip[i|(i,0,1)<-s][i-1|(i,1,0)<-s])$zip3[0..](0:l)$l++[0]
.Pyth,
1918 bajtówWyjaśnienie:
Wypróbuj tutaj .
źródło
Perl, 47 bajtów
Dzięki następującym opcjom Perlrun
-lpe
:Alternatywnie, gdy wyjście jest oddzielone wierszem (34 bajty):
źródło
Python 2, 108 bajtów
Przypadki testowe:
Z pewnością istnieje krótsze rozwiązanie, ale działa.
źródło
Haskell: 123 bajty (przykład, nie można wygrać)
Mniej golfa:
źródło
allTrue s e = and (subList s e)
a możeallTrue = (and.) . sublist
.all (==True) (subList s e)
jest to bardzo jasne.CJam, 30 bajtów
Wprowadź jako tablicę
0
s i1
s w stylu CJam . Wyjście jako tablica par w stylu CJam.Uruchom wszystkie przypadki testowe. (Zajmuje się konwersją formatów wejściowych.)
źródło
Japt, 27 bajtów
Musi istnieć sposób na grę w golfa ...
W każdym razie jest to to samo co moja odpowiedź.
źródło
APL, 17 znaków
W
⎕IO←0
i⎕ML←3
. Po angielsku:⍵×⍳⍴⍵
: wyzeruj elementy wektora indeksu, dopóki argument, w którym argument jest fałszywy⍵⊂
: wytnij na początku każdego ciągu prawd i wyrzuć fałsz(↑,↑∘⊖)¨
: weź pierwszy i ostatni element każdej podtablicyźródło
PowerShell, 82 bajty
Rozwiązanie Regex, używając właściwości obiektu MatchInfo .
Przykład
źródło
Mathematica, 45 bajtów
Niezbyt interesujące; używa wbudowanego.
źródło
Clojure, 109 znaków
Pierwsza rzecz, jaka przyszła mi do głowy, oparta na
reduce
ipartition-by
.Prosty przypadek testowy (mapy
T
dotrue
iF
nafalse
):źródło