É comum precisar fazer uma interface de seleção de página. Normalmente, é assim:
prev 1 ... 3 4 [5] 6 7 ... 173 next
O que significa que existem totalmente 173 páginas e você está na quinta página atualmente.
Esse desafio exige que você pegue o número total de páginas e o número da página atual como entrada e imprima uma string (ou uma matriz) para "exibir" o seletor de páginas.
Entrada
2 inteiros positivos
- número da página atual
- contagem de páginas
É garantido que 1 <= atual <= total.
Resultado
Saída de uma string ou matriz que representa a interface do usuário para seletores de página.
- Se a saída for string, um único espaço (U + 0020) deve ser usado entre cada página.
- Se a saída for uma matriz, a matriz deverá produzir o mesmo resultado que a sequência depois de converter cada item em sequência e juntá-los com um único espaço.
- Os três pontos (
...
) não são opcionais para a saída da matriz.
- Os três pontos (
Detalhes
- Se atual == 1, nenhum "prev" será emitido, caso contrário, "prev" será o primeiro.
- Se atual == total, nenhum "próximo" será emitido, caso contrário, "próximo" será o último.
- A primeira página (1) e a última página (total) devem sempre ser exibidas.
- A página atual, a página (atual - 1), a página (atual - 2), a página (atual + 1) e a (atual + 2) devem ser exibidas desde que estejam no intervalo de [1..total].
- Nenhum outro número de página deve ser gerado.
- As páginas produzidas devem ser classificadas em ordem crescente.
- A saída não deve conter números de página duplicados.
- A página atual deve ser destacada envolvendo-a em um par de
[]
. - Se houver um espaço entre vizinhos, três pontos (
...
) devem ser inseridos.
Casos de teste
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
Regras
- Este é o código-golfe, o código mais curto vence!
4 , 6
como um caso de teste. Semelhante ao3, 6
caso, mas garante que os pontos não sejam adicionados ao lado esquerdo.4,7
caso de teste seria muito apreciada - asseguraria que ambas as situações limites que excluem elipses podem ser simultaneamente conheciRespostas:
Retina ,
125113109107 bytesExperimente online! O link inclui casos de teste. Economizou 12 bytes graças a @MartinEnder. Explicação:
Converta para unário.
Gere todos os números de página na ordem inversa.
Exclua a nova linha que separa a entrada. (Também há um espaço na geração de número de página).
Classifique as páginas novamente em ordem crescente. Isso também classifica a página atual, que agora está duplicada.
Cancele a duplicação e envolva
[]
s pela página atual.Adicione reticências se a página atual for pelo menos 5 ou se houver pelo menos 4 páginas após a página atual. (Observe o espaço à direita, para evitar a inclusão da última página nas reticências.)
Adicione o prev se a página atual não for 1.
Adicione o próximo se a página atual não for a última.
Converta de volta para decimal.
fonte
JavaScript (ES6),
130122121 bytesInvoque com sintaxe de currying, por exemplo
f(3)(10)
.Mostrar snippet de código
Experimente online!
-1 byte (Arnauld): definido
X
comoX-x
.fonte
.join
não faz parte da sua conta! Eu estava ficando louco tentando descobrir por que seu código funcionaria sem associação, enquanto meu código semelhante não. Então eu digo que você simplesmente não o incluiu na sua solução, mas o incluiu no seu snippet!Código de máquina 6502 (C64), 160 bytes
Demonstração on-line - Uso:
sys49152,[current],[total]
por exemplosys49152,5,173
.Os números devem estar no intervalo [1..255] com a corrente <= total. Como isso não foi especificado de outra forma, esse é o intervalo inteiro não assinado "natural" em um processador de 8 bits.
Explicação como lista de desmontagem comentada:
fonte
R ,
214 bytes168 bytesExperimente online!
Obrigado a @ user2390246 por ótimas dicas de golfe
fonte
c()
, que elimina a terrível confusão com o objeto chamadoc
.APL (Dyalog) ,
8382 bytesFunção de infixo anônimo, recebendo atual como argumento à esquerda e total como argumento à direita.
Experimente online!
{
…}
Lambda explícito where⍺
e⍵
representa os argumentos esquerdo e direito:⍺<⍵
a corrente é menor que o total?' next'/⍨
se sim (lit. use isso para replicar) o texto(
…),
Acrescente o seguinte:⍳⍵
número 1 ao total'x'@(
…)
Substitua por umx
nas posições em que os itens estão…~
não∊
membros de1
1,
Seguido por⍵
o total,
Seguido por⍳5
as cinco primeiras Ɩ ntegers ([1,2,3,4,5]
)3-
subtraído de três ([2,1,0,-1,-2]
)⍺+
adicionado ao atual ([⍺+2,⍺+1,⍺,⍺-1,⍺-2]
)⊢
rendimento que (serve para separar⍺
de'x'
)(
…)
Aplique a seguinte função tácita na posição atual:⍕
formato (stringify)'][',
Anexe o texto`1⌽
gire um passo para a esquerda (move o]
para o fim)⊂
coloque (de modo que seja um escalar que caiba na única posição indicada)∊
ε nlist (achatar - porque nós fizemos isso aninhados quando inserido entre parênteses)⍕
formato (stringify - 1 espaço separando números entre si e dasx
execuções)'x+'⎕R'...'
PCRE R moran Jr.x
é executado com três períodos(
…),
Acrescente o seguinte:⍺>1
a corrente é maior que 1?'prev '/⍨
se sim (lit. use isso para replicar) o textofonte
Wolfram Language (Mathematica) ,
131114109 bytesExperimente online!
Como funciona
Muita substituição. Começando com uma lista de todas as páginas, substitua, na ordem:
#->"["<>(t=ToString)@#<>"]"
: a página atual com uma string entre colchetes,1->"prev 1"
: página 1 com a sequênciaprev 1
,#2->t@#2<>" next"
: a última página com a sequência(number) next
, com#-3|#+3:>"..."
: páginacurrent-3
e páginacurrent+3
com a sequência"..."
,x_/;Abs[x-#]>2:>Nothing
: todas as outras páginas (inteiras) abaixocurrent-2
ou acimacurrent+2
sem nada. (Sim,Nothing
é um built-in.)fonte
Funky ,
218210 bytesSalvou alguns bytes, alguns dos quais graças ao tsh
Experimente online!
fonte
i<=p+2
pode ser jogadoi<p+3
, et[2]="["+t[2]+"]"
pode sert[2]="["+p+"]"
?Python 2 ,
136130 bytesExperimente online!
Experimente online! na forma prettificada, onde você pode ver o rodapé se traduz literalmente para "converter cada uma em uma string, juntar-se a espaços".
Essa é uma alternativa à abordagem de Lynn.
fonte
i or'...'
e zeros (como este )Python 2 , 135 bytes
Experimente online!
Primeiro, criamos uma string como
prev 1 3 4 [5] 6 7 10 next
, que tem "lacunas" causadas pelo apagamento de alguns números, mas não de seus espaços delimitadores. Em seguida, substituímos qualquer execução de 2 ou mais espaços...
usando uma regex.fonte
(-3<x-c<3or x%t<2)
a(x%t<2or-3<x-c<3)
para -1, ambos os argumentos para oor
operador irá retornar um valor booleano.Java 8,
201200197 bytesExplicação:
Experimente aqui.
fonte
Java (OpenJDK 8) ,
218179177167166 bytesExperimente online!
fonte
"["+c+"] ";
: 172 bytesp+=
antes do loop for dentro da declaração do loop for: 171 bytesGeléia , 59 bytes
Um programa completo * imprimindo o resultado em STDOUT. Leva argumentos
current
etotal
nessa ordem.Experimente online! ou veja a suíte de testes .
Quão?
* Como um link diádico,
current
à esquerda etotal
à direita, retorna uma lista com uma mistura de caracteres e números inteiros; Esta lista inclui os espaços. NoK
entanto, o byte não pode ser simplesmente removido para aderir às especificações, pois o resultado terá o colchetecurrent
como caracteres separados (como[...'[','5','2',']'...]
), de modo que "converter cada item em string e uni-los em um único espaço" não produzirá o resultado desejado. )fonte
Python 2 ,
178170 bytesExperimente online!
Segunda tentativa depois de ler as regras com mais cuidado.
-8 ao perder alguns suportes desnecessários.
fonte
Octave ,
169 196 190 181 175 169166 bytesExperimente online!
Vou adicionar uma explicação mais tarde.
Hmm, parece que houve alguns problemas com o formato de saída. Agora eles foram resolvidos - todas as saídas estão corretas. Mas, infelizmente, custa 27 bytes. Conseguiu agarrar todos aqueles de volta, embora com um pouco de corte de gordura.
*
vez de.*
- obrigado @StewieGriffinsprintf
vez denum2str
como eu já tinha esse identificadors
.[]
asprint
chamada.strtrim()
sem causar espaço à direita.fonte
C # (.NET Core) ,
195192 bytesEconomizou 3 bytes graças a Kevin Cruijssen.
Experimente online!
fonte
c=>t=>
. Tente aqui: 192 bytesC ++ - 247 bytes
Experimente online!
fonte
Python 2 ,
128124 bytes-4 bytes graças a Jonathan Allan !
Experimente online!
Saída como uma lista, mas o link tio inclui impressão bonita.
fonte
while ~0:
é uma coisa estranha de se usar quandowhile 1:
funciona bem.[[c]]
fora (como este ) EDIT - o mesmo acontece comwhile 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 bytestomar os detalhes literalmente acabou sendo a abordagem mais curta:
Corra com
php -nr '<code>' <curpage> <numpages>
ou experimente online .fonte
CJam, 74
Saídas como matriz. Experimente online
Substitua o final
p
porS*
output como string.Explicação:
fonte
Haskell,
145129 bytesExperimente online!
Edit: @ Ørjan Johansen salvou 16 bytes. Obrigado!
fonte
unwords$
saída da matriz é permitida. (2)s x=show x; ... s[a]
é mais curto, após o qual pode ser mesclado com o próximo com:
emap
, e depoisid=<<
se torna mais longo do que apenas usar++
s. (3)max 4a-2
emin(a+3)t-1
são mais curtos. Experimente online!Script de golfe - 104 caracteres
Ungolfed
fonte
Perl 5,
113 + 1 (-p)109 +3 (-pal) bytesExperimente online
fonte
$'
! Brinquei um pouco com isso, mas não consegui reduzi-lo muito, mas usando em<>
vez do regex e usando-a
para manter uma referência$_
, pude passar para 111: Experimente online! (-l
Adicionado para facilitar a leitura)"@F"
entradas singulares, é uma boa solução! A-l
não é necessário na contagem de bytes, porém, apenas para executar todos os testes de uma só vez :). Eu não disse, mas sua validação de reticências é muito boa!Ruby , 127 bytes
Não estou particularmente feliz com isso, especialmente a lógica anterior / seguinte.
Experimente online!
Ungolfed
fonte
PHP (Navegador), 267 bytes
Experimente online!
Definitivamente não é tão pequeno quanto poderia ter sido, e como foi demonstrado acima, o uso do PHP na linha de comando pode ser muito menor. A entrada é feita através de solicitações GET, a é o número selecionado, b é o limite. Isso parece
foo.bar.com/index.php?a=2&b=12
Ungolfed
Tenho certeza de que meus operadores ternários podem ser aprimorados, sinta-se à vontade para tentar.
fonte
[,$k,$n]=$argv;
-><?[$k,$n]=$_GET;
se eu insistir em que a página atual seja o primeiro argumento e o número de páginas o segundo;<?extract($_GET);
se eu quiser usar argumentos nomeados.$a<$b-2
por$a<$b-3
para corrigir.<?=($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)Fórmula IBM / Lotus Notes,
217211 bytes-2 com graças a @KevinCruijssen
-4 usando variáveis para os valores @Text
Basicamente, uma porta do meu Python 2 responde apenas pela diversão de tentar lembrar como usar o Formula.
Não há TIO para a Formula, então aqui está uma captura de tela de alguns dos casos de teste:
fonte
x>a-3 & x<a+3
na Lotus Notes Formula? Está&x
reservado para alguma coisa ou não há nenhuma razão em particular para que os espaços de ambos os lados sejam obrigatórios? Eu nunca programei nesse idioma, era apenas curioso. :)Excel VBA,
202201 bytesFunção de janela imediata anônima do VBE que leva as entradas do intervalo
A1:A2
e as saídas para a janela imediata do VBE.Versão da sub-rotina
Incluído para facilitar a leitura
fonte
PowerShell , 237 bytes
Experimente online!
Uma concatenação gigantesca de cordas com muitos cifrões.
Trabalhando ainda mais no golfe.Não, acho que isso é o mais curto possível.fonte
Javascript (ES6),
265263258240239220194193182178 bytes-2 de remover uma ferramenta de depuração
-5 de perceber que estou usando o ES6 e às vezes consigo acabar com parênteses
-18 de remover algo de uma versão anterior que agora está obsoleta
-1 de fazer algumas coisas sorrateiras
-19 da remoção de variáveis desnecessárias
-26 bytes para remover os valores muito complicados de remoção de falsey. Eu sou novo no ES6
-1 de usar comparações mais curtas
-11 de usar uma função recursiva
* -4 de substituir
?...:0
por&&...
e... ${t}
por...+t
Isso levou muito da minha vida e não deu votos suficientes.
mas estou tão feliz que o código final seja uma potência de 2 (2 ^ 8). Sei que há outra resposta JavaScript com cerca de 120 bytes.mas eu ainda amo esse códigoEDIT: eu não sei o que estava pensando. 265 não é 2 ^ 8 ...
Ao fazer isso, eu consegui quebrar a versão não destruída. Deus, eu odeio código desagradável.
EDIT 2: agora está parecendo a melhor solução de 121 bytes
Explicação:
para vir, mas basicamente y é
range(end, start)
e faz algumas coisas legais como:page
for 1page > 4
total - page < 4
total - page == 0
e coisas assim e apenas se junta a ele ''. Eu sei que você não precisa, mas eu gosto do fato de ser semi-convencional. Eu não sei. Desfrutar.
Experimente online!
Valide online!
Aqui está uma solução de
186185174170 bytes que eu não gosto: Experimente online!fonte
PowerShell , 141 bytes
Experimente online!
Menos golfe:
fonte