Il est courant de devoir créer une interface de sélection de page. Cela ressemble typiquement à ceci:
prev 1 ... 3 4 [5] 6 7 ... 173 next
Ce qui signifie qu'il y a au total 173 pages et que vous êtes actuellement à la 5ème page.
Ce défi nécessite que vous preniez le nombre total de pages et le numéro de la page actuelle en entrée, puis que vous produisiez une chaîne (ou un tableau) pour "afficher" le sélecteur de page.
Contribution
2 entiers positifs
- numéro de page actuel
- nombre de pages
Il est garanti que 1 <= actuel <= total.
Sortie
Affiche une chaîne ou un tableau représentant l'interface utilisateur pour les sélecteurs de page.
- Si la sortie est sous forme de chaîne, un seul espace (U + 0020) doit être utilisé entre chaque page.
- En cas de sortie sous forme de tableau, le tableau doit produire le même résultat que la chaîne après avoir converti chaque élément en chaîne et les joindre avec un seul espace.
- Les trois points (
...
) ne sont pas facultatifs pour la sortie de tableau.
- Les trois points (
Détails
- Si current == 1, aucun "prev" ne sera émis, sinon, "prev" vient en premier.
- Si courant == total, aucun "suivant" ne sera émis, sinon, "suivant" sera le dernier.
- La première page (1) et la dernière page (total) doivent toujours être imprimées.
- La page en cours, page (actuelle - 1), page (en cours - 2), page (en cours + 1), (page en cours + 2) doit être sortie tant qu'ils sont dans la plage de [1..total].
- Aucun autre numéro de page ne doit être sorti.
- Les pages imprimées doivent être triées par ordre croissant.
- La sortie ne doit pas contenir de numéros de page en double.
- La page en cours doit être mise en évidence en l’enveloppant dans une paire de
[]
. - S'il y a un espace entre les voisins, trois points (
...
) doivent être insérés.
Cas de test
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
Règles
- C'est du code-golf, le code le plus court gagne!
4 , 6
tant que test. Semblable au3, 6
cas, mais assure que les points ne sont pas ajoutés sur le côté gauche.4,7
cas test serait grandement apprécié - garantirait que les deux cas limites qui excluent les ellipses puissent être respectés simultanémentRéponses:
Retina ,
125113109107 octetsEssayez-le en ligne! Le lien inclut des cas de test. Sauvegardé 12 octets grâce à @MartinEnder. Explication:
Convertir en unaire.
Générez tous les numéros de page dans l'ordre inverse.
Supprimer la nouvelle ligne séparant l'entrée. (De toute façon, il y a aussi un espace dans la génération du numéro de page.)
Triez les pages par ordre croissant. Cela trie également la page actuelle, qui est maintenant dupliquée.
Sous-dupliquez et entourez
[]
la page actuelle.Ajoutez des points de suspension si la page en cours est au moins 5 ou s'il y a au moins 4 pages après la page en cours. (Remarquez l'espace de fin, pour éviter d'inclure la dernière page dans les points de suspension.)
Ajoutez le prev si la page en cours n'est pas 1.
Ajoutez le suivant si la page en cours n'est pas la dernière page.
Reconvertir en décimal.
la source
JavaScript (ES6),
130122121 octetsInvoquer avec la syntaxe de currying, par exemple
f(3)(10)
.Afficher l'extrait de code
Essayez-le en ligne!
-1 octet (Arnauld): réglé
X
surX-x
.la source
.join
ne fait pas partie de votre compte! J'étais en train de devenir fou d'essayer de comprendre pourquoi votre code fonctionnerait sans jointure, alors que mon code similaire ne fonctionnerait pas. Ensuite, je dis que vous ne l'avez tout simplement pas inclus dans votre solution, mais que vous l'avez inclus dans votre extrait de code!6502 code machine (C64), 160 octets
Démo en ligne - Utilisation:,
sys49152,[current],[total]
par exemplesys49152,5,173
.Les nombres doivent être compris dans la plage [1..255] avec le courant <= total. Comme cela n'a pas été spécifié autrement, il s'agit de la plage entière «naturelle» non signée sur un processeur 8 bits.
Explication sous forme de liste de désassemblage commentée:
la source
R ,
214 octets,168 octetsEssayez-le en ligne!
Merci à @ user2390246 pour ses bons conseils de golf
la source
c()
, qui supprime l'horrible confusion avec l'objet appeléc
.APL (Dyalog) ,
8382 octetsFonction infixe anonyme prenant le courant comme argument de gauche et le total comme argument de droite.
Essayez-le en ligne!
{
…}
Lambda explicite où⍺
et⍵
représente les arguments gauche et droit:⍺<⍵
le courant est-il inférieur au total?' next'/⍨
si c'est le cas (lit. utilisez-le pour répliquer) le texte(
…),
Préfixe ce qui suit:⍳⍵
ɩ ntegers totale de 1 à'x'@(
…)
Remplacer par unx
aux positions où se trouvent les objets…~
ne pas∊
membres de1
un,
suivi par⍵
le total,
suivi par⍳5
les cinq premières ɩ ntegers ([1,2,3,4,5]
)3-
soustrait de trois ([2,1,0,-1,-2]
)⍺+
ajouté au courant ([⍺+2,⍺+1,⍺,⍺-1,⍺-2]
)⊢
céder que (sert à séparer⍺
de'x'
)(
…)
Applique la fonction tacite suivante à la position actuelle:⍕
format (stringify)'][',
ajouter le texte1⌽
faire un tour vers la gauche (déplace le]
à la fin)⊂
enfermer (de sorte que ce soit un scalaire qui tiendra dans la seule position indiquée)∊
ε nlist (aplatissent - parce que nous l' avons fait lorsque nous avons inséré niché entre parenthèses)⍕
format (stringify - 1 espace séparant les nombres les uns des autres et des passagesx
)'x+'⎕R'...'
PCRE R eplacex
fonctionne avec trois périodes(
…),
Préfixe ce qui suit:⍺>1
le courant est-il supérieur à 1?'prev '/⍨
si c'est le cas (lit. utilisez-le pour répliquer) le textela source
Wolfram Language (Mathematica) ,
131114109 octetsEssayez-le en ligne!
Comment ça fonctionne
Beaucoup de remplacement. En commençant par une liste de toutes les pages, remplacez, dans l'ordre:
#->"["<>(t=ToString)@#<>"]"
: la page en cours avec une chaîne entre crochets,1->"prev 1"
: page 1 avec la ficelleprev 1
,#2->t@#2<>" next"
: la dernière page avec la chaîne(number) next
, avec#-3|#+3:>"..."
: pagecurrent-3
et pagecurrent+3
avec la chaîne"..."
,x_/;Abs[x-#]>2:>Nothing
: toutes les autres (entières) pages cicurrent-2
- dessous ou ci -dessuscurrent+2
avec rien. (Oui,Nothing
est intégré.)la source
Funky ,
218210 octetsEnregistré quelques octets, dont certains grâce à tsh
Essayez-le en ligne!
la source
i<=p+2
on puisse jouer au golfi<p+3
, ett[2]="["+t[2]+"]"
peut-êtret[2]="["+p+"]"
?Python 2 ,
136130 octetsEssayez-le en ligne!
Essayez-le en ligne!sous forme prettifiée, où vous pouvez voir que le pied de page se traduit littéralement par "convertir chacun en chaîne, joindre sur des espaces".
C'est une alternative à l'approche de Lynn.
la source
i or'...'
et des zéros (comme celui-ci )Python 2 , 135 octets
Essayez-le en ligne!
Tout d’abord, nous créons une chaîne semblable à une
prev 1 3 4 [5] 6 7 10 next
«lacune» résultant de l’effacement de certains nombres, mais pas de leurs espaces de délimitation. Ensuite, nous remplaçons toute série de 2 espaces ou plus en...
utilisant une expression régulière.la source
(-3<x-c<3or x%t<2)
sur(x%t<2or-3<x-c<3)
-1, les deux arguments de l'or
opérateur renverront une valeur booléenne.Java 8,
201200197 octetsExplication:
Essayez-le ici.
la source
Java (OpenJDK 8) ,
218179177167166 octetsEssayez-le en ligne!
la source
"["+c+"] ";
p+=
avant la boucle for dans la déclaration de boucle for: 171 octetsGelée , 59 octets
Un programme complet * imprimant le résultat sur STDOUT. Prend les arguments
current
ettotal
dans cet ordre.Essayez-le en ligne!ou voir la suite de tests .
Comment?
* En tant que lien dyadique prenant
current
à gauche ettotal
à droite, une liste contenant un mélange de caractères et d’entiers est renvoyée. cette liste comprend les espaces. L'octetK
ne peut pas simplement être supprimé pour adhérer à la spécification cependant, car le résultat aurait alors lescurrent
caractères séparés entre crochets (comme[...'[','5','2',']'...]
), de sorte que "convertir chaque élément en chaîne et les joindre avec un seul espace" ne produirait pas le résultat souhaité. )la source
Python 2 ,
178170 octetsEssayez-le en ligne!
Deuxième tentative après avoir lu les règles plus attentivement.
-8 en perdant des crochets inutiles.
la source
Octave ,
169 196 190 181 175 175166 166 octetsEssayez-le en ligne!
Je vais ajouter une explication plus tard.
Hmm, il semble y avoir quelques problèmes avec le format de sortie. Celles-ci sont maintenant résolues - toutes les sorties sont correctes. Mais hélas, ça coûte 27 octets. Parvenu à griffer tous ces dos avec un peu de gros gras.
*
au lieu de.*
- merci @StewieGriffinsprintf
au lieu denum2str
comme j'avais déjà cette poignée danss
.[]
à l'sprint
appel.strtrim()
sans créer d'espace.la source
C # (.NET Core) ,
195192 octets3 octets sauvés grâce à Kevin Cruijssen.
Essayez-le en ligne!
la source
c=>t=>
. Essayez-le ici: 192 octetsC ++ - 247 octets
Essayez-le en ligne!
la source
Python 2 ,
128124 octets-4 octets merci à Jonathan Allan !
Essayez-le en ligne!
Sortir sous forme de liste, mais ce lien inclut de jolies impressions.
la source
while ~0:
est une chose étrange à utiliser lorsquewhile 1:
fonctionne bien.[[c]]
sortie (comme ceci ) EDIT - il en est de mêmewhile 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 octetsprendre les détails s'est avéré être l'approche la plus courte:
Courez avec
php -nr '<code>' <curpage> <numpages>
ou essayez-le en ligne .la source
CJam, 74
Les sorties sous forme de tableau. Essayez-le en ligne
Remplacez la finale
p
par laS*
sortie sous forme de chaîne.Explication:
la source
Haskell,
145129 octetsEssayez-le en ligne!
Edit: @ Ørjan Johansen a enregistré 16 octets. Merci!
la source
unwords$
, la sortie du tableau est autorisée. (2)s x=show x; ... s[a]
est plus court, après quoi il peut être fusionné avec le suivant avec:
etmap
, puisid=<<
devient plus long que le simple fait d'utiliser++
s. (3)max 4a-2
etmin(a+3)t-1
sont plus courts. Essayez-le en ligne!Script de golf - 104 personnages
Ungolfed
la source
Perl 5,
113 + 1 (-p)109 +3 (-pal) octetsEssayez-le en ligne
la source
$'
! J'ai eu un petit jeu avec ça, mais je n'ai pas réussi à le réduire beaucoup, mais en utilisant<>
au lieu de regex et en utilisant-a
pour garder une référence à$_
, j'ai pu passer à 111: Essayez-le en ligne! (-l
ajouté pour plus de lisibilité)"@F"
entrées uniques, c’est une bonne solution de contournement! Le-l
nombre d'octets n'est cependant pas nécessaire, mais uniquement pour l'exécution de tous les tests en même temps :). Je n'ai pas dit, mais la validation de vos points de suspension est très agréable!Ruby , 127 octets
Je ne suis pas particulièrement satisfait de cela, en particulier de la logique précédente / suivante.
Essayez-le en ligne!
Ungolfed
la source
PHP (navigateur), 267 octets
Essayez-le en ligne!
Certainement pas aussi petit qu'il aurait pu l'être, et comme cela a été démontré ci-dessus, utiliser PHP en ligne de commande peut être beaucoup plus petit. La saisie s'effectue via des requêtes GET, a est le nombre sélectionné, b est la limite. Cela ressemble à
foo.bar.com/index.php?a=2&b=12
Ungolfed
Je suis assez sûr que mes opérateurs ternaires peuvent être améliorés, n'hésitez pas à essayer.
la source
[,$k,$n]=$argv;
-><?[$k,$n]=$_GET;
si j'insiste pour que la page en cours soit le premier argument et le nombre de pages le second;<?extract($_GET);
si je veux utiliser des arguments nommés.$a<$b-2
par$a<$b-3
pour réparer.<?=($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)Formule IBM / Lotus Notes,
217211 octets-2 grâce à @KevinCruijssen
-4 en utilisant des variables pour les valeurs @Text
En gros, un portage de Python 2 répond juste pour le plaisir d'essayer de se rappeler comment utiliser Formula.
Il n'y a pas de TIO pour Formula, voici donc une capture d'écran de certains des cas de test:
la source
x>a-3 & x<a+3
dans la formule Lotus Notes? Est-ce&x
réservé à quelque chose, ou n'y a-t-il pas de raison particulière pour laquelle les espaces des deux côtés sont obligatoires? Je n'ai jamais programmé dans cette langue, j'étais simplement curieux. :)Excel VBA,
202201 octetsFonction de fenêtre immédiate VBE anonyme qui prend les entrées de la plage
A1:A2
et les envoie à la fenêtre immédiate VBE.Version du sous-programme
Inclus pour la lisibilité
la source
PowerShell , 237 octets
Essayez-le en ligne!
Une concaténation de cordes gigantesque avec beaucoup trop de signes dollar.
Travailler sur le golf plus loin.Non, je pense que c'est aussi court que cette approche peut aller.la source
Javascript (ES6),
265263258240239220194193182178 octets-2 de la suppression d'un outil de débogage
-5 de réaliser que j'utilise ES6 et que je peux parfois me passer de parenthèses
-18 de supprimer quelque chose d'une version antérieure qui est maintenant obsolète
-1 de faire des trucs sournois
-19 de supprimer les variables inutiles
-26 octets pour supprimer les valeurs de falsey trop compliquées. Je suis nouveau sur ES6
-1 d'utiliser des comparaisons plus courtes
-11 d'utiliser une fonction récursive
* -4 de remplacer
?...:0
par&&...
et... ${t}
avec...+t
Cela a pris beaucoup trop de temps dans ma vie et n’a pas donné assez de votes positifs.
mais je suis si heureux que le code final soit une puissance de 2 (2 ^ 8).Je sais qu'il existe une autre réponse JavaScript d'environ 120 octets.mais j'aime toujours ce codeEDIT: Je ne sais pas ce que je pensais. 265 n'est pas 2 ^ 8 ...
En faisant cela, j'ai réussi à casser la version non-golfée. Mon Dieu, est-ce que je déteste le code non-golfeur?
EDIT 2: cela ressemble maintenant à la meilleure solution de 121 octets
Explication:
à venir mais fondamentalement y est
range(end, start)
et il fait des trucs sympas comme:page
is 1page > 4
total - page < 4
total - page == 0
et des trucs comme ça et juste rejoint par ''. Je sais que vous n'êtes pas obligé de le faire mais j'aime le fait que ce soit semi conventionnel. Je ne sais pas. Prendre plaisir.
Essayez-le en ligne!
Validez-le en ligne!
Voici un
186185174170 solution d'octets que je ne aime pas: Essayez en ligne!la source
PowerShell , 141 octets
Essayez-le en ligne!
Moins joué au golf:
la source