转到第N页


47

通常需要建立一个页面选择界面。通常看起来像这样:

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

这意味着总共有173页,您目前位于第5页。

这项挑战要求您将页面总数和当前页面数作为输入,并输出一个字符串(或数组)以“显示”页面选择器。

输入项

2个正整数

  • 当前页码
  • 页数

保证1 <=当前<=总计。

输出量

输出代表页面选择器的ui的字符串或数组。

  • 如果以字符串形式输出,则每页之间应使用一个空格(U + 0020)。
  • 如果以数组形式输出,则在将每个项目转换为字符串并以单个空格将它们连接起来之后,该数组应产生与字符串相同的结果。
    • 三个点(...)对于数组输出不是可选的。

细节

  • 如果current == 1,则不会输出“ prev”,否则,将首先输出“ prev”。
  • 如果current == total,则不输出“ next”,否则输出“ next”。
  • 应该始终输出首页(1)和末页(总计)。
  • 只要在[1..total]范围内,就应输出当前页面,(当前-1)页面,(当前-2)页面,(当前+ 1)页面,(当前+ 2)页面。
  • 不得输出其他页码。
  • 输出的页面应按升序排序。
  • 输出中不应包含重复的页码。
  • 当前页面应以一对括起来突出显示[]
  • 如果邻居之间有空隙,...则应插入三个点()。

测试用例

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

规则

  • 这是代码高尔夫球,最短的代码胜出!

7
可能值得添加4 , 6作为测试用例。与3, 6情况类似,但要确保点未添加到左侧。
汤姆·卡彭特

3
只是要在网络项目中使用其中的一些...
Stan Strum

2
基于@TomCarpenter的评论,4,7将非常感谢一个测试用例-确保可以同时满足排除椭圆的两个边界用例
Taylor Scott

1
@TaylorScott都添加了。
tsh

2
@StanStrum下一个挑战是编写一个无限滚动器。
卡尔,

Answers:


9

视网膜125个 113 109 107字节

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

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

在线尝试!链接包括测试用例。@MartinEnder节省了12个字节。说明:

.+
$*

转换为一元。

r`1\G
 1$'

以相反的顺序生成所有页码。

删除分隔输入的换行符。(无论如何,页码生成还有一个空格。)

O`1+

将页面按升序排序。这还将对当前页面进行排序,该页面现在已被复制。

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

取消重复,并将[]s 包装在当前页面周围。

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

如果当前页面至少为5,或者当前页面之后至少存在4,则添加省略号。(请注意尾随空格,以避免在省略号中包含最后一页。)

^1
prev 1

如果当前页面不是1,则添加prev。

1$
1 next

如果当前页面不是最后一页,请添加下一页。

1+
$.&

转换回十进制。


1
保存了一些字节:tio.run/…(其中之一需要将输入格式更改为换行符)。
马丁·恩德

@MartinEnder谢谢,我特别喜欢那尾随的椭圆高尔夫,尽管我认为我可以削掉另外的三个字节。
尼尔

9

的JavaScript(ES6),130个 122 121字节

使用currying语法调用,例如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(_=>_)

在线尝试!

-1字节(Arnauld):设置XX-x


一定喜欢那些lambdas
Stan Strum,2017年

您应该加+8 ...这.join不是您的计数!我很疯狂,试图弄清楚为什么您的代码无需联接就可以工作,而我的类似代码却不能。然后我说您只是没有将其包含在解决方案中,而是将其包含在代码段中!
nl-x

@ nl-x糟糕!我忘了更新片段。挑战允许您输出字符串或数组。我建议您将其输出为数组。
darrylyeo

7

6502机器代码(C64),160字节

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

在线演示 -用法: sys49152,[current],[total],例如sys49152,5,173

数字必须在[1..255]范围内,且当前<=总数。除非另有说明,否则这是8位处理器上的“自然”无符号整数范围。


作为注释的反汇编清单的说明:

         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

R214字节 168字节

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

在线尝试!

感谢@ user2390246提供了一些很棒的高尔夫技巧



186个字节,逻辑反转。真的感觉不像是一个独特的前提。
刑事

2
165个字节,进一步打高尔夫球。也不使用函数c(),该函数消除了与名为的对象的可怕混淆c
user2390246

2
最多备份171个字节,以纠正出现在多个注释版本中的错误!
user2390246

1
164个字节的另一个小改进。抱歉完全劫持了我,我有点忘了!
user2390246

5

APL(Dyalog)83 82字节

匿名中缀函数,以current作为左参数,total作为右参数。

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

在线尝试!

{} 显式lambda其中代表左右参数:

⍺<⍵ 当前小于总数吗?

' next'/⍨ 如果是这样(使用该文本进行复制)

(), 附加以下内容:

  ⍳⍵ɩ ntegers 1通过总

  'x'@(... ) 用替换x 那里的项目的位置...

   ~ 不

    的成员

   1 一

   , 其次是

    总数

   , 其次是

    ⍳5 前五个ɩ ntegers( [1,2,3,4,5]

    3- 从三([2,1,0,-1,-2])中减去

    ⍺+ 添加到当前([⍺+2,⍺+1,⍺,⍺-1,⍺-2]

    得到的是(用于分离'x'

   (当前位置) 应用以下默认功能:

     格式(字符串化)

    '][', 在文本前面 

    1⌽ 向左旋转一步(将移到]最后)

     封闭(以便它是一个标量,它将适合单个指示的位置)

   ε NLIST(扁平化-因为我们把它嵌套,当我们插入支架)

    格式(字符串化– 1个空格,数字彼此分隔,数字与行分隔x

  'x+'⎕R'...' PCRE R eplace x分三个周期运行

(), 附加以下内容:

  ⍺>1 电流大于1吗?

  'prev '/⍨ 如果是这样(使用该文本进行复制)


5

Wolfram语言(数学)131个 114 109字节

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

在线尝试!

这个怎么运作

很多替换。从所有页面的列表开始,依次替换:

  1. #->"["<>(t=ToString)@#<>"]":当前页面,带有方括号,
  2. 1->"prev 1":第1页,其中包含字符串prev 1
  3. #2->t@#2<>" next":最后一个包含字符串的页面(number) next,带有
  4. #-3|#+3:>"...":页面current-3current+3包含字符串的页面"..."
  5. x_/;Abs[x-#]>2:>Nothing:下方current-2或上方的所有其他(整数)页面,不current+2包含任何内容。(是的,Nothing是内置的。)

4

时髦218210字节

保存了一些字节,其中一些要感谢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)}

在线尝试!


我不了解Funky,但似乎i<=p+2可以打高尔夫球i<p+3t[2]="["+t[2]+"]"也许t[2]="["+p+"]"呢?
tsh

4

Python 2中136个 130字节

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]

在线尝试!

如果以数组形式输出,则在将每个项目转换为字符串并以单个空格将它们连接起来之后,该数组应产生与字符串相同的结果。

在线尝试!以美化的形式,您可以在其中看到页脚的字面意思是“将每个字符串转换为字符串,在空格处连接”。

这是Lynn方法的替代方法。


i or'...'和零保存一个字节(像这样
Jonathan Allan

3

Python 2,135个字节

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

在线尝试!

首先,我们创建一个类似的字符串prev 1 3 4 [5] 6 7 10 next,该字符串具有“间隙”,这是由于擦除一些数字而不是它们的定界空格而引起的。然后,我们...使用正则表达式替换任何2+个空格。


您可以翻转(-3<x-c<3or x%t<2)(x%t<2or-3<x-c<3)为-1,这两个参数的or运算符将返回一个布尔值。
暴民埃里克(Erik the Outgolfer)

3

爪哇8,201个 200 197字节

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

说明:

在这里尝试。

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字节

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

在线尝试!


好的答案,比我的还短!您可以在以下位置放置一个空格来打高尔夫球五个字节"["+c+"] ";172个字节
Kevin Cruijssen

哦,还有一个字节,请将最后一个p+=放在for循环声明中的for循环之前:171个字节
Kevin Cruijssen

3

果冻,59 个字节

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

完整程序*将结果打印到STDOUT。接受参数currenttotal该命令。

在线尝试!或查看测试套件

怎么样?

+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

*作为current左右total两边的二元链接,它返回一个包含字符和整数的列表;此列表包括空格。但是K不能简单地删除字节以遵守规范,因为结果将放在括号中并current作为单独的字符(如[...'[','5','2',']'...]),因此“将每个项目转换为字符串并以单个空格将它们连接”将无法产生所需的结果)


2

Python 2中178个 170字节

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]

在线尝试!

仔细阅读规则后的第二次尝试。

-8失去一些不必要的括号。


2

八度169196190181175169166字节

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

在线尝试!

稍后再添加解释。

嗯,似乎输出格式有些问题。现在,这些问题已解决-所有输出都是正确的。但是可惜它花费了27个字节。设法使所有这些人都回来了,尽管做了一些脂肪修剪。


  • 使用*而不是节省6个字节.*-谢谢@StewieGriffin
  • 使用节省9个字节,sprintf而不是使用中num2str已有的那个s
  • []sprint通话可节省6个字节。
  • 通过寻找减少比较次数的方法来节省6个字节。
  • strtrim()无需占用空间即可节省3个字节。

输出中数字54后面还有1个空格。
tsh

@tsh现在修复。我已经将所有测试用例添加到TIO输出中。
汤姆·卡彭特


2

C ++-247字节

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

在线尝试!


1
请注意,“不应输出其他页码。”
tsh

哦,对不起,我错过了那条规则。我会尽快纠正。
BalazsToth

此外,链接已断开。
伊恩H.17年

@Appleguy:看看这个 -要测量你的代码放在“代码”字段上TIO。然后,您可以从那里轻松创建整个帖子。
菲利克斯·帕尔姆

2

Python 2中 128个  124字节

-4个字节感谢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)

在线尝试!

输出为列表,但tio链接包含漂亮的打印内容。


while ~0:while 1:工作正常时使用是一件奇怪的事情。
乔纳森·艾伦

@JonathanAllan我知道:P-但它仍然有效:D
Xcoder先生17年

-4字节移动[[c]]出来(如)编辑-也是如此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
乔纳森阿伦

@JonathanAllan是的,我只是在玩它,因为我觉得那是多余的。
Xcoder先生17年

2

PHP,157150字节

从字面上看细节是最短的方法:

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

运行php -nr '<code>' <curpage> <numpages>在线尝试


2

果酱(CJam),74岁

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

输出为数组。在线尝试

更换最终pS*作为字符串输出。

说明:

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

哈斯克尔,145个 129字节

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]

在线尝试!

编辑:@ØrjanJohansen保存了16个字节。谢谢!


1
(1)您可以删除unwords$允许数组输出。(2)s x=show x; ... s[a]短,在这之后可以与下一个的与被合并:map,然后id=<<变得高于刚刚使用较长++秒。(3)max 4a-2min(a+3)t-1较短。在线尝试!
与Orjan约翰森

1

高尔夫脚本 -104个字符

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

不打高尔夫球

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

1

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

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

在线尝试


1
很好地使用``$`''和$'!对此做了一点尝试,但是并不能降低太多,但是通过使用<>regex代替并-a保持对的引用$_,我得以降至111:在线尝试!-l为提高可读性而添加)
Dom Hastings

好吧,我没想到@F
Nahuel Fouilleul

我一直很喜欢将"@F"用作单数输入,这是一个不错的解决方法!在-l不需要的字节数虽然只在一次:)运行所有测试。我没有说,但是您的省略号验证非常好!
Dom Hastings

的确,我刚刚看到我的第一篇文章可能有所改善
Nahuel Fouilleul

1

红宝石,127字节

我对此并不特别满意,尤其是上一个/下一个逻辑。

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

在线尝试!

不打高尔夫球

->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(浏览器),267字节

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

在线尝试!

绝对不像以前那样小,并且如上所述,在命令行中使用PHP可能要小得多。输入是通过GET请求进行的,a是选定的数字,b是限制。看起来像foo.bar.com/index.php?a=2&b=12

不打高尔夫球

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

我很确定我的三元运算符可以得到改进,请随时尝试。


在浏览器中运行我的答案将花费一个或两个字节:[,$k,$n]=$argv; -> <?[$k,$n]=$_GET;如果我坚持将当前页面作为第一个参数,将页面数作为第二个参数;<?extract($_GET);如果我想使用命名参数。
泰特斯

对于a = b-3失败;更换$a<$b-2$a<$b-3修复。
泰特斯(Titus),

2
打高尔夫球:<?=($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字节)
泰特斯

1

IBM /莲花笔记公式,217211字节

-2感谢@KevinCruijssen

-4通过将变量用于@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

基本上,我的Python 2答案只是为了尝试记住如何使用公式的乐趣。

没有Formula的TIO,因此以下是一些测试用例的屏幕截图:

在此处输入图片说明


1
x>a-3 & x<a+3在Lotus Notes公式中为什么需要空格是有原因的?被&x保留用于某物,还是没有特别理由为什么两边的空间都是强制性的?我从来没有用这种语言编程过,只是很好奇。:)
Kevin Cruijssen

@KevinCruijssen-老实说,我不知道。从来没有想过要尝试它。太过习惯于编写可读的代码了:-)。我明天将在安装了Notes的计算机上检查并通知您。
ElPedro

1
@KevinCruijssen-你是对的!
ElPedro

呵呵,很高兴我能帮上忙。:)从我那里+1,我看到您通过为@Text创建一个变量来打高尔夫。昨天我看到它被两次使用两次时,我想到了可能。
凯文·克鲁伊森

1

Excel VBA中,202个 201字节

匿名VBE立即窗口功能,该功能从范围获取输入A1:A2并输出到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","")]

子程序版本

包含以备阅读

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字节

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)

在线尝试!

一个巨大的字符串连接方式太多美元符号。进一步打高尔夫球。不,我认为这是这种方法所能做到的。


0

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

-2删除调试工具

-5意识到我正在使用ES6并且有时可以取消括号

-18从现在已过时的早期版本中删除某些内容

-1从偷偷摸摸的东西

-19从删除不必要的变量

从-26个字节中删除所有太复杂的值,以删除falsey值。我是ES6的新手

-1来自使用较短的比较

-11从使用递归函数

*从更换-4 ?...:0&&...,并... ${t}...+t

这浪费了我一生的时间,并且没有给予足够的支持。但是我很高兴最终的代码是2(2 ^ 8)的幂,我确实知道还有另一个大约120字节的JavaScript答案。但我仍然喜欢这段代码

编辑:我不知道我在想什么。265不是2 ^ 8 ...

进行此操作时,我设法打破了非高尔夫版本。天哪,我讨厌取消高尔夫规则。

编辑2:现在看起来更好的121字节解决方案

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

说明:

即将到来,但基本上y是range(end, start),它做了一些很酷的事情,例如:

  1. 显示是否page为1
  2. 显示左点 page > 4
  3. 如果显示正确的点 total - page < 4
  4. 显示下一个 total - page == 0

以及类似的东西,并通过''将其加入。我知道您不必这样做,但我喜欢半常规的事实。我不知道。请享用。

在线尝试!

在线验证!

这里有一个186 185 174,我不喜欢170字节的解决方案:在线试试吧!


0

PowerShell,141字节

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

在线尝试!

少打高尔夫球:

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]"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.