Es común tener que hacer una interfaz de selección de página. Normalmente se ve así:
prev 1 ... 3 4 [5] 6 7 ... 173 next
Lo que significa que hay 173 páginas en total, y actualmente estás en la quinta página.
Este desafío requiere que tome el número total de páginas y el número de página actual como entrada, y envíe una cadena (o una matriz) para "mostrar" el selector de página.
Entrada
2 enteros positivos
- número de página actual
- recuento de páginas
Se garantiza que 1 <= actual <= total.
Salida
Genere una cadena o una matriz que represente la interfaz de usuario para los selectores de página.
- Si se genera como una cadena, se debe usar un solo espacio (U + 0020) entre cada página.
- Si se genera como una matriz, la matriz debería producir el mismo resultado que la cadena después de convertir cada elemento en una cadena y unirlos con un solo espacio.
- Los tres puntos (
...) no son opcionales para la salida de la matriz.
- Los tres puntos (
Detalles
- Si actual == 1, no se generará "prev", de lo contrario, "prev" es lo primero.
- Si actual == total, no se generará "siguiente", de lo contrario, "siguiente" es el último.
- La primera página (1) y la última página (total) siempre deben imprimirse.
- La página actual, la página (actual - 1), la página (actual - 2), la página (actual + 1), la página (actual + 2) deben salir siempre que estén en el rango de [1..total].
- No se deben generar otros números de páginas.
- Las páginas enviadas deben clasificarse en orden ascendente.
- La salida no debe contener números de página duplicados.
- La página actual debe resaltarse envolviéndola en un par de
[]. - Si hay un espacio entre los vecinos, se
...deben insertar tres puntos ( ).
Casos de prueba
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
Reglas
- Este es el código de golf, ¡el código más corto gana!

4 , 6como un caso de prueba. Similar al3, 6caso, pero asegura que no se agreguen puntos en el lado izquierdo.4,7caso de prueba sería muy apreciado, aseguraría que los dos casos límite que excluyen elipses puedan cumplirse simultáneamenteRespuestas:
Retina ,
125113109107 bytesPruébalo en línea! El enlace incluye casos de prueba. Guardado 12 bytes gracias a @MartinEnder. Explicación:
Convierte a unario.
Genere todos los números de página en orden inverso.
Eliminar la nueva línea que separa la entrada. (De todos modos, también hay un espacio desde la generación del número de página).
Ordenar las páginas de nuevo en orden ascendente. Esto también ordena la página actual, que ahora está duplicada.
Sin duplicar y ajustar
[]alrededor de la página actual.Agregue puntos suspensivos si la página actual es de al menos 5 o si hay al menos 4 páginas después de la página actual. (Tenga en cuenta el espacio final, para evitar incluir la última página en los puntos suspensivos).
Agregue el anterior si la página actual no es 1.
Agregue el siguiente si la página actual no es la última página.
Convertir de nuevo a decimal.
fuente
JavaScript (ES6),
130122121 bytesInvocar con sintaxis curry, por ejemplo
f(3)(10).Mostrar fragmento de código
Pruébalo en línea!
-1 byte (Arnauld): establecido
XenX-x.fuente
.joines parte de tu conteo! Me estaba volviendo loco tratando de entender por qué su código funcionaría sin una unión, mientras que mi código similar no lo haría. Luego digo que simplemente no lo incluiste en tu solución, ¡pero lo incluiste en tu fragmento!Código de máquina 6502 (C64), 160 bytes
Demostración en línea - Uso:
sys49152,[current],[total]psys49152,5,173.Ej.Los números deben estar en el rango [1..255] con <= total actual. Como no se especificó lo contrario, este es el rango entero "natural" sin signo en un procesador de 8 bits.
Explicación como listado de desmontaje comentado:
fuente
R ,
214 bytes168 bytesPruébalo en línea!
Gracias a @ user2390246 por algunos buenos consejos de golf
fuente
c(), que elimina la horrible confusión con el objeto llamadoc.APL (Dyalog) ,
8382 bytesFunción infija anónima tomando actual como argumento izquierdo y total como argumento derecho.
Pruébalo en línea!
{…}Explícito lambda donde⍺y⍵representa los argumentos izquierdo y derecho:⍺<⍵¿La corriente es menor que el total?' next'/⍨si es así (iluminado, use eso para replicar) el texto(...),anteponer lo siguiente:⍳⍵te ntegers del 1 al total'x'@(...)reemplazar con unxen las posiciones donde están los artículos ...~no∊miembros de1uno,seguido por⍵el total,seguido por⍳5los primeros cinco Ɩ ntegers ([1,2,3,4,5])3-restado de tres ([2,1,0,-1,-2])⍺+agregado a la actual ([⍺+2,⍺+1,⍺,⍺-1,⍺-2])⊢rendimiento que (sirve para separar⍺de'x')(…)Aplique la siguiente función tácita en la posición actual:⍕formato (stringify)'][',anteponer el texto`1⌽girar un paso hacia la izquierda (mueve el]hasta el final)⊂encerrar (para que sea un escalar que se ajuste a la posición indicada)∊ε nlist (aplanar - porque lo hicimos anidado cuando insertamos entre paréntesis)⍕formato (stringify - 1 espacio separando números entre sí y de lasxcorridas)'x+'⎕R'...'PCRE R eplacexfunciona con tres períodos(...),anteponer lo siguiente:⍺>1¿la corriente es mayor que 1?'prev '/⍨si es así (iluminado, use eso para replicar) el textofuente
Wolfram Idioma (Mathematica) ,
131114109 bytesPruébalo en línea!
Cómo funciona
Muchos reemplazos. Comenzando con una lista de todas las páginas, reemplace, en orden:
#->"["<>(t=ToString)@#<>"]": la página actual con una cadena entre corchetes,1->"prev 1": página 1 con la cadenaprev 1,#2->t@#2<>" next": la última página con la cadena(number) next, con#-3|#+3:>"...": páginacurrent-3y páginacurrent+3con la cadena"...",x_/;Abs[x-#]>2:>Nothing: todas las demás páginas (enteras) debajocurrent-2o arribacurrent+2sin nada. (Sí,Nothingestá integrado).fuente
Funky ,
218210 bytesGuardado algunos bytes, algunos de los cuales gracias a tsh
Pruébalo en línea!
fuente
i<=p+2se puede jugar al golfi<p+3, yt[2]="["+t[2]+"]"puede sert[2]="["+p+"]".Python 2 ,
136130 bytesPruébalo en línea!
Pruébalo en línea! en forma prettified, donde puede ver que el pie de página se traduce literalmente para "convertir cada uno en una cadena, unir en espacios".
Esta es una alternativa al enfoque de Lynn.
fuente
i or'...'y ceros (como este )Python 2 , 135 bytes
Pruébalo en línea!
Primero creamos una cadena como
prev 1 3 4 [5] 6 7 10 next, que tiene "huecos" causados por borrar algunos números pero no sus espacios delimitadores. Luego reemplazamos cualquier corrida de más de 2 espacios...usando una expresión regular.fuente
(-3<x-c<3or x%t<2)a(x%t<2or-3<x-c<3)-1, ambos argumentos para eloroperador devolverán un valor booleano.Java 8,
201200197 bytesExplicación:
Pruébalo aquí
fuente
Java (OpenJDK 8) ,
218179177167166 bytesPruébalo en línea!
fuente
"["+c+"] ";: 172 bytesp+=antes del ciclo for dentro de la declaración for-loop: 171 bytesJalea , 59 bytes
Un programa completo * que imprime el resultado en STDOUT. Toma argumentos
currentytotalen ese orden.Pruébalo en línea! o ver el conjunto de pruebas .
¿Cómo?
* Como enlace diádico
currenta la izquierda ytotala la derecha, esto devuelve una lista con una mezcla de caracteres y enteros; Esta lista incluye los espacios.KSin embargo, el byte no se puede eliminar simplemente para adherirse a la especificación, ya que el resultado se colocaría entre corchetescurrentcomo caracteres separados (por ejemplo[...'[','5','2',']'...]), por lo que "convertir cada elemento en una cadena y unirlos con un solo espacio" no produciría el resultado deseado )fuente
Python 2 ,
178170 bytesPruébalo en línea!
Segundo intento después de leer las reglas con más cuidado.
-8 al perder algunos corchetes innecesarios.
fuente
Octave ,
169 196 190 181 175 169166 bytesPruébalo en línea!
Agregaré una explicación más adelante.
Hmm, parece que hubo algunos problemas con el formato de salida. Ahora se han resuelto: todas las salidas son correctas. Pero, por desgracia, costó 27 bytes. Se las arregló para arañar a todos de vuelta con un poco de recorte de grasa.
*lugar de.*- gracias @StewieGriffinsprintflugar denum2strcomo ya tenía ese identificadors.[]a lasprintllamada.strtrim()sin causar espacio final.fuente
C # (.NET Core) ,
195192 bytesGuardado 3 bytes gracias a Kevin Cruijssen.
Pruébalo en línea!
fuente
c=>t=>. Pruébelo aquí: 192 bytesC ++ - 247 bytes
Pruébalo en línea!
fuente
Python 2 ,
128124 bytes-4 bytes gracias a Jonathan Allan !
Pruébalo en línea!
Salida como una lista, pero el enlace tio incluye una bonita impresión.
fuente
while ~0:Es algo extraño de usar cuandowhile 1:funciona bien.[[c]]salida (como esta ) EDITAR - también lo hacewhile 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 los detalles literalmente resultó ser el enfoque más corto:
Ejecutar
php -nr '<code>' <curpage> <numpages>o probarlo en línea .fuente
CJam, 74
Salidas como matriz. Pruébalo en línea
Reemplace el final
pcon laS*salida como cadena.Explicación:
fuente
Haskell,
145129 bytesPruébalo en línea!
Editar: @ Ørjan Johansen guardó 16 bytes. ¡Gracias!
fuente
unwords$, la salida de matriz está permitida. (2)s x=show x; ... s[a]es más corto, después de lo cual se puede combinar con el siguiente con:ymap, y luego seid=<<vuelve más largo que simplemente usando++s. (3)max 4a-2ymin(a+3)t-1son más cortos. Pruébalo en línea!Golf Script - 104 caracteres
Sin golf
fuente
Perl 5,
113 + 1 (-p)109 +3 (-pal) bytesPruébalo en línea
fuente
$'! Jugué un poco con esto, pero no pude descifrarlo mucho, pero al usar en<>lugar de la expresión regular y usar-apara mantener una referencia$_, pude bajar a 111: ¡ Pruébelo en línea! (-lagregado para facilitar la lectura)"@F"entradas singulares, ¡es una buena solución! Sin-lembargo, no es necesario en el recuento de bytes, solo para ejecutar todas las pruebas a la vez :). No lo dije, ¡pero tu validación de puntos suspensivos es muy buena!Rubí , 127 bytes
No estoy particularmente contento con esto, especialmente la lógica anterior / siguiente.
Pruébalo en línea!
Sin golf
fuente
PHP (navegador), 267 bytes
Pruébalo en línea!
Definitivamente no es tan pequeño como podría haber sido, y como se demostró anteriormente, usar PHP en la línea de comandos puede ser mucho más pequeño. La entrada es a través de solicitudes GET, a es el número seleccionado, b es el límite. Esto parece
foo.bar.com/index.php?a=2&b=12Sin golf
Estoy bastante seguro de que mis operadores ternarios se pueden mejorar, siéntase libre de probar.
fuente
[,$k,$n]=$argv;-><?[$k,$n]=$_GET;si insisto en que la página actual sea el primer argumento y el número de páginas el segundo;<?extract($_GET);si quiero usar argumentos con nombre.$a<$b-2con$a<$b-3para arreglar.<?=($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 con agradecimiento a @KevinCruijssen
-4 mediante el uso de variables para los valores de @Text
Básicamente, un puerto de mi Python 2 responde solo por la diversión de tratar de recordar cómo usar Formula.
No hay TIO para la fórmula, así que aquí hay una captura de pantalla de algunos de los casos de prueba:
fuente
x>a-3 & x<a+3en Lotus Notes Formula? ¿Está&xreservado para algo, o no hay ninguna razón en particular por la cual los espacios en ambos lados son obligatorios? Nunca programé en este idioma por cierto, solo tenía curiosidad. :)Excel VBA,
202201 BytesFunción de ventana inmediata anónima de VBE que toma la entrada del rango
A1:A2y las salidas a la ventana inmediata de VBE.Versión de subrutina
Incluido para legibilidad
fuente
PowerShell , 237 bytes
Pruébalo en línea!
Una concatenación de cadena gigantesca con demasiados signos de dólar.
Trabajando más en el golf.No, creo que esto es tan corto como este enfoque puede llegar.fuente
Javascript (ES6),
265263258240239220194193182178 bytes-2 de eliminar una herramienta de depuración
-5 al darme cuenta de que estoy usando ES6 y que a veces puedo eliminar los paréntesis
-18 de eliminar algo de una versión anterior que ahora está obsoleta
-1 de hacer algunas cosas furtivas
-19 de eliminar variables innecesarias
-26 bytes de eliminar los valores de Falsey demasiado complicados. Soy nuevo en ES6
-1 por usar comparaciones más cortas
-11 por usar una función recursiva
* -4 de reemplazar
?...:0con&&...y... ${t}con...+tEsto tomó demasiado de mi vida y no dio suficientes votos positivos.
pero estoy muy contento de que el código final sea una potencia de 2 (2 ^ 8). Sé que hay otra respuesta de JavaScript que tiene aproximadamente 120 bytes.pero todavía amo este códigoEDITAR: no sé lo que estaba pensando. 265 no es 2 ^ 8 ...
Mientras hacía esto, logré romper la versión sin golf. Dios, odio el código no golfista.
EDIT 2: ahora parece la mejor solución de 121 bytes
Explicación:
por venir, pero básicamente es
range(end, start)y hace algunas cosas interesantes como:pagees 1page > 4total - page < 4total - page == 0y cosas por el estilo y simplemente se une por ''. Sé que no tienes que hacerlo, pero me gusta el hecho de que es semi-convencional. No lo sé. Disfrutar.
Pruébalo en línea!
Validarlo en línea!
Aquí hay una solución de
186185174170 bytes que no me gusta: ¡ Pruébelo en línea!fuente
PowerShell , 141 bytes
Pruébalo en línea!
Menos golfizado:
fuente