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 , 6
como un caso de prueba. Similar al3, 6
caso, pero asegura que no se agreguen puntos en el lado izquierdo.4,7
caso 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
X
enX-x
.fuente
.join
es 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 unx
en las posiciones donde están los artículos ...~
no∊
miembros de1
uno,
seguido por⍵
el total,
seguido por⍳5
los 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 lasx
corridas)'x+'⎕R'...'
PCRE R eplacex
funciona 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-3
y páginacurrent+3
con la cadena"..."
,x_/;Abs[x-#]>2:>Nothing
: todas las demás páginas (enteras) debajocurrent-2
o arribacurrent+2
sin nada. (Sí,Nothing
está integrado).fuente
Funky ,
218210 bytesGuardado algunos bytes, algunos de los cuales gracias a tsh
Pruébalo en línea!
fuente
i<=p+2
se 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 elor
operador 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
current
ytotal
en ese orden.Pruébalo en línea! o ver el conjunto de pruebas .
¿Cómo?
* Como enlace diádico
current
a la izquierda ytotal
a la derecha, esto devuelve una lista con una mezcla de caracteres y enteros; Esta lista incluye los espacios.K
Sin embargo, el byte no se puede eliminar simplemente para adherirse a la especificación, ya que el resultado se colocaría entre corchetescurrent
como 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 @StewieGriffinsprintf
lugar denum2str
como ya tenía ese identificadors
.[]
a lasprint
llamada.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
p
con 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-2
ymin(a+3)t-1
son 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-a
para mantener una referencia$_
, pude bajar a 111: ¡ Pruébelo en línea! (-l
agregado para facilitar la lectura)"@F"
entradas singulares, ¡es una buena solución! Sin-l
embargo, 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=12
Sin 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-2
con$a<$b-3
para 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+3
en Lotus Notes Formula? ¿Está&x
reservado 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:A2
y 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
?...:0
con&&...
y... ${t}
con...+t
Esto 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:page
es 1page > 4
total - page < 4
total - page == 0
y 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