Oświadczenie: chociaż od jakiegoś czasu jestem na tej stronie w celach rozrywkowych, to jest moje pierwsze pytanie, więc proszę wybaczyć wszelkie drobne błędy.
tło
Przydzielając nam pracę domową, mój nauczyciel jest naprawdę denerwujący i zapisuje wszystkie problemy, które musimy zrobić indywidualnie. W związku z tym na zawsze zajmuje mi zapisywanie , które problemy muszę zrobić. Pomyślałem, że moje życie będzie łatwiejsze, wyślę mu program, który sprawi, że lista problemów zajmie mniej miejsca.
Zapisując listę numerów stron lub problemów, używamy myślnika do oznaczenia zakresu. Na przykład 19-21
staje się 19, 20, 21
. Jeśli pomiędzy nimi jest przerwa, używane są dwa przedziały oddzielone przecinkami: 19-21, 27-31
staje się 19, 20, 21, 27, 28, 29, 30, 31
.
W tej chwili prawdopodobnie myślisz: „wydaje się to dość trywialne”. W rzeczywistości na to pytanie zostało już udzielone tu i tutaj .
Istnieje jednak pewien haczyk. Jeśli mamy zakres z jednakowymi kolejnymi cyframi, powtarzające się cyfry można pominąć. Na przykład: 15, 16, 17
staje się 15-7
i 107, 108, 109
staje 107-9
. W przypadku premii, jeśli ostatnia z kolei równa cyfra jest o 1 większa, a ostatnia cyfra górnego limitu jest mniejsza lub równa cyfrze dolnej, można pominąć następujące (przepraszam, jeśli zabrzmiało to myląco; być może niektóre przykłady to wyjaśnią) . 109-113
staje się 109-3
, ponieważ ostatnia ostatnia cyfra oznacza zwiększenie miejsca 10.
Wyzwanie
Twój program powinien pobierać listę liczb całkowitych poprzez dane wejściowe (cokolwiek jest standardowe dla twojego języka lub funkcji). Możesz zdecydować, czy ta lista jest rozdzielana przecinkami, spacjami, czy jako rzeczywista lista / tablica.
Wyprowadzaj najkrótszą drogę (najpierw posortowaną według liczby zakresów, a następnie sumy znaków zawartych w zakresach), aby przedstawić tę listę za pomocą tej notacji. Każdy zakres przerywany musi znajdować się w tym samym wierszu, ale zakresy można oddzielić przecinkami lub znakami nowej linii (dozwolone są znaki końca linii lub przecinków). Te zakresy muszą być w porządku.
Ponieważ nasza szkolna sieć Wi-Fi jest okropna , muszę zminimalizować plik, aby go wysłać. Najkrótszy kod (w bajtach) wygrywa.
Bonusy
Mój nauczyciel jest niechlujny, więc jest kilka rzeczy, które mogłyby mu pomóc. Wiele premii kumuluje się poprzez pomnożenie, np. Premia -10% (x 90%) i premia -25% (x 75%) = 90% * 75% = x 67,5% (premia -32,5%).
- Czasami układa je w niewłaściwej kolejności (nie jest nauczycielem matematyki). Zdobądź premię -20%, jeśli twój program może przyjmować liczby całkowite, które nie są sortowane od najmniej do największej.
- Nasza książka jest dziwna i każda sekcja zaczyna liczyć problemy od -10. Jeśli twój program akceptuje liczby ujemne, weź -25%.
- Jeśli zaakceptuje bonus niższej ostatniej cyfry, zwiększając miejsce 10, np.
25-32
Zmniejszając do25-2
, weź bonus -50%.
Przypadki testowe
In: 1, 2, 3, 4, 5
Out: 1-5
In: 3, 4, 5, 9, 10, 11, 12
Out: 3-5, 9-12
In: 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160
Out: 149-60
In: 1 2 3 4
Out: 1-4
For bonuses:
In: 109, 110, 111, 112, 113
Out: 109-3
In: 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29
Out: 19-9
In: -3, -2, -1, 0, 1, 2
Out: -3-2
In: -3, -2, -1
Out: -3--1
Odpowiedź zostanie zaakceptowana w sobotę, 19 grudnia 2015 r.
GLHF!
1-4 9-2
?149 150 151 152 153 154 155 156 157 178 159 160
?19-9
za,19,20,...,29
a nie19-29
jak sugeruje tekst. Więc co jest poprawne?Odpowiedzi:
LabVIEW, 97 * 0,8 * 0,75 * 0,5 = 29,1 Prymitywy LabVIEW
działa to poprzez zliczanie w górę, jeśli kolejne elementy są od siebie oddalone o 1, a następnie tworzy ciąg z liczby i liczby - liczba modulo 10, a niektóre mnożenie powodujące negatywy są suką.
Gif pokazuje wejście
8,9,10,11
i wyjście8-1
. Do wejścia-5,-4,-3,1,3,4,5
-5--3,1,3-5
wychodzi.źródło
C ++ 11, 451 * 80% * 75% * 50% = 135,3 bajtów
Zaoszczędzono 9 bajtów dzięki @ kirbyfan64sos.
Zaoszczędź 19 bajtów dzięki @JosephMalle i @cat.
Zaoszczędź 11 bajtów dzięki @ pinkfloydx33.
To kwalifikuje się do wszystkich bonusów.
Przykładowy test parametru i wynik:
źródło
int
zamiastunsigned int
? Oszczędza 9 bajtów.gcc
dał:a.cpp: In function ‘std::string f(std::vector<int>)’: a.cpp:8:83: error: ‘to_string’ was not declared in this scope
-std=c++11
; > = 5.0 ma domyślnie włączone (właściwie jest-std=gnu11
, ale wystarczająco blisko).Rubin,
120,118 * 0,8 * 0,75 * 0,5 = 35,4 bajtówPobiera na wejściu argumenty wiersza poleceń (przecinki są w porządku); wypisuje jeden zakres na linię na standardowe wyjście.
Z białymi znakami / komentarzami:
Przypadki testowe
Funkcje nieobjęte przypadkami testowymi
Nieuporządkowane dane wejściowe i zakresy jednoelementowe:
Zakresy ujemne (nie można w nich skrócić większej liczby):
Skrót dowolnej liczby cyfr (tutaj do wprowadzania danych używa się zwykłego rozszerzenia bash):
źródło
((n=c.shift-1)>m)
zm<n=c.shift-1
JavaScript ES6, 229 * 80% * 75% * 50% = 68,7 bajtów
Wejście testowe
Korzystam z następujących danych testowych:
Podstawowy: 229 bajtów
Ta wersja spełnia wymagania pytania (a) ze wszystkimi bonusami (c, d, e), ale zawiesza się na pojedynczych stronach. Może także obsługiwać duplikaty (f). Obsługuje strony ujemne do -10 000, które można łatwo zwiększyć przy (dużej) utracie prędkości.
(Powyższe dane wyjściowe pokazują spacje zamiast rzeczywistych nowych linii dla zwięzłości)
Pojedyncze strony: 233 bajty
Ta nieco dłuższa wersja dodatkowo spełnia wymagania (e) i wyświetla pojedyncze strony jako zakres z jednakowymi dolnymi i górnymi granicami
źródło
GAP , 355 bajtów * 0,8 * 0,75 * 0,5 = 106,5
Spełnia to wszystkie bonusy. Kosztowało mnie prawie 100 dodatkowych bajtów, aby wszystko działało ładnie. Ta funkcja pomija cyfry wiodące tylko wtedy, gdy odstęp nie przepełnia się raz na miejscu. Na przykład
9 10 11
wyjścia,9-1
ale9 10 11 12 .. 20 21
wyjścia9-21
.Gdyby GAP był nieco mniej gadatliwy, mógłbym to zrobić bardzo krótko (również zaoszczędziłbym wiele bajtów, gdyby nie przestrzegał dokładnej składni.) Prawdopodobnie spróbuję zagrać w golfa nieco trudniej jutro. Zobacz poniżej przypadki testowe.
bez golfa:
Zauważ, że w składni GAP
[a..b]
jest równoważne z[a,a+1,...,b]
. Uważam, że te przypadki testowe pokazują, że ten program spełnia wszystkie wymagania. Jeśli coś jest nie tak, daj mi znać.źródło
Lua, 322 * 80% * 75% * 50% = 96,6 Bajtów
Wreszcie zakończono z 3 wyzwaniami, wyniki poniżej 100 bajtów: D
Grał w golfa
Bez golfa
Możesz przetestować lua online , aby zobaczyć, jak działa na testach, skopiuj wklej funkcję, a następnie ten kod:
źródło
Java, 252 * 80% * 75% * 50% = 75,6 bajtów
Zdecydowałem się na metodę (jest znacznie mniejsza w Javie), oto wersja golfowa:
Grał w golfa
A oto czytelna wersja:
Po przetestowaniu są to wyniki:
Wydajność:
Aktualizacja:
Może teraz obsługiwać również liczby ujemne, zwiększając premię.
źródło
p=s=c=0;c--;
nap=s=0;c=-1;
?c=~(p=s=0)
dla punktów stylu.Japt, 127 bajtów * 80% * 75% * 50% = 38,1
Wow, to było jedno wyzwanie, które obejmowało wszystkie bonusy. Prawdopodobnie można go skrócić.
Wypróbuj online!
Jak to działa
Wyjaśnienie jest bardzo szorstkie; nie wahaj się zadawać pytań.
źródło
R, 167 bajtów x 80% x 75% x 50% -> 50,1
Wcięte, z nowymi liniami:
Przypadki testowe:
Działa dla bonusu -50%:
Akceptuje nieposortowane dane wejściowe:
Akceptuje liczby ujemne:
źródło
sh, 135 * .8 * .75 * .5 = 40,5
Skrypt powłoki
skrypt awk
gdzie
s
jest początkiem bieżącej sekwencji io
poprzednią wartością wejściową.źródło
-31, -30, -29, -28
wzrost miejsca 10 od-3
do-2
i dlatego powinien zostać skondensowany-31-8
. Widzę także niejednoznaczność, którą to stwarza, ale o to się proszą.