Перейти на N-ту сторінку


47

Зазвичай потрібно зробити інтерфейс вибору сторінки. Зазвичай це виглядає так:

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

Це означає, що тут загалом 173 сторінки, а ви зараз на 5-й сторінці.

Цей виклик вимагає взяти загальну кількість сторінок та номер поточної сторінки як вхідні дані та вивести рядок (або масив) для "відображення" селектора сторінки.

Вхідні дані

2 натуральних числа

  • номер поточної сторінки
  • кількість сторінок

Гарантується, що 1 <= поточний <= загальний.

Вихід

Виведіть рядок або масив, які представляють інтерфейс для селекторів сторінки.

  • Якщо виводиться як рядок, слід використовувати один пробіл (U + 0020) між кожною сторінкою.
  • Якщо виводиться як масив, масив повинен давати такий самий результат, що і рядок після перетворення кожного елемента в рядок і з'єднувати їх з єдиним пробілом.
    • Три точки ( ...) не є обов'язковими для виведення масиву.

Деталі

  • Якщо current == 1, жодне "prev" не виводиться, інакше "prev" вийде першим.
  • Якщо current == total, "next" не буде виведено, інакше "next" стане останнім.
  • Перша сторінка (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випадку, але крапки не додаються зліва.
Том Карпентер

3
Тільки ДУМАЙТЕ деякі з них для веб-проекту ...
Stan Strum

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

Спробуйте в Інтернеті! Посилання включає тестові випадки. Збережено 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/… (один з яких вимагав змінити вхідний формат на поділ передачі рядків).
Мартін Ендер

@MartinEnder Спасибі, мені особливо подобається той гольф-трейлер-еліпсис, хоча я думаю, що можу поголити ще один <s> три </s> чотири байти.
Ніл

9

JavaScript (ES6), 130 122 121 байт

Викликати синтаксис currying, напр f(3)(10).

x=>X=>[x>1&&'prev 1',x>4&&'...',x>3&&x-2,x>2&&x-1,`[${x}]`,(X-=x)>1&&x+1,X>2&&x+2,X>3&&'...',X&&X+x+' next'].filter(_=>_)

Спробуйте в Інтернеті!

-1 байт (Arnauld): встановити Xна X-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

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 байт із зворотом логіки. Насправді не відчувається як окрема передумова.
Кримінально-

2
165 байт з подальшим гольфу. Також не використовується функція c(), яка позбавляється від жахливого плутанини з об'єктом, що називається c.
користувач2390246

2
Завантажте до 171 байт, виправляючи помилку, яка з’являється у кількох коментованих версіях!
користувач2390246

1
Ще одне невелике поліпшення на 164 байти . Вибачте за те, що повністю викрали це, я трохи захопився!
користувач2390246

5

APL (Діалог) , 83 82 байти

Функція анонімної інфіксації, приймаючи поточний як аргумент лівого та сумарний як правий аргумент.

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

Спробуйте в Інтернеті!

{} Явна лямбда, де і представляють лівий і правий аргументи:

⍺<⍵ струм менший за загальний?

' next'/⍨ якщо так (літ. використовувати це для копіювання) тексту

(), Додайте наступне:

  ⍳⍵від 1 до всього

  'x'@() Замініть x на позицію, де знаходяться предмети…

   ~ ні

    члени

   1 один

   , слідом за ним

    загальний

   , слідом за ним

    ⍳5 перші п'ять ɩ ntegers ( [1,2,3,4,5])

    3- відняти від трьох ( [2,1,0,-1,-2])

    ⍺+ додано до поточного ( [⍺+2,⍺+1,⍺,⍺-1,⍺-2])

    урожай, який (служить для відділення від 'x')

   () Застосувати таку негласну функцію в поточному положенні:

     формат (растровий)

    '][', додайте текст` 

    1⌽ обертати на один крок вліво (рухається ]до кінця)

     прикладіть (так, щоб скаляр, який помістився в одній зазначеній позиції)

   ϵ nlist (згладити - тому що ми створили його вкладені, коли вставили дужки)

    формат (stringify - 1 простір, що розділяє числа один від одного та від xпрогонів)

  'x+'⎕R'...' PCRE R eplace xпрацює з трьома періодами

(), Додайте наступне:

  ⍺>1 струм більший за 1?

  'prev '/⍨ якщо так (літ. використовувати це для копіювання) тексту


5

Мова Вольфрама (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

Фанки , 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

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]

Спробуйте в Інтернеті!

Якщо виводиться як масив, масив повинен давати такий самий результат, що і рядок після перетворення кожного елемента в рядок і з'єднувати їх з єдиним пробілом.

Спробуйте в Інтернеті!у попередньо викладеному вигляді, де ви бачите, що колонтитул перекладається доволі буквально, щоб "перетворити кожен на рядок, приєднатись до пробілів".

Це альтернатива підходу Лінни.


Збережіть байт 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:"");}

Спробуйте в Інтернеті!


Гарна відповідь, коротша за мою! Ви можете "["+c+"] ";
пограти в

О, і ще один байт, помістивши останній p+=перед циклом for-циклу всередині декларації for-loop: 171 байт
Кевін Круїйсен

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

* Як діадичне посилання currentзліва та totalсправа, це повертає список із поєднанням символів та цілих чисел; цей список включає пробіли. Однак байт Kне може бути просто видалений, щоб дотримуватися специфікації, оскільки результат отримав би currentокремі символи (наприклад [...'[','5','2',']'...]), тому "перетворити кожен елемент у рядок і з'єднати їх з єдиним пробілом" не вдасться отримати бажаний результат )


2

Пітон 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()не викликаючи місця.

Після номера 54 у вашому виході є ще один пробіл.
tsh

Виправлено @tsh зараз. Я додав усі тестові випадки до виводу TIO.
Том Карпентер

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-петлі. І ще 1 за допомогою введення currying 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

Також посилання розривається.
Ян Х.

@Appleguy: подивіться на це - ваш код для вимірювання переходить у поле "код" на TIO. Тоді ви можете легко створити звідти всю свою публікацію.
Фелікс Палмен

2

Python 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 включає симпатичний друк.


while ~0:це дивна річ, яку слід використовувати, коли while 1:працює добре.
Джонатан Аллан

@JonathanAllan Я знаю: P - Але це все ще працює : D
Містер Xcoder

-4 байти, що рухаються [[c]](наприклад, це EDIT) - так 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

Виводи як масив. Спробуйте в Інтернеті

Замінити в фіналі 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'*

Безумовно

~\: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додано для читабельності)
Dom Hastings

Чудово, я не думав @F
Nahuel Fouilleul

Я насолоджувався використанням "@F"сингулярних даних, це приємне вирішення! -lНе потрібно в лічильнику байтів , хоча, тільки для запуску всіх тестів відразу :). Я не сказав, але перевірка еліпсису дуже приємна!
Дом Гастінгс

Дійсно, я щойно бачив, як один з моїх перших дописів міг бути вдосконалений
Nahuel 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
?>

Я впевнений, що моїх потрійних операторів можна вдосконалити, не соромтеся спробувати.


Здійснення роботи моєї відповіді в браузері коштувало б одного або двох байтів: [,$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

В основному порт мого Python 2 відповідає лише на задоволення від спроб запам'ятати, як використовувати формулу.

Для Формули немає TIO, ось ось скріншот деяких тестових випадків:

введіть тут опис зображення


1
Чи є причина, чому потрібні пробіли x>a-3 & x<a+3у формулі Lotus Notes? Є чи &xзарезервований для чого - то, або не існує ніяких причин , зокрема , чому простору з обох сторін є обов'язковими? Я ніколи не програмував на цій мові btw, був просто цікавий. :)
Кевін Крейсейсен

@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 байт для видалення надто складних значень для видалення фальси. Я новачок в ES6

-1 від використання коротших порівнянь

-11 від використання рекурсивної функції

* -4 від заміни ?...:0на &&..., і ... ${t}на...+t

Це зайняло занадто багато мого життя, і я не дав достатньо грошей. але я дуже радий, що остаточний код має потужність 2 (2 ^ 8). Я знаю, що є ще одна відповідь JavaScript, яка становить приблизно 120 байт. але я все ще люблю цей код

EDIT: Я не знаю, що я думав. 265 - це не 2 ^ 8 ...

Роблячи це, мені вдалося зламати версію без вогків. Боже, чи ненавиджу я коду для гольфу.

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

Пояснення:

в майбутньому, але в основному це так, range(end, start)і це дуже цікаві речі, такі як:

  1. показати prev якщо 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]"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.