Vai all'ennesima pagina


47

È comune dover creare un'interfaccia di selezione della pagina. In genere si presenta così:

prev 1 ... 3 4 [5] 6 7 ... 173 next

Ciò significa che ci sono in totale 173 pagine e attualmente sei sulla 5a pagina.

Questa sfida richiede di prendere il numero totale di pagine e il numero di pagina corrente come input e di generare una stringa (o un array) per "visualizzare" il selettore di pagine.

Ingresso

2 numeri interi positivi

  • numero di pagina corrente
  • conteggio delle pagine

È garantito che 1 <= corrente <= totale.

Produzione

Emette una stringa o un array che rappresenta l'interfaccia utente per i selettori di pagina.

  • Se viene emesso come stringa, è necessario utilizzare un singolo spazio (U + 0020) tra ciascuna pagina.
  • Se l'output è un array, l'array dovrebbe produrre lo stesso risultato della stringa dopo aver convertito ogni elemento in stringa e unirli con un singolo spazio.
    • I tre punti ( ...) non sono opzionali per l'output di array.

Dettagli

  • Se corrente == 1, non verrà emesso alcun "precedente", altrimenti verrà visualizzato "precedente".
  • Se current == totale, non verrà emesso alcun "successivo", altrimenti "successivo" arriva per ultimo.
  • La prima pagina (1) e l'ultima (totale) devono sempre essere emesse.
  • La pagina corrente, la pagina (corrente - 1), la pagina (corrente - 2), la pagina (corrente + 1), la pagina (corrente + 2) devono essere emesse purché siano nell'intervallo di [1..totale].
  • Nessun altro numero di pagine deve essere emesso.
  • Le pagine generate devono essere ordinate in ordine crescente.
  • L'output non deve contenere numeri di pagina duplicati.
  • La pagina corrente deve essere evidenziata avvolgendola in una coppia di [].
  • Se è presente uno spazio tra i vicini, è ...necessario inserire tre punti ( ).

Casi test

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

Regole

  • Questo è code-golf, vince il codice più corto!

7
Potrebbe valere la pena aggiungerlo 4 , 6come test case. Simile al 3, 6caso, ma assicura che i punti non vengano aggiunti sul lato sinistro.
Tom Carpenter,

3
GIOCHEREMO alcuni di questi per un progetto web ...
Stan Strum,

2
Basandosi sul commento di @TomCarpenter, un 4,7caso di test sarebbe molto apprezzato - assicurerebbe che entrambi i casi limite che escludono le ellissi possano essere incontrati contemporaneamente
Taylor Scott

1
@TaylorScott Entrambi aggiunti.
TSH

2
@StanStrum La prossima sfida è scrivere uno scroller infinito.
Carl,

Risposte:


9

Retina , 125 113 109 107 byte

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

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

Provalo online! Il link include casi di test. Risparmiato 12 byte grazie a @MartinEnder. Spiegazione:

.+
$*

Converti in unario.

r`1\G
 1$'

Genera tutti i numeri di pagina in ordine inverso.

Elimina la nuova riga che separa l'input. (C'è anche uno spazio lì dalla generazione del numero di pagina.)

O`1+

Riordinare le pagine in ordine crescente. Questo ordina anche la pagina corrente, che ora è duplicata.

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

Non duplicare e avvolgere []i messaggi nella pagina corrente.

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

Aggiungi dei puntini di sospensione se la pagina corrente è almeno 5 o se ci sono almeno 4 pagine dopo la pagina corrente. (Nota lo spazio finale, per evitare di includere l'ultima pagina tra i puntini di sospensione.)

^1
prev 1

Aggiungi il precedente se la pagina corrente non è 1.

1$
1 next

Aggiungi il successivo se la pagina corrente non è l'ultima pagina.

1+
$.&

Converti in decimale.


1
Salvati alcuni byte: tio.run/… (uno dei quali ha richiesto la modifica del formato di input per la separazione dell'alimentazione di linea).
Martin Ender,

@MartinEnder Grazie, mi piace particolarmente quell'ellissi di golf finale, anche se penso di poter radere altri <s> tre </s> quattro byte.
Neil,

9

JavaScript (ES6), 130 122 121 byte

Richiamare con la sintassi del curry, ad es 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(_=>_)

Provalo online!

-1 byte (Arnauld): impostato Xsu X-x.


Devo amare quei lambda
Stan Strum,

Devi aggiungere +8 ... Non .joinfa parte del tuo conteggio! Stavo impazzendo cercando di capire perché il tuo codice avrebbe funzionato senza un join, mentre il mio codice simile non avrebbe funzionato. Quindi dico che non l'hai incluso nella tua soluzione, ma l'hai incluso nel tuo frammento!
nl-x

@ nl-x Whoops! Ho dimenticato di aggiornare il mio frammento. La sfida consente di produrre una stringa o un array; Ti consiglierei l'output come array.
darrylyeo,

7

6502 codice macchina (C64), 160 byte

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 - Utilizzo: sys49152,[current],[total] ad essys49152,5,173.

I numeri devono essere compresi nell'intervallo [1..255] con corrente <= totale. Poiché ciò non è stato specificato diversamente, si tratta dell'intervallo intero senza segno "naturale" su un processore a 8 bit.


Spiegazione come elenco di smontaggio commentato:

         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

6

R , 214 byte 168 byte

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'}

Provalo online!

Grazie a @ user2390246 per alcuni ottimi consigli sul golf



186 byte con un'inversione di logica. Non sembra davvero una premessa distinta.
CriminallyVulgar

2
165 byte con ulteriore golf. Inoltre non utilizza la funzione c(), che elimina l'orribile confusione con l'oggetto chiamato c.
user2390246

2
Eseguire il backup di 171 byte correggendo un errore che appare in diverse versioni commentate!
user2390246

1
Un altro piccolo miglioramento per 164 byte . Scusami per aver dirottato completamente questo, mi sono lasciata trasportare un po '!
user2390246

5

APL (Dyalog) , 83 82 byte

Funzione di infissione anonima che assume corrente come argomento sinistro e totale come argomento destro.

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

Provalo online!

{... } esplicito lambda dove e rappresentano gli argomenti sinistro e destro:

⍺<⍵ la corrente è inferiore al totale?

' next'/⍨ in tal caso (lett. usa quello per replicare) il testo

(... ), anteporre quanto segue:

  ⍳⍵te nteger da 1 a totale

  'x'@(... ) sostituisci con un x nelle posizioni in cui gli articoli sono ...

   ~ non

    membri di

   1 uno

   , seguito da

    il totale

   , seguito da

    ⍳5 i primi cinque ɩ ntegers ( [1,2,3,4,5])

    3- sottratto da tre ( [2,1,0,-1,-2])

    ⍺+ aggiunto al corrente ( [⍺+2,⍺+1,⍺,⍺-1,⍺-2])

    resa che (serve per separarsi da 'x')

   (... ) applica la seguente funzione tacita nella posizione corrente:

     formato (stringify)

    '][', anteporre il testo » 

    1⌽ ruota di un passo verso sinistra (sposta ]alla fine)

     racchiudere (in modo che sia uno scalare che si adatterà nella singola posizione indicata)

   ϵ nlist (appiattisci - perché l'abbiamo fatto nidificato quando abbiamo inserito parentesi)

    formato (stringify - 1 spazio che separa i numeri l'uno dall'altro e dalle xesecuzioni)

  'x+'⎕R'...' PCRE R eplace xfunziona con tre periodi

(... ), anteporre quanto segue:

  ⍺>1 la corrente è maggiore di 1?

  'prev '/⍨ in tal caso (lett. usa quello per replicare) il testo


5

Wolfram Language (Mathematica) , 131 114 109 byte

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

Provalo online!

Come funziona

Molta sostituzione. A partire da un elenco di tutte le pagine, sostituire, in ordine:

  1. #->"["<>(t=ToString)@#<>"]": la pagina corrente con una stringa tra parentesi,
  2. 1->"prev 1": pagina 1 con la stringa prev 1,
  3. #2->t@#2<>" next": l'ultima pagina con la stringa (number) next, con
  4. #-3|#+3:>"...": pagina current-3e pagina current+3con la stringa "...",
  5. x_/;Abs[x-#]>2:>Nothing: tutte le altre pagine (intere) sotto current-2o sopra current+2senza niente. (Sì, Nothingè un built-in.)

4

Funky , 218 210 byte

Salvati alcuni byte, alcuni dei quali grazie a 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)}

Provalo online!


Non conosco Funky, ma sembra che i<=p+2possa essere giocato a golf i<p+3, e t[2]="["+t[2]+"]"potrebbe essere t[2]="["+p+"]"?
TSH

4

Python 2 , 136 130 byte

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]

Provalo online!

Se l'output è un array, l'array dovrebbe produrre lo stesso risultato della stringa dopo aver convertito ogni elemento in stringa e unirli con un singolo spazio.

Provalo online! in forma predefinita, dove puoi vedere il piè di pagina che si traduce letteralmente in "converti ciascuno in stringa, unisci spazi".

Questa è un'alternativa all'approccio di Lynn.


Salva un byte con i or'...'e zeri (come questo )
Jonathan Allan il

3

Python 2 , 135 byte

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

Provalo online!

Per prima cosa creiamo una stringa simile prev 1 3 4 [5] 6 7 10 next, che ha "lacune" causate dalla cancellazione di alcuni numeri ma non dai loro spazi di delimitazione. Quindi sostituiamo qualsiasi esecuzione di 2+ spazi ...utilizzando una regex.


È possibile passare (-3<x-c<3or x%t<2)a (x%t<2or-3<x-c<3)-1, entrambi gli argomenti per l' oroperatore restituiranno un valore booleano.
Erik the Outgolfer,

3

Java 8, 201 200 197 byte

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":"")

Spiegazione:

Provalo qui.

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)

3

Java (OpenJDK 8) , 218 179 177 167 166 byte

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:"");}

Provalo online!


Bella risposta, più corta della mia! Puoi giocare a golf a cinque byte inserendo uno spazio già dopo "["+c+"] ";: 172 byte
Kevin Cruijssen

Oh, e un altro byte inserendo l'ultimo p+=prima del for-loop all'interno della dichiarazione for-loop: 171 byte
Kevin Cruijssen

3

Gelatina , 59 byte

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

Un programma completo * che stampa il risultato su STDOUT. Accetta argomenti currente totalin questo ordine.

Provalo online! o vedi la suite di test .

Come?

+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

* Come collegamento diadico prendendo currenta sinistra etotal destra questo restituisce un elenco con un mix di caratteri e numeri interi; questo elenco include gli spazi. Il byte Knon può essere semplicemente rimosso per aderire alla specifica, poiché il risultato dovrebbe quindi essere racchiuso currenttra parentesi come caratteri separati (come [...'[','5','2',']'...]), quindi il "converti ogni elemento in stringa e uniscili con un singolo spazio" non produrrà il risultato desiderato )


2

Python 2 , 178 170 byte

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]

Provalo online!

Secondo tentativo dopo aver letto le regole più attentamente.

-8 perdendo alcune parentesi non necessarie.


2

Ottava , 169 196 190 181 175 169 166 byte

@(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)

Provalo online!

Aggiungerò una spiegazione più avanti.

Hmm, sembra che ci siano stati dei problemi con il formato di output. Questi sono stati risolti: tutti gli output sono corretti. Ma purtroppo costa 27 byte. Riuscì ad artigliare tutti quelli con un po 'di grasso.


  • Risparmia 6 byte usando *invece di .*- grazie @StewieGriffin
  • Salva 9 byte usando sprintfinvece di num2strcome avevo già gestito s.
  • Salva 6 byte inserendo []la sprintchiamata.
  • Salva 6 byte trovando un modo per ridurre il numero di confronti.
  • Salva 3 byte rimuovendo la necessità strtrim()senza causare spazio finale.

C'è 1 spazio in più dopo il numero 54 nell'output.
TSH

@tsh risolto ora. Ho aggiunto tutti i casi di test all'output TIO.
Tom Carpenter,

2

C # (.NET Core) , 195 192 byte

Salvato 3 byte grazie a 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;}

Provalo online!


1
È possibile salvare 2 byte rimuovendo le parentesi del ciclo for. E 1 altro utilizzando un input di curry c=>t=>. Provalo qui: 192 byte
Kevin Cruijssen il

2

C ++ - 247 byte

#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";}

Provalo online!


1
Si noti che "Nessun altro numero di pagine deve essere emesso."
TSH

Ohh scusa se ho perso quella regola. Lo correggerò presto.
Balazs:

Inoltre, il collegamento è interrotto.
Ian H.

@Appleguy: guarda questo : il tuo codice da misurare va nel campo "code" su TIO. Quindi puoi facilmente creare l'intero post da lì.
Felix Palmen,

2

Python 2 ,  128  124 byte

-4 byte grazie a Jonathan Allan !

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)

Provalo online!

Output come elenco, ma tio link include pretty-print.


while ~0:è una cosa strana da usare quando while 1:funziona bene.
Jonathan Allan,

@JonathanAllan Lo so: P - Ma funziona ancora : D
Mr. Xcoder

-4 byte spostando la modifica [[c]](in questo modo ) EDIT - così fa 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 Sì grazie, ci stavo solo giocando perché mi sembrava ridondante.
Mr. Xcoder,

2

PHP, 157 150 byte

prendendo i dettagli letteralmente si è rivelato l'approccio più breve:

[,$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;

Corri con php -nr '<code>' <curpage> <numpages>o provalo online .


2

CJam, 74

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

Output come array. Provalo online

Sostituisci il finale pcon S*l'output come stringa.

Spiegazione:

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

2

Haskell, 145 129 byte

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]

Provalo online!

Modifica: @ Ørjan Johansen ha salvato 16 byte. Grazie!


1
(1) È possibile rilasciare unwords$, l'output dell'array è consentito. (2) s x=show x; ... s[a]è più corto, dopo di che può essere unito al successivo con :e map, quindi id=<<diventa più lungo del semplice utilizzo di ++s. (3) max 4a-2e min(a+3)t-1sono più brevi. Provalo online!
Ørjan Johansen,

1

Golf Script - 104 caratteri

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

Ungolfed

~\: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'


Si Grazie. Ero su cellulare, era un po 'scomodo stipare tutto il codice.
FedeWar

1

Perl 5, 113 + 1 (-p) 109 +3 (-pal) byte

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

Provalo online


1
Buon uso di `` $ `` `e $'! Ho giocato un po 'con questo, ma non sono riuscito a sminuirlo molto, ma usando <>invece la regex e usando -aper mantenere un riferimento $_, sono riuscito a passare a 111: Provalo online! ( -laggiunto per leggibilità)
Dom Hastings

Bene, non ho pensato a @F
Nahuel Fouilleul il

Mi "@F"è piaciuto l'uso di input singolari, è una bella soluzione! Non -lè necessario nel conteggio dei byte, ma solo per eseguire tutti i test contemporaneamente :). Non ho detto, ma la tua convalida con i puntini di sospensione è molto bella!
Dom Hastings,

in effetti ho appena visto che uno dei miei primi post potrebbe essere migliorato
Nahuel Fouilleul il

1

Rubino , 127 byte

Non sono particolarmente contento di questo, specialmente della logica precedente / successiva.

->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]')}

Provalo online!

Ungolfed

->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]')
}

1

PHP (Browser), 267 byte

<?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?>

Provalo online!

Sicuramente non così piccolo come avrebbe potuto essere, e come è stato dimostrato sopra, l'uso di PHP nella riga di comando può essere molto più piccolo. L'input avviene tramite richieste GET, a è il numero selezionato, b è il limite. Questo sembrafoo.bar.com/index.php?a=2&b=12

Ungolfed

<?
    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
?>

Sono abbastanza sicuro che i miei operatori ternari possano essere migliorati, non esitate a provare.


Far funzionare la mia risposta in un browser costerebbe uno o due byte: [,$k,$n]=$argv; -> <?[$k,$n]=$_GET;se insisto sul fatto che la pagina corrente sia il primo argomento e il numero di pagine il secondo; <?extract($_GET);se voglio usare argomenti chiamati.
Tito

fallisce per a = b-3; sostituire $a<$b-2con $a<$b-3per risolvere.
Tito

2
golf: <?=($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 byte)
Tito

1

Formula IBM / Lotus Notes, 217 211 byte

-2 grazie a @KevinCruijssen

-4 usando le variabili per i valori @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

Fondamentalmente una porta della mia risposta Python 2 solo per il divertimento di provare a ricordare come usare Formula.

Non esiste un TIO per Formula, quindi ecco uno screenshot di alcuni dei casi di test:

inserisci qui la descrizione dell'immagine


1
C'è un motivo per cui sono richiesti spazi x>a-3 & x<a+3in Lotus Notes Formula? È &xriservato a qualcosa o non c'è motivo in particolare perché gli spazi su entrambi i lati siano obbligatori? Non ho mai programmato in questa lingua a proposito, era solo curioso. :)
Kevin Cruijssen il

@KevinCruijssen - Ad essere sincero, non lo so. Non avrei mai pensato di provarlo senza. Troppo abituato a scrivere codice leggibile :-). Domani controllo quando arrivo a un computer con Notes installato e ti faccio sapere.
ElPedro,

1
@KevinCruijssen - avevi ragione!
ElPedro

Hehe, felice di poterti aiutare. :) +1 da parte mia e vedo che hai giocato a golf un po 'di più creando una variabile per @Text. Quando ho visto che è stato usato due volte due ieri, mi è passato per la mente che sarebbe stato possibile.
Kevin Cruijssen,

1

Excel VBA, 202 201 byte

Funzione di finestra immediata VBE anonima che accetta input dalla gamma A1:A2e output alla finestra immediata 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","")]

Versione subroutine

Incluso per la leggibilità

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

0

PowerShell , 237 byte

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)

Provalo online!

Una gigantesca concatenazione di archi con troppi segni di dollaro. Lavorare ulteriormente sul golf. No, penso che questo sia breve quanto questo approccio può andare.


0

Javascript (ES6), 265 263 258 240 239 220 194 193 182 178 byte

-2 dalla rimozione di uno strumento di debug

-5 dalla consapevolezza che sto usando ES6 e che a volte riesco a eliminare la parentesi

-18 dalla rimozione di qualcosa da una versione precedente che ora è obsoleta

-1 dal fare alcune cose subdole

-19 dalla rimozione di variabili non necessarie

-26 byte dalla rimozione dei valori di falso fin troppo complicati. Sono nuovo di ES6

-1 dall'uso di confronti più brevi

-11 dall'uso di una funzione ricorsiva

* -4 dalla sostituzione ?...:0con &&...e ... ${t}con...+t

Ciò ha richiesto troppo tempo della mia vita e non ha dato abbastanza voti. ma sono così contento che il codice finale sia una potenza di 2 (2 ^ 8) So che c'è un'altra risposta JavaScript che è di circa 120 byte. ma adoro ancora questo codice

EDIT: non so cosa stavo pensando. 265 non è 2 ^ 8 ...

Nel fare questo, sono riuscito a rompere la versione non giocata. Dio, odio il codice ungolfing.

EDIT 2: ora sembra la migliore soluzione da 121 byte

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` `

Spiegazione:

a venire ma fondamentalmente lo è range(end, start)e fa cose interessanti come:

  1. mostra prev if pageè 1
  2. mostra i punti a sinistra se page > 4
  3. mostra i punti giusti se total - page < 4
  4. mostra dopo se total - page == 0

e cose del genere e si unisce a ''. So che non è necessario, ma mi piace il fatto che sia semi-convenzionale. Non lo so. Godere.

Provalo online!

Convalidalo online!

Ecco una soluzione 186 185 174 170 byte che non mi piace: provala online!


0

PowerShell , 141 byte

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]"

Provalo online!

Meno golf:

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]"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.