Nページに移動


47

一般に、ページ選択インターフェースを作成する必要があります。通常、次のようになります。

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

つまり、合計で173ページあり、現在5ページ目です。

このチャレンジでは、ページの総数と現在のページ番号を入力として受け取り、ページセレクターを「表示」するための文字列(または配列)を出力する必要があります。

入力

2つの正の整数

  • 現在のページ番号
  • ページ数

1 <= current <= totalであることが保証されています。

出力

ページセレクターのUIを表す文字列または配列を出力します。

  • 文字列として出力する場合は、各ページの間に単一のスペース(U + 0020)を使用する必要があります。
  • 配列として出力する場合、配列は各項目を文字列に変換し、それらを単一のスペースで結合した後、文字列と同じ結果を生成する必要があります。
    • 3つのドット(...)は配列出力ではオプションではありません。

詳細

  • current == 1の場合、「prev」は出力されません。それ以外の場合、「prev」が最初に表示されます。
  • current == totalの場合、「next」は出力されません。それ以外の場合、「next」は最後になります。
  • 最初のページ(1)と最後のページ(合計)は常に出力されます。
  • [1..total]の範囲内にある限り、現在のページ、(現在-1)ページ、(現在-2)ページ、(現在+ 1)ページ、(現在+ 2)ページが出力されます。
  • 他のページ番号は出力されません。
  • 出力されたページは昇順でソートする必要があります。
  • 出力に重複するページ番号を含めることはできません。
  • 現在のページは、のペアでラップして強調表示する必要があり[]ます。
  • 隣同士の間に隙間がある場合は、3つのドット(...)を挿入する必要があります。

テストケース

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
ちょうどつもりYOINK Webプロジェクトのためにこれらのいくつか...
スタン・ストラム

2
@TomCarpenterのコメントに構築4,7テストケースが非常に高く評価されるであろうと、 -楕円を除外境界事例の両方を同時に満たすことができることを保証するであろう
テイラー・スコット

1
@TaylorScott両方が追加されました。
tsh

2
@StanStrum次の課題は、無限のスクローラーを書くことです。
カール

回答:


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]

[]現在のページを重複させずにラップします。

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

現在のページが5ページ以上ある場合、または現在のページの後に4ページ以上ある場合は、省略記号を追加します。(最後のページが省略記号に含まれないように、末尾のスペースに注意してください。)

^1
prev 1

現在のページが1でない場合はprevを追加します。

1$
1 next

現在のページが最後のページでない場合は、次を追加します。

1+
$.&

10進数に戻します。


1
数バイトを保存しました:tio.run/…(入力フォーマットを改行区切りに変更する必要がありました)。
マーティンエンダー

@MartinEnderありがとう、特に末尾の省略ゴルフが気に入っていますが、別の<s> 3 </ s> 4バイトを削ることができると思います。
ニール

9

JavaScriptの(ES6)、130の 122 121バイト

カリー化構文で呼び出します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ます。


お奨めは、これらのラムダ大好き
スタン・ストラム

+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バイトとロジックの反転。明確な前提のようには感じません。
CriminallyVulgar

2
さらにゴルフで165バイト。またc()、呼ばれるオブジェクトとの恐ろしい混乱を取り除く関数を使用しませんc
user2390246

2
コメント付きバージョンのいくつかに表示されるエラーを修正して、最大171バイトをバックアップしてください!
-user2390246

1
164バイトの別の小さな改善。これを完全にハイジャックしてすみません、少し夢中になりました!
user2390246

5

APL(Dyalog)83 82バイト

現在の引数を左引数、合計を右引数とする匿名中置関数。

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

オンラインでお試しください!

{} 明示的なラムダ。ここでおよびは左右の引数を表します。

⍺<⍵ 現在の合計は小さいですか?

' next'/⍨ その場合(点灯。複製に使用)、テキスト

(), 次を追加します。

  ⍳⍵ɩ整数1から合計

  'x'@(... ) と交換x アイテムがある位置...

   ~ じゃない

    のメンバー

   1 1

   , に続く

    合計

   , に続く

    ⍳5 最初の5つのɩ整数([1,2,3,4,5]

    3- 3から減算([2,1,0,-1,-2]

    ⍺+ 現在に追加([⍺+2,⍺+1,⍺,⍺-1,⍺-2]

    それをもたらす(から分離するのに役立つ'x'

   (… 現在の位置)  次の暗黙関数適用します。

     フォーマット(文字列化)

    '][', テキストを追加する ` 

    1⌽ 左に1ステップ回転します(]最後まで移動します)

     囲む(指定された単一の位置に収まるスカラーになるように)

   ε NLIST(平らに-私たちはブラケットを挿入したとき、それは入れ子になったため)

    format(stringify –数値を互いに、およびx実行から分離する1つのスペース)

  'x+'⎕R'...' PCRE R eplace xは3つの期間で実行されます

(), 次を追加します。

  ⍺>1 電流は1より大きいですか?

  'prev '/⍨ その場合(点灯。複製に使用)、テキスト


5

Wolfram言語(Mathematica)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

ファンキー218 210バイト

いくつかのバイトを保存しました。そのうちのいくつかは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)}

オンラインでお試しください!


私はファンキーを知りませんが、i<=p+2ゴルフをすることができるようですi<p+3、そしてそうt[2]="["+t[2]+"]"かもしれませんt[2]="["+p+"]"
tsh

4

パイソン2136の 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'...'ゼロでバイトを保存します(このように)
ジョナサンアラン

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オペレータがブール値を返します。
エリックアウトゴルファー

3

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

オンラインでお試しください!


いい答え、私のものよりも短い!することができます後、すでにスペースを置くことによってゴルフ5バイト"["+c+"] ";172バイト
ケビンCruijssen

ああ、さらにもう1バイトp+=for-loop宣言内のfor-loopの前に最後を置くことにより:171バイト
ケビン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左右の2 項リンクとして、totalこれは文字と整数が混在したリストを返します。このリストにはスペースが含まれます。Kただし、結果を指定するためにバイトを単純に削除することはできません。その場合、結果にはcurrent個別の文字として括弧が付けられる[...'[','5','2',']'...]ため(「など」)、「各項目を文字列に変換し、単一のスペースで結合」すると、目的の結果が得られません)


2

Pythonの2178の 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]

オンラインでお試しください!

ルールをより注意深く読んだ後の2回目の試行。

-8不要なブラケットを失うことにより。


2

オクターブ169196190181175175169166バイト

@(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
  • ハンドルを既に持っていたのではsprintfなく、num2strを使用して9バイトを保存しますs
  • 引っ張って6つのバイトを保存[]sprintのコール。
  • 比較の回数を減らす方法を見つけることにより、6バイトを節約します。
  • strtrim()末尾のスペースを発生させずに必要性をなくすことにより、3バイトを節約します。

出力の54番の後にさらに1つのスペースがあります。
tsh

@tshは修正されました。すべてのテストケースをTIO出力に追加しました。
トムカーペンター

2

C#(.NET Core)195 192バイト

Kevin Cruijssenのおかげで3バイト節約されました。

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

オンラインでお試しください!


1
forループの括弧を削除することにより、2バイトを節約できます。そして、カリー入力を使用してさらに1つc=>t=>ここで試してください:192バイト
ケビンクルーッセン

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.

@Appleguy:見て、この -あなたのコードを測定するためには、TIOの「コード」フィールドに行きます。その後、そこから投稿全体を簡単に作成できます。
フェリックスパルメン

2

パイソン2 128の  124バイト

ジョナサンアランのおかげで-4バイト!

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リンクにはpretty-printが含まれます。


while ~0:while 1:うまく動作するときに使用する奇妙なものです。
ジョナサンアラン

@JonathanAllan私が知っている:P-しかし、それはまだ動作します:D
Mr. Xcoder

-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

2

PHP、157 150バイト

文字通り詳細を取得することが最短のアプローチであることが判明しました。

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

Haskell、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短くなっています。オンラインでお試しください!
Ørjanヨハンセン

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
`` $ `` `と$'!これを少し試してみましたが、それをあまり落とすことはできませんでしたが<>、正規表現の代わりにを使用-aしてを参照することで$_、111にドロップできました:オンラインで試してみてください!-l読みやすさのために追加)
ドムヘイスティングス

いいでしょう、@ Fには思いもしませんでした
ナウエル・フイユル

私は"@F"特異な入力の使用を楽しんでいます、それは素晴らしい回避策です!-lしかし、唯一:)一度にすべてのテストを実行するためのバイト数では必要ありません。私は言いませんでしたが、あなたの省略記号の検証はとてもいいです!
ドムヘイスティングス

確かに私はちょうど私の最初のポストの一つが改善される可能性を見てきました
ナウエルFouilleul

1

ルビー、127バイト

これ、特にprev / nextロジックには特に満足していません。

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

私は三項演算子を改善できると確信しています。お気軽に試してください。


ブラウザで私の答えの仕事を作ることは1または2バイトの費用がかかります:[,$k,$n]=$argv; - > <?[$k,$n]=$_GET;私は最初の引数とページ秒の数である現在のページを主張する場合には、<?extract($_GET);名前付き引数を使用する場合。
タイタス

a = b-3では失敗します。置き換え$a<$b-2$a<$b-3修正します。
タイタス

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 / Lotus Notesフォーミュラ、217 211バイト

-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

基本的には、Formulaの使用方法を思い出そうとするためだけに、Python 2の回答の移植版です。

FormulaにはTIOがないので、テストケースのスクリーンショットを次に示します。

ここに画像の説明を入力してください


1
x>a-3 & x<a+3Lotus Notes Formula でスペースが必要な理由はありますか?される&x何かのために予約、または両側にスペースが必須でない理由は特にありませんか?ちなみに、この言語でプログラミングしたことはありませんでしたが、ただ興味がありました。:)
ケビンクルーイッセン

@KevinCruijssen-正直なところ、私は知りません。なしでそれをしようと考えたことはありません。読みやすいコードを書くのにも慣れています:-)。明日、Notesがインストールされているマシンにアクセスしてお知らせします。
エルペドロ

1
@KevinCruijssen-あなたは正しかった!
エルペドロ

へへ、助けてくれて嬉しい。:)私からの+1で、@ Textの変数を作成することでもう少しゴルフをしているようです。昨日2回2回使用されていたのを見たとき、それは可能性があると思いました。
ケビンCruijssen

1

Excel VBA、202 201バイト

範囲から入力を受け取りA1:A2、VBEイミディエイトウィンドウに出力する匿名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

ジャバスクリプト(ES6)、265 263 258 240 239 220 194 193 182 178バイト

-2デバッグツールの削除から

-5 ES6を使用していて、ときどきカッコを廃止できることに気づいたとき

-18廃止された以前のバージョンから何かを削除することから

-1卑劣なことをすることから

-19不要な変数の削除

-26バイトを削除すると、非常に複雑になり、偽の値が削除されます。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. page1の場合、前を表示
  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]"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.