Обычно нужно сделать интерфейс выбора страницы. Обычно это выглядит так:
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
правила
- Это код-гольф, выигрывает самый короткий код!
4 , 6
в качестве тестового примера. Аналогично3, 6
случаю, но гарантирует, что точки не добавляются на левую сторону.4,7
тестовый пример был бы очень признателен - гарантировал бы, что оба граничных случая, которые исключают эллипсы, могут быть выполнены одновременноОтветы:
Сетчатка ,
125113109107 байтПопробуйте онлайн! Ссылка включает в себя тестовые случаи. Сохранено 12 байт благодаря @MartinEnder. Объяснение:
Преобразовать в одинарный.
Генерация всех номеров страниц в обратном порядке.
Удалите новую строку, разделяющую ввод. (В любом случае там также есть пробел от генерации номера страницы.)
Сортировка страниц обратно в порядке возрастания. Это также сортирует текущую страницу, которая теперь дублируется.
Не дублируйте и оборачивайте
[]
вокруг текущей страницы.Добавьте многоточие, если текущая страница по крайней мере 5, или если после текущей страницы есть по крайней мере 4 страницы. (Обратите внимание на конечный пробел, чтобы не включать последнюю страницу в многоточие.)
Добавьте prev, если текущая страница не 1.
Добавьте следующий, если текущая страница не последняя.
Конвертировать обратно в десятичную.
источник
JavaScript (ES6),
130122121 байтВызывать с синтаксисом каррирования, например
f(3)(10)
.Показать фрагмент кода
Попробуйте онлайн!
-1 байт (Арнаулд): установлен
X
вX-x
.источник
.join
не часть вашего счета! Я сходил с ума, пытаясь понять, почему ваш код будет работать без объединения, в то время как мой аналогичный код не сработает. Тогда я говорю, что вы просто не включили его в свое решение, но включили его в свой фрагмент!6502 машинный код (C64), 160 байт
Интернет демо - Использование:
sys49152,[current],[total]
, напримерsys49152,5,173
.Числа должны быть в диапазоне [1..255] с током <= всего. Поскольку это не было указано иначе, это «естественный» диапазон целых чисел без знака на 8-битном процессоре.
Пояснение как прокомментированный список разборки:
источник
R ,
214 байтов,168 байтовПопробуйте онлайн!
Спасибо @ user2390246 за отличные советы по игре в гольф
источник
c()
, которая избавляет от ужасной путаницы с вызываемым объектомc
.APL (Dyalog) ,
8382 байтаАнонимная инфиксная функция, принимающая current в качестве левого аргумента и total в качестве правого аргумента.
Попробуйте онлайн!
{
…}
Явная лямбда, где⍺
и⍵
представляют левый и правый аргументы:⍺<⍵
ток меньше общего?' 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 eplacex
работает с тремя периодами(
…),
Добавьте следующее:⍺>1
ток больше 1?'prev '/⍨
если это так (буквально, используйте для репликации) текстисточник
Wolfram Language (Mathematica) ,
131114109 байтПопробуйте онлайн!
Как это устроено
Много замены. Начиная со списка всех страниц, замените по порядку:
#->"["<>(t=ToString)@#<>"]"
: текущая страница со строкой в скобках,1->"prev 1"
: страница 1 со строкойprev 1
,#2->t@#2<>" next"
: последняя страница со строкой(number) next
, с#-3|#+3:>"..."
: страницаcurrent-3
и страницаcurrent+3
со строкой"..."
,x_/;Abs[x-#]>2:>Nothing
: все остальные (целые) страницы нижеcurrent-2
или вышеcurrent+2
ни с чем. (Да,Nothing
это встроенный.)источник
Фанки ,
218210 байтСохранено несколько байтов, некоторые из которых благодаря tsh
Попробуйте онлайн!
источник
i<=p+2
можно играть в гольфi<p+3
, аt[2]="["+t[2]+"]"
может бытьt[2]="["+p+"]"
?Python 2 ,
136130 байтПопробуйте онлайн!
Попробуйте онлайн! в предварительно проверенной форме, где вы можете видеть, что нижний колонтитул переводится буквально, чтобы "преобразовать каждый в строку, объединить на пробелах".
Это альтернатива подходу Линн.
источник
i or'...'
нулями (как это )Python 2 , 135 байт
Попробуйте онлайн!
Сначала мы создаем строку наподобие
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
оператору будет возвращать логическое значение.Java 8,
201200197 байтовОбъяснение:
Попробуй это здесь.
источник
Java (OpenJDK 8) ,
218179177167166 байтПопробуйте онлайн!
источник
"["+c+"] ";
p+=
перед циклом for в объявлении цикла for: 171 байтЖеле , 59 байт
Полная программа * печать результата в STDOUT. Принимает аргументы
current
иtotal
в таком порядке.Попробуйте онлайн! или посмотрите набор тестов .
Как?
* В виде диадической ссылки
current
слева иtotal
справа возвращается список со смесью символов и целых чисел; этот список включает в себя пробелы. Однако байтK
не может быть просто удален, чтобы придерживаться спецификации, поскольку в результате результат будет заключен в квадратные скобки вcurrent
виде отдельных символов (например[...'[','5','2',']'...]
), поэтому «преобразование каждого элемента в строку и объединение их с одним пробелом» не приведет к желаемому результату. )источник
Python 2 ,
178170 байтПопробуйте онлайн!
Вторая попытка после прочтения правил более тщательно.
-8, потеряв ненужные скобки.
источник
Октава ,
169 196 190 181 175 169166 байтПопробуйте онлайн!
Я добавлю объяснение позже.
Хм, кажется, были некоторые проблемы с форматом вывода. Теперь они решены - все результаты верны. Но увы это стоило 27 байт. Удалось зацепить всех тех назад, хотя с небольшим количеством жирной отделки.
*
вместо.*
- спасибо @StewieGriffinsprintf
вместо того,num2str
как у меня уже была эта ручкаs
.[]
вsprint
вызове.strtrim()
не создавая пробела.источник
C # (.NET Core) ,
195192 байтаСохранено 3 байта благодаря Кевину Круйссену.
Попробуйте онлайн!
источник
c=>t=>
. Попробуйте это здесь: 192 байтаC ++ - 247 байт
Попробуйте онлайн!
источник
Python 2 ,
128124 байта-4 байта благодаря Джонатану Аллану !
Попробуйте онлайн!
Выводится как список, но ссылка tio включает pretty-print.
источник
while ~0:
это странная вещь, чтобы использовать, когдаwhile 1:
работает нормально.[[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':
: pPHP,
157150 байтбуквально взятие деталей оказалось самым коротким подходом:
Запустите
php -nr '<code>' <curpage> <numpages>
или попробуйте онлайн .источник
CJam, 74
Выходы в виде массива. Попробуйте онлайн
Заменить финал
p
наS*
для вывода в виде строки.Объяснение:
источник
Haskell,
145129 байтовПопробуйте онлайн!
Редактировать: @ Ørjan Йохансен сохранил 16 байтов. Спасибо!
источник
unwords$
, вывод массива разрешен. (2)s x=show x; ... s[a]
короче, после чего его можно объединить со следующим с:
иmap
, а затемid=<<
становится длиннее, чем просто с помощью++
s. (3)max 4a-2
иmin(a+3)t-1
короче. Попробуйте онлайн!Гольф-скрипт - 104 персонажа
Ungolfed
источник
Perl 5,
113 + 1 (-p)109 +3 (-pal) байтовПопробуйте онлайн
источник
$'
! Немного поигрался с этим, но не смог сильно его упустить, но, используя<>
вместо регулярного выражения и используя-a
ссылку$_
, я смог опуститься до 111: попробуйте онлайн! (-l
добавлено для удобства чтения)"@F"
единственного числа, это хороший обходной путь! Однако-l
не требуется для подсчета байтов, только для запуска всех тестов одновременно :). Я не сказал, но ваша проверка многоточия очень хороша!Рубин , 127 байт
Я не особенно доволен этим, особенно предыдущая / следующая логика.
Попробуйте онлайн!
Ungolfed
источник
PHP (браузер), 267 байт
Попробуйте онлайн!
Определенно не так мало, как могло бы быть, и, как было показано выше, использование PHP в командной строке может быть намного меньше. Ввод осуществляется через GET-запросы, a - выбранное число, b - ограничение. Это выглядит как
foo.bar.com/index.php?a=2&b=12
Ungolfed
Я уверен, что мои троичные операторы могут быть улучшены, не стесняйтесь попробовать.
источник
[,$k,$n]=$argv;
-><?[$k,$n]=$_GET;
если я настаиваю на том, чтобы текущая страница была первым аргументом, а число страниц вторым;<?extract($_GET);
если я хочу использовать именованные аргументы.$a<$b-2
с ,$a<$b-3
чтобы исправить.<?=($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 байт)IBM / Lotus Notes Formula,
217211 байт-2 с благодарностью @KevinCruijssen
-4 с помощью переменных для значений @Text
В основном порт моего ответа на Python 2 просто для удовольствия, чтобы вспомнить, как использовать Формулу.
Там нет TIO для Формулы, поэтому вот скриншот некоторых тестовых случаев:
источник
x>a-3 & x<a+3
в формуле Lotus Notes требуются пробелы ? Является ли&x
зарезервирован для чего - то, или не существует никаких причин , в частности , почему пространства с обеих сторон являются обязательными? Я никогда не программировал на этом языке, кстати, было просто любопытно. :)Excel VBA,
202201 байтФункция анонимного непосредственного окна VBE, которая берет входные данные из диапазона
A1:A2
и выводит в непосредственное окно VBE.Версия подпрограммы
Включено для удобства чтения
источник
PowerShell , 237 байт
Попробуйте онлайн!
Одна гигантская последовательность строк со слишком большим количеством знаков доллара.
Работаю над гольфом дальше.Нет, я думаю, что это так коротко, как этот подход может пойти.источник
Javascript (ES6),
265263258240239220194193182178 байт-2 от удаления инструмента отладки
-5 от осознания того, что я использую ES6 и иногда могу покончить с круглыми скобками
-18 от удаления чего-то из более ранней версии, которая теперь устарела
-1 от какой-то подлости
-19 от удаления ненужных переменных
-26 байт от удаления слишком сложного удаления значений фальси. Я новичок в ES6
-1 от использования более коротких сравнений
-11 от использования рекурсивной функции
* -4 от замены
?...:0
на&&...
, и... ${t}
с...+t
Это заняло слишком много моей жизни и не дало достаточно голосов.
но я так рад, что окончательный код имеет степень 2 (2 ^ 8).Я знаю, что есть другой ответ JavaScript, который составляет около 120 байт.но я все еще люблю этот кодРЕДАКТИРОВАТЬ: я не знаю, о чем я думал. 265 это не 2 ^ 8 ...
Делая это, мне удалось сломать неопрятную версию. Боже, неужели я ненавижу кодекс без игры в гольф?
РЕДАКТИРОВАТЬ 2: теперь это выглядит как лучшее 121-байтовое решение
Объяснение:
прийти, но в основном у,
range(end, start)
и это делает некоторые интересные вещи, такие как:page
1page > 4
total - page < 4
total - page == 0
и тому подобное, и просто присоединяется к нему через ''. Я знаю, что нет необходимости, но мне нравится тот факт, что это полу-условно. Я не знаю. Наслаждаться.
Попробуйте онлайн!
Подтвердите это онлайн!
Вот решение
186185174170 байт, которое мне не нравится: Попробуйте онлайн!источник
PowerShell , 141 байт
Попробуйте онлайн!
Менее гольф:
источник