Ir para a nona página


47

É comum precisar fazer uma interface de seleção de página. Normalmente, é assim:

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

O que significa que existem totalmente 173 páginas e você está na quinta página atualmente.

Esse desafio exige que você pegue o número total de páginas e o número da página atual como entrada e imprima uma string (ou uma matriz) para "exibir" o seletor de páginas.

Entrada

2 inteiros positivos

  • número da página atual
  • contagem de páginas

É garantido que 1 <= atual <= total.

Resultado

Saída de uma string ou matriz que representa a interface do usuário para seletores de página.

  • Se a saída for string, um único espaço (U + 0020) deve ser usado entre cada página.
  • Se a saída for uma matriz, a matriz deverá produzir o mesmo resultado que a sequência depois de converter cada item em sequência e juntá-los com um único espaço.
    • Os três pontos ( ...) não são opcionais para a saída da matriz.

Detalhes

  • Se atual == 1, nenhum "prev" será emitido, caso contrário, "prev" será o primeiro.
  • Se atual == total, nenhum "próximo" será emitido, caso contrário, "próximo" será o último.
  • A primeira página (1) e a última página (total) devem sempre ser exibidas.
  • A página atual, a página (atual - 1), a página (atual - 2), a página (atual + 1) e a (atual + 2) devem ser exibidas desde que estejam no intervalo de [1..total].
  • Nenhum outro número de página deve ser gerado.
  • As páginas produzidas devem ser classificadas em ordem crescente.
  • A saída não deve conter números de página duplicados.
  • A página atual deve ser destacada envolvendo-a em um par de [].
  • Se houver um espaço entre vizinhos, três pontos ( ...) devem ser inseridos.

Casos de teste

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

Regras

  • Este é o código-golfe, o código mais curto vence!

7
Pode valer a pena adicionar 4 , 6como um caso de teste. Semelhante ao 3, 6caso, mas garante que os pontos não sejam adicionados ao lado esquerdo.
Tom Carpenter

3
Só vai YOINK alguns deles para um projeto de web ...
Stan Strum

2
Com base no comentário de @TomCarpenter um 4,7caso de teste seria muito apreciada - asseguraria que ambas as situações limites que excluem elipses podem ser simultaneamente conheci
Taylor Scott

1
@TaylorScott Ambos adicionados.
Tsh #

2
@StanStrum O próximo desafio é escrever um scroller infinito.
Carl

Respostas:


9

Retina , 125 113 109 107 bytes

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

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

Experimente online! O link inclui casos de teste. Economizou 12 bytes graças a @MartinEnder. Explicação:

.+
$*

Converta para unário.

r`1\G
 1$'

Gere todos os números de página na ordem inversa.

Exclua a nova linha que separa a entrada. (Também há um espaço na geração de número de página).

O`1+

Classifique as páginas novamente em ordem crescente. Isso também classifica a página atual, que agora está duplicada.

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

Cancele a duplicação e envolva []s pela página atual.

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

Adicione reticências se a página atual for pelo menos 5 ou se houver pelo menos 4 páginas após a página atual. (Observe o espaço à direita, para evitar a inclusão da última página nas reticências.)

^1
prev 1

Adicione o prev se a página atual não for 1.

1$
1 next

Adicione o próximo se a página atual não for a última.

1+
$.&

Converta de volta para decimal.


1
Salvou alguns bytes: tio.run/… (um dos quais exigia a alteração do formato de entrada para a separação de avanço de linha).
Martin Ender #

@MartinEnder Obrigado, eu particularmente gosto do golfe com reticências, apesar de achar que posso raspar mais <s> três </s> quatro bytes.
911 Neil

9

JavaScript (ES6), 130 122 121 bytes

Invoque com sintaxe de currying, por exemplo 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(_=>_)

Experimente online!

-1 byte (Arnauld): definido Xcomo X-x.


Conseguiu amar aqueles lambdas
Stan Strum

Você deve adicionar +8 ... Isso .joinnão faz parte da sua conta! Eu estava ficando louco tentando descobrir por que seu código funcionaria sem associação, enquanto meu código semelhante não. Então eu digo que você simplesmente não o incluiu na sua solução, mas o incluiu no seu snippet!
Nl-x

@ nl-x Opa! Esqueci de atualizar meu snippet. O desafio permite que você produza uma string ou uma matriz; Eu recomendo que você imprima como uma matriz.
darrylyeo

7

Código de máquina 6502 (C64), 160 bytes

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

Demonstração on-line - Uso: sys49152,[current],[total] por exemplosys49152,5,173.

Os números devem estar no intervalo [1..255] com a corrente <= total. Como isso não foi especificado de outra forma, esse é o intervalo inteiro não assinado "natural" em um processador de 8 bits.


Explicação como lista de desmontagem comentada:

         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 bytes 168 bytes

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

Experimente online!

Obrigado a @ user2390246 por ótimas dicas de golfe



186 bytes com uma reversão da lógica. Realmente não parece uma premissa distinta.
CriminallyVulgar

2
165 bytes com mais golfe. Também não usa a função c(), que elimina a terrível confusão com o objeto chamado c.
user2390246

2
Faça backup de 171 bytes, corrigindo um erro que aparece em várias versões comentadas!
user2390246

1
Outra pequena melhoria para 164 bytes . Desculpe por seqüestrar completamente isso, fiquei um pouco empolgado!
precisa saber é o seguinte

5

APL (Dyalog) , 83 82 bytes

Função de infixo anônimo, recebendo atual como argumento à esquerda e total como argumento à direita.

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

Experimente online!

{} Lambda explícito where e representa os argumentos esquerdo e direito:

⍺<⍵ a corrente é menor que o total?

' next'/⍨ se sim (lit. use isso para replicar) o texto

(), Acrescente o seguinte:

  ⍳⍵número 1 ao total

  'x'@() Substitua por um x nas posições em que os itens estão…

   ~ não

    membros de

   1 1

   , Seguido por

    o total

   , Seguido por

    ⍳5 as cinco primeiras Ɩ ntegers ( [1,2,3,4,5])

    3- subtraído de três ( [2,1,0,-1,-2])

    ⍺+ adicionado ao atual ( [⍺+2,⍺+1,⍺,⍺-1,⍺-2])

    rendimento que (serve para separar de 'x')

   () Aplique a seguinte função tácita na posição atual:

     formato (stringify)

    '][', Anexe o texto` 

    1⌽ gire um passo para a esquerda (move o ]para o fim)

     coloque (de modo que seja um escalar que caiba na única posição indicada)

   ε nlist (achatar - porque nós fizemos isso aninhados quando inserido entre parênteses)

    formato (stringify - 1 espaço separando números entre si e das xexecuções)

  'x+'⎕R'...' PCRE R moran Jr. xé executado com três períodos

(), Acrescente o seguinte:

  ⍺>1 a corrente é maior que 1?

  'prev '/⍨ se sim (lit. use isso para replicar) o texto


5

Wolfram Language (Mathematica) , 131 114 109 bytes

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

Experimente online!

Como funciona

Muita substituição. Começando com uma lista de todas as páginas, substitua, na ordem:

  1. #->"["<>(t=ToString)@#<>"]": a página atual com uma string entre colchetes,
  2. 1->"prev 1": página 1 com a sequência prev 1,
  3. #2->t@#2<>" next": a última página com a sequência (number) next, com
  4. #-3|#+3:>"...": página current-3e página current+3com a sequência "...",
  5. x_/;Abs[x-#]>2:>Nothing: todas as outras páginas (inteiras) abaixo current-2ou acima current+2sem nada. (Sim, Nothingé um built-in.)

4

Funky , 218 210 bytes

Salvou alguns bytes, alguns dos quais graças ao 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)}

Experimente online!


Eu não sei Funky, mas parece que i<=p+2pode ser jogado i<p+3, e t[2]="["+t[2]+"]"pode ser t[2]="["+p+"]"?
tsh

4

Python 2 , 136 130 bytes

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]

Experimente online!

Se a saída for uma matriz, a matriz deverá produzir o mesmo resultado que a sequência depois de converter cada item em sequência e juntá-los com um único espaço.

Experimente online! na forma prettificada, onde você pode ver o rodapé se traduz literalmente para "converter cada uma em uma string, juntar-se a espaços".

Essa é uma alternativa à abordagem de Lynn.


Salvar um byte com i or'...'e zeros (como este )
Jonathan Allan

3

Python 2 , 135 bytes

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

Experimente online!

Primeiro, criamos uma string como prev 1 3 4 [5] 6 7 10 next, que tem "lacunas" causadas pelo apagamento de alguns números, mas não de seus espaços delimitadores. Em seguida, substituímos qualquer execução de 2 ou mais espaços ...usando uma regex.


Você pode virar (-3<x-c<3or x%t<2)a (x%t<2or-3<x-c<3)para -1, ambos os argumentos para o oroperador irá retornar um valor booleano.
Erik the Outgolfer 07/11

3

Java 8, 201 200 197 bytes

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

Explicação:

Experimente aqui.

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 bytes

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

Experimente online!


Boa resposta, mais curta que a minha! Você pode golfe cinco bytes por colocar um espaço já depois "["+c+"] ";: 172 bytes
Kevin Cruijssen

Ah, e mais um byte, colocando o último p+=antes do loop for dentro da declaração do loop for: 171 bytes
Kevin Cruijssen 7/17/17

3

Geléia , 59 bytes

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

Um programa completo * imprimindo o resultado em STDOUT. Leva argumentos currente totalnessa ordem.

Experimente online! ou veja a suíte de testes .

Quão?

+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

* Como um link diádico, currentà esquerda e totalà direita, retorna uma lista com uma mistura de caracteres e números inteiros; Esta lista inclui os espaços. No Kentanto, o byte não pode ser simplesmente removido para aderir às especificações, pois o resultado terá o colchete currentcomo caracteres separados (como [...'[','5','2',']'...]), de modo que "converter cada item em string e uni-los em um único espaço" não produzirá o resultado desejado. )


2

Python 2 , 178 170 bytes

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]

Experimente online!

Segunda tentativa depois de ler as regras com mais cuidado.

-8 ao perder alguns suportes desnecessários.


2

Octave , 169 196 190 181 175 169 166 bytes

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

Experimente online!

Vou adicionar uma explicação mais tarde.

Hmm, parece que houve alguns problemas com o formato de saída. Agora eles foram resolvidos - todas as saídas estão corretas. Mas, infelizmente, custa 27 bytes. Conseguiu agarrar todos aqueles de volta, embora com um pouco de corte de gordura.


  • Economize 6 bytes usando em *vez de .*- obrigado @StewieGriffin
  • Salvar 9 bytes usando em sprintfvez de num2strcomo eu já tinha esse identificador s.
  • Economize 6 bytes puxando []a sprintchamada.
  • Economize 6 bytes, encontrando uma maneira de reduzir o número de comparações.
  • Economize 3 bytes removendo a necessidade strtrim()sem causar espaço à direita.

Há mais 1 espaço após o número 54 na sua saída.
Tsh 7/17

@tsh corrigido agora. Adicionei todos os casos de teste à saída do TIO.
Tom Carpenter

2

C # (.NET Core) , 195 192 bytes

Economizou 3 bytes graças 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;}

Experimente online!


1
Você pode salvar 2 bytes removendo os colchetes do loop for. E mais 1 usando uma entrada de curry c=>t=>. Tente aqui: 192 bytes
Kevin Cruijssen 7/11

2

C ++ - 247 bytes

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

Experimente online!


1
Observe que "Nenhum outro número de página deve ser gerado."
tsh

Ohh, desculpe, eu perdi essa regra. Eu vou corrigi-lo em breve.
precisa saber é o seguinte

Além disso, o link está quebrado.
Ian H.

@ Appleguy: veja isso - seu código a ser medido vai no campo "código" no TIO. Então você pode criar facilmente todo o seu post a partir daí.
Felix Palmen

2

Python 2 ,  128  124 bytes

-4 bytes graças 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)

Experimente online!

Saída como uma lista, mas o link tio inclui impressão bonita.


while ~0:é uma coisa estranha de se usar quando while 1:funciona bem.
Jonathan Allan

@JonathanAllan eu sei: P - Mas ainda funciona : D
Sr. Xcoder 7/17/17

-4 bytes mover a [[c]]fora (como este ) EDIT - o mesmo acontece com 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 Sim, obrigado, eu estava apenas brincando, porque achei que era redundante.
Mr. Xcoder

2

PHP, 157 150 bytes

tomar os detalhes literalmente acabou sendo a abordagem mais curta:

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

Corra com php -nr '<code>' <curpage> <numpages>ou experimente 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

Saídas como matriz. Experimente online

Substitua o final ppor S*output como string.

Explicação:

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 bytes

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]

Experimente online!

Edit: @ Ørjan Johansen salvou 16 bytes. Obrigado!


1
(1) Você pode soltar a unwords$saída da matriz é permitida. (2) s x=show x; ... s[a]é mais curto, após o qual pode ser mesclado com o próximo com :e map, e depois id=<<se torna mais longo do que apenas usar ++s. (3) max 4a-2e min(a+3)t-1são mais curtos. Experimente online!
Ørjan Johansen

1

Script de golfe - 104 caracteres

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


Sim obrigado. Eu estava no celular, era um pouco desconfortável colocar todo o código.
FedeWar 7/11

1

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

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

Experimente online


1
Bom uso de `` $ `` `e $'! Brinquei um pouco com isso, mas não consegui reduzi-lo muito, mas usando em <>vez do regex e usando -apara manter uma referência $_, pude passar para 111: Experimente online! ( -lAdicionado para facilitar a leitura)
Dom Hastings

Tudo bem, eu não pensei em @F
Nahuel Fouilleul 7/11

Eu estou gostando do uso de "@F"entradas singulares, é uma boa solução! A -lnão é necessário na contagem de bytes, porém, apenas para executar todos os testes de uma só vez :). Eu não disse, mas sua validação de reticências é muito boa!
Dom Hastings

um fato que eu acabo de visto dos meus primeiros posts poderia ser melhorado
Nahuel FOUILLEUL

1

Ruby , 127 bytes

Não estou particularmente feliz com isso, especialmente a lógica anterior / seguinte.

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

Experimente 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 (Navegador), 267 bytes

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

Experimente online!

Definitivamente não é tão pequeno quanto poderia ter sido, e como foi demonstrado acima, o uso do PHP na linha de comando pode ser muito menor. A entrada é feita através de solicitações GET, a é o número selecionado, b é o limite. Isso parecefoo.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
?>

Tenho certeza de que meus operadores ternários podem ser aprimorados, sinta-se à vontade para tentar.


Fazer minha resposta funcionar em um navegador custaria um ou dois bytes: [,$k,$n]=$argv; -> <?[$k,$n]=$_GET;se eu insistir em que a página atual seja o primeiro argumento e o número de páginas o segundo; <?extract($_GET);se eu quiser usar argumentos nomeados.
Titus

falha para a = b-3; substitua $a<$b-2por $a<$b-3para corrigir.
Titus

2
golfed: <?=($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 bytes)
Titus

1

Fórmula IBM / Lotus Notes, 217 211 bytes

-2 com graças a @KevinCruijssen

-4 usando variáveis ​​para os valores @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

Basicamente, uma porta do meu Python 2 responde apenas pela diversão de tentar lembrar como usar o Formula.

Não há TIO para a Formula, então aqui está uma captura de tela de alguns dos casos de teste:

insira a descrição da imagem aqui


1
Existe uma razão pela qual os espaços são necessários x>a-3 & x<a+3na Lotus Notes Formula? Está &xreservado para alguma coisa ou não há nenhuma razão em particular para que os espaços de ambos os lados sejam obrigatórios? Eu nunca programei nesse idioma, era apenas curioso. :)
Kevin Cruijssen

@KevinCruijssen - Para ser sincero, não sei. Nunca pensei em tentar sem. Muito usado para escrever código legível :-). Vou verificar amanhã quando chegar a uma máquina com o Notes instalado e avisá-lo.
ElPedro 7/11

1
@KevinCruijssen - você estava certo!
ElPedro 8/11

Hehe, que bom que eu pude ajudar. :) +1 de mim, e vejo que você jogou um pouco mais criando uma variável para @Text. Quando vi que foi usado duas vezes duas ontem, passou pela minha cabeça que talvez fosse possível.
9117 Kevin Murrijssen #

1

Excel VBA, 202 201 bytes

Função de janela imediata anônima do VBE que leva as entradas do intervalo A1:A2e as saídas para a janela imediata do 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","")]

Versão da sub-rotina

Incluído para facilitar a leitura

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 bytes

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)

Experimente online!

Uma concatenação gigantesca de cordas com muitos cifrões. Trabalhando ainda mais no golfe. Não, acho que isso é o mais curto possível.


0

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

-2 de remover uma ferramenta de depuração

-5 de perceber que estou usando o ES6 e às vezes consigo acabar com parênteses

-18 de remover algo de uma versão anterior que agora está obsoleta

-1 de fazer algumas coisas sorrateiras

-19 da remoção de variáveis ​​desnecessárias

-26 bytes para remover os valores muito complicados de remoção de falsey. Eu sou novo no ES6

-1 de usar comparações mais curtas

-11 de usar uma função recursiva

* -4 de substituir ?...:0por &&...e ... ${t}por...+t

Isso levou muito da minha vida e não deu votos suficientes. mas estou tão feliz que o código final seja uma potência de 2 (2 ^ 8) . Sei que há outra resposta JavaScript com cerca de 120 bytes. mas eu ainda amo esse código

EDIT: eu não sei o que estava pensando. 265 não é 2 ^ 8 ...

Ao fazer isso, eu consegui quebrar a versão não destruída. Deus, eu odeio código desagradável.

EDIT 2: agora está parecendo a melhor solução de 121 bytes

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

Explicação:

para vir, mas basicamente y é range(end, start)e faz algumas coisas legais como:

  1. mostrar prev se pagefor 1
  2. mostrar pontos esquerdos se page > 4
  3. mostre pontos certos se total - page < 4
  4. mostrar a seguir se total - page == 0

e coisas assim e apenas se junta a ele ''. Eu sei que você não precisa, mas eu gosto do fato de ser semi-convencional. Eu não sei. Desfrutar.

Experimente online!

Valide online!

Aqui está uma solução de 186 185 174 170 bytes que eu não gosto: Experimente online!


0

PowerShell , 141 bytes

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

Experimente online!

Menos golfe:

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]"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.