Перейти на 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
Просто собираюсь найти некоторые из них для веб-проекта ...
Стэн Струм,

2
Основываясь на комментарии @TomCarpenter, 4,7тестовый пример был бы очень признателен - гарантировал бы, что оба граничных случая, которые исключают эллипсы, могут быть выполнены одновременно
Тейлор Скотт

1
@TaylorScott Оба добавлены.
17

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

Добавьте prev, если текущая страница не 1.

1$
1 next

Добавьте следующий, если текущая страница не последняя.

1+
$.&

Конвертировать обратно в десятичную.


1
Сохранено несколько байтов: tio.run/… (один из которых требовал изменения формата ввода на разделение перевода строки).
Мартин Эндер

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

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 байт (Арнаулд): установлен 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.
user2390246

2
Сделайте резервную копию до 171 байта, исправляя ошибку, которая появляется в нескольких закомментированных версиях!
user2390246

1
Еще одно небольшое улучшение на 164 байта . Извините за то, что полностью похитил это, я немного увлекся!
user2390246

5

APL (Dyalog) , 83 82 байта

Анонимная инфиксная функция, принимающая current в качестве левого аргумента и total в качестве правого аргумента.

{('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')

   () Применить следующую молчаливую функцию в текущей позиции:

     формат (строка)

    '][', добавить текст` 

    1⌽ повернуть на один шаг влево (сдвинуть ]до конца)

     заключить (чтобы это был скаляр, который поместится в одной указанной позиции)

   ε NLIST (расплющить - потому что мы сделали это вложенным , когда мы вставили скобку)

    формат (stringify - 1 пробел, отделяющий числа друг от друга и от xтрасс)

  'x+'⎕R'...' PCRE R eplace xработает с тремя периодами

(), Добавьте следующее:

  ⍺>1 ток больше 1?

  'prev '/⍨ если это так (буквально, используйте для репликации) текст


5

Wolfram Language (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оператору будет возвращать логическое значение.
Эрик 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+"] ";
Кевин Круйссен

Да, и еще один байт, поместив последний p+=перед циклом for в объявлении цикла for: 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

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.
Том Карпентер

2

C # (.NET Core) , 195 192 байта

Сохранено 3 байта благодаря Кевину Круйссену.

c=>t=>{var n=c>1?"prev ":"";n+=c>4?"1 ... ":c<2?"[1] ":"1 ";if(t>1){for(int i=c-3;i++<c+2;)if(i>1&i<t)n+=i==c?$"[{i}] ":i+" ";n+=c<t-4?"... "+t:c==t?$"[{t}]":t+"";n+=c<t?" next":"";}return n;}

Попробуйте онлайн!


1
Вы можете сэкономить 2 байта, удалив скобки цикла for. И еще 1 с помощью ввода карри c=>t=>. Попробуйте это здесь: 192 байта
Кевин Круйссен

2

C ++ - 247 байт

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

Попробуйте онлайн!


1
Обратите внимание, что «никакие другие номера страниц не должны выводиться».
17

Ой, прости, я пропустил это правило. Я исправлю это в ближайшее время.
BalazsToth

Также ссылка битая.
Ян Х.

@Appleguy: посмотрите на это - ваш измеряемый код помещается в поле «code» на 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 включает pretty-print.


while ~0:это странная вещь, чтобы использовать, когда while 1:работает нормально.
Джонатан Аллан

@JonathanAllan Я знаю: P - Но это все еще работает : D
Мистер Xcoder

-4 байта, перемещая [[c]](как это ) РЕДАКТИРОВАТЬ - так делает while 2*3*4*5*6*7*8*9*'I know a song that will get on your nerves, get on your nerves, get on your nerves;\n':: p
Джонатан Аллан

@JonathanAllan Да, спасибо, я просто играл с этим, потому что чувствовал, что это излишне.
мистер Xcoder

2

PHP, 157 150 байт

буквально взятие деталей оказалось самым коротким подходом:

[,$k,$n]=$argv;for($k>1&&print"prev ";$i++<$n;)$g=in_array($i,range($k-2,$k+2)+[5=>1,$n])?!print$i-$k?"$i ":"[$i] ":$g||print"... ";$k<$n&&print next;

Запустите php -nr '<code>' <curpage> <numpages>или попробуйте онлайн .


2

CJam, 74

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

Выходы в виде массива. Попробуйте онлайн

Заменить финал 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 Йохансен сохранил 16 байтов. Спасибо!


1
(1) Вы можете удалить unwords$, вывод массива разрешен. (2) s x=show x; ... s[a]короче, после чего его можно объединить со следующим с :и map, а затем id=<<становится длиннее, чем просто с помощью ++s. (3) max 4a-2и min(a+3)t-1короче. Попробуйте онлайн!
Орджан Йохансен

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'


Да спасибо. Я был на мобильном телефоне, было немного неудобно втиснуть весь код.
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
Науэль Фуйе

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

действительно, я только что видел, что одно из моих первых сообщений может быть улучшено
Nahuel Fouilleul

1

Рубин , 127 байт

Я не особенно доволен этим, особенно предыдущая / следующая логика.

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

Попробуйте онлайн!

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
игра в гольф: <?=($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 Formula, 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зарезервирован для чего - то, или не существует никаких причин , в частности , почему пространства с обеих сторон являются обязательными? Я никогда не программировал на этом языке, кстати, было просто любопытно. :)
Кевин Круйссен

@KevinCruijssen - Если честно, я не знаю. Никогда не думал попробовать это без. Слишком привык к написанию читаемого кода :-). Завтра я проверю, когда доберусь до машины с установленными Notes и сообщу вам.
ElPedro

1
@KevinCruijssen - ты был прав!
ElPedro

Хе-хе, рад, что смог помочь. :) +1 от меня, и я вижу, что вы играете в гольф еще больше, создав переменную для @Text. Когда я увидел, что вчера его использовали два раза два, мне в голову пришло, что это возможно.
Кевин Круйссен

1

Excel VBA, 202 201 байт

Функция анонимного непосредственного окна VBE, которая берет входные данные из диапазона A1:A2и выводит в непосредственное окно VBE.

For i=[Max(A1-2,1)]To[Min(A1+2,A2)]:s=s &IIf([A1]=i,"[" &i &"]",i)&" ":Next:?[If(A1=1,"","prev "&If(A1>3,1&If(A1>4," ... "," "),""))]s[If(A1<A2,If(A1-A2<-3,"... ","")&If(A1-A2<-2,A2&" ","")&"next","")]

Версия подпрограммы

Включено для удобства чтения

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

    Call Sheet1.Activate

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

    Dim s As String
    Let s = ""

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

0

PowerShell , 237 байт

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

Попробуйте онлайн!

Одна гигантская последовательность строк со слишком большим количеством знаков доллара. Работаю над гольфом дальше. Нет, я думаю, что это так коротко, как этот подход может пойти.


0

Javascript (ES6), 265 263 258 240 239 220 194 193 182 178 байт

-2 от удаления инструмента отладки

-5 от осознания того, что я использую ES6 и иногда могу покончить с круглыми скобками

-18 от удаления чего-то из более ранней версии, которая теперь устарела

-1 от какой-то подлости

-19 от удаления ненужных переменных

-26 байт от удаления слишком сложного удаления значений фальси. Я новичок в ES6

-1 от использования более коротких сравнений

-11 от использования рекурсивной функции

* -4 от замены ?...:0 на &&..., и ... ${t}с...+t

Это заняло слишком много моей жизни и не дало достаточно голосов. но я так рад, что окончательный код имеет степень 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` `

Объяснение:

прийти, но в основном у, 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]"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.