Gehe zur N-ten Seite


47

Es ist üblich, eine Seitenauswahlschnittstelle zu erstellen. Es sieht normalerweise so aus:

prev 1 ... 3 4 [5] 6 7 ... 173 next

Das bedeutet, dass insgesamt 173 Seiten vorhanden sind und Sie sich derzeit auf der 5. Seite befinden.

Für diese Herausforderung müssen Sie die Gesamtzahl der Seiten und die aktuelle Seitenzahl als Eingabe verwenden und eine Zeichenfolge (oder ein Array) ausgeben, um die Seitenauswahl anzuzeigen.

Eingang

2 positive ganze Zahlen

  • aktuelle Seitennummer
  • Anzahl der Seiten

Es ist garantiert, dass 1 <= aktuell <= gesamt.

Ausgabe

Geben Sie eine Zeichenfolge oder ein Array aus, das die Benutzeroberfläche für die Seitenauswahl darstellt.

  • Bei der Ausgabe als Zeichenfolge sollte zwischen jeder Seite ein einzelnes Leerzeichen (U + 0020) verwendet werden.
  • Bei der Ausgabe als Array sollte das Array dasselbe Ergebnis wie die Zeichenfolge erzeugen, nachdem jedes Element in eine Zeichenfolge konvertiert und mit einem einzelnen Leerzeichen verbunden wurde.
    • Die drei Punkte ( ...) sind für die Array-Ausgabe nicht optional.

Einzelheiten

  • Wenn current == 1, wird kein "prev" ausgegeben, ansonsten steht "prev" an erster Stelle.
  • Wenn current == total, wird kein "next" ausgegeben, andernfalls kommt "next" als letztes.
  • Die erste Seite (1) und die letzte Seite (gesamt) sollten immer ausgegeben werden.
  • Die aktuelle Seite, (aktuelle - 1) Seite, (aktuelle - 2) Seite, (aktuelle + 1) Seite, (aktuelle + 2) Seite sollte ausgegeben werden, solange sie im Bereich von [1..Total] liegen.
  • Es sollten keine anderen Seitenzahlen ausgegeben werden.
  • Die ausgegebenen Seiten sollten in aufsteigender Reihenfolge sortiert werden.
  • Die Ausgabe sollte keine doppelten Seitenzahlen enthalten.
  • Die aktuelle Seite sollte hervorgehoben werden, indem Sie sie in ein Paar von einwickeln [].
  • Wenn zwischen Nachbarn eine Lücke besteht, sollten drei Punkte ( ...) eingefügt werden.

Testfälle

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

Regeln

  • Das ist Code-Golf, der kürzeste Code gewinnt!

7
Könnte es wert sein, 4 , 6als Testfall hinzugefügt zu werden. Ähnlich wie im 3, 6Fall, stellt jedoch sicher, dass keine Punkte auf der linken Seite hinzugefügt werden.
Tom Carpenter

3
Ich werde nur einige davon für ein Webprojekt NACHDENKEN ...
Stan Strum

2
Aufbauend auf @TomCarpenters Kommentar wäre ein 4,7Testfall sehr dankbar - würde sicherstellen, dass beide Grenzfälle, die Ellipsen ausschließen, gleichzeitig erfüllt sind
Taylor Scott

1
@ TaylorScott Beide hinzugefügt.
8.

2
@StanStrum Die nächste Herausforderung besteht darin, einen unendlichen Scroller zu schreiben.
Carl

Antworten:


9

Retina , 125 113 109 107 Bytes

.+
$*
r`1\G
 1$'
¶

O`1+
\b(1+) \1\b
[$1]
 .* (1+ 1+ \[)|(] 1+ 1+) .* 
$2 ... $1
^1
prev 1
1$
1 next
1+
$.&

Probieren Sie es online! Link enthält Testfälle. 12 Bytes dank @MartinEnder eingespart. Erläuterung:

.+
$*

In Unary konvertieren.

r`1\G
 1$'

Generieren Sie alle Seitenzahlen in umgekehrter Reihenfolge.

Löschen Sie den Zeilenumbruch, der die Eingabe trennt. (Es gibt dort sowieso auch ein Leerzeichen von der Seitenzahlengenerierung.)

O`1+

Sortieren Sie die Seiten wieder in aufsteigender Reihenfolge. Dadurch wird auch die aktuelle Seite sortiert, die jetzt dupliziert wird.

\b(1+) \1\b
[$1]

Duplizieren Sie und wickeln Sie []s um die aktuelle Seite.

 .* (1+ 1+ \[)|(] 1+ 1+) .* 
$2 ... $1

Fügen Sie ein Auslassungszeichen hinzu, wenn die aktuelle Seite mindestens 5 oder mindestens 4 Seiten nach der aktuellen Seite sind. (Um zu vermeiden, dass die letzte Seite in die Auslassungspunkte einbezogen wird, beachten Sie das nachstehende Leerzeichen.)

^1
prev 1

Füge das Vorherige hinzu, wenn die aktuelle Seite nicht 1 ist.

1$
1 next

Fügen Sie die nächste hinzu, wenn die aktuelle Seite nicht die letzte Seite ist.

1+
$.&

Zurück in Dezimalzahl konvertieren.


1
Ein paar Bytes gespart : tio.run/… (eines davon erforderte das Ändern des Eingabeformats auf Zeilenvorschubtrennung).
Martin Ender

@MartinEnder Danke, ich mag besonders das nachlaufende Ellipsengolf, obwohl ich denke, dass ich weitere <s> drei </ s> vier Bytes abschneiden kann.
Neil

9

JavaScript (ES6), 130 122 121 Byte

Mit der aktuellen Syntax aufrufen, z f(3)(10).

x=>X=>[x>1&&'prev 1',x>4&&'...',x>3&&x-2,x>2&&x-1,`[${x}]`,(X-=x)>1&&x+1,X>2&&x+2,X>3&&'...',X&&X+x+' next'].filter(_=>_)

Probieren Sie es online!

-1 Byte (Arnauld): Set Xan X-x.


Ich muss diese Lambdas lieben
Stan Strum

Sie sollten +8 hinzufügen ... Das .joinist nicht Teil Ihrer Zählung! Ich wurde verrückt, um herauszufinden, warum Ihr Code ohne Join funktionieren würde, während mein ähnlicher Code dies nicht tun würde. Dann sage ich, dass Sie es einfach nicht in Ihre Lösung aufgenommen haben, sondern in Ihr Snippet!
nl-x

@ nl-x Hoppla! Ich habe vergessen, mein Snippet zu aktualisieren. Mit dieser Herausforderung können Sie eine Zeichenfolge oder ein Array ausgeben. Ich würde empfehlen, dass Sie als Array ausgeben.
darrylyeo

7

6502 Maschinencode (C64), 160 Bytes

00 C0 20 9B B7 86 FB CA F0 01 CA 86 FD 20 9B B7 86 FC A6 FB E8 E4 FC B0 01 E8
86 FE A2 01 E4 FB F0 1A A9 91 A0 C0 20 1E AB A2 02 E4 FD B0 0D A9 2E 20 D2 FF
CA 10 FA 20 3F AB A6 FD 86 9E E4 FB D0 05 A9 5B 20 D2 FF A9 00 20 CD BD A6 9E
E4 FB D0 05 A9 5D 20 D2 FF 20 3F AB A6 9E E4 FC F0 25 E4 FE F0 05 E8 86 9E D0
D5 E8 E4 FC F0 0D A2 02 A9 2E 20 D2 FF CA 10 FA 20 3F AB A6 FC A9 00 20 CD BD
20 3F AB A6 FC E4 FB F0 07 A9 99 A0 C0 20 1E AB 60 50 52 45 56 20 31 20 00 4E
45 58 54 00

Online-Demo - Verwendung: sys49152,[current],[total] zBsys49152,5,173.

Die Zahlen müssen im Bereich [1..255] mit aktuell <= gesamt liegen. Da dies nicht anders angegeben wurde, ist dies der "natürliche" vorzeichenlose Ganzzahlbereich auf einem 8-Bit-Prozessor.


Erklärung als kommentierte Zerlegungsliste:

         00 C0       .WORD $C000        ; load address
.C:c000  20 9B B7    JSR $B79B          ; read 8bit integer
.C:c003  86 FB       STX $FB            ; store current page
.C:c005  CA          DEX                ; calculate lower start for ...
.C:c006  F0 01       BEQ .stl
.C:c008  CA          DEX
.C:c009   .stl:
.C:c009  86 FD       STX $FD            ; ... range and store
.C:c00b  20 9B B7    JSR $B79B          ; read 8bit integer
.C:c00e  86 FC       STX $FC            ; store total pages
.C:c010  A6 FB       LDX $FB            ; load current page
.C:c012  E8          INX                ; calculate upper end for ...
.C:c013  E4 FC       CPX $FC
.C:c015  B0 01       BCS .stu
.C:c017  E8          INX
.C:c018   .stu:
.C:c018  86 FE       STX $FE            ; ... range and store
.C:c01a  A2 01       LDX #$01           ; check whether first page is current
.C:c01c  E4 FB       CPX $FB
.C:c01e  F0 1A       BEQ .sequence      ; then directly to sequence
.C:c020  A9 91       LDA #<.prev        ; output string for ...
.C:c022  A0 C0       LDY #>.prev
.C:c024  20 1E AB    JSR $AB1E          ; ... "prev 1 "
.C:c027  A2 02       LDX #$02           ; check whether page 2 is in range ...
.C:c029  E4 FD       CPX $FD
.C:c02b  B0 0D       BCS .sequence      ; ... then directly to sequence
.C:c02d  A9 2E       LDA #$2E           ; load character '.'
.C:c02f   .ellip1:
.C:c02f  20 D2 FF    JSR $FFD2          ; output ...
.C:c032  CA          DEX
.C:c033  10 FA       BPL .ellip1        ; ... 3 times
.C:c035  20 3F AB    JSR $AB3F          ; output space
.C:c038  A6 FD       LDX $FD            ; load lower start for range
.C:c03a   .sequence:
.C:c03a  86 9E       STX $9E            ; store to temporary
.C:c03c   .seqloop:
.C:c03c  E4 FB       CPX $FB            ; compare with current
.C:c03e  D0 05       BNE .notcurrent1   ; yes -> output '['
.C:c040  A9 5B       LDA #$5B
.C:c042  20 D2 FF    JSR $FFD2
.C:c045   .notcurrent1:
.C:c045  A9 00       LDA #$00
.C:c047  20 CD BD    JSR $BDCD          ; output number
.C:c04a  A6 9E       LDX $9E            ; compare with current
.C:c04c  E4 FB       CPX $FB
.C:c04e  D0 05       BNE .notcurrent2   ; yes -> output ']'
.C:c050  A9 5D       LDA #$5D
.C:c052  20 D2 FF    JSR $FFD2
.C:c055   .notcurrent2:
.C:c055  20 3F AB    JSR $AB3F          ; output space
.C:c058  A6 9E       LDX $9E
.C:c05a  E4 FC       CPX $FC            ; compare position with last page
.C:c05c  F0 25       BEQ .printnext     ; if eq jump to part printing "next"
.C:c05e  E4 FE       CPX $FE            ; compare position to upper end of range
.C:c060  F0 05       BEQ .printellip2   ; if eq jump to part printing "..."
.C:c062  E8          INX
.C:c063  86 9E       STX $9E            ; next number
.C:c065  D0 D5       BNE .seqloop       ; and repeat loop for sequence
.C:c067   .printellip2:
.C:c067  E8          INX
.C:c068  E4 FC       CPX $FC            ; compare next number with last page
.C:c06a  F0 0D       BEQ .printlast     ; if eq jump to part printing page num
.C:c06c  A2 02       LDX #$02
.C:c06e  A9 2E       LDA #$2E           ; load character '.'
.C:c070   .ellip2:
.C:c070  20 D2 FF    JSR $FFD2          ; output ...
.C:c073  CA          DEX
.C:c074  10 FA       BPL .ellip2        ; ... 3 times
.C:c076  20 3F AB    JSR $AB3F          ; output space
.C:c079   .printlast:
.C:c079  A6 FC       LDX $FC            ; output last page number
.C:c07b  A9 00       LDA #$00
.C:c07d  20 CD BD    JSR $BDCD
.C:c080  20 3F AB    JSR $AB3F          ; output space
.C:c083   .printnext:
.C:c083  A6 FC       LDX $FC            ; compare current page with last page
.C:c085  E4 FB       CPX $FB
.C:c087  F0 07       BEQ .done          ; if eq nothing else to do
.C:c089  A9 99       LDA #<.next        ; output string for ...
.C:c08b  A0 C0       LDY #>.next
.C:c08d  20 1E AB    JSR $AB1E          ; "next"
.C:c090   .done:
.C:c090  60          RTS
.C:c091   .prev:
.C:c091  50 52 45 56 .BYTE "prev"
.C:c095  20 31 20 00 .BYTE " 1 ", $00
.C:c099   .next:
.C:c099  4E 45 58 54 .BYTE "next"
.C:c09d  00          .BYTE $00

6

R , 214 Bytes 168 Bytes

function(c,m,`~`=function(x,y)if(x)cat(y)){o=-2:2+c
o=o[o>0&o<=m]
o[o==c]=paste0('[',c,']')
c>1~'prev '
c>3~'1 '
c>4~' ... '
T~o
c+3<m~' ...'
c+2<m~c('',m)
c<m~' next'}

Probieren Sie es online!

Vielen Dank an @ user2390246 für einige großartige Golftipps



186 Bytes mit einer Umkehrung der Logik. Fühlt sich nicht wirklich nach einer bestimmten Prämisse an.
CriminallyVulgar

2
165 Bytes mit weiterem Golfen. Verwendet auch nicht die Funktion c(), die die schreckliche Verwechslung mit dem aufgerufenen Objekt beseitigt c.
user2390246

2
Sichern Sie bis zu 171 Byte und korrigieren Sie einen Fehler, der in mehreren der kommentierten Versionen auftritt!
user2390246

1
Eine weitere kleine Verbesserung für 164 Bytes . Tut mir leid, dass ich das komplett gekapert habe, ich wurde ein bisschen mitgerissen!
user2390246

5

APL (Dyalog) , 83 82 Bytes

Anonyme Infix-Funktion, die das aktuelle Argument als linkes Argument und das gesamte Argument als rechtes Argument verwendet.

{('prev '/⍨⍺>1),('x+'R'...'⍕∊(⊂1'][',⍕)@⍺⊢'x'@(~∊∘(1,⍵,⍺+3-⍳5))⍳⍵),' next'/⍨⍺<⍵}

Probieren Sie es online!

{} Explizites Lambda wo und repräsentieren die linken und rechten Argumente:

⍺<⍵ ist aktuell kleiner als gesamt?

' next'/⍨ wenn ja, (benutze das um den Text zu replizieren)

(), Folgendes voranstellen:

  ⍳⍵Zahlen von 1 bis insgesamt

  'x'@(An den Stellen, an denen sich die Gegenstände befinden ) , durch ein ersetzen.x

   ~ nicht

    Mitglieder von

   1 einer

   , gefolgt von

    die Summe

   , gefolgt von

    ⍳5 der erste fünf ɩ ntegers ( [1,2,3,4,5])

    3- subtrahiert von drei ( [2,1,0,-1,-2])

    ⍺+ zum aktuellen hinzugefügt ( [⍺+2,⍺+1,⍺,⍺-1,⍺-2])

    ergeben, dass (dient zur Trennung von 'x')

   () Wenden an der aktuellen Position die folgende stillschweigende Funktion an :

     format (stringify)

    '][', stellen Sie den Text voran " 

    1⌽ einen Schritt nach links drehen (bewegt das ]zum Ende)

     einschließen (so dass es ein Skalar ist, der in die einzelne angegebene Position passt)

   ϵ nlist (Abflachen - weil wir es geschachtelt gemacht haben, als wir Klammern eingefügt haben)

    Format (Stringify - 1 Leerzeichen, das Zahlen voneinander und von xLäufen trennt )

  'x+'⎕R'...' PCRE R ePlace xLäufe mit drei Perioden

(), Folgendes voranstellen:

  ⍺>1 ist aktuell größer als 1?

  'prev '/⍨ wenn ja, (benutze das um den Text zu replizieren)


5

Wolfram Language (Mathematica) , 131 114 109 Bytes

Range@#2/.{#->"["<>(t=ToString)@#<>"]",1->"prev 1",#2->t@#2<>" next",#-3|#+3:>"...",x_/;Abs[x-#]>2:>Nothing}&

Probieren Sie es online!

Wie es funktioniert

Viel zu ersetzen. Beginnen Sie mit einer Liste aller Seiten und ersetzen Sie sie in der folgenden Reihenfolge:

  1. #->"["<>(t=ToString)@#<>"]": die aktuelle Seite mit einer Klammer,
  2. 1->"prev 1": Seite 1 mit der Zeichenfolge prev 1,
  3. #2->t@#2<>" next": die letzte Seite mit dem String (number) next, mit
  4. #-3|#+3:>"...": Seite current-3und Seite current+3mit der Zeichenfolge "...",
  5. x_/;Abs[x-#]>2:>Nothing: alle anderen (ganzzahligen) Seiten darunter current-2oder darüber current+2mit nichts. (Ja, Nothingist eingebaut.)

4

Funky , 218 210 Bytes

Einige Bytes gespeichert, einige dank tsh

p=>m=>{t={}a=t::push b=t::pop fori=p-2i<p+3i++a(i)t[2]="[%i]"%p whilet[0]<1b(0)whilet[n=-1+#t]>m b(n)ifp>4a(0,"...")ifp>3a(0,1)ifp>1a(0,"prev")ifp<m-3a("...")ifp<m-2a(m)ifp<m a("next")t::reduce((a,b)=>a+" "+b)}

Probieren Sie es online!


Ich kenne Funky nicht, aber es scheint, dass i<=p+2man Golf spielen i<p+3kann und t[2]="["+t[2]+"]"kann t[2]="["+p+"]"?
tsh

4

Python 2 , 136 130 Bytes

lambda p,n:[i for i,j in zip(['prev',1,'...',p-2,p-1,[p],p+1,p+2,'...',n,'next'],[1,3,4,2,1,.1,-n,1-n,3-n,2-n,-n])if p*cmp(j,0)>j]

Probieren Sie es online!

Bei der Ausgabe als Array sollte das Array dasselbe Ergebnis wie die Zeichenfolge erzeugen, nachdem jedes Element in eine Zeichenfolge konvertiert und mit einem einzelnen Leerzeichen verbunden wurde.

Probieren Sie es online! In einer hübschen Form, in der die Fußzeile zu sehen ist, bedeutet dies wörtlich übersetzt "konvertiere jede in eine Zeichenfolge, verbinde Leerzeichen".

Dies ist eine Alternative zu Lynns Ansatz.


Speichern Sie ein Byte mit i or'...'und Nullen (wie folgt )
Jonathan Allan

3

Python 2 , 135 Bytes

lambda c,t:re.sub('  +',' ... ','prev '*(c>1)+' '.join(`[x,[x]][x==c]`*(x%t<2or-3<x-c<3)for x in range(1,t+1))+' next'*(c<t))
import re

Probieren Sie es online!

Zuerst erstellen wir eine Zeichenkette prev 1 3 4 [5] 6 7 10 next, die "Lücken" aufweist, die durch das Löschen einiger Zahlen, aber nicht durch deren Begrenzungsräume verursacht werden. Dann ersetzen wir jede Folge von 2+ Leerzeichen durch ...einen regulären Ausdruck.


Sie können (-3<x-c<3or x%t<2)nach (x%t<2or-3<x-c<3)-1 wechseln. Beide Argumente an den orOperator geben einen booleschen Wert zurück.
Erik der Outgolfer

3

Java 8, 201 200 197 Bytes

t->n->(n<2?"[1] ":"prev 1 ")+(n>4?"... "+(n-2)+" "+~-n+" ["+n+"] ":n>3?"2 3 [4] ":n>2?"2 [3] ":n>1?"[2] ":"")+(n<t?(n>t-2?"":n>t-3?t-1+" ":n>t-4?(t-2)+" "+~-t+" ":++n+" "+-~n+" ... ")+t+" next":"")

Erläuterung:

Probieren Sie es hier aus.

t->n->             // Method with two integer parameters and String return-type
  (n<2?            //  If the current page is 1:
    "[1] "         //   Start with literal "[1] "
   :               //  Else:
    "prev 1 ")     //   Start with literal "prev 1"
  +(n>4?           //  +If the current page is larger than 4:
     "... "        //    Append literal "... "
     +(n-2)+" "    //    + the current page minus 2, and a space
     ~-n           //    + the current page minus 1, and a space
     +" ["+n+"] "  //    + "[current_page]" and a space
    :n>3?          //   Else-if the current page is 4:
     "2 3 [4] "    //    Append literal "2 3 [4] "
    :n>2?          //   Else-if the current page is 3:
     "2 [3] "      //    Append literal "2 [3] "
    :n>1?          //   Else-if the current page is 2:
     "[2] "        //    Append literal "[2] "
    :              //   Else (the current page is 1):
     "")           //    Append nothing
  +(n<t?           //  +If the current page and total amount of pages are not the same:
     (n>t-2?       //    If the current page is larger than the total minus 2:
       ""          //     Append nothing
      :n>t-3?      //    Else-if the current page is larger than the total minus 3:
       t-1+" "     //     Append the total minus 1, and a space
      :n>t-4?      //    Else-if the current page is larger than the total minus 4:
       (t-2)+" "   //     Append the total minus 2, and a space
       +~-t+" "    //     + the total minus 1, and a space
      :            //    Else:
       ++n+" "     //     Append the current page plus 1, and a space
       +-~n+       //     + the current page plus 2, and a space
       " ... ")    //     + literal "... "
     +t            //    + the total itself
     +" next")     //    + literal " next"
    :              //   Else (current page and total amount of pages are the same):
     "")           //    Append nothing
                   // End of method (implicit / single-line return-statement)

3

Java (OpenJDK 8) , 218 179 177 167 166 Bytes

c->t->{String p,e="... ",x="["+c+"] ";int i=c-2;for(p=c>1?"prev 1 "+(c>4?e:""):x;i<c+3;i++)p+=i>1&i<t?i==c?x:i+" ":"";return p+(i<t-1?e:"")+(c<t?t+" next":t>1?x:"");}

Probieren Sie es online!


Schöne Antwort, kürzer als meine! Sie können fünf Bytes Golf spielen, indem Sie ein Leerzeichen setzen, das bereits "["+c+"] ";
folgt

Oh, und noch ein Byte, indem Sie das letzte p+=vor der for-Schleife in die for-Loop-Deklaration
einfügen

3

Jelly , 59 Bytes

+2Rṫ-4>Ðḟ⁹1;;QµI’a3R”.ṁ⁸żẎ
Ị¬;n“¢©ỵY“¡&ç»ẋ"W€jçLÐfKṣ⁸j⁸WŒṘ¤

Ein vollständiges Programm *, das das Ergebnis in STDOUT ausgibt. Argumentiert currentund totalin dieser Reihenfolge.

Probieren Sie es online! oder sehen Sie sich die Testsuite an .

Wie?

+2Rṫ-4>Ðḟ⁹1;;QµI’a3R”.ṁ⁸żẎ - Link 1, numbers and ellipses: current, total
                           -                                   e.g. 52, 173
 2                         - literal two                            2
+                          - add to current                         54
  R                        - range                                  [1,2,3,...,53,54]
    -4                     - literal minus four                     -4
   ṫ                       - tail from index (i.e. right five)      [50,51,52,53,54]
         ⁹                 - chain's right argument, total          173
       Ðḟ                  - filter discard if:
      >                    -  greater than?                         [50,51,52,53,54]
          1                - literal one                            1
           ;               - concatenate                            [1,50,51,52,53,54]
            ;              - concatenate (implicit right = total)   [1,50,51,52,53,54,173]
             Q             - unique (remove excess 1 and/or total)  [1,50,51,52,53,54,173]
              µ            - new monadic chain, call that X
               I           - incremental differences                [49,1,1,1,1,119]
                ’          - decrement (vectorises)                 [48,0,0,0,0,118]
                  3        - literal three                          3
                 a         - logical and (vectorises)               [3,0,0,0,0,3]
                   R       - range (vectorises)                     [[1,2,3],[],[],[],[],[1,2,3]]
                    ”.     - literal '.' character                  '.'
                      ṁ    - mould like that                        [['.','.','.'],[],[],[],[],['.','.','.']]
                       ⁸   - chain's left argument, X               [1,50,51,52,53,54,173]
                        ż  - zip with that                          [[1,['.', '.', '.']],[50,[]],[51,[]],[52,[]],[53,[]],[54,['.','.','.']],[173]]
                         Ẏ - tighten                                [1,['.', '.', '.'],50,[],51,[],52,[],53,[],54,['.','.','.'],173]

Ị¬;n“¢©ỵY“¡&ç»ẋ"W€jçLÐfKṣ⁸j⁸WŒṘ¤ - Main link: current, total   e.g. 52, 173
Ị                                - insignificant? (abs(current)<=1)  0
 ¬                               - logical not                       1
   n                             - not equal (current != total)      1
  ;                              - concatenate                       [1,1]
    “¢©ỵY“¡&ç»                   - list of compressed strings        [['p','r','e','v'], ['n','e','x','t']]
               "                 - zip with:
              ẋ                  -   repeat (zeros -> empty lists)   [['p','r','e','v'], ['n','e','x','t']]
                W€               - wrap €ach (prep for the join)     [[['p','r','e','v']], [['n','e','x','t']]]
                   ç             - call last link (1) as a dyad      [1,['.', '.', '.'],50,[],51,[],52,[],53,[],54,['.','.','.'],173]
                  j              - join                              [['p','r','e','v'],1,['.','.','.'],50,[],51,[],52,[],53,[],54,['.','.','.'],173,['n','e','x','t']]
                     Ðf          - filter keep if:
                    L            -   length (removes empty lists)    [['p','r','e','v'],1,['.','.','.'],50,51,52,53,54,['.','.','.'],173,['n','e','x','t']]
                       K         - join with spaces                  ['p','r','e','v',' ',1,' ','.','.','.',' ',50,' ',51,' ',52,' ',53,' ',54,' ','.','.','.',' ',173,' ','n','e','x','t']
                         ⁸       - chain's left argument, current    52
                        ṣ        - split at that                     [['p','r','e','v',' ',1,' ','.','.','.',' ',50,' ',51,' ',],[,' ',53,' ',54,' ','.','.','.',' ',173,' ','n','e','x','t']]
                               ¤ - nilad followed by link(s) as a nilad:
                           ⁸     -   chain's left argument, current  52
                            W    -   wrap                            [52]
                             ŒṘ  -   Python string representation    ['[','5','2',']']
                          j      - join                              ['p','r','e','v',' ',1,' ','.','.','.',' ',50,' ',51,' ','[','5','2',']',' ',53,' ',54,' ','.','.','.',' ',173,' ','n','e','x','t']
                                 - implicit print                    prev 1 ... 50 51 [52] 53 54 ... 173 next

* Als dyadische Verknüpfung currentauf der linken und totalrechten Seite wird eine Liste mit einer Mischung aus Zeichen und ganzen Zahlen zurückgegeben. Diese Liste enthält die Leerzeichen. Das Byte Kkann jedoch nicht einfach entfernt werden, um die Spezifikation einzuhalten, da das Ergebnis dann in eckige Klammern current(wie [...'[','5','2',']'...]) gesetzt wird, sodass die Option "Konvertiere jedes Element in eine Zeichenfolge und verbinde sie mit einem Leerzeichen" nicht zum gewünschten Ergebnis führt )


2

Python 2 , 178 170 Bytes

x,y=input()
e="... ",""
o=("Prev 1 ","[1] ")[y<2]+e[y<5]
for z in range(2,x):o+=("",(`z`,`[z]`)[z==y]+" ")[y-3<z<y+3]
print o+("",e[x-y<4]+(`x`+" Next",`[x]`)[y==x])[x>1]

Probieren Sie es online!

Zweiter Versuch, nachdem Sie die Regeln genauer gelesen haben.

-8 durch den Verlust einiger nicht benötigter Klammern.


2

Octave , 169 196 190 181 175 169 166 Bytes

@(n,m)(r=[(n>1)*'prev ' (g=n>4)*'1 ... ' (s=@sprintf)(f='%d ',max(n-3+g,1):n-1) s('[%d]',n) 32*(q=n<m) s(f,n+1:min(n+3-(l=n<m-3),m)) l*['... ' s(f,m)] q*'next'])(r>0)

Probieren Sie es online!

Ich werde später eine Erklärung hinzufügen.

Hmm, anscheinend gab es einige Probleme mit dem Ausgabeformat. Diese wurden nun behoben - alle Ausgaben sind korrekt. Aber leider kostete es 27 Bytes. Schaffte es, alle mit ein wenig Fettabbau zurück zu krallen.


  • Sparen Sie 6 Byte, indem Sie *anstelle von " .*-" @StewieGriffin verwenden
  • Speichern Sie 9 Bytes mit sprintfanstelle von, num2strwie ich bereits dieses Handle hatte s.
  • Sparen Sie 6 Bytes, indem Sie []in den sprintAnruf ziehen.
  • Sparen Sie 6 Bytes, indem Sie eine Möglichkeit finden, die Anzahl der Vergleiche zu verringern.
  • Sparen Sie 3 Bytes, indem Sie die Notwendigkeit für entfernen, strtrim()ohne nachstehenden Speicherplatz zu verursachen.

Nach Nummer 54 ist noch 1 Platz in Ihrer Ausgabe.
7.

@tsh jetzt behoben. Ich habe alle Testfälle zur TIO-Ausgabe hinzugefügt.
Tom Carpenter

2

C # (.NET Core) , 195 192 Bytes

3 Bytes gespart dank Kevin Cruijssen.

c=>t=>{var n=c>1?"prev ":"";n+=c>4?"1 ... ":c<2?"[1] ":"1 ";if(t>1){for(int i=c-3;i++<c+2;)if(i>1&i<t)n+=i==c?$"[{i}] ":i+" ";n+=c<t-4?"... "+t:c==t?$"[{t}]":t+"";n+=c<t?" next":"";}return n;}

Probieren Sie es online!


1
Sie können 2 Bytes sparen, indem Sie die Klammern der for-Schleife entfernen. Und 1 weiteres durch Verwendung eines Curry-Eingangs c=>t=>. Versuchen Sie es hier: 192 Bytes
Kevin Cruijssen

2

C ++ - 247 Bytes

#include <iostream>
#define c std::cout<<
#define N (a-i<3?i-a<2?1:b-i:a-i-2)
void s(int a,int b){if(a>1)c"prev ";for(int i=1;i<=b&&N!=0;i+=N)c(i==1?"":" ")<<(a==i?"[":"")<<i<<(a==i?"]":"")<<(N>1?" ...":"");if(a<b-2)c" "<<b;if(a<b)c" next";c"\n";}

Probieren Sie es online!


1
Beachten Sie, dass "keine anderen Seitenzahlen ausgegeben werden sollen."
7.

Oh, tut mir leid, dass ich diese Regel verpasst habe. Ich werde es bald korrigieren.
BalazsToth

Auch die Verbindung ist unterbrochen.
Ian H.

@Appleguy: Blick auf diese - Code zu geht , gemessen in der „Code“ Feld auf TIO. Dann können Sie von dort aus ganz einfach Ihren Beitrag erstellen.
Felix Palmen

2

Python 2 ,  128  124 Bytes

-4 Bytes danke an Jonathan Allan !

lambda c,l:["prev"]*(c>1)+[range(1,c),[1,"...",c-2,c-1]][c>4]+[[c]]+[range(c+1,l+1),[c+1,c+2,"...",l]][l-c>4]+["next"]*(c<l)

Probieren Sie es online!

Ausgabe als Liste, aber der Link enthält Pretty-Print.


while ~0:ist eine seltsame Sache, wenn es gut while 1:funktioniert.
Jonathan Allan

@ JonathanAllan Ich weiß: P - Aber es funktioniert immer noch : D
Mr. Xcoder

-4 Bytes Verschieben des [[c]]Outs ( so ) BEARBEITEN - so funktioniert es 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':: p
Jonathan Allan

@ JonathanAllan Ja, danke, ich habe nur rumgespielt, weil ich das Gefühl hatte, dass es überflüssig ist.
Mr. Xcoder

2

PHP, 157 150 Bytes

Die Details buchstäblich zu nehmen, stellte sich als kürzester Ansatz heraus:

[,$k,$n]=$argv;for($k>1&&print"prev ";$i++<$n;)$g=in_array($i,range($k-2,$k+2)+[5=>1,$n])?!print$i-$k?"$i ":"[$i] ":$g||print"... ";$k<$n&&print next;

Laufen Sie mit php -nr '<code>' <curpage> <numpages>oder versuchen Sie es online .


2

CJam, 74

q~\:A\:B]3e*[1T4A3+1A].>["prev"1'.3*_B"next"]:a.*3/5,A2-f+B,2>&*:+_A#Aa`tp

Ausgänge als Array. Probieren Sie es online aus

Ersetzen Sie das Finale pdurch, S*um es als Zeichenfolge auszugeben.

Erläuterung:

q~          read and evaluate the input (pushing 2 numbers on the stack)
\:A\:B      store the numbers in A and B, keeping them in the same order
]3e*        wrap in array, then repeat each number 3 times - [A A A B B B]
[1T4        make an array containing 1, 0 (T=0 by default), 4,
A3+1A]      then A+3, 1, and A
.>          compare the 2 arrays element by element - [A>1 A>0 A>4 B>A+3 B>1 B>A]
             (each result is 1 or 0)
["prev"1    make an array containing "prev", 1,
'.3*_       "..." twice ("..." = '.' repeated 3 times),
B"next"]    then B and "next"
:a          wrap each of its elements in an array - [["prev"][1]["..."]…]
.*          repeat each of these arrays according to the previous array
             e.g. ["prev"] is repeated A>1 times - ["prev"] if A>1, else []
             [1] is repeated A>0 times (always 1), etc.
             obtaining an array of 6 arrays, some of which may be empty
3/          split into 2 arrays of 3 arrays each (between the "..." parts)
5,A2-f+     make an array [0 1 2 3 4] then add A-2 to each element
B,2>&       intersect with the array [2 3 … B-1] (these are the middle numbers)
*           join the 2 previous arrays by adding these numbers between them
:+          concatenate all these arrays and numbers together
             obtaining an array containing only numbers and strings
_A#         duplicate the array then find the position of A in it
Aa`         generate the "[A]" string (with the actual number for A)
             by wrapping A in an array and getting its string representation
t           put it in the array at A's position
p           print the array's string representation

2

Haskell, 145 129 Bytes

s x=show x
a#t=["prev 1"|a>1]++["..."|a>4]++map s[max 4a-2..a-1]++s[a]:map s[a+1..min(a+3)t-1]++["..."|t-a>3]++[s t++" next"|a<t]

Probieren Sie es online!

Edit: @ Ørjan Johansen hat 16 Bytes gespeichert. Vielen Dank!


1
(1) Sie können die unwords$Array-Ausgabe fallen lassen. (2) s x=show x; ... s[a]ist kürzer, danach kann es mit :und mit dem nächsten zusammengeführt werden und mapwird dann id=<<länger als nur mit ++s. (3) max 4a-2und min(a+3)t-1sind kürzer. Probieren Sie es online!
Ørjan Johansen

1

Golf Script - 104 Zeichen

~\:a;:b;1a<'prev '*3a<'1 ... '*[5,{a 2-+}/]{.0>\b)<&},{.a={'['\']'}*' '}/;b a-:c 2>' ... 'b+*0c<' next'*

Ungolfed

~\:a;:b;       # a = 1st arg, b = 2nd arg
1a<'prev '*    # if a > 1: print 'prev '
3a<'1 ... '*   # if a > 3: print '1 ... '
[5,{a 2-+}/]   # creates an array [a-2 a-1 a a+1 a+2]
{.0>\b)<&},    # keeps only elements >0 and <=b
{
  .a={'['\']'}*      # puts '[' ']' around the element equal to a
  ' '}/;             # prints each element with a leading space
b a-:c 2>' ... 'b+*  # if b-a > 2: print ' ... ' + b
0c<' next'*          # if b-a > 0: print ' next'


Ja Dankeschön. Ich war auf dem Handy, es war etwas unangenehm, den gesamten Code zu stopfen.
FedeWar

1

Perl 5, 113 + 1 (-p) 109 + 3 (-pal) Bytes

$_=join$",1..<>;s/\b@F\b/[$&]/;s/^1/prev 1/;s/\d$/$& next/;s/(^|\] )\w+ \w+ \K[\w ]*(?= \w+ \w+( \[|$))/.../g

Probieren Sie es online aus


1
Gute Verwendung von `` $ `` `und $'! Hatte ein bisschen damit gespielt, konnte es aber nicht viel <>runterholen , aber indem ich anstelle des regulären Ausdrucks verwendete und -aeinen Verweis auf verwendete $_, konnte ich auf 111 zurückgreifen : Online ausprobieren! ( -lzur besseren Lesbarkeit hinzugefügt)
Dom Hastings

Gut, ich dachte nicht an @F
Nahuel Fouilleul

Ich habe die Verwendung "@F"für einzelne Eingaben genossen , es ist eine schöne Umgehung! Die -lwird in der Byteanzahl aber nicht benötigt, nur um alle Tests gleichzeitig auszuführen :). Ich habe nicht gesagt, aber Ihre Auslassungspunkte Validierung ist sehr schön!
Dom Hastings

Tatsächlich habe ich gerade gesehen, dass einer meiner ersten Posts verbessert werden könnte
Nahuel Fouilleul,

1

Ruby , 127 Bytes

Ich bin damit nicht besonders zufrieden, besonders mit der vorherigen / nächsten Logik.

->c,t{"prev #{(1..t).chunk{|n|n<2||n==t||n>c-3&&n<c+3}.map{|t,a|t ?a:?.*3}*" "} next".sub(/(prev )?\b(#{c})\b( next)?/,'[\2]')}

Probieren Sie es online!

Ungolfed

->c,t{
  "prev #{
    (1..t)
    .chunk {|n| n < 2 || n == t || n > c - 3 && n < c + 3 }
    .map {|t,a| t ? a : ?. * 3 } * " "
  } next"
  .sub(/(prev )?\b(#{ c })\b( next)?/, '[\2]')
}

1

PHP (Browser), 267 Bytes

<?php parse_str($_SERVER['QUERY_STRING']);$c=$a!=1?$a>3?$a>4?'prev 1 . . . ':'prev 1 ':'prev ':'[1] ';$d=$a<$b-2?$a+3:$b;for($i=$a<=2?$a==1?$i=2:$i=$a-1:$i=$a-2;$i<$d;$i++)$c.=$a==$i?"[$i] ":"$i ";if($a<$b-2)$c.=" . . . $b next";else $c.=$a==$b?"[$b]":"$b next";echo $c?>

Probieren Sie es online!

Definitiv nicht so klein, wie es hätte sein können, und wie oben gezeigt wurde, kann die Verwendung von PHP in der Befehlszeile viel kleiner sein. Die Eingabe erfolgt über GET-Anforderungen, a ist die ausgewählte Zahl, b ist das Limit. Das sieht so ausfoo.bar.com/index.php?a=2&b=12

Ungolfed

<?
    parse_str($_SERVER['QUERY_STRING']);
    $c=$a!=1?$a>3?$a>4?'prev 1 . . . ':'prev 1 ':'prev ':'[1] ';
    $d=$a<$b-2?$a+3:$b;
    for($i=$a<=2?$a==1?$i=2:$i=$a-1:$i=$a-2;$i<$d;$i++)
        $c.=$a==$i?"[$i] ":"$i ";

    if($a<$b-2)$c.=" . . . $b next";else
    $c.=$a==$b?"[$b]":"$b next";
    echo $c
?>

Ich bin mir ziemlich sicher, dass meine ternären Operatoren verbessert werden können. Probieren Sie es einfach aus.


Das Ausführen meiner Antwort in einem Browser kostet ein oder zwei Bytes: [,$k,$n]=$argv; -> <?[$k,$n]=$_GET;Wenn ich darauf bestehe, dass die aktuelle Seite das erste Argument ist und die Anzahl der Seiten die zweite; <?extract($_GET);wenn ich benannte Argumente verwenden möchte.
Titus

scheitert für a = b-3; ersetzen $a<$b-2mit $a<$b-3zu reparieren.
Titus

2
Golf: <?=($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)
Titus

1

IBM / Lotus Notes-Formel, 217 211 Bytes

-2 mit Dank an @KevinCruijssen

-4 durch Verwendung von Variablen für die @ Text-Werte

o:=@If(a=1;"[1]";"Prev 1 ")+@If(a>4;"... ";"");@For(x:=2;x<b;x:=x+1;T:=@Text(x);o:=o+@If(x>a-3&x<a+3;@If(a=x;"["+T+"]";T)+" ";""));Z:=@Text(b);o:=o+@If(b>1;@If(b-a>3;"... ";"")+@If(a=b;"["+Z+"]";Z+" Next");"");o

Im Grunde genommen eine Portierung meiner Python 2-Antwort, nur aus Spaß daran, sich zu erinnern, wie man Formula benutzt.

Es gibt kein TIO für Formula. Hier ist ein Screenshot einiger Testfälle:

Bildbeschreibung hier eingeben


1
Gibt es einen Grund, warum x>a-3 & x<a+3in Lotus Notes Formula Leerzeichen erforderlich sind ? Ist &xetwas reserviert oder gibt es keinen besonderen Grund, warum die Felder auf beiden Seiten obligatorisch sind? Ich habe übrigens nie in dieser Sprache programmiert, war nur neugierig. :)
Kevin Cruijssen

@ KevinCruijssen - Ehrlich gesagt weiß ich es nicht. Ich hätte nie gedacht, es ohne zu versuchen. Zu gewohnt, lesbaren Code zu schreiben :-). Ich werde morgen nachsehen, ob ein Computer mit Notes installiert ist, und Ihnen Bescheid geben.
ElPedro

1
@ KevinCruijssen - Sie hatten Recht!
ElPedro

Hehe, ich bin froh, dass ich helfen konnte. :) +1 von mir, und ich sehe, Sie haben mehr Golf gespielt, indem Sie eine Variable für @Text erstellt haben. Als ich gestern sah, dass es zwei mal zwei verwendet wurde, kam mir das in den Sinn.
Kevin Cruijssen

1

Excel VBA, 202 201 Bytes

Anonyme VBE-Direktfensterfunktion, die Eingaben aus dem Bereich A1:A2und Ausgaben in das VBE-Direktfenster übernimmt .

For i=[Max(A1-2,1)]To[Min(A1+2,A2)]:s=s &IIf([A1]=i,"[" &i &"]",i)&" ":Next:?[If(A1=1,"","prev "&If(A1>3,1&If(A1>4," ... "," "),""))]s[If(A1<A2,If(A1-A2<-3,"... ","")&If(A1-A2<-2,A2&" ","")&"next","")]

Unterprogrammversion

Zur besseren Lesbarkeit enthalten

Public Sub PageSelect(Optional ByVal Current As Long = -1, _
                      Optional ByVal Total   As Long = -1)

    Call Sheet1.Activate

    Let [A1] = IIf(Current = -1, [A1], Current)
    Let [A2] = IIf(Total   = -1, [A1], Total)

    Dim s As String
    Let s = ""

    For i = [Max(A1-2,1)] To [Min(A1+2,A2)] Step 1
        Let s = s & IIf([A1] = i, "[" & i & "]", i) & " "
    Next
    Debug.Print [If(A1=1,"","prev "&If(A1>3,1&If(A1>4," ... "," "),""))]; _
                s; _
                [If(A1<A2,If(A1-A2<-3,"... ","")&If(A1-A2<-2,A2&" ","")&"next","")]
End Sub

0

PowerShell , 237 Byte

param($a,$n)('prev 1','[1]')[$n-lt2]+" ... $($n-2) $($n-1) [$n]"*($n-gt4)+" 2 3 [4]"*($n-eq4)+" 2 [3]"*($n-eq3)+" [2]"*($n-eq2)+" $($n+1) $($n+2) ..."*($n-lt$a-3)+" $($n+1) $($n+2)"*($n-eq$a-3)+" $($n+1)"*($n-eq$a-2)+" $a next"*($n-ne$a)

Probieren Sie es online!

Eine gigantische String-Verkettung mit viel zu vielen Dollarzeichen. Weiter am Golfen arbeiten. Nein, ich denke, das ist so kurz wie dieser Ansatz gehen kann.


0

Javascript (ES6), 265 263 258 240 239 220 194 193 182 178 Bytes

-2 vom Entfernen eines Debug-Tools

-5 von der Erkenntnis, dass ich ES6 verwende und manchmal auf Klammern verzichten kann

-18 davon abhalten, etwas aus einer früheren Version zu entfernen, das jetzt veraltet ist

-1 von ein paar hinterhältigen Sachen

-19 vor dem Entfernen unnötiger Variablen

-26 Bytes aus dem allzu komplizierten Entfernen von Falsey-Werten. Ich bin neu in ES6

-1 von kürzeren Vergleichen

-11 von der Verwendung einer rekursiven Funktion

* -4 vom Ersetzen ?...:0mit &&...und ... ${t}mit...+t

Das hat viel zu viel meines Lebens gekostet und nicht genug Gegenstimmen gegeben. aber ich bin so froh, dass der endgültige Code eine Potenz von 2 (2 ^ 8) ist. Ich weiß, dass es eine andere JavaScript-Antwort gibt, die ungefähr 120 Bytes beträgt. aber ich liebe diesen Code immer noch

EDIT: Ich weiß nicht, was ich gedacht habe. 265 ist nicht 2 ^ 8 ...

Dabei ist es mir gelungen, die ungolfed version zu brechen. Gott, hasse ich ungolfing Code.

EDIT 2: Jetzt sieht es aus wie die bessere 121-Byte-Lösung

y=(e,i,t="")=>i++<e?y(e,i,t+i+' '):t.slice(0,-1);m=(t,p)=>[p-1&&"prev",p<5?y(p-1,0):"1 ... "+y(p-1,p-3),`[${t}]`,t-p<4?y(t,p):y(p+2,p)+` ... `+t,t-p&&"next"].filter(e=>e).join` `

Erläuterung:

zu kommen, aber im Grunde ist y range(end, start)und es macht einige coole Sachen wie:

  1. show prev if pageist 1
  2. zeige linke Punkte wenn page > 4
  3. zeige richtige Punkte wenn total - page < 4
  4. zeige nächstes wenn total - page == 0

und solche Sachen und schließen sich einfach an durch ''. Ich weiß, dass Sie nicht müssen, aber ich mag die Tatsache, dass es halbkonventionell ist. Ich weiß es nicht. Genießen.

Probieren Sie es online!

Validiere es online!

Hier ist eine 186 185 174 170-Byte-Lösung, die mir nicht gefällt: Probieren Sie es online aus!


0

PowerShell , 141 Byte

param($c,$t)($('prev'*($c-ne1)
1
'...'*($c-gt4)
($c-2)..($c+2)-gt1-lt$t
'...'*($t-$c-gt4)
$t
'next'*($t-ne$c))|?{$_}|gu)-replace"^$c$","[$c]"

Probieren Sie es online!

Weniger golfen:

param($current,$total)
$uiElements=$(
    'prev'*($current-ne1)
    1
    '...'*($current-gt4)
    ($current-2)..($current+2)-gt1-lt$total
    '...'*($total-$current-gt4)
    $total
    'next'*($total-ne$current)
)
($uiElements|where{$_}|Get-Unique)-replace"^$current$","[$current]"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.