(Chciałem to opublikować, gdy 1542: Konflikt planowania wciąż był bieżącym xkcd, ale miałem konflikt planowania).
Wkład
Dane wejściowe będą listą 3n
elementów, które reprezentują n
zdarzenia. Pierwszym elementem w każdej grupie 3 będzie nazwa zdarzenia; drugi i trzeci odpowiednio czas rozpoczęcia i zakończenia. Na przykład:
foo 12 34 bar 56 78
reprezentuje zdarzenie, foo
które zaczyna się od „czasu 12” (czasy są reprezentowane po prostu liczbami całkowitymi; możesz myśleć o nich jako minutach po północy) i kończy się o 34, a drugie zdarzenie, bar
które zaczyna się o 56 i kończy o 78.
Nazwy zdarzeń będą zawsze składać się wyłącznie ze znaków alfanumerycznych, a czasy będą zawsze liczbami całkowitymi ≥ 0 i <1440. Czas zakończenia będzie zawsze o co najmniej 1 większy niż czas rozpoczęcia. Nie gwarantuje się, że zostaną w jakikolwiek sposób posortowane.
Jeśli chcesz, możesz wziąć to jako ciąg oddzielony spacjami; w przeciwnym razie powinien być traktowany jako tablica, lista, wektor lub odpowiednik twojego języka.
Wydajność
Dane wyjściowe powinny być oddzieloną spacjami listą nazw zdarzeń. Reguły, dla których nazwy zdarzeń mają być generowane, są następujące:
Żadne z generowanych zdarzeń nie może powodować konfliktów. Na przykład, przy wejściu
a 0 10 b 5 15
, nie może wyjście zarównoa
ab
ponieważ czasy konfliktu (czyli częściowo pokrywają się). Jeśli wydarzenie kończy się dokładnie tak, jak inne, możesz dołączyć oba.Nie możesz wyrenderować wydarzenia o nazwie
NSCC
(„Krajowy konkurs konfliktu planowania”), którego zawsze będzie dokładnie jeden z danych wejściowych. Również koniecznością wyjścia przynajmniej jedno zdarzenie, które konfliktów (częściowo pokrywa się) zNSCC
(i zawsze będzie co najmniej jeden z tych, jak również).Musisz wygenerować jak najwięcej zdarzeń, przestrzegając dwóch powyższych zasad. (Jest tak, abyś wyglądał na tak zajętego, jak to możliwe, aby pominięcie NSCC wydawało się bardziej wiarygodne).
Może być również wyprowadzany jako pojedynczy ciąg oddzielony spacją lub tablica, lista, wektor itp.
Możliwe jest więcej niż jedno wyjście.
Przypadki testowe
Zauważ, że wymienione dane wyjściowe są tylko przykładami. Twój kod może wyświetlać coś innego, o ile nadal spełnia trzy powyższe reguły (w szczególności oznacza to, że musi być taka sama liczba zdarzeń jak w przykładzie).
W: UnderwaterBasketWeavingConvention 50 800 NSCC 500 550
Out:UnderwaterBasketWeavingConvention
W: SconeEating 0 50 RegexSubbing 45 110 CodeGolfing 95 105 NSCC 100 200
Out:SconeEating CodeGolfing
W: VelociraptorHunting 0 300 NerdSniping 200 500 SEChatting 400 700 DoorknobTurning 650 750 NSCC 725 775
Out:NerdSniping DoorknobTurning
W: NSCC 110 115 A 100 120 B 120 140 C 105 135 D 100 105 E 135 500
Out:C D E
W: A 800 900 NSCC 700 1000 B 650 750 C 950 1050 D 655 660 E 660 665 F 1030 1040 G 1040 1060
Out:A D E F G
W: A 10 11 B 11 12 C 12 13 D 13 14 NSCC 15 1090 E 10 16
Out:E
Możesz dodać więcej przypadków testowych w edycji, jeśli są przypadki, które przegapiłem.
Zasady
Twój kod musi zostać ukończony w ciągu 30 sekund dla wszystkich dostarczonych przypadków testowych (jest to raczej kontrola poprawności, ponieważ prawdopodobnie powinien zakończyć się znacznie szybciej dla wszystkich przypadków testowych łącznie) na rozsądnej maszynie osobistej.
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach.
underwaterBasketWeavingConvention 50 800 nscc 550
zamiast swojego przykładu?Odpowiedzi:
Pyth, 45 bajtów
Ten był trudny do gry w golfa. Znalazłem kilka 45-bajtowych rozwiązań, to jest prawdopodobnie najbardziej egzotyczne, ponieważ używa
A
(przypisywania par) i.g
(grupowania).Wypróbuj online: Demonstracja lub Uprząż testowa
Wyjaśnienie
źródło
SWI-Prolog,
537524516502447436 bajtówKrótkie wyjaśnienie tego, co robi każdy predykat:
z(A,B)
sprawdza, czy zdarzenie A nie powoduje konfliktu z żadnym zdarzeniem z listy zdarzeń Bu(A,B)
sprawdza, czy każde zdarzenie z listy A nie powoduje konfliktu z żadnym zdarzeniem z listy B (służy do sprawdzania, czy nie ma konfliktów na liście A przez wywołanieu(A,A)
)y(A,B,C)
dzieli listę na listę trojaczków (aby przekształcić dane wejściowe w listę zdarzeń)d(A)
drukuje nazwy zdarzeń na liście Al(A,R)
ocenia najdłuższą listę zdarzeń R zawartą na liście list Av(A,NSCC,C,R)
zwraca listę R zawierającą każdą listę zdarzeń w A, które nie mają wewnętrznego konfliktu i które powodują konflikt ze zdarzeniem NSCCs(A,B)
true, jeśli B jest podzbiorem Ax(A)
główny predykat, A jest wejściem.Przypadki testowe : wykonaj
test.
w tłumaczu po załadowaniu powyższego kodu z dodanymi po nim następującymi:Zajęło mi to znacznie więcej czasu, niż się spodziewałem. Prawdopodobnie można to znacznie pograć w golfa. Prawdopodobnie możesz również użyć różnych bibliotek programowania ograniczeń, aby uzyskać krótsze rozwiązania.
Edycja: Podziękowania dla @Oliphaunt za pomysł użycia
A:B:C
zamiast[A,B,C]
trojaczki. Oszczędza 14 bajtów.Edit2: Jeszcze raz dziękuję @Oliphaunt za wskazanie, że predykat `` t / 3`` był bezużyteczny. Oszczędza 55 bajtów
Edycja3: Zyskano 11 bajtów przy użyciu gramatyki klauzuli ostatecznej dla predykatów
y
id
.źródło
A/B/C
Zamiast[A,B,C]
trojaczki, oszczędzając 10 bajtów; 2. Czy możesz użyć\+
zamiastnot
? 3. Czy możesz wyjaśnić, dlaczego potrzebujesz ostatecznego odcięciax(A)
?:
zamiast/
skorzystać z prawa asocjatywności byłego, tzn. Żebym mógł napisaćA:_
jako skrót dlaA:_:_
(aleA+B/C
działa równie dobrze: możesz wtedy użyćA+_
). Nawiasem mówiąc, również w twoim oryginale mogłeś użyć[A|_]
zamiast[A,_,_]
. Zauważ wreszcie, że moja wersja SWI-Prolog nie miałanth0/4
, więc użyłemselect/3
zamiast tego.t(S,T)
ale potem zapomniałem. Teraz przetestowane: można zaoszczędzić 55 więcej bajtów przez upuszczenie go w całości i dzwoniąc bezpośrednios(E,L)
odsetof/3
.JavaScript ( ES6 ), 228
Druga próba, mam nadzieję, że to zadziała.
Moim celem jest najdłuższa sekwencja zdarzeń, w których występuje konflikt synchronizacji, ale brak konfliktu synchronizacji po usunięciu NSCC zdarzenia. Ta zmodyfikowana sekwencja z usuniętym NSCC jest żądanym wyjściem.
Korzystam z funkcji „Pierwsze wyszukiwanie”, badając kolejkę kandydujących rozwiązań, zaczynając od najdłuższego (pierwszy to lista początkowa). Z kandydackiego rozwiązania n zdarzeń buduję i kolejkuję n więcej kandydujących rozwiązań, usuwając jedno ze zdarzeń i zachowując pozostałe.
Rozwiązanie kandydujące jest poprawne, jeśli istnieje konflikt czasowy „taki, jaki jest”, ale po odfiltrowaniu zdarzenia NSCC konflikt nie występuje. Używam podfunkcji K do sprawdzania konfliktów.
Prawdopodobnie można by grać w golfa trochę więcej ...
Przetestuj poniższy fragment kodu (tylko EcmaScript 6, tylko FireFox)
źródło
Java, 828 bajtów
Prawdopodobnie jest tam bardziej zwięzła implementacja Java, ale oto moje zadanie:
źródło
else return
.Python, 373 znaków
Tworzy wszystkie możliwe kombinacje i sprawdza każdą z nich.
Test
Wkład:
["NSCC",110,115,"A",100,120,"B",120,140,"C",105,135,"D",100,105,"E",135,500]
Wydajność:
źródło