Idź do N-tej strony

47

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.

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!
tsh
źródło
7
Może warto dodać 4 , 6jako przypadek testowy. Podobnie jak w 3, 6przypadku, ale zapewnia, że ​​kropki nie zostaną dodane do lewej strony.
Tom Carpenter,
3
Po prostu WYKONAJ niektóre z nich do projektu internetowego ...
Stan Strum
2
Opierając się na komentarzu @TomCarpenter, 4,7przypadek testowy byłby bardzo mile widziany - zapewniłby, że oba przypadki graniczne wykluczające elipsy mogą być jednocześnie spełnione
Taylor Scott
1
@TaylorScott Oba dodane.
tsh
2
@StanStrum Kolejnym wyzwaniem jest napisanie nieskończonego scrollera.
Carl

Odpowiedzi:

9

Siatkówka , 125 113 109 107 bajtów

.+
$*
r`1\G
 1$'
¶

O`1+
\b(1+) \1\b
[$1]
 .* (1+ 1+ \[)|(] 1+ 1+) .* 
$2 ... $1
^1
prev 1
1$
1 next
1+
$.&

Wypróbuj online! Link zawiera przypadki testowe. Zaoszczędź 12 bajtów dzięki @MartinEnder. Wyjaśnienie:

.+
$*

Konwertuj na unary.

r`1\G
 1$'

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).

O`1+

Posortuj strony z powrotem w kolejności rosnącej. Spowoduje to również posortowanie bieżącej strony, która jest teraz zduplikowana.

\b(1+) \1\b
[$1]

Zduplikuj i owiń []wokół bieżącej strony.

 .* (1+ 1+ \[)|(] 1+ 1+) .* 
$2 ... $1

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).

^1
prev 1

Dodaj poprzednią, jeśli bieżąca strona nie ma 1.

1$
1 next

Dodaj następny, jeśli bieżąca strona nie jest ostatnią stroną.

1+
$.&

Konwertuj z powrotem na dziesiętne.

Neil
źródło
1
Zapisano kilka bajtów: tio.run/… (jeden z nich wymagał zmiany formatu wejściowego na separację kanału).
Martin Ender,
@MartinEnder Dzięki, szczególnie podoba mi się ten golf ellipsis, chociaż myślę, że mogę ogolić kolejne <s> trzy </s> cztery bajty.
Neil,
9

JavaScript (ES6), 130 122 121 bajtów

Wywołaj ze składnią curry, np f(3)(10).

x=>X=>[x>1&&'prev 1',x>4&&'...',x>3&&x-2,x>2&&x-1,`[${x}]`,(X-=x)>1&&x+1,X>2&&x+2,X>3&&'...',X&&X+x+' next'].filter(_=>_)

Wypróbuj online!

-1 bajt (Arnauld): Ustaw Xna X-x.

darrylyeo
źródło
Uwielbiam te lambdas
Stan Strum
Powinieneś dodać +8 ... To .joinnie 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!
nl-x
@ nl-x Ups! Zapomniałem zaktualizować swój fragment kodu. Wyzwanie pozwala na wyprowadzenie ciągu lub tablicy; Polecam wyjście w postaci tablicy.
darrylyeo
7

Kod maszynowy 6502 (C64), 160 bajtów

00 C0 20 9B B7 86 FB CA F0 01 CA 86 FD 20 9B B7 86 FC A6 FB E8 E4 FC B0 01 E8
86 FE A2 01 E4 FB F0 1A A9 91 A0 C0 20 1E AB A2 02 E4 FD B0 0D A9 2E 20 D2 FF
CA 10 FA 20 3F AB A6 FD 86 9E E4 FB D0 05 A9 5B 20 D2 FF A9 00 20 CD BD A6 9E
E4 FB D0 05 A9 5D 20 D2 FF 20 3F AB A6 9E E4 FC F0 25 E4 FE F0 05 E8 86 9E D0
D5 E8 E4 FC F0 0D A2 02 A9 2E 20 D2 FF CA 10 FA 20 3F AB A6 FC A9 00 20 CD BD
20 3F AB A6 FC E4 FB F0 07 A9 99 A0 C0 20 1E AB 60 50 52 45 56 20 31 20 00 4E
45 58 54 00

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:

         00 C0       .WORD $C000        ; load address
.C:c000  20 9B B7    JSR $B79B          ; read 8bit integer
.C:c003  86 FB       STX $FB            ; store current page
.C:c005  CA          DEX                ; calculate lower start for ...
.C:c006  F0 01       BEQ .stl
.C:c008  CA          DEX
.C:c009   .stl:
.C:c009  86 FD       STX $FD            ; ... range and store
.C:c00b  20 9B B7    JSR $B79B          ; read 8bit integer
.C:c00e  86 FC       STX $FC            ; store total pages
.C:c010  A6 FB       LDX $FB            ; load current page
.C:c012  E8          INX                ; calculate upper end for ...
.C:c013  E4 FC       CPX $FC
.C:c015  B0 01       BCS .stu
.C:c017  E8          INX
.C:c018   .stu:
.C:c018  86 FE       STX $FE            ; ... range and store
.C:c01a  A2 01       LDX #$01           ; check whether first page is current
.C:c01c  E4 FB       CPX $FB
.C:c01e  F0 1A       BEQ .sequence      ; then directly to sequence
.C:c020  A9 91       LDA #<.prev        ; output string for ...
.C:c022  A0 C0       LDY #>.prev
.C:c024  20 1E AB    JSR $AB1E          ; ... "prev 1 "
.C:c027  A2 02       LDX #$02           ; check whether page 2 is in range ...
.C:c029  E4 FD       CPX $FD
.C:c02b  B0 0D       BCS .sequence      ; ... then directly to sequence
.C:c02d  A9 2E       LDA #$2E           ; load character '.'
.C:c02f   .ellip1:
.C:c02f  20 D2 FF    JSR $FFD2          ; output ...
.C:c032  CA          DEX
.C:c033  10 FA       BPL .ellip1        ; ... 3 times
.C:c035  20 3F AB    JSR $AB3F          ; output space
.C:c038  A6 FD       LDX $FD            ; load lower start for range
.C:c03a   .sequence:
.C:c03a  86 9E       STX $9E            ; store to temporary
.C:c03c   .seqloop:
.C:c03c  E4 FB       CPX $FB            ; compare with current
.C:c03e  D0 05       BNE .notcurrent1   ; yes -> output '['
.C:c040  A9 5B       LDA #$5B
.C:c042  20 D2 FF    JSR $FFD2
.C:c045   .notcurrent1:
.C:c045  A9 00       LDA #$00
.C:c047  20 CD BD    JSR $BDCD          ; output number
.C:c04a  A6 9E       LDX $9E            ; compare with current
.C:c04c  E4 FB       CPX $FB
.C:c04e  D0 05       BNE .notcurrent2   ; yes -> output ']'
.C:c050  A9 5D       LDA #$5D
.C:c052  20 D2 FF    JSR $FFD2
.C:c055   .notcurrent2:
.C:c055  20 3F AB    JSR $AB3F          ; output space
.C:c058  A6 9E       LDX $9E
.C:c05a  E4 FC       CPX $FC            ; compare position with last page
.C:c05c  F0 25       BEQ .printnext     ; if eq jump to part printing "next"
.C:c05e  E4 FE       CPX $FE            ; compare position to upper end of range
.C:c060  F0 05       BEQ .printellip2   ; if eq jump to part printing "..."
.C:c062  E8          INX
.C:c063  86 9E       STX $9E            ; next number
.C:c065  D0 D5       BNE .seqloop       ; and repeat loop for sequence
.C:c067   .printellip2:
.C:c067  E8          INX
.C:c068  E4 FC       CPX $FC            ; compare next number with last page
.C:c06a  F0 0D       BEQ .printlast     ; if eq jump to part printing page num
.C:c06c  A2 02       LDX #$02
.C:c06e  A9 2E       LDA #$2E           ; load character '.'
.C:c070   .ellip2:
.C:c070  20 D2 FF    JSR $FFD2          ; output ...
.C:c073  CA          DEX
.C:c074  10 FA       BPL .ellip2        ; ... 3 times
.C:c076  20 3F AB    JSR $AB3F          ; output space
.C:c079   .printlast:
.C:c079  A6 FC       LDX $FC            ; output last page number
.C:c07b  A9 00       LDA #$00
.C:c07d  20 CD BD    JSR $BDCD
.C:c080  20 3F AB    JSR $AB3F          ; output space
.C:c083   .printnext:
.C:c083  A6 FC       LDX $FC            ; compare current page with last page
.C:c085  E4 FB       CPX $FB
.C:c087  F0 07       BEQ .done          ; if eq nothing else to do
.C:c089  A9 99       LDA #<.next        ; output string for ...
.C:c08b  A0 C0       LDY #>.next
.C:c08d  20 1E AB    JSR $AB1E          ; "next"
.C:c090   .done:
.C:c090  60          RTS
.C:c091   .prev:
.C:c091  50 52 45 56 .BYTE "prev"
.C:c095  20 31 20 00 .BYTE " 1 ", $00
.C:c099   .next:
.C:c099  4E 45 58 54 .BYTE "next"
.C:c09d  00          .BYTE $00
Felix Palmen
źródło
6

R , 214 bajtów 168 bajtów

function(c,m,`~`=function(x,y)if(x)cat(y)){o=-2:2+c
o=o[o>0&o<=m]
o[o==c]=paste0('[',c,']')
c>1~'prev '
c>3~'1 '
c>4~' ... '
T~o
c+3<m~' ...'
c+2<m~c('',m)
c<m~' next'}

Wypróbuj online!

Podziękowania dla @ user2390246 za kilka świetnych wskazówek golfowych

znak
źródło
197 bajtów
2390246
186 bajtów z odwróceniem logiki. Tak naprawdę nie wydaje się to odrębną przesłanką.
CriminallyVulgar
2
165 bajtów z dalszym golfem. Nie używa również funkcji c(), która pozbywa się okropnego pomieszania z wywoływanym obiektem c.
user2390246,
2
Wykonaj kopię zapasową do 171 bajtów, poprawiając błąd, który pojawia się w kilku komentowanych wersjach!
user2390246,
1
Kolejne małe ulepszenie dla 164 bajtów . Przepraszam za całkowite przejęcie tego, trochę mnie poniosło!
user2390246,
5

APL (Dyalog) , 83 82 bajtów

Anonimowa funkcja poprawki przyjmująca bieżący jako lewy argument i całkowity jako prawy argument.

{('prev '/⍨⍺>1),('x+'R'...'⍕∊(⊂1'][',⍕)@⍺⊢'x'@(~∊∘(1,⍵,⍺+3-⍳5))⍳⍵),' next'/⍨⍺<⍵}

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ń na x na w pozycjach, w których elementy…

   ~ nie

    członkowie

   1 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 od xprzebiegów)

  'x+'⎕R'...' PCRE R eplace xdział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

Adám
źródło
5

Wolfram Language (Mathematica) , 131 114 109 bajtów

Range@#2/.{#->"["<>(t=ToString)@#<>"]",1->"prev 1",#2->t@#2<>" next",#-3|#+3:>"...",x_/;Abs[x-#]>2:>Nothing}&

Wypróbuj online!

Jak to działa

Dużo zastępowania. Zaczynając od listy wszystkich stron, zamień w kolejności:

  1. #->"["<>(t=ToString)@#<>"]": bieżąca strona z ciągiem w nawiasach,
  2. 1->"prev 1": strona 1 z ciągiem prev 1,
  3. #2->t@#2<>" next": ostatnia strona z ciągiem (number) next, z
  4. #-3|#+3:>"...": strona current-3i strona current+3z ciągiem "...",
  5. x_/;Abs[x-#]>2:>Nothing: wszystkie inne (całkowite) strony poniżej current-2lub powyżej current+2bez niczego. (Tak, Nothingjest wbudowany.)
Misza Ławrow
źródło
4

Funky , 218 210 bajtów

Zapisano kilka bajtów, z których część dzięki tsh

p=>m=>{t={}a=t::push b=t::pop fori=p-2i<p+3i++a(i)t[2]="[%i]"%p whilet[0]<1b(0)whilet[n=-1+#t]>m b(n)ifp>4a(0,"...")ifp>3a(0,1)ifp>1a(0,"prev")ifp<m-3a("...")ifp<m-2a(m)ifp<m a("next")t::reduce((a,b)=>a+" "+b)}

Wypróbuj online!

ATaco
źródło
Nie wiem, funky, ale wydaje się, że i<=p+2można golfed do i<p+3i t[2]="["+t[2]+"]"mogą być t[2]="["+p+"]"?
tsh
4

Python 2 , 136 130 bajtów

lambda p,n:[i for i,j in zip(['prev',1,'...',p-2,p-1,[p],p+1,p+2,'...',n,'next'],[1,3,4,2,1,.1,-n,1-n,3-n,2-n,-n])if p*cmp(j,0)>j]

Wypróbuj online!

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ą.

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.

Erik the Outgolfer
źródło
Zapisz bajt z i or'...'zerami (jak ten )
Jonathan Allan,
3

Python 2 , 135 bajtów

lambda c,t:re.sub('  +',' ... ','prev '*(c>1)+' '.join(`[x,[x]][x==c]`*(x%t<2or-3<x-c<3)for x in range(1,t+1))+' next'*(c<t))
import re

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.

Lynn
źródło
Można przełączyć (-3<x-c<3or x%t<2)się (x%t<2or-3<x-c<3)na -1, oba argumenty do oroperatora zwróci wartość logiczną.
Erik the Outgolfer
3

Java 8, 201 200 197 bajtów

t->n->(n<2?"[1] ":"prev 1 ")+(n>4?"... "+(n-2)+" "+~-n+" ["+n+"] ":n>3?"2 3 [4] ":n>2?"2 [3] ":n>1?"[2] ":"")+(n<t?(n>t-2?"":n>t-3?t-1+" ":n>t-4?(t-2)+" "+~-t+" ":++n+" "+-~n+" ... ")+t+" next":"")

Wyjaśnienie:

Wypróbuj tutaj.

t->n->             // Method with two integer parameters and String return-type
  (n<2?            //  If the current page is 1:
    "[1] "         //   Start with literal "[1] "
   :               //  Else:
    "prev 1 ")     //   Start with literal "prev 1"
  +(n>4?           //  +If the current page is larger than 4:
     "... "        //    Append literal "... "
     +(n-2)+" "    //    + the current page minus 2, and a space
     ~-n           //    + the current page minus 1, and a space
     +" ["+n+"] "  //    + "[current_page]" and a space
    :n>3?          //   Else-if the current page is 4:
     "2 3 [4] "    //    Append literal "2 3 [4] "
    :n>2?          //   Else-if the current page is 3:
     "2 [3] "      //    Append literal "2 [3] "
    :n>1?          //   Else-if the current page is 2:
     "[2] "        //    Append literal "[2] "
    :              //   Else (the current page is 1):
     "")           //    Append nothing
  +(n<t?           //  +If the current page and total amount of pages are not the same:
     (n>t-2?       //    If the current page is larger than the total minus 2:
       ""          //     Append nothing
      :n>t-3?      //    Else-if the current page is larger than the total minus 3:
       t-1+" "     //     Append the total minus 1, and a space
      :n>t-4?      //    Else-if the current page is larger than the total minus 4:
       (t-2)+" "   //     Append the total minus 2, and a space
       +~-t+" "    //     + the total minus 1, and a space
      :            //    Else:
       ++n+" "     //     Append the current page plus 1, and a space
       +-~n+       //     + the current page plus 2, and a space
       " ... ")    //     + literal "... "
     +t            //    + the total itself
     +" next")     //    + literal " next"
    :              //   Else (current page and total amount of pages are the same):
     "")           //    Append nothing
                   // End of method (implicit / single-line return-statement)
Kevin Cruijssen
źródło
3

Java (OpenJDK 8) , 218 179 177 167 166 bajtów

c->t->{String p,e="... ",x="["+c+"] ";int i=c-2;for(p=c>1?"prev 1 "+(c>4?e:""):x;i<c+3;i++)p+=i>1&i<t?i==c?x:i+" ":"";return p+(i<t-1?e:"")+(c<t?t+" next":t>1?x:"");}

Wypróbuj online!

Roberto Graham
źródło
Ładna odpowiedź, krótsza niż moja! Możesz "["+c+"] ";
zagrać w
Aha, i jeszcze jeden bajt, umieszczając ostatni p+=przed pętlą for wewnątrz deklaracji for-loop: 171 bajtów
Kevin Cruijssen
3

Galaretka , 59 bajtów

+2Rṫ-4>Ðḟ⁹1;;QµI’a3R”.ṁ⁸żẎ
Ị¬;n“¢©ỵY“¡&ç»ẋ"W€jçLÐfKṣ⁸j⁸WŒṘ¤

Pełny program * drukujący wynik do STDOUT. Trwa argumentów currenti totalw tej kolejności.

Wypróbuj online! lub zobacz zestaw testowy .

W jaki sposób?

+2Rṫ-4>Ðḟ⁹1;;QµI’a3R”.ṁ⁸żẎ - Link 1, numbers and ellipses: current, total
                           -                                   e.g. 52, 173
 2                         - literal two                            2
+                          - add to current                         54
  R                        - range                                  [1,2,3,...,53,54]
    -4                     - literal minus four                     -4
   ṫ                       - tail from index (i.e. right five)      [50,51,52,53,54]
         ⁹                 - chain's right argument, total          173
       Ðḟ                  - filter discard if:
      >                    -  greater than?                         [50,51,52,53,54]
          1                - literal one                            1
           ;               - concatenate                            [1,50,51,52,53,54]
            ;              - concatenate (implicit right = total)   [1,50,51,52,53,54,173]
             Q             - unique (remove excess 1 and/or total)  [1,50,51,52,53,54,173]
              µ            - new monadic chain, call that X
               I           - incremental differences                [49,1,1,1,1,119]
                ’          - decrement (vectorises)                 [48,0,0,0,0,118]
                  3        - literal three                          3
                 a         - logical and (vectorises)               [3,0,0,0,0,3]
                   R       - range (vectorises)                     [[1,2,3],[],[],[],[],[1,2,3]]
                    ”.     - literal '.' character                  '.'
                      ṁ    - mould like that                        [['.','.','.'],[],[],[],[],['.','.','.']]
                       ⁸   - chain's left argument, X               [1,50,51,52,53,54,173]
                        ż  - zip with that                          [[1,['.', '.', '.']],[50,[]],[51,[]],[52,[]],[53,[]],[54,['.','.','.']],[173]]
                         Ẏ - tighten                                [1,['.', '.', '.'],50,[],51,[],52,[],53,[],54,['.','.','.'],173]

Ị¬;n“¢©ỵY“¡&ç»ẋ"W€jçLÐfKṣ⁸j⁸WŒṘ¤ - Main link: current, total   e.g. 52, 173
Ị                                - insignificant? (abs(current)<=1)  0
 ¬                               - logical not                       1
   n                             - not equal (current != total)      1
  ;                              - concatenate                       [1,1]
    “¢©ỵY“¡&ç»                   - list of compressed strings        [['p','r','e','v'], ['n','e','x','t']]
               "                 - zip with:
              ẋ                  -   repeat (zeros -> empty lists)   [['p','r','e','v'], ['n','e','x','t']]
                W€               - wrap €ach (prep for the join)     [[['p','r','e','v']], [['n','e','x','t']]]
                   ç             - call last link (1) as a dyad      [1,['.', '.', '.'],50,[],51,[],52,[],53,[],54,['.','.','.'],173]
                  j              - join                              [['p','r','e','v'],1,['.','.','.'],50,[],51,[],52,[],53,[],54,['.','.','.'],173,['n','e','x','t']]
                     Ðf          - filter keep if:
                    L            -   length (removes empty lists)    [['p','r','e','v'],1,['.','.','.'],50,51,52,53,54,['.','.','.'],173,['n','e','x','t']]
                       K         - join with spaces                  ['p','r','e','v',' ',1,' ','.','.','.',' ',50,' ',51,' ',52,' ',53,' ',54,' ','.','.','.',' ',173,' ','n','e','x','t']
                         ⁸       - chain's left argument, current    52
                        ṣ        - split at that                     [['p','r','e','v',' ',1,' ','.','.','.',' ',50,' ',51,' ',],[,' ',53,' ',54,' ','.','.','.',' ',173,' ','n','e','x','t']]
                               ¤ - nilad followed by link(s) as a nilad:
                           ⁸     -   chain's left argument, current  52
                            W    -   wrap                            [52]
                             ŒṘ  -   Python string representation    ['[','5','2',']']
                          j      - join                              ['p','r','e','v',' ',1,' ','.','.','.',' ',50,' ',51,' ','[','5','2',']',' ',53,' ',54,' ','.','.','.',' ',173,' ','n','e','x','t']
                                 - implicit print                    prev 1 ... 50 51 [52] 53 54 ... 173 next

* Jako dyadyczny link currentpo lewej i totalpo prawej stronie zwraca listę zawierającą mieszankę znaków i liczb całkowitych; ta lista zawiera spacje. Bajt Knie może być po prostu usunięty, aby zachować zgodność ze specyfikacją, ponieważ wynik miałby wtedy nawiasy klamrowe currentjako 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 )

Jonathan Allan
źródło
2

Python 2 , 178 170 bajtów

x,y=input()
e="... ",""
o=("Prev 1 ","[1] ")[y<2]+e[y<5]
for z in range(2,x):o+=("",(`z`,`[z]`)[z==y]+" ")[y-3<z<y+3]
print o+("",e[x-y<4]+(`x`+" Next",`[x]`)[y==x])[x>1]

Wypróbuj online!

Druga próba po dokładniejszym przeczytaniu zasad.

-8 przez utratę niepotrzebnych nawiasów.

ElPedro
źródło
2

Oktawa , 169 196 190 181 175 169 166 bajtów

@(n,m)(r=[(n>1)*'prev ' (g=n>4)*'1 ... ' (s=@sprintf)(f='%d ',max(n-3+g,1):n-1) s('[%d]',n) 32*(q=n<m) s(f,n+1:min(n+3-(l=n<m-3),m)) l*['... ' s(f,m)] q*'next'])(r>0)

Wypró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.


  • Zaoszczędź 6 bajtów, używając *zamiast .*- dzięki @StewieGriffin
  • Zaoszczędź 9 bajtów, używając sprintfzamiast tego, num2strjak już miałem ten uchwyt s.
  • Zaoszczędź 6 bajtów, wciągając []się w sprintrozmowę.
  • Zaoszczędź 6 bajtów, znajdując sposób na zmniejszenie liczby porównań.
  • Zaoszczędź 3 bajty, usuwając potrzebę strtrim()bez powodowania końcowego miejsca.
Tom Carpenter
źródło
Na twoim wyjściu jest jeszcze 1 miejsce po numerze 54.
tsh
@tsh naprawione teraz. Dodałem wszystkie przypadki testowe do wyjścia TIO.
Tom Carpenter
2

C # (.NET Core) , 195 192 bajtów

Zaoszczędził 3 bajty dzięki Kevin Cruijssen.

c=>t=>{var n=c>1?"prev ":"";n+=c>4?"1 ... ":c<2?"[1] ":"1 ";if(t>1){for(int i=c-3;i++<c+2;)if(i>1&i<t)n+=i==c?$"[{i}] ":i+" ";n+=c<t-4?"... "+t:c==t?$"[{t}]":t+"";n+=c<t?" next":"";}return n;}

Wypróbuj online!

Ian H.
źródło
1
Możesz zapisać 2 bajty, usuwając nawiasy pętli for. I jeszcze 1 za pomocą curry c=>t=>. Wypróbuj tutaj: 192 bajty
Kevin Cruijssen
2

C ++ - 247 bajtów

#include <iostream>
#define c std::cout<<
#define N (a-i<3?i-a<2?1:b-i:a-i-2)
void s(int a,int b){if(a>1)c"prev ";for(int i=1;i<=b&&N!=0;i+=N)c(i==1?"":" ")<<(a==i?"[":"")<<i<<(a==i?"]":"")<<(N>1?" ...":"");if(a<b-2)c" "<<b;if(a<b)c" next";c"\n";}

Wypróbuj online!

BalazsToth
źródło
1
Pamiętaj, że „Nie należy wypisywać żadnych innych numerów stron”.
tsh
Och, przepraszam, że nie przestrzegam tej zasady Wkrótce to poprawię.
BalazsToth
Ponadto link jest zepsuty.
Ian H.,
@Appleguy: spójrz na to - kod, który chcesz zmierzyć, znajduje się w polu „code” na TIO. Następnie możesz łatwo utworzyć cały swój post.
Felix Palmen,
2

Python 2 ,  128  124 bajtów

-4 bajty dzięki Jonathanowi Allanowi !

lambda c,l:["prev"]*(c>1)+[range(1,c),[1,"...",c-2,c-1]][c>4]+[[c]]+[range(c+1,l+1),[c+1,c+2,"...",l]][l-c>4]+["next"]*(c<l)

Wypróbuj online!

Wyjście jako lista, ale link do tio zawiera ładny wydruk.

Pan Xcoder
źródło
while ~0:to dziwna rzecz do użycia, gdy while 1:działa dobrze.
Jonathan Allan,
@JonathanAllan Wiem: P - Ale to wciąż działa : D
Pan Xcoder
-4 bajty przenoszące [[c]](tak jak to ) EDYCJA - podobnie jak while 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':: p
Jonathan Allan
@JonathanAllan Tak, dziękuję, bawiłem się z nim, ponieważ czułem, że jest zbędny.
Pan Xcoder,
2

PHP, 157 150 bajtów

dosłowne podejście do szczegółów okazało się najkrótszym podejściem:

[,$k,$n]=$argv;for($k>1&&print"prev ";$i++<$n;)$g=in_array($i,range($k-2,$k+2)+[5=>1,$n])?!print$i-$k?"$i ":"[$i] ":$g||print"... ";$k<$n&&print next;

Uruchom php -nr '<code>' <curpage> <numpages>lub wypróbuj online .

Tytus
źródło
2

CJam, 74

q~\:A\:B]3e*[1T4A3+1A].>["prev"1'.3*_B"next"]:a.*3/5,A2-f+B,2>&*:+_A#Aa`tp

Dane wyjściowe jako tablica. Wypróbuj online

Wymień finał pz S*wyjściowe jako ciąg.

Wyjaśnienie:

q~          read and evaluate the input (pushing 2 numbers on the stack)
\:A\:B      store the numbers in A and B, keeping them in the same order
]3e*        wrap in array, then repeat each number 3 times - [A A A B B B]
[1T4        make an array containing 1, 0 (T=0 by default), 4,
A3+1A]      then A+3, 1, and A
.>          compare the 2 arrays element by element - [A>1 A>0 A>4 B>A+3 B>1 B>A]
             (each result is 1 or 0)
["prev"1    make an array containing "prev", 1,
'.3*_       "..." twice ("..." = '.' repeated 3 times),
B"next"]    then B and "next"
:a          wrap each of its elements in an array - [["prev"][1]["..."]…]
.*          repeat each of these arrays according to the previous array
             e.g. ["prev"] is repeated A>1 times - ["prev"] if A>1, else []
             [1] is repeated A>0 times (always 1), etc.
             obtaining an array of 6 arrays, some of which may be empty
3/          split into 2 arrays of 3 arrays each (between the "..." parts)
5,A2-f+     make an array [0 1 2 3 4] then add A-2 to each element
B,2>&       intersect with the array [2 3 … B-1] (these are the middle numbers)
*           join the 2 previous arrays by adding these numbers between them
:+          concatenate all these arrays and numbers together
             obtaining an array containing only numbers and strings
_A#         duplicate the array then find the position of A in it
Aa`         generate the "[A]" string (with the actual number for A)
             by wrapping A in an array and getting its string representation
t           put it in the array at A's position
p           print the array's string representation
aditsu
źródło
2

Haskell, 145 129 bajtów

s x=show x
a#t=["prev 1"|a>1]++["..."|a>4]++map s[max 4a-2..a-1]++s[a]:map s[a+1..min(a+3)t-1]++["..."|t-a>3]++[s t++" next"|a<t]

Wypróbuj online!

Edycja: @ Ørjan Johansen zapisał 16 bajtów. Dzięki!

nimi
źródło
1
(1) Można upuścić 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ą :i map, a następnie id=<<staje się dłuższy niż tylko za pomocą ++s. (3) max 4a-2i min(a+3)t-1są krótsze. Wypróbuj online!
Ørjan Johansen
1

Skrypt golfowy - 104 znaki

~\:a;:b;1a<'prev '*3a<'1 ... '*[5,{a 2-+}/]{.0>\b)<&},{.a={'['\']'}*' '}/;b a-:c 2>' ... 'b+*0c<' next'*

Bez golfa

~\:a;:b;       # a = 1st arg, b = 2nd arg
1a<'prev '*    # if a > 1: print 'prev '
3a<'1 ... '*   # if a > 3: print '1 ... '
[5,{a 2-+}/]   # creates an array [a-2 a-1 a a+1 a+2]
{.0>\b)<&},    # keeps only elements >0 and <=b
{
  .a={'['\']'}*      # puts '[' ']' around the element equal to a
  ' '}/;             # prints each element with a leading space
b a-:c 2>' ... 'b+*  # if b-a > 2: print ' ... ' + b
0c<' next'*          # if b-a > 0: print ' next'
FedeWar
źródło
2
Możesz usunąć wszystkie nowe wiersze .
Erik the Outgolfer
Tak dziękuję. Byłem na telefonie komórkowym, to było trochę niewygodne, aby wcisnąć cały kod.
FedeWar
1

Perl 5, 113 + 1 (-p) 109 +3 (-pal) bajtów

$_=join$",1..<>;s/\b@F\b/[$&]/;s/^1/prev 1/;s/\d$/$& next/;s/(^|\] )\w+ \w+ \K[\w ]*(?= \w+ \w+( \[|$))/.../g

Wypróbuj online

Nahuel Fouilleul
źródło
1
Ładne użycie `` $ '' i $'! 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 -azachowując odniesienie $_, mogłem przejść do 111: Wypróbuj online! ( -ldodano dla czytelności)
Dom Hastings,
W porządku, nie pomyślałem @F
Nahuel Fouilleul
Z przyjemnością korzystam z "@F"pojedynczych danych wejściowych, to miłe obejście! Nie -ljest 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!
Dom Hastings,
w rzeczy
samej,
1

Rubin , 127 bajtów

Nie jestem z tego szczególnie zadowolony, szczególnie logika poprzednia / następna.

->c,t{"prev #{(1..t).chunk{|n|n<2||n==t||n>c-3&&n<c+3}.map{|t,a|t ?a:?.*3}*" "} next".sub(/(prev )?\b(#{c})\b( next)?/,'[\2]')}

Wypróbuj online!

Bez golfa

->c,t{
  "prev #{
    (1..t)
    .chunk {|n| n < 2 || n == t || n > c - 3 && n < c + 3 }
    .map {|t,a| t ? a : ?. * 3 } * " "
  } next"
  .sub(/(prev )?\b(#{ c })\b( next)?/, '[\2]')
}
Jordania
źródło
1

PHP (przeglądarka), 267 bajtów

<?php parse_str($_SERVER['QUERY_STRING']);$c=$a!=1?$a>3?$a>4?'prev 1 . . . ':'prev 1 ':'prev ':'[1] ';$d=$a<$b-2?$a+3:$b;for($i=$a<=2?$a==1?$i=2:$i=$a-1:$i=$a-2;$i<$d;$i++)$c.=$a==$i?"[$i] ":"$i ";if($a<$b-2)$c.=" . . . $b next";else $c.=$a==$b?"[$b]":"$b next";echo $c?>

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 jakfoo.bar.com/index.php?a=2&b=12

Bez golfa

<?
    parse_str($_SERVER['QUERY_STRING']);
    $c=$a!=1?$a>3?$a>4?'prev 1 . . . ':'prev 1 ':'prev ':'[1] ';
    $d=$a<$b-2?$a+3:$b;
    for($i=$a<=2?$a==1?$i=2:$i=$a-1:$i=$a-2;$i<$d;$i++)
        $c.=$a==$i?"[$i] ":"$i ";

    if($a<$b-2)$c.=" . . . $b next";else
    $c.=$a==$b?"[$b]":"$b next";
    echo $c
?>

Jestem prawie pewien, że moi trójskładnikowi operatorzy mogą zostać poprawieni, zachęcamy do wypróbowania.

Ben
źródło
Uruchomienie odpowiedzi w przeglądarce kosztowałoby jeden lub dwa bajty: [,$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.
Tytus
zawodzi dla a = b-3; zastąpić $a<$b-2z $a<$b-3do naprawienia.
Tytus
2
grał w golfa: <?=($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)
Tytus
1

Formuła IBM / Lotus Notes, 217 211 bajtów

-2 dzięki dzięki @KevinCruijssen

-4 przy użyciu zmiennych dla wartości @Text

o:=@If(a=1;"[1]";"Prev 1 ")+@If(a>4;"... ";"");@For(x:=2;x<b;x:=x+1;T:=@Text(x);o:=o+@If(x>a-3&x<a+3;@If(a=x;"["+T+"]";T)+" ";""));Z:=@Text(b);o:=o+@If(b>1;@If(b-a>3;"... ";"")+@If(a=b;"["+Z+"]";Z+" Next");"");o

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:

wprowadź opis zdjęcia tutaj

ElPedro
źródło
1
Czy istnieje powód, dla którego wymagane są spacje x>a-3 & x<a+3w formularzu Lotus Notes? Czy jest &xzarezerwowane 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. :)
Kevin Cruijssen
@KevinCruijssen - Szczerze mówiąc nie wiem. Nigdy nie myślałem o wypróbowaniu go bez. Zbyt przyzwyczajony do pisania czytelnego kodu :-). Sprawdzę jutro, gdy dojdę do komputera z zainstalowanym programem Notes i dam ci znać.
ElPedro,
1
@KevinCruijssen - miałeś rację!
ElPedro,
Hehe, cieszę się, że mogłem pomóc. :) +1 ode mnie i widzę, że grałeś jeszcze w golfa, tworząc zmienną dla @Text. Kiedy zobaczyłem, że był używany dwa razy dwa wczoraj, przyszło mi do głowy, że to możliwe.
Kevin Cruijssen
1

Excel VBA, 202 201 bajtów

Anonimowa funkcja bezpośredniego okna VBE, która przenosi dane wejściowe z zakresu A1:A2i wyjścia do bezpośredniego okna VBE.

For i=[Max(A1-2,1)]To[Min(A1+2,A2)]:s=s &IIf([A1]=i,"[" &i &"]",i)&" ":Next:?[If(A1=1,"","prev "&If(A1>3,1&If(A1>4," ... "," "),""))]s[If(A1<A2,If(A1-A2<-3,"... ","")&If(A1-A2<-2,A2&" ","")&"next","")]

Wersja podprogramu

Zawarte dla czytelności

Public Sub PageSelect(Optional ByVal Current As Long = -1, _
                      Optional ByVal Total   As Long = -1)

    Call Sheet1.Activate

    Let [A1] = IIf(Current = -1, [A1], Current)
    Let [A2] = IIf(Total   = -1, [A1], Total)

    Dim s As String
    Let s = ""

    For i = [Max(A1-2,1)] To [Min(A1+2,A2)] Step 1
        Let s = s & IIf([A1] = i, "[" & i & "]", i) & " "
    Next
    Debug.Print [If(A1=1,"","prev "&If(A1>3,1&If(A1>4," ... "," "),""))]; _
                s; _
                [If(A1<A2,If(A1-A2<-3,"... ","")&If(A1-A2<-2,A2&" ","")&"next","")]
End Sub
Taylor Scott
źródło
0

PowerShell , 237 bajtów

param($a,$n)('prev 1','[1]')[$n-lt2]+" ... $($n-2) $($n-1) [$n]"*($n-gt4)+" 2 3 [4]"*($n-eq4)+" 2 [3]"*($n-eq3)+" [2]"*($n-eq2)+" $($n+1) $($n+2) ..."*($n-lt$a-3)+" $($n+1) $($n+2)"*($n-eq$a-3)+" $($n+1)"*($n-eq$a-2)+" $a next"*($n-ne$a)

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.

AdmBorkBork
źródło
0

JavaScript (ES6), 265 263 258 240 239 220 194 193 182 178 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ą ?...:0z &&...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 kod

EDYCJA: 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

y=(e,i,t="")=>i++<e?y(e,i,t+i+' '):t.slice(0,-1);m=(t,p)=>[p-1&&"prev",p<5?y(p-1,0):"1 ... "+y(p-1,p-3),`[${t}]`,t-p<4?y(t,p):y(p+2,p)+` ... `+t,t-p&&"next"].filter(e=>e).join` `

Wyjaśnienie:

przyjść, ale w zasadzie jest range(end, start)i robi fajne rzeczy, takie jak:

  1. pokaż poprzednią, jeśli pagejest 1
  2. pokaż lewe kropki, jeśli page > 4
  3. pokaż odpowiednie kropki, jeśli total - page < 4
  4. pokaż następne jeśli 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 186 185 174 170 bajtów rozwiązanie, które nie lubię: Wypróbuj online!

Stan Strum
źródło
0

PowerShell , 141 bajtów

param($c,$t)($('prev'*($c-ne1)
1
'...'*($c-gt4)
($c-2)..($c+2)-gt1-lt$t
'...'*($t-$c-gt4)
$t
'next'*($t-ne$c))|?{$_}|gu)-replace"^$c$","[$c]"

Wypróbuj online!

Mniej golfa:

param($current,$total)
$uiElements=$(
    'prev'*($current-ne1)
    1
    '...'*($current-gt4)
    ($current-2)..($current+2)-gt1-lt$total
    '...'*($total-$current-gt4)
    $total
    'next'*($total-ne$current)
)
($uiElements|where{$_}|Get-Unique)-replace"^$current$","[$current]"
mazzy
źródło