Często konieczne jest utworzenie interfejsu wyboru strony. Zwykle wygląda to tak:
prev 1 ... 3 4 [5] 6 7 ... 173 next
Co oznacza, że jest w sumie 173 strony, a ty jesteś obecnie na 5. stronie.
Wyzwanie to wymaga wprowadzenia całkowitej liczby stron i bieżącego numeru strony jako danych wejściowych i wyprowadzenia łańcucha (lub tablicy) w celu „wyświetlenia” selektora stron.
Wejście
2 dodatnie liczby całkowite
- aktualny numer strony
- liczba stron
Gwarantuje się, że 1 <= prąd <= ogółem.
Wynik
Wypisuje ciąg lub tablicę reprezentującą interfejs użytkownika dla selektorów stron.
- Jeśli dane wyjściowe są ciągiem, między każdą stroną należy użyć pojedynczej spacji (U + 0020).
- Jeśli dane wyjściowe są tablicą, tablica powinna dawać taki sam wynik jak ciąg znaków po przekonwertowaniu każdego elementu na ciąg i połączeniu ich pojedynczą spacją.
- Trzy kropki (
...
) nie są opcjonalne dla danych wyjściowych tablicy.
- Trzy kropki (
Detale
- Jeśli prąd == 1, nie zostanie wyprowadzone „poprzednie”, w przeciwnym razie „poprzednie” będzie pierwsze.
- Jeśli prąd == ogółem, nie zostanie wyświetlone „następne”, w przeciwnym razie „następne” będzie ostatnie.
- Zawsze należy wydrukować pierwszą stronę (1) i ostatnią stronę (łącznie).
- Strona bieżąca, strona (bieżąca - 1), strona (bieżąca - 2), strona (bieżąca + 1), strona (bieżąca + 2) powinna być wyświetlana, o ile mieszczą się w przedziale [1.. ogółem].
- Żadne inne numery stron nie powinny być wyprowadzane.
- Wydrukowane strony powinny być sortowane w porządku rosnącym.
- Dane wyjściowe nie powinny zawierać zduplikowanych numerów stron.
- Bieżącą stronę należy wyróżnić, zawijając ją w parę
[]
. - Jeśli między sąsiadami jest przerwa,
...
należy wstawić trzy kropki ( ).
Przypadki testowe
Current Total Output
1 1 [1]
1 2 [1] 2 next
1 10 [1] 2 3 ... 10 next
3 3 prev 1 2 [3]
3 6 prev 1 2 [3] 4 5 6 next
4 6 prev 1 2 3 [4] 5 6 next
4 7 prev 1 2 3 [4] 5 6 7 next
3 10 prev 1 2 [3] 4 5 ... 10 next
5 10 prev 1 ... 3 4 [5] 6 7 ... 10 next
10 10 prev 1 ... 8 9 [10]
52 173 prev 1 ... 50 51 [52] 53 54 ... 173 next
Zasady
- To jest code-golf, wygrywa najkrótszy kod!
4 , 6
jako przypadek testowy. Podobnie jak w3, 6
przypadku, ale zapewnia, że kropki nie zostaną dodane do lewej strony.4,7
przypadek testowy byłby bardzo mile widziany - zapewniłby, że oba przypadki graniczne wykluczające elipsy mogą być jednocześnie spełnioneOdpowiedzi:
Siatkówka ,
125113109107 bajtówWypróbuj online! Link zawiera przypadki testowe. Zaoszczędź 12 bajtów dzięki @MartinEnder. Wyjaśnienie:
Konwertuj na unary.
Wygeneruj wszystkie numery stron w odwrotnej kolejności.
Usuń nowy wiersz oddzielający dane wejściowe. (W każdym razie jest też spacja z generowania numeru strony).
Posortuj strony z powrotem w kolejności rosnącej. Spowoduje to również posortowanie bieżącej strony, która jest teraz zduplikowana.
Zduplikuj i owiń
[]
wokół bieżącej strony.Dodaj wielokropek, jeśli bieżąca strona ma co najmniej 5 lub jeśli za bieżącą stroną znajdują się co najmniej 4 strony. (Zwróć uwagę na końcowe spacje, aby uniknąć włączenia ostatniej strony do wielokropka).
Dodaj poprzednią, jeśli bieżąca strona nie ma 1.
Dodaj następny, jeśli bieżąca strona nie jest ostatnią stroną.
Konwertuj z powrotem na dziesiętne.
źródło
JavaScript (ES6),
130122121 bajtówWywołaj ze składnią curry, np
f(3)(10)
.Pokaż fragment kodu
Wypróbuj online!
-1 bajt (Arnauld): Ustaw
X
naX-x
.źródło
.join
nie jest część twojej liczby! Oszalałem, próbując zrozumieć, dlaczego twój kod działałby bez łączenia, podczas gdy mój podobny kod nie działał. Następnie mówię, że po prostu nie umieściłeś go w swoim rozwiązaniu, ale umieściłeś go we fragmencie!Kod maszynowy 6502 (C64), 160 bajtów
Demo online - Zastosowanie:
sys49152,[current],[total]
npsys49152,5,173
.Liczby muszą zawierać się w przedziale [1..255], przy czym prąd <= suma. Ponieważ nie podano inaczej, jest to „naturalny” zakres liczb całkowitych bez znaku na 8-bitowym procesorze.
Wyjaśnienie jako skomentowana lista demontażu:
źródło
R ,
214 bajtów168 bajtówWypróbuj online!
Podziękowania dla @ user2390246 za kilka świetnych wskazówek golfowych
źródło
c()
, która pozbywa się okropnego pomieszania z wywoływanym obiektemc
.APL (Dyalog) ,
8382 bajtówAnonimowa funkcja poprawki przyjmująca bieżący jako lewy argument i całkowity jako prawy argument.
Wypróbuj online!
{
…}
Jawna lambda gdzie⍺
i⍵
reprezentuje lewy i prawy argument:⍺<⍵
czy prąd jest mniejszy niż całkowity?' next'/⍨
jeśli tak (lit. użyj tego do replikacji) tekstu(
…),
Wstaw następujące:⍳⍵
ɩ liczb całkowitych od 1 do ogółem'x'@(
…)
Zamień nax
na w pozycjach, w których elementy…~
nie∊
członkowie1
jeden,
śledzony przez⍵
ogółem,
śledzony przez⍳5
pierwsze pięć t ntegers ([1,2,3,4,5]
)3-
odjęte od trzech ([2,1,0,-1,-2]
)⍺+
dodano do bieżącej ([⍺+2,⍺+1,⍺,⍺-1,⍺-2]
)⊢
wydajność, która (służy do oddzielenia⍺
od'x'
)(
…)
Zastosuj następującą funkcję ukrytą w bieżącej pozycji:⍕
format (stringify)'][',
dodaj tekst`1⌽
obróć o krok w lewo (przesuwa]
do końca)⊂
dołącz (tak, aby był to skalar, który zmieści się w jednej wskazanej pozycji)∊
ε nlist (spłaszczenia - ponieważ wykonany jest zagnieżdżony gdy dodaje nawiasach)⍕
format (stringify - 1 spacja oddzielająca liczby od siebie i odx
przebiegów)'x+'⎕R'...'
PCRE R eplacex
działa z trzema okresami(
…),
Wstaw następujące:⍺>1
czy prąd jest większy niż 1?'prev '/⍨
jeśli tak (lit. użyj tego do replikacji) tekstuźródło
Wolfram Language (Mathematica) ,
131114109 bajtówWypróbuj online!
Jak to działa
Dużo zastępowania. Zaczynając od listy wszystkich stron, zamień w kolejności:
#->"["<>(t=ToString)@#<>"]"
: bieżąca strona z ciągiem w nawiasach,1->"prev 1"
: strona 1 z ciągiemprev 1
,#2->t@#2<>" next"
: ostatnia strona z ciągiem(number) next
, z#-3|#+3:>"..."
: stronacurrent-3
i stronacurrent+3
z ciągiem"..."
,x_/;Abs[x-#]>2:>Nothing
: wszystkie inne (całkowite) strony poniżejcurrent-2
lub powyżejcurrent+2
bez niczego. (Tak,Nothing
jest wbudowany.)źródło
Funky ,
218210 bajtówZapisano kilka bajtów, z których część dzięki tsh
Wypróbuj online!
źródło
i<=p+2
można golfed doi<p+3
it[2]="["+t[2]+"]"
mogą byćt[2]="["+p+"]"
?Python 2 ,
136130 bajtówWypróbuj online!
Wypróbuj online! w formie wstępnej, w której stopka tłumaczy dosłownie „konwertować każdy na ciąg znaków, łączyć spacje”.
Jest to alternatywa dla podejścia Lynn.
źródło
i or'...'
zerami (jak ten )Python 2 , 135 bajtów
Wypróbuj online!
Najpierw tworzymy ciąg podobny do
prev 1 3 4 [5] 6 7 10 next
, który ma „luki” spowodowane usunięciem niektórych liczb, ale nie ich spacjami. Następnie zastępujemy dowolny...
ciąg ponad 2 spacji za pomocą wyrażenia regularnego.źródło
(-3<x-c<3or x%t<2)
się(x%t<2or-3<x-c<3)
na -1, oba argumenty door
operatora zwróci wartość logiczną.Java 8,
201200197 bajtówWyjaśnienie:
Wypróbuj tutaj.
źródło
Java (OpenJDK 8) ,
218179177167166 bajtówWypróbuj online!
źródło
"["+c+"] ";
p+=
przed pętlą for wewnątrz deklaracji for-loop: 171 bajtówGalaretka , 59 bajtów
Pełny program * drukujący wynik do STDOUT. Trwa argumentów
current
itotal
w tej kolejności.Wypróbuj online! lub zobacz zestaw testowy .
W jaki sposób?
* Jako dyadyczny link
current
po lewej itotal
po prawej stronie zwraca listę zawierającą mieszankę znaków i liczb całkowitych; ta lista zawiera spacje. BajtK
nie może być po prostu usunięty, aby zachować zgodność ze specyfikacją, ponieważ wynik miałby wtedy nawiasy klamrowecurrent
jako osobne znaki (np.[...'[','5','2',']'...]
), Więc „przekonwertuj każdy element na ciąg i połącz je pojedynczą spacją” nie przyniesie pożądanego wyniku )źródło
Python 2 ,
178170 bajtówWypróbuj online!
Druga próba po dokładniejszym przeczytaniu zasad.
-8 przez utratę niepotrzebnych nawiasów.
źródło
Oktawa ,
169 196 190 181 175 169166 bajtówWypróbuj online!
Później dodam wyjaśnienie.
Hmm, wygląda na to, że wystąpiły pewne problemy z formatem wyjściowym. Zostały one już rozwiązane - wszystkie dane wyjściowe są prawidłowe. Ale niestety kosztowało 27 bajtów. Udało mu się jednak wyrwać wszystkich z powrotem przy odrobinie tłuszczu.
*
zamiast.*
- dzięki @StewieGriffinsprintf
zamiast tego,num2str
jak już miałem ten uchwyts
.[]
się wsprint
rozmowę.strtrim()
bez powodowania końcowego miejsca.źródło
C # (.NET Core) ,
195192 bajtówZaoszczędził 3 bajty dzięki Kevin Cruijssen.
Wypróbuj online!
źródło
c=>t=>
. Wypróbuj tutaj: 192 bajtyC ++ - 247 bajtów
Wypróbuj online!
źródło
Python 2 ,
128124 bajtów-4 bajty dzięki Jonathanowi Allanowi !
Wypróbuj online!
Wyjście jako lista, ale link do tio zawiera ładny wydruk.
źródło
while ~0:
to dziwna rzecz do użycia, gdywhile 1:
działa dobrze.[[c]]
(tak jak to ) EDYCJA - podobnie jakwhile 2*3*4*5*6*7*8*9*'I know a song that will get on your nerves, get on your nerves, get on your nerves;\n':
: pPHP,
157150 bajtówdosłowne podejście do szczegółów okazało się najkrótszym podejściem:
Uruchom
php -nr '<code>' <curpage> <numpages>
lub wypróbuj online .źródło
CJam, 74
Dane wyjściowe jako tablica. Wypróbuj online
Wymień finał
p
zS*
wyjściowe jako ciąg.Wyjaśnienie:
źródło
Haskell,
145129 bajtówWypróbuj online!
Edycja: @ Ørjan Johansen zapisał 16 bajtów. Dzięki!
źródło
unwords$
, dane wyjściowe z tablicy są dozwolone. (2)s x=show x; ... s[a]
jest krótszy, po czym można go połączyć z następnym za pomocą:
imap
, a następnieid=<<
staje się dłuższy niż tylko za pomocą++
s. (3)max 4a-2
imin(a+3)t-1
są krótsze. Wypróbuj online!Skrypt golfowy - 104 znaki
Bez golfa
źródło
Perl 5,
113 + 1 (-p)109 +3 (-pal) bajtówWypróbuj online
źródło
$'
! Miałem trochę zabawy z tym, ale nie byłem w stanie dużo tego obniżyć, ale używając<>
zamiast wyrażenia regularnego i-a
zachowując odniesienie$_
, mogłem przejść do 111: Wypróbuj online! (-l
dodano dla czytelności)"@F"
pojedynczych danych wejściowych, to miłe obejście! Nie-l
jest to jednak potrzebne do liczenia bajtów, tylko do uruchomienia wszystkich testów jednocześnie :). Nie powiedziałem, ale twoja walidacja elipsy jest bardzo ładna!Rubin , 127 bajtów
Nie jestem z tego szczególnie zadowolony, szczególnie logika poprzednia / następna.
Wypróbuj online!
Bez golfa
źródło
PHP (przeglądarka), 267 bajtów
Wypróbuj online!
Zdecydowanie nie tak małe, jak mogłoby być i jak wykazano powyżej, używanie PHP w wierszu poleceń może być znacznie mniejsze. Dane wejściowe są wysyłane za pośrednictwem żądań GET, a jest wybraną liczbą, b jest granicą. To wygląda jak
foo.bar.com/index.php?a=2&b=12
Bez golfa
Jestem prawie pewien, że moi trójskładnikowi operatorzy mogą zostać poprawieni, zachęcamy do wypróbowania.
źródło
[,$k,$n]=$argv;
-><?[$k,$n]=$_GET;
jeśli nalegam, aby bieżąca strona była pierwszym argumentem, a liczba stron - drugim;<?extract($_GET);
jeśli chcę użyć nazwanych argumentów.$a<$b-2
z$a<$b-3
do naprawienia.<?=($a=$_GET['a'])>1?'prev 1 ':'[1] ',$a>4?'... ':'';for($i=$a>4?$a-3:1;$i<$a+3&++$i<$b=$_GET['b'];)echo$a-$i?"$i ":"[$i] ";echo$a<$b-3?"... ":"",$a<$b?"$b next":"[$b]";
(169 bajtów)Formuła IBM / Lotus Notes,
217211 bajtów-2 dzięki dzięki @KevinCruijssen
-4 przy użyciu zmiennych dla wartości @Text
Zasadniczo port mojej odpowiedzi w Python 2 tylko dla zabawy, gdy próbuję zapamiętać, jak używać Formula.
Formula nie ma TIO, więc oto zrzut ekranu niektórych przypadków testowych:
źródło
x>a-3 & x<a+3
w formularzu Lotus Notes? Czy jest&x
zarezerwowane na coś, czy też nie ma żadnego powodu, dlaczego przestrzenie po obu stronach są obowiązkowe? Nigdy nie programowałem w tym języku, byłem po prostu ciekawy. :)Excel VBA,
202201 bajtówAnonimowa funkcja bezpośredniego okna VBE, która przenosi dane wejściowe z zakresu
A1:A2
i wyjścia do bezpośredniego okna VBE.Wersja podprogramu
Zawarte dla czytelności
źródło
PowerShell , 237 bajtów
Wypróbuj online!
Jedna gigantyczna kombinacja strun ze zdecydowanie zbyt wieloma znakami dolara.
Dalsza praca nad golfem.Nie, myślę, że jest to tak krótkie, jak to możliwe.źródło
JavaScript (ES6),
265263258240239220194193182178 bajtów-2 od usunięcia narzędzia do debugowania
-5 od uświadomienia sobie, że używam ES6 i czasami mogę pozbyć się nawiasów
-18 od usunięcia czegoś z wcześniejszej wersji, która jest już nieaktualna
-1 od robienia podstępnych rzeczy
-19 od usuwania niepotrzebnych zmiennych
-26 bajtów od usunięcia zbyt skomplikowanych wartości Falsey. Jestem nowy w ES6
-1 od zastosowania krótszych porównań
-11 od użycia funkcji rekurencyjnej
* -4 z wymianą
?...:0
z&&...
i... ${t}
z...+t
Zajęło mi to zbyt wiele miejsca w życiu i nie dało wystarczającego poparcia.
ale cieszę się, że końcowy kod ma potęgę 2 (2 ^ 8).Wiem, że istnieje inna odpowiedź JavaScript, która ma około 120 bajtów.ale nadal kocham ten kodEDYCJA: nie wiem o czym myślałem. 265 to nie 2 ^ 8 ...
Robiąc to, udało mi się przełamać niegodziwą wersję. Boże, czy nienawidzę kodu niegodziwego?
EDYCJA 2: teraz wygląda jak lepsze rozwiązanie 121-bajtowe
Wyjaśnienie:
przyjść, ale w zasadzie jest
range(end, start)
i robi fajne rzeczy, takie jak:page
jest 1page > 4
total - page < 4
total - page == 0
i takie tam i po prostu dołącza do tego przez ''. Wiem, że nie musisz, ale podoba mi się fakt, że jest to częściowo konwencjonalne. Nie wiem Cieszyć się.
Wypróbuj online!
Sprawdź to online!
Oto
186185174170 bajtów rozwiązanie, które nie lubię: Wypróbuj online!źródło
PowerShell , 141 bajtów
Wypróbuj online!
Mniej golfa:
źródło