ไปที่หน้า Nth


47

เป็นเรื่องปกติที่จะต้องสร้างส่วนต่อประสานการเลือกหน้า โดยทั่วไปจะมีลักษณะเช่นนี้:

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

ซึ่งหมายความว่ามีทั้งหมด 173 หน้าและคุณอยู่ในหน้าที่ 5 ในขณะนี้

ความท้าทายนี้ต้องการให้คุณใช้จำนวนหน้าทั้งหมดและหมายเลขหน้าปัจจุบันเป็นอินพุตและส่งออกสตริง (หรืออาร์เรย์) เพื่อ "แสดง" ตัวเลือกหน้า

อินพุต

2 จำนวนเต็มบวก

  • หมายเลขหน้าปัจจุบัน
  • จำนวนหน้า

รับประกันได้ว่า 1 <= current <= total

เอาท์พุต

ส่งออกสตริงหรืออาร์เรย์ซึ่งเป็นตัวแทนของ UI สำหรับตัวเลือกหน้า

  • หากเอาต์พุตเป็นสตริงควรใช้เว้นวรรค (U + 0020) ระหว่างแต่ละหน้า
  • หากเอาต์พุตเป็นอาร์เรย์อาร์เรย์ควรสร้างผลลัพธ์เดียวกันกับสตริงหลังจากแปลงแต่ละรายการเป็นสตริงและเข้าร่วมกับช่องว่างเดียว
    • สามจุด ( ...) ไม่ใช่ตัวเลือกสำหรับเอาต์พุตอาร์เรย์

รายละเอียด

  • หากปัจจุบัน == 1 จะไม่มีการแสดงผล "prev" มิฉะนั้น "prev" จะมาก่อน
  • หากปัจจุบัน == ผลรวมจะไม่มีการแสดง "ถัดไป" มิฉะนั้นจะแสดงว่า "ถัดไป" เป็นครั้งสุดท้าย
  • หน้าแรก (1) และหน้าสุดท้าย (ทั้งหมด) ควรแสดงผลลัพธ์เสมอ
  • หน้าปัจจุบัน (ปัจจุบัน - 1) หน้า (ปัจจุบัน - 2) หน้า (ปัจจุบัน + 1) หน้า (ปัจจุบัน +2) หน้าควรจะออกตราบใดที่อยู่ในช่วง [1..total]
  • ไม่ควรแสดงหมายเลขหน้าอื่น
  • หน้าที่เรียงลำดับควรเรียงตามลำดับจากน้อยไปมาก
  • ผลลัพธ์ไม่ควรมีหมายเลขหน้าซ้ำกัน
  • []หน้าปัจจุบันควรจะเน้นโดยห่อไว้ในคู่ของ
  • หากมีช่องว่างระหว่างเพื่อนบ้านใด ๆ...ควรแทรกจุดสามจุด ( )

กรณีทดสอบ

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เคส แต่ให้แน่ใจว่าจุดจะไม่ถูกเพิ่มทางด้านซ้าย
Tom Carpenter

3
เพียงแค่จะ YOINK บางส่วนของเหล่านี้สำหรับโครงการเว็บ ...
สแตนดีด

2
การสร้างความคิดเห็นของ @TomCarpenter 4,7กรณีทดสอบจะได้รับการชื่นชมอย่างมาก - จะประกันว่าทั้งสองกรณีขอบเขตที่แยกออกจากจุดไข่ปลาอาจจะพบพร้อมกัน
Taylor Scott

1
@TaylorScott ทั้งคู่ได้เพิ่ม
tsh

2
@StanStrum ความท้าทายต่อไปคือการเขียน scroller ที่ไม่มีที่สิ้นสุด
Carl

คำตอบ:


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+
$.&

ลองออนไลน์! ลิงค์มีกรณีทดสอบ บันทึก 12 ไบต์ด้วย @MartinEnder คำอธิบาย:

.+
$*

แปลงเป็นเอก

r`1\G
 1$'

สร้างหมายเลขหน้าทั้งหมดในลำดับย้อนกลับ

ลบบรรทัดใหม่ที่แยกอินพุต (นอกจากนี้ยังมีช่องว่างจากการสร้างหมายเลขหน้าด้วย)

O`1+

เรียงหน้ากลับเป็นลำดับจากน้อยไปหามาก นี่เป็นการเรียงลำดับหน้าปัจจุบันซึ่งตอนนี้ซ้ำกัน

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

ยกเลิกการทำซ้ำและ[]ล้อมรอบหน้าปัจจุบัน

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

เพิ่มจุดไข่ปลาหากหน้าปัจจุบันอย่างน้อย 5 หรือถ้ามีอย่างน้อย 4 หน้าหลังจากหน้าปัจจุบัน (หมายเหตุช่องว่างท้ายท้ายเพื่อหลีกเลี่ยงการรวมหน้าสุดท้ายในจุดไข่ปลา)

^1
prev 1

เพิ่มก่อนหน้าหากหน้าปัจจุบันไม่ใช่ 1

1$
1 next

เพิ่มถัดไปหากหน้าปัจจุบันไม่ใช่หน้าสุดท้าย

1+
$.&

แปลงกลับเป็นทศนิยม


1
บันทึกสองสามไบต์: tio.run/… (หนึ่งในนั้นจำเป็นต้องเปลี่ยนรูปแบบการป้อนข้อมูลเป็นการแยก linefeed)
Martin Ender

@ มาร์ตินเอนเดอร์ขอบคุณฉันชอบกอล์ฟจุดไข่ปลาที่ต่อท้ายแม้ว่าฉันคิดว่าฉันสามารถกำจัด <s> สาม </s> สี่ไบต์ได้อีก
Neil

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


ต้องรักลูกแกะเหล่านั้น
Stan Strum

คุณควรเพิ่ม +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

R , 214 ไบต์ 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 ไบต์

ฟังก์ชัน infix แบบไม่ระบุชื่อที่รับกระแสเป็นอาร์กิวเมนต์ซ้ายและผลรวมเป็นอาร์กิวเมนต์ที่ถูกต้อง

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

ลองออนไลน์!

{} แลมบ์ดาชัดเจนที่ใดและเป็นตัวแทนของการขัดแย้งทางซ้ายและขวา:

⍺<⍵ ปัจจุบันมีขนาดเล็กกว่าทั้งหมด?

' next'/⍨ ถ้าเป็นเช่นนั้น (จุดใช้ที่จะทำซ้ำ) ข้อความ

(), เพิ่มรายละเอียดต่อไปนี้:

  ⍳⍵ɩ ntegers 1 ผ่านทั้งหมด

  'x'@(... ) แทนที่ด้วยการx ที่ตำแหน่งที่รายการที่มี ...

   ~ ไม่

    สมาชิกของ

   1 หนึ่ง

   , ติดตามโดย

    รวม

   , ติดตามโดย

    ⍳5 ครั้งแรกห้าɩ ntegers ( [1,2,3,4,5])

    3- ลบออกจากสาม ( [2,1,0,-1,-2])

    ⍺+ เพิ่มในปัจจุบัน ( [⍺+2,⍺+1,⍺,⍺-1,⍺-2])

    ให้ผลผลิตที่ (ทำหน้าที่แยกจาก'x')

   (... ) ใช้ฟังก์ชัน tacit ต่อไปนี้ที่ตำแหน่งปัจจุบัน:

     รูปแบบ (stringify)

    '][', เติมข้อความท้ายข้อความ 

    1⌽ หมุนไปทางซ้ายหนึ่งก้าว (เลื่อน]ไปยังจุดสิ้นสุด)

     ใส่ (เพื่อให้เป็นแบบสเกลาร์ซึ่งจะพอดีกับตำแหน่งที่ระบุเดี่ยว)

   ε nlist (แบน - เพราะเราทำให้มันซ้อนกันเมื่อเราแทรกวงเล็บ)

    รูปแบบ (stringify - 1 ช่องว่างคั่นตัวเลขจากกันและกันและจากการxทำงาน)

  'x+'⎕R'...' PCRE R eplace xทำงานด้วยสามช่วงเวลา

(), เพิ่มรายละเอียดต่อไปนี้:

  ⍺>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-3และหน้าcurrent+3ด้วยสตริง"..." ,
  5. x_/;Abs[x-#]>2:>Nothing: หน้าอื่น ๆ (จำนวนเต็ม) ด้านล่างcurrent-2หรือด้านบนcurrent+2ไม่มีอะไรเลย (ใช่Nothingเป็นแบบในตัว)

4

Funky , 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)}

ลองออนไลน์!


ฉันไม่รู้จัก Funky แต่ดูเหมือนว่าi<=p+2สามารถเล่นกอล์ฟi<p+3ได้และt[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+ โดย...ใช้ regex


คุณสามารถพลิก(-3<x-c<3or x%t<2)ไป(x%t<2or-3<x-c<3)หา -1 ได้อาร์กิวเมนต์ทั้งสองไปที่orโอเปอเรเตอร์จะคืนค่าบูลีน
Erik the Outgolfer

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

ลองออนไลน์!


คำตอบที่ดีสั้นกว่าของฉัน! คุณสามารถเล่นกอล์ฟห้าไบต์ได้โดยใส่ช่องว่างหลังจาก"["+c+"] ";: 172 bytes
Kevin Cruijssen

โอ้และอีกหนึ่งไบต์โดยการใส่ครั้งสุดท้ายp+=ก่อนหน้า for-loop ภายในการประกาศ for-loop: 171 bytes
Kevin Cruijssen

3

เยลลี่ , 59 ไบต์

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

โปรแกรม * เต็มพิมพ์ผลการ STDOUT รับอาร์กิวเมนต์currentและtotalตามลำดับ

ลองออนไลน์! หรือดูการทดสอบในตัว

อย่างไร?

+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

* เนื่องจากลิงก์ของ dyadic 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

อ็อกเทฟ , 169 196 190 181 175 169 166 ไบต์

@(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นั้นแล้ว
  • บันทึก 6 ไบต์โดยการดึง[]เข้าสู่sprintการโทร
  • บันทึก 6 ไบต์โดยหาวิธีลดจำนวนการเปรียบเทียบ
  • บันทึก 3 ไบต์ด้วยการลบความต้องการstrtrim()โดยไม่ทำให้เกิดพื้นที่ต่อท้าย

มีที่ว่าง 1 หลังหมายเลข 54 ในผลลัพธ์ของคุณ
tsh

@tsh แก้ไขแล้ว ฉันได้เพิ่มกรณีทดสอบทั้งหมดไปยังเอาต์พุต TIO
Tom Carpenter

2

C # (. NET Core) , 195 192 ไบต์

บันทึกแล้ว 3 ไบต์ขอบคุณ 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;}

ลองออนไลน์!


1
คุณสามารถบันทึก 2 ไบต์โดยการลบวงเล็บของ for-loop และอีก 1 c=>t=>โดยใช้การป้อนข้อมูลความดีความชอบ ลองที่นี่: 192 ไบต์
Kevin Cruijssen

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

นอกจากนี้ลิงค์เสีย
Ian H.

@Appleguy: ดูนี่ - รหัสของคุณที่จะวัดได้ไปในฟิลด์ "code" ใน TIO จากนั้นคุณสามารถสร้างโพสต์ทั้งหมดของคุณได้อย่างง่ายดาย
เฟลิกซ์ Palmen

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:ทำงานได้ดี
Jonathan Allan

@JanathanAllan ฉันรู้ว่า: 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
Jonathan Allan

@JanathanAllan ใช่ขอบคุณฉันเพิ่งเล่นไปรอบ ๆ เพราะฉันรู้สึกว่ามันซ้ำซ้อน
นาย 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

เอาต์พุตเป็นอาร์เรย์ ลองออนไลน์

แทนที่สุดท้ายpด้วยS*เป็นเอาต์พุต

คำอธิบาย:

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]

ลองออนไลน์!

แก้ไข: @ Ørjan Johansen บันทึกแล้ว 16 ไบต์ ขอบคุณ!


1
(1) คุณสามารถปล่อยunwords$เอาท์พุตอาร์เรย์ได้ (2) s x=show x; ... s[a]สั้นหลังจากที่มันสามารถนำมารวมกับอย่างใดอย่างหนึ่งต่อไปด้วย:และmapจากนั้นid=<<จะกลายเป็นนานกว่าเพียงแค่การใช้++s (3) max 4a-2และmin(a+3)t-1สั้นกว่า ลองออนไลน์!
Ørjan Johansen

1

สคริปต์กอล์ฟ - 104 ตัวอักษร

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

Ungolfed

~\:a;:b;       # a = 1st arg, b = 2nd arg
1a<'prev '*    # if a > 1: print 'prev '
3a<'1 ... '*   # if a > 3: print '1 ... '
[5,{a 2-+}/]   # creates an array [a-2 a-1 a a+1 a+2]
{.0>\b)<&},    # keeps only elements >0 and <=b
{
  .a={'['\']'}*      # puts '[' ']' around the element equal to a
  ' '}/;             # prints each element with a leading space
b a-:c 2>' ... 'b+*  # if b-a > 2: print ' ... ' + b
0c<' next'*          # if b-a > 0: print ' next'

2
คุณสามารถลบบรรทัดใหม่ทั้งหมด
Erik the Outgolfer

ใช่ขอบคุณ. ฉันอยู่บนมือถือมันไม่สะดวกที่จะยัดรหัสทั้งหมด
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"อินพุตแบบเอกสิทธิ์เฉพาะบุคคลมันเป็นวิธีแก้ปัญหาที่ดี! -lไม่จำเป็นต้องใช้ในการนับไบต์ แต่เฉพาะสำหรับการทดสอบการทำงานทั้งหมดในครั้งเดียว :) ฉันไม่ได้พูด แต่การตรวจสอบจุดไข่ปลาของคุณดีมาก!
Dom Hastings

แน่นอนฉันเพิ่งเห็นหนึ่งในโพสต์แรกของฉันจะดีขึ้น
Nahuel Fouilleul

1

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

ลองออนไลน์!

Ungolfed

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

1

PHP (เบราว์เซอร์), 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

Ungolfed

<?
    parse_str($_SERVER['QUERY_STRING']);
    $c=$a!=1?$a>3?$a>4?'prev 1 . . . ':'prev 1 ':'prev ':'[1] ';
    $d=$a<$b-2?$a+3:$b;
    for($i=$a<=2?$a==1?$i=2:$i=$a-1:$i=$a-2;$i<$d;$i++)
        $c.=$a==$i?"[$i] ":"$i ";

    if($a<$b-2)$c.=" . . . $b next";else
    $c.=$a==$b?"[$b]":"$b next";
    echo $c
?>

ฉันค่อนข้างมั่นใจว่าผู้ประกอบการที่ประกอบไปด้วยไตรภาคของฉันจะดีขึ้นรู้สึกอิสระที่จะลอง


การทำให้คำตอบของฉันทำงานในเบราว์เซอร์จะมีค่าใช้จ่ายหนึ่งหรือสองไบต์: [,$k,$n]=$argv; -> <?[$k,$n]=$_GET;ถ้าฉันยืนยันว่าหน้าปัจจุบันเป็นอาร์กิวเมนต์แรกและจำนวนหน้าที่สอง <?extract($_GET);ถ้าฉันต้องการใช้อาร์กิวเมนต์ที่มีชื่อ
ติตัส

ล้มเหลวสำหรับ a = b-3; แทนที่$a<$b-2ด้วย$a<$b-3เพื่อแก้ไข
ติตัส

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

1

สูตร 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

โดยพื้นฐานแล้วพอร์ตของ Python 2 ของฉันจะตอบเพียงเพื่อความสนุกในการพยายามจดจำวิธีใช้สูตร

ไม่มี TIO สำหรับสูตรดังนั้นนี่เป็นภาพหน้าจอของกรณีทดสอบบางส่วน:

ป้อนคำอธิบายรูปภาพที่นี่


1
มีเหตุผลที่ต้องมีช่องว่างx>a-3 & x<a+3ในสูตร Lotus Notes หรือไม่ ถูก&xสงวนไว้สำหรับบางสิ่งบางอย่างหรือมีเหตุผลไม่โดยเฉพาะในพื้นที่ว่าทำไมทั้งสองข้างมีผลบังคับใช้? ฉันไม่เคยตั้งโปรแกรมในภาษานี้ แต่ก็อยากรู้ :)
Kevin Cruijssen

@KevinCruijssen - พูดตามตรงฉันไม่รู้ ไม่เคยคิดว่าจะลองโดยไม่ต้อง คุ้นเคยกับการเขียนโค้ดที่อ่านได้มากเกินไป :-) ฉันจะตรวจสอบพรุ่งนี้เมื่อฉันไปถึงเครื่องที่ติดตั้ง Notes และแจ้งให้คุณทราบ
ElPedro

1
@KevinCruijssen - คุณพูดถูก!
ElPedro

เฮ้อดีใจที่ฉันช่วยได้ :) +1 จากฉันและฉันเห็นว่าคุณเล่นกอล์ฟเพิ่มด้วยการสร้างตัวแปรสำหรับ @Text เมื่อฉันเห็นมันถูกใช้สองครั้งเมื่อวานนี้สองครั้งมันทำให้ฉันนึกถึงว่าเป็นไปได้
Kevin Cruijssen

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

สิ่งนี้ใช้เวลามากเกินไปในชีวิตของฉันและไม่ให้ upvotes มากพอ แต่ฉันดีใจที่รหัสสุดท้ายคือพลังของ 2 (2 ^ 8)ฉันรู้ว่ามีอีกคำตอบ JavaScript ที่ประมาณ 120 ไบต์ แต่ฉันยังคงรักรหัสนี้

แก้ไข: ฉันไม่รู้ว่าฉันคิดอะไรอยู่ 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]"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.