Nth Sayfasına Git


47

Sayfa seçim arayüzü yapmak için sıkça rastlanır. Genellikle şöyle görünür:

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

Bu, toplamda 173 sayfa olduğu ve şu anda 5. sayfadasınız demektir.

Bu zorluk, toplam sayfa sayısını ve geçerli sayfa numarasını girdi olarak almanızı ve sayfa seçiciyi "görüntülemek" için bir dize (veya bir dizi) çıkarmanızı gerektirir.

Giriş

2 pozitif tam sayı

  • mevcut sayfa numarası
  • sayfa sayısı

Toplam 1 <= akım <= toplam olması garanti edilir.

Çıktı

Sayfa seçicileri için kullanıcı arabirimini temsil eden bir dize veya bir dizi çıktılar.

  • Dizge olarak çıktı verilirse, her sayfa arasında tek bir boşluk (U + 0020) kullanılmalıdır.
  • Bir dizi olarak çıktı ise, dizi her maddeyi dizeye dönüştürdükten ve tek bir boşlukla birleştirdikten sonra dizeyle aynı sonucu vermelidir.
    • ...Dizi çıkışı için üç nokta ( ) isteğe bağlı değildir.

ayrıntılar

  • Akım == 1 ise, "prev" çıkmaz, aksi takdirde "prev" önce gelir.
  • Akım == toplam ise, "sonraki" çıkmaz, aksi takdirde "sonraki" en son gelir.
  • İlk sayfa (1) ve son sayfa (toplam) her zaman yazdırılmalıdır.
  • Geçerli sayfa, (geçerli - 1) sayfa, (geçerli - 2) sayfa, (geçerli + 1) sayfa, (geçerli + 2) sayfa, [1.toto] aralığında olduğu sürece yazdırılmalıdır.
  • Başka hiçbir sayfa numarası gösterilmemelidir.
  • Çıktılan sayfalar artan düzende sıralanmalıdır.
  • Çıktı, yinelenen sayfa numaraları içermemelidir.
  • Geçerli sayfa, bir çift olarak sarılarak vurgulanmalıdır [].
  • Herhangi bir komşu arasında bir boşluk varsa, üç nokta ( ...) yerleştirilmelidir.

Test Kılıfları

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

kurallar

  • Bu kod golf, en kısa kod kazanır!

7
4 , 6Bir test durumu olarak eklemeye değer olabilir . Kasaya benzer 3, 6, ancak noktaların sol tarafa eklenmemesini sağlar.
Tom Carpenter,

3
Bunlardan bazılarını bir web projesi için göreceğim ...
Stan Strum

2
@ TomCarpenter 'in yorumuna dayanarak, bir 4,7test vakası büyük ölçüde takdir edilecektir - elipsleri dışlayan sınır vakalarının ikisinin de aynı anda karşılanabileceğini garanti eder
Taylor Scott

1
@TaylorScott Her ikisi de eklendi.
tsh

2
@StanStrum Bir sonraki zorluk sonsuz bir kaydırma çubuğu yazmaktır.
Carl

Yanıtlar:


9

Retina , 125 113 109 107 bayt

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

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

Çevrimiçi deneyin! Link, test durumlarını içerir. @ Martininder sayesinde 12 bayt kaydedildi. Açıklama:

.+
$*

Birliğe dönüştür.

r`1\G
 1$'

Tüm sayfa numaralarını ters sırada oluşturun.

Girişi ayıran yeni satırı silin. (Sayfa numarası oluşturma işleminden yine de orada bir boşluk var.)

O`1+

Sayfaları artan düzende sıralayın. Bu aynı zamanda şimdi kopyalanan geçerli sayfayı sıralar.

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

Çoğaltın ve []geçerli sayfanın etrafına s sarın .

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

Geçerli sayfa en az 5 ise veya geçerli sayfadan sonra en az 4 sayfa varsa bir üç nokta ekleyin. (Üç noktaya son sayfanın dahil edilmemesi için sondaki boşluğa dikkat edin.)

^1
prev 1

Geçerli sayfa 1 değilse, prev değerini ekleyin.

1$
1 next

Geçerli sayfa son sayfa değilse, bir sonrakini ekleyin.

1+
$.&

Ondalık basamağa dönüştür.


1
Birkaç bayt kaydedildi: tio.run/… (bunlardan biri giriş formatının satır besleme ayrımına dönüştürülmesi gerekiyordu).
Martin Ender

@MartinEnder Teşekkürler, özellikle takip eden üç nokta golf oynamaktan hoşlanıyorum, ancak sanırım bir <s> üç </s> dört bayt daha tıraş edebilirim.
Neil

9

JavaScript (ES6), 130 122 121 bayt

Kabaran sözdizimi ile çağırın, örn 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(_=>_)

Çevrimiçi deneyin!

-1 baytı (Arnauld): Ayar Xiçin X-x.


Bu lambdaları sevmeliyim
Stan Strum

+8 eklemelisin ... Bu .joinsayının bir parçası değil! Benzer kodun çalışmadığı zamanlarda, kodunuzun neden birleşme olmadan işe yarayacağını anlamaya çalışırken çıldırıyordum. Öyleyse derhal çözümünüze dahil etmediniz, ancak snippet'inize dahil ettiniz!
nl-x

@ nl-x Çorbalar! Snippet'imi güncellemeyi unuttum. Zorluk bir dizgiyi veya diziyi çıkarmanızı sağlar; Dizi olarak çıkış yapmanızı tavsiye ederim.
darrylyeo

7

6502 makine kodu (C64), 160 bayt

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

Çevrimiçi demo - Kullanım:, sys49152,[current],[total] örnsys49152,5,173.

Sayıların akımı <= toplam olacak şekilde [1..255] aralığında olması gerekir. Aksi belirtilmediğinden, 8bit işlemcideki "doğal" işaretsiz tam sayı aralığı budur.


Yorumlanan sökme listesinin açıklaması:

         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 bayt 168 bayt

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'}

Çevrimiçi deneyin!

Bazı harika golf oyunları için @ user2390246'ya teşekkürler



186 bayt ters mantık ile. Gerçekten farklı bir öncül gibi hissetmez.
CriminallyVulgar

2
Daha fazla golf ile 165 bayt . Ayrıca, c()çağrılan nesne ile yapılan korkunç karmaşadan kurtulan işlevi kullanmaz c.
user2390246

2
Yorumlanan sürümlerin çoğunda görünen bir hatayı düzelterek 171 bayta kadar yedekleyin !
user2390246

1
164 bayt için bir başka küçük gelişme . Bunu tamamen kaçırdığım için özür dilerim, biraz uzağa taşındım!
kullanıcı2390246

5

APL (Dyalog) , 83 82 bayt

Anonim infix işlevi sol argüman olarak geçerli ve sağ argüman olarak toplam alır.

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

Çevrimiçi deneyin!

{} Açık lambda ve sol ve sağ argümanları temsil eden:

⍺<⍵ akım toplamdan daha mı küçük?

' next'/⍨ öyleyse (yanıyorsa, metni kopyalamak için kullanın)

(), Aşağıdakileri hazırlayın:

  ⍳⍵Toplam 1'den 1'e kadar

  'x'@(... ) Bir ile değiştirin x az öğelerdir pozisyonlarda ...

   ~ değil

    üyeleri

   1 bir

   , bunu takiben

    toplam

   , bunu takiben

    ⍳5 ilk beş nt ntegers ( [1,2,3,4,5])

    3- üçünden çıkarıldı ( [2,1,0,-1,-2])

    ⍺+ akıntıya eklendi ( [⍺+2,⍺+1,⍺,⍺-1,⍺-2])

    ki (ayrılmasını sağlar verim den 'x')

   (... ) Aşağıdaki zımni fonksiyonunu uygulamak de mevcut konumda:

     biçim (dize)

    '][', metni hazırla 

    1⌽ bir adım sola döndürün ( ]sonuna kadar hareket ettirin )

     sarın (böylece belirtilen tek konuma sığacak bir skaler olacaktır)

   ε nlist (dümdüz - biz parantez eklenen zaman iç içe yapmış)

    format (stringify - sayıları birbirinden ve koşulardan ayıran 1 boşluk x)

  'x+'⎕R'...' PCRE R eplace xüç periyotla çalışır

(), Aşağıdakileri hazırlayın:

  ⍺>1 akım 1'den büyük mü?

  'prev '/⍨ öyleyse (yanıyorsa, metni kopyalamak için kullanın)


5

Wolfram Dili (Mathematica) , 131 114 109 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

Değiştirilmesi çok. Tüm sayfaların bir listesiyle başlayarak, sırasıyla:

  1. #->"["<>(t=ToString)@#<>"]": köşeli ayraçlı geçerli sayfa
  2. 1->"prev 1": dizge ile 1. sayfa prev 1,
  3. #2->t@#2<>" next": Dize ile son sayfa (number) nextile
  4. #-3|#+3:>"...": dizge ile sayfa current-3ve sayfa ,current+3"..."
  5. x_/;Abs[x-#]>2:>Nothing: tüm diğer (tamsayı) sayfaların altında current-2veya üstünde current+2hiçbir şey yok. (Evet, Nothingyerleşiktir.)

4

Funky , 218 210 bayt

Bazıları bayt olarak kaydedildi, bazıları tsh sayesinde

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)}

Çevrimiçi deneyin!


Bilmiyorum Funky, ama görünüşe göre i<=p+2golf oynayabilir i<p+3ve t[2]="["+t[2]+"]"olabilir t[2]="["+p+"]"mi?
tsh

4

Python 2 , 136 130 bayt

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]

Çevrimiçi deneyin!

Bir dizi olarak çıktı ise, dizi her maddeyi dizeye dönüştürdükten ve tek bir boşlukla birleştirdikten sonra dizeyle aynı sonucu vermelidir.

Çevrimiçi deneyin! Altbilginin, kelimenin tam anlamıyla "her birini dizeye dönüştürmek, boşluklara katılmak" için çevirilerini tam anlamıyla çevirdiğini görebileceğiniz formda.

Bu Lynn'in yaklaşımına bir alternatif.


Bir ile byte kaydet i or'...'ve sıfırlar (gibi bu )
Jonathan Allan

3

Python 2 , 135 bayt

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

Çevrimiçi deneyin!

İlk önce prev 1 3 4 [5] 6 7 10 next, bazı sayıları silmenin neden olduğu “boşlukları” olan ancak sınırlandırıcı alanlarını olmayan bir dize yaratıyoruz . Daha sonra, ...bir regex kullanarak 2+ boşluktan herhangi birini çalıştırın .


Sen çevirebilirsiniz (-3<x-c<3or x%t<2)için (x%t<2or-3<x-c<3), her iki argüman için -1 oroperatörü bir boolean değerini döndürür.
Outgolfer Erik

3

Java 8, 201 200 197 bayt

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":"")

Açıklama:

Burada dene.

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 bayt

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:"");}

Çevrimiçi deneyin!


Güzel cevap, benimkinden kısa! Zaten sonra bir boşluk koyarak beş bayt golf yapabilirsiniz "["+c+"] ";: 172 bayt
Kevin Cruijssen

Ah, ve p+=for-loop bildiriminin içindeki for-loop öncesindeki sonuncuyu koyarak bir bayt daha : 171 byte
Kevin Cruijssen

3

Jöle , 59 bayt

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

Tam bir program * sonucu STDOUT'a yazdırıyor. Argümanlar alır currentve totalbu sırada.

Çevrimiçi deneyin! veya test odasına bakın .

Nasıl?

+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

* currentSolda ve totalsağda yer alan ikili bir bağlantı olarak, bu karakter ve tamsayıların bir karışımını içeren bir liste döndürür; bu liste boşlukları içerir. KBununla birlikte, bayt basitçe belirtime uymak için kaldırılamaz, çünkü sonuç currentayrı karakterler (benzeri [...'[','5','2',']'...]) olarak parantez içine alınır , böylece "her öğeyi dizeye dönüştür ve bunları tek bir boşlukla birleştir" istenen sonucu veremez )


2

Python 2 , 178 170 bayt

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]

Çevrimiçi deneyin!

Kuralları daha dikkatli okuduktan sonra ikinci girişim.

-8 Bazı gereksiz parantezleri kaybederek.


2

Octave , 169 196 190 181 175 169 166 bayt

@(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)

Çevrimiçi deneyin!

Daha sonra bir açıklama ekleyeceğim.

Hmm, çıktı formatıyla ilgili bazı sorunlar varmış gibi görünüyor. Bunlar şimdi çözüldü - tüm çıktılar doğru. Ama ne yazık ki, 27 bayta mal oldu. Biraz yağ kesmeden olsa da hepsini geri çekmeyi başardı.


  • Kullanarak 6 bayt kaydet *yerine.* tasarruf edin - thanks @StewieGriffin
  • Kullanılarak 9 bayt kaydet sprintfyerine num2strben zaten o sapı vardıs .
  • Aramaya çekerek 6 bayt tasarruf []edin sprint.
  • Karşılaştırma sayısını azaltmak için bir yol bularak 6 bayt tasarruf edin.
  • strtrim()Sondaki alana neden olmadan ihtiyacı ortadan kaldırarak 3 byte tasarruf edin.

Çıktınızda 54 numaradan sonra 1 boşluk var.
tsh

@tsh şimdi düzeltildi. Tüm test durumlarını TIO çıkışına ekledim.
Tom Carpenter,

2

C # (.NET Core) , 195 192 bayt

Kevin Cruijssen sayesinde 3 bayt kaydedildi.

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;}

Çevrimiçi deneyin!


1
For-loop'un parantezlerini kaldırarak 2 byte tasarruf edebilirsiniz. Ve 1 daha fazla bir kurutma girişi kullanarak c=>t=>. Burada deneyin: 192 bayt
Kevin Cruijssen

2

C ++ - 247 bayt

#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";}

Çevrimiçi deneyin!


1
"Başka sayfa numarası çıkmaması gerektiğine" dikkat edin.
saat

Ohh üzgünüm bu kuralı kaçırdım. Yakında düzelteceğim.
BalazsToth

Ayrıca, bağlantı koptu.
Ian H.

@Appleguy: bakmak bu - kodunuzda ölçülecek TIO üzerinde "kod" alanına gider. Sonra tüm postanızı kolayca buradan oluşturabilirsiniz.
Felix Palmen

2

Python 2 ,  128  124 bayt

Jonathan Allan sayesinde -4 bayt !

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)

Çevrimiçi deneyin!

Bir liste olarak çıktı, ancak tio bağlantısı oldukça baskı içerir.


while ~0:while 1:iyi çalıştığında kullanmak tuhaf bir şeydir .
Jonathan Allan

@ JonathanAllan Biliyorum: P - Ama hala çalışıyor : D
Bay Xcoder

-4 hareket bayt [[c]](gibi out bu ) EDIT - yapar 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 Evet, ben sadece onunla oynuyordum çünkü gereksiz olduğunu hissettim.
Bay Xcoder

2

PHP, 157 150 bayt

detaylara tam anlamıyla ulaşmak en kısa yol olarak ortaya çıktı:

[,$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;

İle koş php -nr '<code>' <curpage> <numpages>Çevrimiçi olarak veya deneyin .


2

CJam, 74

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

Dizi olarak çıktılar. Çevrimiçi deneyin

Diziyi çıktılamak için finali pile değiştirin S*.

Açıklama:

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 bayt

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]

Çevrimiçi deneyin!

Düzenleme: @ Ørjan Johansen 16 bayt kaydetti. Teşekkürler!


1
(1) Düşebilir unwords$, dizi çıkışına izin verilir. (2) s x=show x; ... s[a]daha sonra, bir sonraki ile bir ile birleştirilmiş olabilir, daha kısa olan :ve mapve daha sonra id=<<artık sadece kullanarak daha olur ++s. (3) max 4a-2ve min(a+3)t-1daha kısa. Çevrimiçi deneyin!
Ørjan Johansen

1

Golf Script - 104 karakter

~\: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'


Evet teşekkür ederim. Mobildeydim, tüm kodları toplamak biraz rahatsız edici oldu.
FedeWar

1

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

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

Çevrimiçi deneyin


1
'$' `Ve $'! Bununla küçük bir oyun oynadım, ancak bunu çok az başaramadım, ancak <>regex yerine kullanarak -ave bir referansta bulunmak için $_kullanarak 111'e düşmeyi başardım: Çevrimiçi deneyin! ( -lokunabilirlik için eklendi)
Dom Hastings

Güzel, @ F
Nahuel Fouilleul

"@F"Tekil girdileri kullanmaktan keyif alıyorum , bu güzel bir çözüm! Bununla birlikte -l, bayt sayımında gerekli değildir, yalnızca tüm testleri bir kerede çalıştırmak için :). Söylemedim ama elips onayın çok güzel!
Dom Hastings

Gerçekten de ilk gönderilerimden birinin geliştirilebileceğini
gördüm

1

Ruby , 127 bayt

Bundan özellikle mutlu değilim, özellikle de önceki / sonraki mantık.

->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]')}

Çevrimiçi deneyin!

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 (Tarayıcı), 267 Bayt

<?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?>

Çevrimiçi deneyin!

Kesinlikle olabileceği kadar küçük değildir ve yukarıda gösterildiği gibi PHP'yi komut satırında kullanmak çok daha küçük olabilir. Giriş, GET istekleriyle yapılır, a seçilen sayı, b sınırdır. Bu benziyorfoo.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
?>

Üçlü operatörlerimin geliştirilebileceğinden, denemekten çekinmediğinden eminim.


Bir tarayıcıda cevabımın çalışması bir veya iki bayta mal olur: [,$k,$n]=$argv; -> <?[$k,$n]=$_GET;mevcut sayfada ilk argüman ve ikinci sayfa sayısı olmak konusunda ısrar edersem; <?extract($_GET);Eğer adlandırılmış değişkenleri kullanmak istersem.
Titus

a = b-3 için başarısız olur; düzeltmek için $a<$b-2ile değiştirin $a<$b-3.
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 Formülü, 217 211 Bayt

-2 @KevinCruijssen sayesinde

-4 @Text değerleri için değişkenler kullanarak

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

Temelde Python 2'nin bir limanı sadece Formula'yı nasıl kullanacağımı hatırlamaya çalışmaktan hoşlanıyor.

Formül için TIO yok, bu yüzden bazı test durumlarının ekran görüntüsü:

görüntü tanımını buraya girin


1
x>a-3 & x<a+3Lotus Notes Formülünde boşluk gerekli olmasının bir nedeni var mı ? Bir &xşey için ayrılmış veya her iki taraftaki boşlukların zorunlu olmasının özel bir nedeni yok mu? Hiç bu dilde programlanmadım btw, sadece merak ettim. :)
Kevin Cruijssen

@KevinCruijssen - Dürüst olmak gerekirse bilmiyorum. Asla denemeyi asla düşünmedim. Okunaklı kod yazmak için çok kullanılmış :-). Notes yüklü bir makineye ulaştığımda yarın kontrol edeceğim ve size haber vereceğim.
ElPedro

1
@KevinCruijssen - haklıydın!
ElPedro

Hehe, yardım edebildiğime sevindim. :) +1 benden, @Text için bir değişken oluşturarak biraz daha golf oynadığını görüyorum. Dün iki kez kullanıldığını görünce mümkün olabilecek aklımdan geçti.
Kevin Cruijssen

1

Excel VBA, 202 201 Bayt

Menzilden girdi alan A1:A2ve VBE acil durum penceresine çıkan anonim VBE acil durum pencere işlevi .

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","")]

Altprogram Sürümü

Okunabilirlik için dahil

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 bayt

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)

Çevrimiçi deneyin!

Çok fazla dolar işareti olan devasa bir dize birleştirme. Daha fazla golf oynamaya çalışıyorum. Hayır, bence bu yaklaşımın gidebileceği kadar kısa.


0

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

-2 bir hata ayıklama aracını kaldırmaktan

-5 ES6 kullandığımı ve bazen parantezle başa çıkabileceğimin farkına varmaktan

-18, artık eski olan bir sürümden bir şeyin kaldırılmasından

-1 bazı sinsi şeyler yapmaktan

-19 Gereksiz değişkenleri kaldırmaktan

-26 byte hepsi çok karmaşık kaldırarak falsey değerleri kaldırın. ES6’da yeniyim

-1 kısa karşılaştırmaları kullanmaktan

-11 özyinelemeli bir işlev kullanmaktan

* -4 ?...:0ile &&...ve ... ${t}ile değiştirmeden...+t

Bu benim hayatımın çok fazla ötesine geçti ve yeterince fazla oy vermedi. ancak son kodun 2 (2 ^ 8) gücü olduğu için çok mutluyum , yaklaşık 120 baytlık başka bir JavaScript yanıtı olduğunu biliyorum. ama ben hala bu kodu seviyorum

EDIT: Ne düşündüğümü bilmiyorum. 265 2 ^ 8 değil ...

Bunu yaparken, unungolfed versiyonunu kırmayı başardım. Tanrım, unungolfing kodundan nefret mi ediyorum?

2 EDIT: şimdi daha iyi 121 bayt çözüm gibi görünüyor

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` `

Açıklama:

gelmek ama temelde y range(end, start)ve bazı serin şeyler yapar:

  1. göster ise prev page1
  2. soldaki noktaları göster page > 4
  3. eğer doğru noktaları göster total - page < 4
  4. sonra göster total - page == 0

ve bunun gibi şeyler ve '' ile birleşiyor. Zorunda olmadığını biliyorum ama yarı geleneksel olan gerçeği seviyorum. Bilmiyorum. Keyfini çıkarın.

Çevrimiçi deneyin!

Çevrimiçi olarak doğrulayın!

İşte sevmediğim 186 185 174 170 byte çözüm: Çevrimiçi deneyin!


0

PowerShell , 141 bayt

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]"

Çevrimiçi deneyin!

Daha az golf oynadı:

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]"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.