Pergi ke Halaman ke-N


47

Biasanya perlu membuat antarmuka pemilihan halaman. Biasanya terlihat seperti ini:

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

Yang berarti ada total 173 halaman, dan Anda berada di halaman ke-5 saat ini.

Tantangan ini mengharuskan Anda mengambil jumlah total halaman dan nomor halaman saat ini sebagai input, dan menghasilkan string (atau array) untuk "menampilkan" pemilih halaman.

Memasukkan

2 bilangan bulat positif

  • nomor halaman saat ini
  • hitungan halaman

Dijamin bahwa 1 <= saat ini <= total.

Keluaran

Keluarkan string atau array yang mewakili ui untuk pemilih halaman.

  • Jika output sebagai string, spasi tunggal (U + 0020) harus digunakan di antara setiap halaman.
  • Jika output sebagai array, array harus menghasilkan hasil yang sama seperti string setelah mengkonversi setiap item menjadi string dan bergabung dengan mereka dengan satu spasi.
    • Tiga titik ( ...) bukan opsional untuk output array.

Detail

  • Jika saat ini == 1, tidak ada "prev" yang akan ditampilkan, jika tidak, "prev" yang lebih dulu.
  • Jika current == total, "next" tidak akan dihasilkan, jika tidak, "next" adalah yang terakhir.
  • Halaman pertama (1) dan halaman terakhir (total) harus selalu ditampilkan.
  • Halaman saat ini, halaman (saat ini - 1), halaman (saat ini - 2), halaman (saat ini + 1), halaman (saat ini + 2) harus ditampilkan selama berada dalam kisaran [1..total].
  • Tidak ada nomor halaman lain yang harus dikeluarkan.
  • Halaman yang dikeluarkan harus diurutkan dalam urutan menaik.
  • Keluaran tidak boleh berisi nomor halaman duplikat.
  • Halaman saat ini harus disorot dengan membungkusnya menjadi sepasang [].
  • Jika ada celah di antara tetangga, tiga titik ( ...) harus dimasukkan.

Uji Kasus

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

Aturan

  • Ini kode-golf, kode terpendek menang!

7
Mungkin layak ditambahkan 4 , 6sebagai test case. Mirip dengan 3, 6kasing, tetapi pastikan titik tidak ditambahkan ke sisi kiri.
Tom Carpenter

3
Hanya akan MENDAPATKAN beberapa di antaranya untuk proyek web ...
Stan Strum

2
Berdasarkan komentar @TomCarpenter, 4,7test case akan sangat dihargai - akan memastikan bahwa kedua case batas yang mengecualikan elips dapat secara bersamaan bertemu
Taylor Scott

1
@TaylorScott Keduanya menambahkan.
tsh

2
@StanStrum Tantangan berikutnya adalah menulis scroller yang tak terbatas.
Carl

Jawaban:


9

Retina , 125 113 109 107 byte

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

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

Cobalah online! Tautan termasuk kasus uji. Disimpan 12 byte berkat @MartinEnder. Penjelasan:

.+
$*

Konversikan ke unary.

r`1\G
 1$'

Hasilkan semua nomor halaman dalam urutan terbalik.

Hapus baris baru yang memisahkan input. (Lagi pula, ada ruang dari pembuatan nomor halaman.)

O`1+

Urutkan halaman kembali ke urutan menaik. Ini juga mengurutkan halaman saat ini, yang sekarang digandakan.

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

Tidak menggandakan dan membungkus []sekitar halaman saat ini.

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

Tambahkan elipsis jika halaman saat ini setidaknya 5, atau jika ada setidaknya 4 halaman setelah halaman saat ini. (Perhatikan spasi tambahan, untuk menghindari menyertakan halaman terakhir di elipsis.)

^1
prev 1

Tambahkan prev jika halaman saat ini bukan 1.

1$
1 next

Tambahkan berikutnya jika halaman saat ini bukan halaman terakhir.

1+
$.&

Konversi kembali ke desimal.


1
Menyimpan beberapa byte: tio.run/… (salah satunya diperlukan mengubah format input ke pemisahan linefeed).
Martin Ender

@ MartinEnder Terima kasih, saya sangat suka golf elipsis yang tertinggal itu, meskipun saya pikir saya dapat mencukur <s> tiga </s> empat byte lainnya.
Neil

9

JavaScript (ES6), 130 122 121 byte

Aktifkan dengan sintaks currying, mis 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(_=>_)

Cobalah online!

-1 byte (Arnauld): Diatur Xke X-x.


Harus menyukai lambda itu
Stan Strum

Anda harus menambahkan +8 ... Ini .joinbukan bagian dari hitungan Anda! Saya jadi gila mencoba mencari tahu mengapa kode Anda akan bekerja tanpa bergabung, sedangkan kode yang sama tidak. Maka saya katakan Anda tidak memasukkannya ke dalam solusi Anda, tetapi memasukkannya ke dalam cuplikan Anda!
nl-x

@ nl-x Whoops! Saya lupa memperbarui cuplikan saya. Tantangannya memungkinkan Anda untuk mengeluarkan string atau array; Saya akan merekomendasikan Anda output sebagai array.
darrylyeo

7

6502 kode mesin (C64), 160 byte

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

Demo online - Penggunaan:, sys49152,[current],[total] missys49152,5,173.

Angka-angka harus dalam kisaran [1..255] dengan arus <= total. Karena ini tidak ditentukan sebaliknya, ini adalah rentang integer unsigned "alami" pada prosesor 8bit.


Penjelasan sebagai komentar daftar pembongkaran:

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

6

R , 214 byte, 168 byte

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

Cobalah online!

Terima kasih kepada @ user2390246 untuk beberapa kiat bermain golf yang hebat



186 byte dengan pembalikan logika. Tidak terasa seperti premis yang berbeda.
CriminallyVulgar

2
165 byte dengan golf lebih lanjut. Juga tidak menggunakan fungsi c(), yang menghilangkan kebingungan mengerikan dengan objek yang dipanggil c.
user2390246

2
Cadangkan hingga 171 byte memperbaiki kesalahan yang muncul di beberapa versi berkomentar!
user2390246

1
Peningkatan kecil lainnya untuk 164 byte . Maaf karena benar-benar membajak ini, saya agak terbawa suasana!
user2390246

5

APL (Dyalog) , 83 82 byte

Fungsi infix anonim mengambil argumen saat ini sebagai kiri dan total sebagai argumen benar.

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

Cobalah online!

{... } lambda eksplisit di mana dan mewakili argumen kiri dan kanan:

⍺<⍵ apakah saat ini lebih kecil dari total?

' next'/⍨ Jika demikian (lit. gunakan itu untuk mereplikasi) teks

(... ), tambahkan yang berikut:

  ⍳⍵egmemulai 1 hingga total

  'x'@(... ) ganti dengan x pada posisi di mana item berada ...

   ~ tidak

    anggota dari

   1 satu

   , diikuti oleh

    jumlah seluruhnya

   , diikuti oleh

    ⍳5 lima ɩ ntegers pertama ( [1,2,3,4,5])

    3- dikurangi dari tiga ( [2,1,0,-1,-2])

    ⍺+ ditambahkan ke saat ini ( [⍺+2,⍺+1,⍺,⍺-1,⍺-2])

    hasil yang (berfungsi untuk memisahkan dari 'x')

   (... ) terapkan fungsi diam-diam berikut pada posisi saat ini:

     format (stringify)

    '][', tambahkan teks` 

    1⌽ putar satu langkah ke kiri (pindahkan ]ke ujung)

     melampirkan (sehingga skalar yang sesuai dengan posisi yang ditunjukkan)

   ϵ nlist (ratakan - karena kami membuatnya bersarang ketika kami memasukkan tanda kurung)

    format (stringify - 1 spasi yang memisahkan angka dari satu sama lain dan dari proses x)

  'x+'⎕R'...' PCRE R eplace xberjalan dengan tiga periode

(... ), tambahkan yang berikut:

  ⍺>1 apakah saat ini lebih besar dari 1?

  'prev '/⍨ Jika demikian (lit. gunakan itu untuk mereplikasi) teks


5

Bahasa Wolfram (Mathematica) , 131 114 109 byte

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

Cobalah online!

Bagaimana itu bekerja

Banyak penggantian. Dimulai dengan daftar semua halaman, ganti, secara berurutan:

  1. #->"["<>(t=ToString)@#<>"]": halaman saat ini dengan string yang diberi tanda kurung,
  2. 1->"prev 1": halaman 1 dengan string prev 1,
  3. #2->t@#2<>" next": halaman terakhir dengan string (number) next, dengan
  4. #-3|#+3:>"...": halaman current-3dan halaman current+3dengan string "...",
  5. x_/;Abs[x-#]>2:>Nothing: semua halaman (integer) lain di bawah current-2atau di atas current+2tanpa apa-apa. (Ya, Nothingadalah built-in.)

4

Funky , 218 210 byte

Menyimpan beberapa byte, beberapa di antaranya berkat 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)}

Cobalah online!


Saya tidak tahu Funky, tapi sepertinya i<=p+2bisa main golf i<p+3, dan t[2]="["+t[2]+"]"mungkin t[2]="["+p+"]"?
tsh

4

Python 2 , 136 130 byte

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

Cobalah online!

Jika output sebagai array, array harus menghasilkan hasil yang sama seperti string setelah mengkonversi setiap item menjadi string dan bergabung dengan mereka dengan satu spasi.

Cobalah online! dalam bentuk prettified, di mana Anda dapat melihat footer menerjemahkan secara harfiah untuk "mengkonversi masing-masing menjadi string, bergabung di spasi".

Ini merupakan alternatif dari pendekatan Lynn.


Simpan satu byte dengan i or'...'dan nol (seperti ini )
Jonathan Allan

3

Python 2 , 135 byte

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

Cobalah online!

Pertama-tama kita membuat string seperti prev 1 3 4 [5] 6 7 10 next, yang memiliki "celah" yang disebabkan oleh menghapus beberapa angka tetapi bukan ruang pembatasnya. Lalu kami mengganti setiap menjalankan 2+ spasi dengan ...menggunakan regex.


Anda dapat beralih (-3<x-c<3or x%t<2)ke (x%t<2or-3<x-c<3)-1, kedua argumen kepada oroperator akan mengembalikan nilai boolean.
Erik the Outgolfer

3

Java 8, 201 200 197 byte

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

Penjelasan:

Coba di sini.

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

3

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

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

Cobalah online!


Jawaban yang bagus, lebih pendek dari saya! Anda dapat bermain golf lima byte dengan menempatkan spasi setelah "["+c+"] ";: 172 byte
Kevin Cruijssen

Oh, dan satu byte lagi dengan meletakkan yang terakhir p+=sebelum for-loop di dalam deklarasi for-loop: 171 byte
Kevin Cruijssen

3

Jelly , 59 byte

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

Program lengkap * mencetak hasilnya ke STDOUT. Membawa argumen currentdan totaldalam urutan itu.

Cobalah online! atau lihat test-suite .

Bagaimana?

+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

* Sebagai tautan diadik yang mengambil currentdi kiri dan totaldi kanan ini mengembalikan daftar dengan campuran karakter dan bilangan bulat; daftar ini termasuk spasi. Byte Ktidak dapat dengan mudah dihapus untuk mematuhi spesifikasi, karena hasilnya kemudian akan diberi tanda kurung currentsebagai karakter yang terpisah (seperti [...'[','5','2',']'...]) sehingga "mengkonversi setiap item menjadi string dan bergabung dengan mereka dengan satu spasi" akan gagal menghasilkan hasil yang diinginkan )


2

Python 2 , 178 170 byte

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

Cobalah online!

Upaya kedua setelah membaca aturan lebih hati-hati.

-8 dengan kehilangan beberapa tanda kurung yang tidak dibutuhkan.


2

Oktaf , 169 196 190 181 175 169 166 byte

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

Cobalah online!

Saya akan menambahkan penjelasan nanti.

Hmm, sepertinya ada beberapa masalah dengan format output. Ini sekarang telah diselesaikan - semua output sudah benar. Namun sayang harganya 27 byte. Berhasil mencakar semua kembali meskipun dengan sedikit pemangkasan lemak.


  • Hemat 6 byte dengan menggunakan *bukan .*- terima kasih @StewieGriffin
  • Simpan 9 byte menggunakan sprintfbukan num2strkarena saya sudah memiliki pegangan itu s.
  • Hemat 6 byte dengan menarik []ke dalam sprintpanggilan.
  • Hemat 6 byte dengan mencari cara untuk mengurangi jumlah perbandingan.
  • Hemat 3 byte dengan menghapus kebutuhan strtrim()tanpa menyebabkan spasi tambahan.

Ada 1 lebih banyak ruang setelah angka 54 di output Anda.
tsh

@tsh diperbaiki sekarang. Saya telah menambahkan semua test case ke output TIO.
Tom Carpenter

2

C # (.NET Core) , 195 192 byte

Disimpan 3 byte berkat 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;}

Cobalah online!


1
Anda dapat menyimpan 2 byte dengan menghapus tanda kurung for-loop. Dan 1 lagi dengan menggunakan input kari c=>t=>. Cobalah di sini: 192 byte
Kevin Cruijssen

2

C ++ - 247 byte

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

Cobalah online!


1
Perhatikan bahwa "Tidak ada nomor halaman lain yang boleh dikeluarkan."
tsh

Ohh maaf saya melewatkan aturan itu. Saya akan memperbaikinya segera.
BalazsToth

Juga, tautannya rusak.
Ian H.

@ Appleguy: lihat ini - kode Anda untuk diukur berada di bidang "kode" di TIO. Maka Anda dapat dengan mudah membuat seluruh posting Anda dari sana.
Felix Palmen

2

Python 2 ,  128  124 byte

-4 byte terima kasih kepada 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)

Cobalah online!

Keluaran sebagai daftar, tetapi tautan tio menyertakan cetak cantik.


while ~0:adalah hal yang aneh untuk digunakan ketika while 1:berfungsi dengan baik.
Jonathan Allan

@ Jonathan Allan Saya tahu: P - Tapi masih berfungsi : D
Tn. Xcoder

-4 byte memindahkan [[c]]keluar (seperti ini ) EDIT - begitu juga 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

@ Jonathan Allan Ya terima kasih, saya hanya bermain-main dengannya karena saya merasa itu berlebihan.
Tn. Xcoder

2

PHP, 157 150 byte

mengambil rincian secara harfiah ternyata menjadi pendekatan terpendek:

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

Jalankan dengan php -nr '<code>' <curpage> <numpages>atau coba online .


2

CJam, 74

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

Output sebagai array. Cobalah online

Ganti final pdengan S*output sebagai string.

Penjelasan:

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

2

Haskell, 145 129 byte

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

Cobalah online!

Sunting: @ Ørjan Johansen menyimpan 16 byte. Terima kasih!


1
(1) Anda dapat menjatuhkan unwords$, output array diizinkan. (2) s x=show x; ... s[a]lebih pendek, setelah itu dapat digabung dengan yang berikutnya dengan :dan map, dan kemudian id=<<menjadi lebih lama dari hanya menggunakan ++s. (3) max 4a-2dan min(a+3)t-1lebih pendek. Cobalah online!
Ørjan Johansen

1

Script Golf - 104 karakter

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

Tidak disatukan

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


Ya terima kasih. Saya menggunakan ponsel, sedikit tidak nyaman untuk menjejalkan semua kode.
FedeWar

1

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

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

Cobalah online


1
Penggunaan `` $ `` `dan $'! Sudah sedikit bermain dengan ini, tetapi tidak bisa turun banyak, tetapi dengan menggunakan <>alih-alih regex dan menggunakan -auntuk menyimpan referensi $_, saya bisa turun ke 111: Cobalah online! ( -lditambahkan untuk dibaca)
Dom Hastings

Baik, saya tidak berpikir untuk @F
Nahuel Fouilleul

Saya telah menikmati penggunaan "@F"input tunggal, ini solusi yang bagus! Tidak -ldiperlukan dalam hitungan byte, hanya untuk menjalankan semua tes sekaligus :). Saya tidak mengatakannya, tetapi validasi elipsis Anda sangat bagus!
Dom Hastings

memang saya baru saja melihat salah satu posting pertama saya dapat ditingkatkan
Nahuel Fouilleul

1

Ruby , 127 byte

Saya tidak terlalu senang dengan ini, terutama logika 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]')}

Cobalah online!

Tidak disatukan

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

1

PHP (Browser), 267 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?>

Cobalah online!

Jelas tidak sekecil yang seharusnya, dan seperti yang ditunjukkan di atas, menggunakan PHP di command line bisa jauh lebih kecil. Inputnya adalah melalui permintaan GET, a adalah nomor yang dipilih, b adalah batasnya. Ini sepertifoo.bar.com/index.php?a=2&b=12

Tidak disatukan

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

Saya cukup yakin operator ternary saya dapat ditingkatkan, jangan ragu untuk mencoba.


Menjadikan jawaban saya berfungsi di browser akan dikenakan biaya satu atau dua byte: [,$k,$n]=$argv; -> <?[$k,$n]=$_GET;jika saya bersikeras halaman saat ini menjadi argumen pertama dan jumlah halaman yang kedua; <?extract($_GET);jika saya ingin menggunakan argumen bernama.
Titus

gagal untuk a = b-3; ganti $a<$b-2dengan $a<$b-3untuk memperbaiki.
Titus

2
golf: <?=($a=$_GET['a'])>1?'prev 1 ':'[1] ',$a>4?'... ':'';for($i=$a>4?$a-3:1;$i<$a+3&++$i<$b=$_GET['b'];)echo$a-$i?"$i ":"[$i] ";echo$a<$b-3?"... ":"",$a<$b?"$b next":"[$b]";(169 bytes)
Titus

1

IBM / Lotus Notes Formula, 217 211 Bytes

-2 dengan terima kasih kepada @KevinCruijssen

-4 dengan menggunakan variabel untuk nilai-nilai @Teks

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

Pada dasarnya port jawaban Python 2 saya hanya untuk bersenang-senang mencoba mengingat bagaimana menggunakan Formula.

Tidak ada TIO untuk Formula jadi inilah tangkapan layar dari beberapa kasus uji:

masukkan deskripsi gambar di sini


1
Apakah ada alasan mengapa spasi diperlukan di x>a-3 & x<a+3dalam Lotus Notes Formula? Apakah &xdicadangkan untuk sesuatu, atau tidak ada alasan khusus mengapa ruang di kedua belah pihak wajib? Saya tidak pernah memprogram dalam bahasa ini btw, hanya ingin tahu. :)
Kevin Cruijssen

@KevinCruijssen - Sejujurnya saya tidak tahu. Tidak pernah terpikir untuk mencobanya tanpa. Terlalu terbiasa menulis kode yang dapat dibaca :-). Saya akan memeriksa besok ketika saya sampai ke mesin dengan Notes terpasang dan memberi tahu Anda.
ElPedro

1
@KevinCruijssen - Anda benar!
ElPedro

Hehe, senang aku bisa membantu. :) +1 dari saya, dan saya melihat Anda bermain golf lagi dengan membuat variabel untuk @Text. Ketika saya melihatnya digunakan dua kali dua kemarin, terlintas di benak saya bahwa itu mungkin.
Kevin Cruijssen

1

Excel VBA, 202 201 Bytes

Fungsi jendela langsung VBE anonim yang mengambil input dari jarak A1:A2dan keluaran ke jendela langsung 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","")]

Versi Subrutin

Termasuk untuk kesesuaian

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

    Call Sheet1.Activate

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

    Dim s As String
    Let s = ""

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

0

PowerShell , 237 byte

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

Cobalah online!

Satu rangkaian string raksasa dengan tanda dolar terlalu banyak. Berusaha bermain golf lebih jauh. Tidak, saya pikir ini sesingkat pendekatan ini bisa berjalan.


0

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

-2 dari menghapus alat debug

-5 dari menyadari bahwa saya menggunakan ES6 dan kadang-kadang bisa menghilangkan kurung

-18 dari menghapus sesuatu dari versi sebelumnya yang sekarang sudah usang

-1 dari melakukan beberapa hal licik

-19 dari menghapus variabel yang tidak perlu

-26 byte menghapus semua nilai falsey penghapusan yang terlalu rumit. Saya baru mengenal ES6

-1 dari menggunakan perbandingan yang lebih pendek

-11 dari menggunakan fungsi rekursif

* -4 dari penggantian ?...:0dengan &&..., dan ... ${t}dengan...+t

Ini terlalu banyak mengambil hidup saya, dan tidak memberikan cukup suara. tapi saya sangat senang kode terakhir adalah kekuatan 2 (2 ^ 8) Saya tahu ada jawaban JavaScript lain yaitu sekitar 120 byte. tapi saya masih suka kode ini

EDIT: saya tidak tahu apa yang saya pikirkan. 265 bukan 2 ^ 8 ...

Sambil membuat ini, saya berhasil memecahkan versi yang ungolfed. Ya Tuhan, aku benci kode yang tidak disukai.

EDIT 2: sekarang tampak seperti solusi 121 byte yang lebih baik

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

Penjelasan:

datang tetapi pada dasarnya y adalah range(end, start)dan itu melakukan beberapa hal keren seperti:

  1. tampilkan sebelumnya jika page1
  2. tunjukkan titik kiri jika page > 4
  3. tunjukkan titik yang tepat jika total - page < 4
  4. tampilkan selanjutnya jika total - page == 0

dan hal-hal seperti itu dan hanya bergabung dengan ''. Saya tahu Anda tidak harus tetapi saya suka fakta yang semi-konvensional. Saya tidak tahu Nikmati.

Cobalah online!

Validasikan secara online!

Berikut ini adalah solusi 186 185 174 170 byte yang tidak saya sukai: Cobalah online!


0

PowerShell , 141 byte

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

Cobalah online!

Kurang bermain golf:

param($current,$total)
$uiElements=$(
    'prev'*($current-ne1)
    1
    '...'*($current-gt4)
    ($current-2)..($current+2)-gt1-lt$total
    '...'*($total-$current-gt4)
    $total
    'next'*($total-ne$current)
)
($uiElements|where{$_}|Get-Unique)-replace"^$current$","[$current]"
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.