Rozważ kawałek sznurka (jak w „sznurku”, a nie w „wiązce znaków”), który jest składany w tę iz powrotem na linii rzeczywistej. Możemy opisać kształt łańcucha za pomocą listy punktów, przez które przechodzi (w kolejności). Dla uproszczenia założymy, że wszystkie te punkty są liczbami całkowitymi.
Weź jako przykład [-1, 3, 1, -2, 5, 2, 3, 4]
(pamiętaj, że nie każdy wpis oznacza zakładanie):
Ciąg rozciągający się wzdłuż kierunku pionowego służy wyłącznie do celów wizualizacji. Wyobraź sobie, że sznurek jest spłaszczony na prawdziwej linii.
Teraz pojawia się pytanie: jaka jest największa liczba kawałków, na które ten sznurek można pokroić jednym cięciem (które na powyższym zdjęciu musiałyby być pionowe). W tym przypadku odpowiedź brzmi 6 z cięciem pomiędzy 2
i 3
:
Aby uniknąć dwuznaczności, cięcie musi być wykonywane w pozycji innej niż całkowita.
Wyzwanie
Biorąc pod uwagę listę pozycji całkowitych, przez które składa się sznurek, musisz określić największą liczbę kawałków, na które można cięć za pomocą pojedynczego cięcia w pozycji innej niż całkowita.
Możesz napisać pełny program lub funkcję. Możesz przyjmować dane wejściowe za pomocą STDIN, argumentu wiersza poleceń, pytania lub parametru funkcji. Możesz zapisać dane wyjściowe do STDOUT, wyświetlić je w oknie dialogowym lub zwrócić z funkcji.
Możesz założyć, że lista ma dowolny dogodny format listy lub łańcucha.
Lista będzie zawierać co najmniej 2 i nie więcej niż 100 wpisów. Wpisy będą liczbami całkowitymi, każdy w zakresie -2 31 ≤ p i <2 31 . Możesz założyć, że żadne dwa kolejne wpisy nie są identyczne.
Twój kod musi przetwarzać takie dane wejściowe (w tym poniższe przypadki testowe) w czasie krótszym niż 10 sekund na rozsądnym komputerze stacjonarnym.
Przypadki testowe
Wszystkie przypadki testowe są po prostu wprowadzane, a następnie generowane.
[0, 1]
2
[2147483647, -2147483648]
2
[0, 1, -1]
3
[1, 0, -1]
2
[-1, 3, 1, -2, 5, 2, 3, 4]
6
[-1122432493, -1297520062, 1893305528, 1165360246, -1888929223, 385040723, -80352673, 1372936505, 2115121074, -1856246962, 1501350808, -183583125, 2134014610, 720827868, -1915801069, -829434432, 444418495, -207928085, -764106377, -180766255, 429579526, -1887092002, -1139248992, -1967220622, -541417291, -1617463896, 517511661, -1781260846, -804604982, 834431625, 1800360467, 603678316, 557395424, -763031007, -1336769888, -1871888929, 1594598244, 1789292665, 962604079, -1185224024, 199953143, -1078097556, 1286821852, -1441858782, -1050367058, 956106641, -1792710927, -417329507, 1298074488, -2081642949, -1142130252, 2069006433, -889029611, 2083629927, 1621142867, -1340561463, 676558478, 78265900, -1317128172, 1763225513, 1783160195, 483383997, -1548533202, 2122113423, -1197641704, 319428736, -116274800, -888049925, -798148170, 1768740405, 473572890, -1931167061, -298056529, 1602950715, -412370479, -2044658831, -1165885212, -865307089, -969908936, 203868919, 278855174, -729662598, -1950547957, 679003141, 1423171080, 1870799802, 1978532600, 107162612, -1482878754, -1512232885, 1595639326, 1848766908, -321446009, -1491438272, 1619109855, 351277170, 1034981600, 421097157, 1072577364, -538901064]
53
[-2142140080, -2066313811, -2015945568, -2013211927, -1988504811, -1884073403, -1860777718, -1852780618, -1829202121, -1754543670, -1589422902, -1557970039, -1507704627, -1410033893, -1313864752, -1191655050, -1183729403, -1155076106, -1150685547, -1148162179, -1143013543, -1012615847, -914543424, -898063429, -831941836, -808337369, -807593292, -775755312, -682786953, -679343381, -657346098, -616936747, -545017823, -522339238, -501194053, -473081322, -376141541, -350526016, -344380659, -341195356, -303406389, -285611307, -282860017, -156809093, -127312384, -24161190, -420036, 50190256, 74000721, 84358785, 102958758, 124538981, 131053395, 280688418, 281444103, 303002802, 309255004, 360083648, 400920491, 429956579, 478710051, 500159683, 518335017, 559645553, 560041153, 638459051, 640161676, 643850364, 671996492, 733068514, 743285502, 1027514169, 1142193844, 1145750868, 1187862077, 1219366484, 1347996225, 1357239296, 1384342636, 1387532909, 1408330157, 1490584236, 1496234950, 1515355210, 1567464831, 1790076258, 1829519996, 1889752281, 1903484827, 1904323014, 1912488777, 1939200260, 2061174784, 2074677533, 2080731335, 2111876929, 2115658011, 2118089950, 2127342676, 2145430585]
2
źródło
a reasonable desktop PC
jest niejednoznaczne?Odpowiedzi:
APL,
1614 bajtówDzięki @ngn za zapisanie 2 bajtów.
W
⎕
rzeczywistości jest to znak ramki, a nie błąd braku czcionki. Możesz wypróbować program na tryapl.org , ale ponieważ⎕
nie jest tam w pełni obsługiwany, musisz go zastąpić wartością wejściową:Wyjaśnienie
Program najlepiej objaśnia przykładowe dane wejściowe
s = ¯1 3 1 ¯2 5 2 3 4
pobrane ze STDIN przez⎕
. Najpierw obliczamy≤
produkt routera zas
pomocą samego siebie∘.≤⍨
. Wynikiem tego jest macierz boolowska, któreji
rząd informuje, które elementys
są mniejsze lub równes[i]
:Występowanie w wierszu
0 1
i1 0
na nimi
oznacza miejsca, w których ciąg przechodzi przez punkts[i] + 0.5
. Dopasowujemy je w każdym wierszu, używając opcji2≠/
„zmniejsz 2 listy podrzędne o≠
”:Pozostaje wziąć sumy wierszy
+/
i jeden plus ich maksimum z
1+⌈/
:Wynik jest automatycznie drukowany do STDOUT w większości implementacji APL.
źródło
×
mnożenie i bardzo proste reguły składniowe. Google „mastering Dyalog APL” dla dobrego przewodnika.Python,
887573 bajtówPo prostu prosta lambda
Aby pokazać inne podejście:
Pyth,
2827 bajtówTen jest mniej więcej równoważny
stosowane do listy danych wejściowych z STDIN. Wypróbuj go w tłumaczu online .
źródło
def f(x):max(sum((a+.5-m)*(a+.5-n)<0for m,n in zip(x,x[1:]))for a in x)+1
+.5
s, aby uratować niektóre postacie. Uświadomiłem sobie, że w moim przypadku są bezcelowe.a = point + .5
i zlicza ściśle określone przedziałya
. Bez tego.5
będziesz mieć problemy z przypadkami takimi jak[1, 0, -1]
przykład.Pyth :
313029282423 znaków (znaki Python 68)Wypróbuj tutaj: Pyth Compiler / Executor
Oczekuje listy liczb całkowitych jako danych wejściowych
[-1, 3, 1, -2, 5, 2, 3, 4]
To proste tłumaczenie mojego programu w języku Python:
Stare rozwiązanie: Pyth 28 char
Tylko z powodów archiwizacji.
Odpowiedni kod Pythona to:
źródło
,QtQ
[QtQ)
i
nie jest linią przecięcia,i - 0.5
jest. I dlatego1
(właściwie1 - 0.5 = 0.5
) jest w środku(-1, 1)
.min(a)<i<=max(a)
jest równoważnemin(a) < i - 0.5 < max(a)
rozwiązaniu w Pyth zmin(a) < i < max(a)+1
(zauważh
inheSk
).g
, która jest>=
, jeśli zastąpi<dheSk
sięgeSkd
.CJam,
36 34 3330 bajtówUważam, że istnieje lepszy algorytm na wolności. Mimo to działa to poniżej limitu wymaganego dla wszystkich przypadków testowych (nawet w kompilatorze online)
Dane wejściowe są jak
Dane wyjściowe (w powyższym przypadku) to
Jak to działa
Załóżmy teraz, że tablica wejściowa
[-1 3 1 -2 5 2 3 4]
wygląda następująco:Druga tablica w ostatnim wierszu to fałdy łańcucha.
Teraz iterujemy
[-1 3 1 -2 5 2 3 4]
i obliczamy liczbę zestawów, w których każdy z nich leży. Uzyskaj maksimum z tej liczby, zwiększ ją i otrzymamy odpowiedź.Wypróbuj online tutaj
źródło
Matlab
(123) (97)(85)Tak, w końcu zastosowanie XNOR =) Jestem pewien, że można go bardziej zagrać w golfa.
Ale szczerze mówiąc jestem trochę zawstydzony tym, że MatLab staje się językiem, który znam najlepiej = /
Przybliżony czas działania to
O(n^2)
.EDYCJA 2:
EDYCJA: Nowa wersja bardziej golfowa (w tym wskazówki od @DennisJaheruddin, dzięki!)
Stara wersja:
@ MartinBüttner: Naprawdę podobają mi się twoje małe, miłe wyzwania tuż przed pójściem do łóżka!
źródło
c=sort(a)-.5
Oczywiście pierwszy punkt jest poza zakresem, ale z pewnością łatwiej sobie z tym poradzić. W najgorszym przypadku możesz to zrobićc(1)=[];
. - Możesz także usunąć polecenie disp, tylko obliczenie czegoś zapisze to na standardowe wyjście. - Wreszcie w tym przypadkunumel
można go zastąpićnnz
conv
podejścia ... = D. Zawsze zapominam onnz
, bardzo dziękuję!disp
ponieważ ktoś kiedyś skrytykował to, że za pomocą zaproponowanej przez ciebie metody otrzymujesz także inne znaki (nazwa var lubans
) napisane na standardowe wyjście ...Mathematica
134 133104Fajne do rozwiązania, pomimo wielkości kodu. Dalsze golfa nadal można osiągnąć poprzez wymianę idei
IntervalMemberQ[Interval[a,b],n]
za<n<b
.Wyjaśnienie
list1
czy podana lista punktówlist2
jest skróconą listą, która usuwa liczby, które nie były złożone ; są nieistotne. Nie jest to konieczne, ale prowadzi do bardziej przejrzystego i wydajnego rozwiązania.Przedziały w
list1
ilist2
są przedstawione na wykresach poniżej:Musimy przetestować tylko jedną linię w każdym interwale określonym przez punkty zagięcia. Linie testowe to przerywane pionowe linie na wykresie.
f
znajduje liczbę cięć lub skrzyżowań każdej linii testowej. Linia przy x = 2,5 wykonuje 5 skrzyżowań. To pozostawia 5 + 1 kawałków sznurka.źródło
Pyth, 21 bajtów
Wypróbuj tutaj.
Podaj dane jako listę w stylu Python, np
[-1, 3, 1, -2, 5, 2, 3, 4]
Ściśle oparty na programie @ jakube, ale z ulepszonym centralnym algorytmem. Zamiast
>
sprawdzać i>=
sprawdzać, robię a.index()
na trzech liczbach łącznie i upewniam się, że indeks wynosi 1, co oznacza, że jest większy niż minimum i mniejszy lub równy maksimum.źródło
R,
8683Pracowałem nad tym, a potem zdałem sobie sprawę, że w zasadzie znalazłem to samo rozwiązanie, co Optimizer i inne, które podejrzewam.
W każdym razie jest to funkcja pobierająca wektor
źródło
R
. FWIW możesz zapisać 3 znaki, używającT
„PRAWDA”GolfScript (43 bajty)
Pod względem wydajności jest to O (n ^ 2) przy założeniu, że porównania zajmują czas O (1). Dzieli dane wejściowe na segmenty linii i dla każdego punktu początkowego liczy półotwarte segmenty linii, które je przekraczają.
Demo online
źródło
Python - 161
To może być bardziej golfa. gnibbler bardzo pomógł w grze w golfa.
źródło
Ruby, 63
Podobne do koncepcji rozwiązań w języku Python.
Dodaj 2 znaki przed kodem, np.
f=
Jeśli potrzebujesz nazwanej funkcji. Thx do MarkReed .źródło
C #,
7365 bajtówCzytając zasady, pomyślałem, że C # lambda powinna zrobić całkiem nieźle.
Edycja: właśnie znaleziona
Count
ma przydatne przeciążenie do filtrowania!Możesz to przetestować, definiując odpowiedni
delegate
typ:I wtedy
źródło
Matlab (
6343)Dane wejściowe podano jako wektor wiersza przekazany do funkcji
f
. Na przykładf([-1, 3, 1, -2, 5, 2, 3, 4])
powraca6
.Krótsza wersja:
Oktawa (31)
W Octave
bsxfun
można usunąć dzięki automatycznemu nadawaniu:źródło
JavaScript (ES6) 80
82Zobacz komentarze - liczba bajtów nie obejmuje przypisania do F (to wciąż potrzebne do przetestowania)
Testuj w konsoli FireFox / FireBug
Wynik
źródło
lambda
rozwiązania Python nie musisz przypisywać wartości funkcji do rzeczywistej zmiennej, więc możesz znokautować dwa znaki.Galaretka , 10 bajtów
Wypróbuj online!
Jak to działa
źródło
05AB1E , 6 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
JavaScript (Node.js) , 71 bajtów
Wypróbuj online!
źródło
Dodaj ++ , 27 bajtów
Wypróbuj online!
Podejdź do Zgarba za odpowiedź APL
Kluczową częścią tego wyzwania jest wdrożenie zewnętrznego polecenia produktu. Niestety, Add ++ nie ma wbudowanego do tego celu, nie ma też żadnego sposobu definiowania funkcji, które przyjmują inne funkcje jako argumenty. Niemniej jednak nadal możemy wprowadzić uogólnioną funkcję produktu zewnętrznego. Ponieważ jedynym sposobem na dostęp do funkcji w innej funkcji jest odwołanie się do istniejącej funkcji zdefiniowanej przez użytkownika lub wbudowanej, musimy stworzyć „wbudowaną”, która odwołuje się do takiej funkcji.
Uogólniona funkcja „tabeli” wyglądałaby mniej więcej tak:
Wypróbuj online!
gdzie
func
jest funkcja dyadyczna, która zawiera nasz operand. Widać nikłe podobieństwo tej struktury w oryginalnym złożenia, na początku wag funkcji, ale tutaj chcemy przede wszystkim, a jednowartościowy funkcji produktu zewnętrzna - zewnętrzną funkcję produktu, które ma ten sam argument po obu stronach.Ogólna funkcja tabeli wykorzystuje to, jak
€
ach szybko zbliża się do funkcji dyadycznych. Jeśli wygląda stosgdy
€{func}
zostanie napotkany,€
wyskakujee
, wiąże to jako lewy argument z diadem i odwzorowuje tę częściową funkcjęa, b, c, d
. Jednak€
szybkie mapy na całym stosie, a nie na listach. Musimy więc spłaszczyć tablice przekazane jako argumenty jako pierwsze.Funkcja tabeli działa ogólnie w ten sposób
Możemy to jednak znacznie skrócić, ponieważ potrzebujemy, aby nasz zewnętrzny stół był monadyczny i wystarczy zastosować się do przekazanego argumentu.
A
Komenda popycha każdy argument do stosu pojedynczo, więc nie trzeba poeksperymentować z dowolnej manipulacji stosu. Krótko mówiąc, jeśli naszym argumentem jest tablica[a b c d]
, musimy zrobić stosNajwyższą wartością jest oczywiście argument. Być może zauważyłeś z ogólnego przykładu, jakim
bU
jest polecenie rozpakuj, tzn. Dzieli on górną tablicę na stos. Aby wykonać powyższą konfigurację, możemy użyć koduWypróbuj online!
Można to jednak skrócić bajtem. Jako alias
L,bU
możemy użyć~
flagi, aby wcześniej przelać argumenty na stos, czyniąc nasz przykład konfiguracji wWypróbuj online!
który jest początkiem drugiej linii w programie. Teraz wdrożyliśmy monadyczny produkt zewnętrzny, wystarczy zaimplementować resztę algorytmu. Po pobraniu wyniku tabeli za pomocą
<
(mniej niż) i policz liczbę[0 1]
i[1 0]
pary w każdym rzędzie. Wreszcie bierzemy maksimum tych liczb i zwiększamy je.Kompletny krok do przejścia krok po kroku to
źródło