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.
- Die drei Punkte (
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!
4 , 6
als Testfall hinzugefügt zu werden. Ähnlich wie im3, 6
Fall, stellt jedoch sicher, dass keine Punkte auf der linken Seite hinzugefügt werden.4,7
Testfall sehr dankbar - würde sicherstellen, dass beide Grenzfälle, die Ellipsen ausschließen, gleichzeitig erfüllt sindAntworten:
Retina ,
125113109107 BytesProbieren Sie es online! Link enthält Testfälle. 12 Bytes dank @MartinEnder eingespart. Erläuterung:
In Unary konvertieren.
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.)
Sortieren Sie die Seiten wieder in aufsteigender Reihenfolge. Dadurch wird auch die aktuelle Seite sortiert, die jetzt dupliziert wird.
Duplizieren Sie und wickeln Sie
[]
s um die aktuelle Seite.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.)
Füge das Vorherige hinzu, wenn die aktuelle Seite nicht 1 ist.
Fügen Sie die nächste hinzu, wenn die aktuelle Seite nicht die letzte Seite ist.
Zurück in Dezimalzahl konvertieren.
quelle
JavaScript (ES6),
130122121 ByteMit der aktuellen Syntax aufrufen, z
f(3)(10)
.Code-Snippet anzeigen
Probieren Sie es online!
-1 Byte (Arnauld): Set
X
anX-x
.quelle
.join
ist 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!6502 Maschinencode (C64), 160 Bytes
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:
quelle
R ,
214 Bytes168 BytesProbieren Sie es online!
Vielen Dank an @ user2390246 für einige großartige Golftipps
quelle
c()
, die die schreckliche Verwechslung mit dem aufgerufenen Objekt beseitigtc
.APL (Dyalog) ,
8382 BytesAnonyme Infix-Funktion, die das aktuelle Argument als linkes Argument und das gesamte Argument als rechtes Argument verwendet.
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 von1
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 vonx
Läufen trennt )'x+'⎕R'...'
PCRE R ePlacex
Läufe mit drei Perioden(
…),
Folgendes voranstellen:⍺>1
ist aktuell größer als 1?'prev '/⍨
wenn ja, (benutze das um den Text zu replizieren)quelle
Wolfram Language (Mathematica) ,
131114109 BytesProbieren Sie es online!
Wie es funktioniert
Viel zu ersetzen. Beginnen Sie mit einer Liste aller Seiten und ersetzen Sie sie in der folgenden Reihenfolge:
#->"["<>(t=ToString)@#<>"]"
: die aktuelle Seite mit einer Klammer,1->"prev 1"
: Seite 1 mit der Zeichenfolgeprev 1
,#2->t@#2<>" next"
: die letzte Seite mit dem String(number) next
, mit#-3|#+3:>"..."
: Seitecurrent-3
und Seitecurrent+3
mit der Zeichenfolge"..."
,x_/;Abs[x-#]>2:>Nothing
: alle anderen (ganzzahligen) Seiten daruntercurrent-2
oder darübercurrent+2
mit nichts. (Ja,Nothing
ist eingebaut.)quelle
Funky ,
218210 BytesEinige Bytes gespeichert, einige dank tsh
Probieren Sie es online!
quelle
i<=p+2
man Golf spieleni<p+3
kann undt[2]="["+t[2]+"]"
kannt[2]="["+p+"]"
?Python 2 ,
136130 BytesProbieren Sie es online!
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.
quelle
i or'...'
und Nullen (wie folgt )Python 2 , 135 Bytes
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.quelle
(-3<x-c<3or x%t<2)
nach(x%t<2or-3<x-c<3)
-1 wechseln. Beide Argumente an denor
Operator geben einen booleschen Wert zurück.Java 8,
201200197 BytesErläuterung:
Probieren Sie es hier aus.
quelle
Java (OpenJDK 8) ,
218179177167166 BytesProbieren Sie es online!
quelle
"["+c+"] ";
p+=
vor der for-Schleife in die for-Loop-DeklarationJelly , 59 Bytes
Ein vollständiges Programm *, das das Ergebnis in STDOUT ausgibt. Argumentiert
current
undtotal
in dieser Reihenfolge.Probieren Sie es online! oder sehen Sie sich die Testsuite an .
Wie?
* Als dyadische Verknüpfung
current
auf der linken undtotal
rechten Seite wird eine Liste mit einer Mischung aus Zeichen und ganzen Zahlen zurückgegeben. Diese Liste enthält die Leerzeichen. Das ByteK
kann jedoch nicht einfach entfernt werden, um die Spezifikation einzuhalten, da das Ergebnis dann in eckige Klammerncurrent
(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 )quelle
Python 2 ,
178170 BytesProbieren Sie es online!
Zweiter Versuch, nachdem Sie die Regeln genauer gelesen haben.
-8 durch den Verlust einiger nicht benötigter Klammern.
quelle
Octave ,
169 196 190 181 175 169166 BytesProbieren 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.
*
anstelle von ".*
-" @StewieGriffin verwendensprintf
anstelle von,num2str
wie ich bereits dieses Handle hattes
.[]
in densprint
Anruf ziehen.strtrim()
ohne nachstehenden Speicherplatz zu verursachen.quelle
C # (.NET Core) ,
195192 Bytes3 Bytes gespart dank Kevin Cruijssen.
Probieren Sie es online!
quelle
c=>t=>
. Versuchen Sie es hier: 192 BytesC ++ - 247 Bytes
Probieren Sie es online!
quelle
Python 2 ,
128124 Bytes-4 Bytes danke an Jonathan Allan !
Probieren Sie es online!
Ausgabe als Liste, aber der Link enthält Pretty-Print.
quelle
while ~0:
ist eine seltsame Sache, wenn es gutwhile 1:
funktioniert.[[c]]
Outs ( so ) BEARBEITEN - so funktioniert eswhile 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 BytesDie Details buchstäblich zu nehmen, stellte sich als kürzester Ansatz heraus:
Laufen Sie mit
php -nr '<code>' <curpage> <numpages>
oder versuchen Sie es online .quelle
CJam, 74
Ausgänge als Array. Probieren Sie es online aus
Ersetzen Sie das Finale
p
durch,S*
um es als Zeichenfolge auszugeben.Erläuterung:
quelle
Haskell,
145129 BytesProbieren Sie es online!
Edit: @ Ørjan Johansen hat 16 Bytes gespeichert. Vielen Dank!
quelle
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 undmap
wird dannid=<<
länger als nur mit++
s. (3)max 4a-2
undmin(a+3)t-1
sind kürzer. Probieren Sie es online!Golf Script - 104 Zeichen
Ungolfed
quelle
Perl 5,
113 + 1 (-p)109 + 3 (-pal) BytesProbieren Sie es online aus
quelle
$'
! Hatte ein bisschen damit gespielt, konnte es aber nicht viel<>
runterholen , aber indem ich anstelle des regulären Ausdrucks verwendete und-a
einen Verweis auf verwendete$_
, konnte ich auf 111 zurückgreifen : Online ausprobieren! (-l
zur besseren Lesbarkeit hinzugefügt)"@F"
für einzelne Eingaben genossen , es ist eine schöne Umgehung! Die-l
wird 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!Ruby , 127 Bytes
Ich bin damit nicht besonders zufrieden, besonders mit der vorherigen / nächsten Logik.
Probieren Sie es online!
Ungolfed
quelle
PHP (Browser), 267 Bytes
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 aus
foo.bar.com/index.php?a=2&b=12
Ungolfed
Ich bin mir ziemlich sicher, dass meine ternären Operatoren verbessert werden können. Probieren Sie es einfach aus.
quelle
[,$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.$a<$b-2
mit$a<$b-3
zu reparieren.<?=($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)IBM / Lotus Notes-Formel,
217211 Bytes-2 mit Dank an @KevinCruijssen
-4 durch Verwendung von Variablen für die @ Text-Werte
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:
quelle
x>a-3 & x<a+3
in Lotus Notes Formula Leerzeichen erforderlich sind ? Ist&x
etwas 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. :)Excel VBA,
202201 BytesAnonyme VBE-Direktfensterfunktion, die Eingaben aus dem Bereich
A1:A2
und Ausgaben in das VBE-Direktfenster übernimmt .Unterprogrammversion
Zur besseren Lesbarkeit enthalten
quelle
PowerShell , 237 Byte
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.quelle
Javascript (ES6),
265263258240239220194193182178 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
?...:0
mit&&...
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 nochEDIT: 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
Erläuterung:
zu kommen, aber im Grunde ist y
range(end, start)
und es macht einige coole Sachen wie:page
ist 1page > 4
total - page < 4
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
186185174170-Byte-Lösung, die mir nicht gefällt: Probieren Sie es online aus!quelle
PowerShell , 141 Byte
Probieren Sie es online!
Weniger golfen:
quelle