Prawdopodobnie widziałeś te znaki na drzwiach różnych sklepów:
GODZINY OTWARCIA
pn – pt 0900–1800 sob.
-niedz. 1100–1530
Zadanie polega na wygenerowaniu takiego znaku, grupując kolejne dni z tymi samymi godzinami otwarcia, z listy godzin otwarcia na cały tydzień. Zauważ, że tydzień „zawija się”, co jest uważane za kolejne.
Wejście:
- 7 elementów, reprezentujących godziny otwarcia każdego dnia w tygodniu, zaczynając od poniedziałku.
- Każdy element jest ciągiem w postaci XXXX-XXXX
Przykładowe dane wejściowe:
0900-1800 0900-1800 0930-1730 0930-1730 0900-1500 1100-1500 1100-1500
- Można wysłać dane wejściowe jako tablicę (na przykład jako dane wejściowe do funkcji, jeśli nie czytasz ze standardowego wejścia)
Wynik:
- Lista godzin otwarcia, w których kolejne dni z tymi samymi godzinami otwarcia są pokazane jako zakres. Pamiętaj, że niedziela (ostatni dzień) i poniedziałek (pierwszy dzień) to także kolejne dni.
- Dzień, w którym dzień nie ma podobnych godzin otwarcia jak dni przed lub po, jest drukowany sam
- Dni są określone jako trzy małe litery: pon wt śr czw pt sr niedz
- Pamiętaj, że pierwszy element na wejściu odpowiada mon, obok wt itp.
- Godziny otwarcia są pokazane jak na wejściu
Dwa przykłady
mon-fri 0900-1800, sat-sun 1100-1500 mon-wed 1030-1530, thu 100-1800, fri-sun 1200-1630
Dane wyjściowe należy posortować, aby zakresy były wyświetlane w kolejności dni w tygodniu. Poniedziałek jest preferowany jako pierwszy, ale może się zdarzyć, że nie jest pierwszy w grupie, ponieważ tydzień się kończy. Więc w tym przypadku wt jest pierwszym zakresem.
tue-fri 0900-1800, sat-mon 1100-1500
Nie grupuj, chyba że z rzędu, tutaj środa i piątek mają takie same godziny otwarcia, ale są oddzielone czwartkiem z różnymi godzinami otwarcia, więc są one wymienione osobno.
mon-tue 1000-1200, wed 0900-1500, thu 1000-1800, fri 0900-1500, sat-sun 1000-1500
- Dane wyjściowe mogą być rozdzielone przecinkami jako przykłady tutaj lub oddzielone znakiem nowej linii, jak w przykładzie na górze.
Przypadki testowe
Pierwszy wiersz jest wprowadzany, drugi wiersz jest oczekiwany
0900-1800 0900-1800 0900-1800 0900-1800 0900-1800 1100-1500 1100-1500
mon-fri 0900-1800, sat-sun 1100-1500
0900-1800 0900-1800 0900-1800 0930-1700 0900-1800 1100-1500 1100-1500
mon-wed 0900-1800, thu 0930-1700, fri 0900-1800, sat-sun 1100-1500
1100-1500 0900-1800 0900-1800 0900-1800 0900-1800 1100-1500 1100-1500
tue-fri 0900-1800, sat-mon 1100-1500
1100-1500 1100-1500 0900-1800 0900-1800 0900-1800 0900-1800 1100-1500
wed-sat 0900-1800, sun-tue 1100-1500
1200-1500 1100-1500 0900-1800 0900-1800 0900-1800 0900-1800 1100-1500
mon 1200-1500, tue 1100-1500, wed-sat 0900-1800, sun 1100-1500
Zasady
To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w bajtach.
Odpowiedzi:
JavaScript (ES6),
182173170163157 bajtówZapisano 6 bajtów za pomocą edc65
Pobiera dane wejściowe jako tablicę ciągów i bezpośrednio drukuje wynik na konsoli:
Sformatowane i skomentowane
Przypadki testowe
źródło
D='montuewedthufrisatsun'.match(/.../g)
użycieD
jako tablicy zamiast funkcji powinno zaoszczędzić trochę bajtówD()
można go wywołać za pomocą-1
(gdy szukamy słowa „dzień przed poniedziałkiem”), który działa,substr()
ale nie działa z tablicą.Partia, 334 bajty
Pobiera dane wejściowe jako parametry wiersza polecenia, wyświetla każdą grupę w osobnym wierszu. Działa poprzez porównywanie godzin każdego dnia z poprzednim dniem, śledząc
f
jako pierwszy dzień w grupie,h
jako godziny dla tej grupy,l
jako ostatni dzień w grupie iw
kiedy ostatnia grupa wraca na początek tygodnia. Po znalezieniu niedopasowania drukowana jest poprzednia grupa, chyba że ma miejsce zawijanie tygodnia. Na koniec, gdy wszystkie dni są przetwarzane, ostatnia grupa jest dostosowywana do każdego tygodnia pakowania i czy wszystkie godziny okazały się takie same przed wyjściem.0
jest używany jako symbol zastępczy, ponieważ puste ciągi kosztują więcej bajtów do porównania w partii.źródło
Galareta ,
87 84 8075 bajtów'
szybkim, „płaskim”)Jestem pewien, że istnieje lepszy sposób, ale na razie:
TryiItOnline
W jaki sposób?
źródło
JavaScript (ES6),
171169 bajtówPobiera dane wejściowe jako tablicę i wysyła do konsoli osobnymi wierszami. To jest prawie dokładnie port mojej odpowiedzi wsadowej;
f
teraz domyślnie pusty ciąg oczywiście, natomiast mogę również domyślniel
iw
do'sun'
(używając wartości wskaźnikowych zaoszczędziło mi 3 bajty w trybie wsadowym, ponieważ udało mi się połączyć inicjalizacji Into theset/a
).źródło
BaCon ,
514496455 bajtówPoniższy program BASIC jest pokazany z wcięciem. Ale bez wcięcia składa się z 455 bajtów.
Chodzi o to, aby wykorzystać harmonogramy jako indeksy do tablicy asocjacyjnej. Następnie każdy dzień oznacza trochę: poniedziałek = bit 0, wtorek = bit 1, środa = bit 2 i tak dalej. Rzeczywiste wartości członków tablicy asocjacyjnej są obliczane na podstawie odpowiednich bitów dni przy użyciu binarnego OR.
Następnie należy sprawdzić, ile kolejnych bitów jest obecnych w elementach tablicy asocjacyjnej, zaczynając od bitu 0.
W przypadku ustawienia bitu 0 i bitu 6 jest zawijanie tygodnia. W takim przypadku zacznij szukać początku następnej sekwencji bitów, zapamiętując tę pozycję początkową. Wydrukuj resztę sekwencji, a gdy tylko bit 6 zostanie osiągnięty, zakres dnia powinien zostać zakończony wcześniej zapamiętaną pozycją.
Korzystanie z następujących wywołań w celu wywołania SUB:
Wyjście :
źródło