W zeszłym miesiącu pożyczyłem dużo książek z biblioteki. Wszystkie były dobre książki, pełne emocji i zwrotów akcji. Niestety w niektórych momentach byłem bardzo zły / smutny / rozczarowany, więc wyrwałem kilka stron.
Teraz biblioteka chce wiedzieć, ile stron rozerwałem na każdą książkę.
Twoim celem jest napisanie programu, który pobiera posortowaną listę liczb rozdzielanych przecinkami jako dane wejściowe i drukuje minimalną i maksymalną możliwą liczbę stron, które mogłem oderwać. Każda linia reprezentuje książkę, każda liczba oznacza brakującą stronę z książki.
Przykładowe dane wejściowe:
7,8,100,101,222,223
2,3,88,89,90,103,177
2,3,6,7,10,11
1
1,2
Przykładowe dane wyjściowe:
4/5
5/6
3/6
1/1
1/2
4/5
oznacza, że mogłem oderwać 4 lub 5 stron, w zależności od strony, od której zaczyna się numeracja stron książki. Można było oderwać stronę 6/7, stronę 8/9, stronę 100/101 i stronę 222/223 (4 strony). Alternatywnie można oderwać strony 7/8, strony 99/100, strony 101/102, strony 221/222 i strony 223/224 (5 stron).
Pamiętaj, że strona książki ma zawsze przód i tył. Również numeracja stron różni się w zależności od książki. Niektóre książki mają nawet numery stron na lewej stronie; niektóre po prawej stronie. Wszystkie książki są czytane od lewej do prawej.
Najkrótszy kod w bajtach wygrywa. Ścisły format we / wy nie jest wymagany. Twoje programy muszą mieć możliwość pobrania jednej lub więcej książek jako danych wejściowych. Baw się dobrze.
4/5
i5/4
)min/max
lub wszystkiemax/min
. (Chociaż osobiście wolałbym, żeby to nie było częścią specyfikacji!)programs must be able to take one or more books as input
rządzenia? Większość (jeśli nie wszystkie) po prostu zawinie kod, aby zweryfikować pojedynczą książkę w pętli lub coś takiego. IMHO po prostu dodaje narzut do odpowiedzi, przy niewielkim lub zerowym zwiększeniu wyzwania. Na te pytania otrzymano już wiele odpowiedzi, więc lepiej jest zachować taką, jaka jest, ale pamiętaj o tym w przyszłych wyzwaniach.1,3,5,7,9,11,13,15,17,18
- na korzyść języków, których wbudowanasort
metoda domyślnie sortuje leksykograficznie (zakładając, że do specyfikacji dodawane jest wymaganie konsekwentnego sortowania wyników ).Odpowiedzi:
05AB1E , 13 bajtów
Wypróbuj online!
Dzięki Emigna za heads-up na temat zmian specyfikacji.
Wyjaśnienie
źródło
Python 2 ,
72566867 bajtówWypróbuj online!
źródło
JavaScript,
104939285807974 bajtówByłoby 57 bajtów, gdyby nie niepotrzebny (moim zdaniem) wymóg, aby każda para liczb na wyjściu była konsekwentnie sortowana, lub 47 bajtów , gdybyśmy potrzebowali tylko jednej książki jako danych wejściowych.
Wejścia i wyjścia są zarówno tablicami tablic.
Przypadki testowe
Przypadki testowe są podzielone na pojedyncze książki dla lepszej czytelności, przy czym ostatni przypadek (który obejmuje
[1,2]
przypadek skrajny) służy do zilustrowania, że to rozwiązanie obsługuje wiele książek na wejściu.Historia
Pokaż fragment kodu
źródło
[1,3,5,7,9,11,13,15,17,18]
.[0,.5]
zamiast używać,g
gdy zauważyłem twój komentarz. Nie wiem, dlaczego mam taki mentalny blok z bitowymi operatorami! Miałem nadzieję, że sortowanie wyników nie stanie się wymaganiem i żesort()
w międzyczasie nikt nie zauważy mojego zepsucia;) Potrzebuję trochę pracy, więc wrócę za chwilę do aktualizacji.y/2
? Jakie jest uzasadnienie podziału numeru strony na pół dla tego algorytmu?Retina 0.8.2 , 60 bajtów
Wypróbuj online! Wyjaśnienie:
Konwertuj numery stron na unary.
Zduplikuj listę, wstawiając a
/
.Zwiększ numery stron w jednym egzemplarzu listy.
Policz liczbę stron, ale kolejne liczby parzyste i nieparzyste liczą się tylko jako jedna strona.
Posortuj liczby w kolejności.
Konwertuj liczby z powrotem na dziesiętne.
źródło
,(?=.*/)¶1,
być coś takiego,.*/¶1$&
zamiast tego?Haskell , 62 bajty
Wypróbuj online!
źródło
Your goal is to write a program, which takes a sorted, comma-delimmited list of numbers as input
)Java (OpenJDK 9) , 163 bajty
Wypróbuj online!
Objaśnienia
Uwaga: ponieważ nie ma żadnych wymagań, minimalna i maksymalna liczba stron nie są uporządkowane.
źródło
size
sięadd
w Javie, aby zaoszczędzić kilka bajtów? nps.add(p/2).size
.APL (Dyalog Unicode) , 37 bajtów
Wypróbuj online!
Można to zrobić dla mniej niż połowy liczby bajtów, jeśli kolejność wyjściowa stron nie ma znaczenia:
W jaki sposób?
źródło
Perl 5 , 95 + 1 (
-a
) = 96 bajtówWypróbuj online!
źródło
Wolfram Language (Mathematica) , 37 bajtów
Dzięki @MartinEnder za 8 bajtów!
Wypróbuj online!
Wyjaśnienie
W:
{3, 4, 5}
Weź (dane wejściowe) i (dane wejściowe + 1).
{{3, 4, 5}, {4, 5, 6}}
Dla każdej liczby z góry weź największą liczbę parzystą pomniejszoną o to.
{{2, 4, 4}, {4, 4, 6}}
Dla każdej listy z góry podziel listę według tych samych elementów
{{{2}, {4, 4}}, {{4, 4}, {6}}}
i weź długość każdego:
{2, 2}
Posortuj dane wyjściowe.
źródło
SplitBy
:Length@Split@⌊#/2⌋&/@{#,#+1}&
działa. Ale wtedy to nawet krócej zrobić podłogę przed mapie:Length@*Split/@⌊{#,#+1}/2⌋&
. A jeśli chcesz, możesz uzyskać tę samą liczbę bajtów bez Unicode:Length@*Split/@{#,#+1}~Floor~2&
Czysty ,
222210204196 bajtówWypróbuj online!
Wymagania pełnego programu absolutnie zabijają zdolność Clean do konkurowania.
Dla tych, którzy zwracali uwagę na moje odpowiedzi w Clean, zauważysz
import qualified
, że jest to brzydki hack do poruszania się przy użyciu modułów, których nie należy używać razem - co jest potrzebne tylko tutaj z powodu kolejnego brzydkiego hacka do zrobienia zGenLib
poleganiem naData.Maybe
zamiastStdMaybe
, co jest wynikiem kolejnego brzydkiego włamania do bibliotek przetłumaczonych z Haskella,Data
aby uzyskać funkcjonalność, zanim własne biblioteki Clean będą równie kompletne.Pobiera dane wejściowe za pomocą argumentów wiersza polecenia.
źródło
Perl, 40 bajtów
Zawiera
+1
dlaa
Dane wyjściowe nie są uporządkowane.
Zakłada dodatnie numery stron (szczególnie brak strony
0
). Zakłada, że brakujące strony są wymienione tylko raz. Nie obchodzi, czy dane wejściowe są uporządkowane, czy nie.Przetwarzanie tylko jednej książki na bieg oszczędza
3
bajty dla37
:źródło