Inspiracją dla tego kodu golfowego układanki jest problemem Bridge i latarki , w którym d ludzie na początku mostu wszystko musi przejechać ją w jak najkrótszym czasie.
Chodzi o to, że najwyżej dwie osoby mogą przejść jednocześnie, w przeciwnym razie most zmiażdży się pod ich ciężarem, a grupa ma dostęp tylko do jednej pochodni, którą należy zabrać, aby przejść przez most.
Każda osoba w całej układance ma określony czas na przejście przez most. Jeśli dwie osoby krzyżują się razem, para idzie tak wolno, jak najwolniejsza osoba.
Nie ma określonej liczby osób, które muszą przejść przez most; twoje rozwiązanie MUSI działać dla dowolnej wartości d .
Nie musisz używać standardowych danych wejściowych dla tego problemu, ale dla wyjaśnienia problemu użyję następującego formatu danych wejściowych i wyjściowych dla wyjaśnienia. Pierwsza liczba, d , to liczba osób na początku mostu. Następnie kod będzie skanował w poszukiwaniu cyfr d , z których każda reprezentuje prędkość osoby.
Wyjściowym kodem będzie NAJMNIEJ czas wymagany do przejścia wszystkich od początku mostu do końca mostu, przy jednoczesnym spełnieniu kryteriów wyjaśnionych wcześniej.
Oto niektóre przypadki wejściowe i wyjściowe oraz wyjaśnienie pierwszego przypadku wejściowego. Wyodrębnienie algorytmu na podstawie tych informacji zależy od rozwiązania problemu w jak najmniejszej liczbie bajtów kodu.
Wejście
4
1 2 5 8
wynik
15
Aby osiągnąć ten wynik, ludzie muszą przejść w następujący sposób.
A and B cross forward (2 minutes)
A returns (1 minute)
C and D cross forward (8 minutes)
B returns (2 minutes)
A and B cross forward (2 minutes)
Oto kolejny przypadek testowy, który poprowadzi Cię po drodze.
Wejście
5
3 1 6 8 12
wynik
29
Zasady:
- Załóż, że dane wejściowe nie zostaną posortowane i musisz to zrobić samodzielnie (w razie potrzeby)
- Liczba osób w układance nie jest ustalona na 4 (N> = 1)
- Każda grupa i indywidualne przejście musi mieć pochodnię. Jest tylko jedna pochodnia.
- Każda grupa musi składać się maksymalnie z 2 osób!
- Nie, nie możesz zeskoczyć z mostu i przepłynąć na drugą stronę. Żadnych innych takich sztuczek;).
1 3 4 5
, które powinny zwrócić 14, a nie 15.1 4 5 6 7
ma podobny problem. 25 vs. 26N >= 2
ludzi (co dziwne, że to dodatkowa praca, aby poradzić sobie z trywialnym przypadkiem „jedna osoba musi przejść”), więc wyjaśnienie tej kwestii byłoby świetne. Z góry dziękuję.Odpowiedzi:
Python 3,
10099 bajtówrozwiązanie rekurencyjne
Dzięki @xnor za ten artykuł
Dzięki @lirtosiast zapisz 2 bajty, @movatica zapisz 1 bajt i @ gladed wskazując, że moje poprzednie rozwiązanie nie działa
użyj poniższej sztuczki, aby ocenić coś w funkcji lambda,
s.sort() or s
tutaj obliczamy sortowanie i zwracamy wynik testus.sort()or len(s)>3
Bez golfa
Wyniki
źródło
len(s)==2
nalen(s)<3
s[0]*(len(s)==2)
nie(s[0]*len(s)==2)
błądf([1]) -> 0
, dlatego nie możemy zastąpić go<3
podziękowaniemA5:22
Python 2,
11911411211911010095 bajtówPoradzono mi, aby oddzielić moje odpowiedzi.
Rozwiązanie wykorzystujące
Theorem 1, A2:09
ten papier xnor połączone . Aby zacytować artykuł (zmieniając go na indeksowanie zerowe):The difference between C_{k-1} and C_k is 2*t_1 - t_0 - t_{N-2k}.
Ungolfing:
źródło
Ruby,
9413397961019699 bajtówPoradzono mi, aby oddzielić moje odpowiedzi.
Jest to rozwiązanie oparte na algorytmie opisanym w
A6:06-10
od tego papieru na moście i pochodnia problem .Edycja: Naprawienie błędu, który
a=s[0]
nie jest jeszcze zdefiniowany, kiedya
jest wywoływany na końcu ifs.size <= 3
.Ungolfing:
źródło
Scala,
113135 (darnit)Ungolfed nieco:
Próbnik:
Ogólnie nie jest to świetne, ale może nie jest złe dla mocno napisanego języka. I niechętnie dziękuję xnorowi za wykrycie sprawy, której nie złapałem.
źródło
Rubin,
1049593 bajtówPoradzono mi, aby oddzielić moje odpowiedzi.
To rozwiązanie oparte na moim roztwór Python 2 i
Theorem 1, A2:09
od tego papieru na moście i pochodnia problem .Ungolfing:
źródło