Perkecil bilangan bulat berturut-turut

22

Terkait: Katakan padaku berapa banyak masalah matematika yang harus saya lakukan!

Tantangan

Dengan daftar integer ketat L yang benar-benar positif, dan integer 3 ≤ N ≤ panjang L, ganti bilangan bulat tengah dari berturut-turut bilangan bulat integer L panjang ≥ N dengan tanda hubung tunggal -.

Aturan

  • Spasi horisontal tidak relevan.
  • Anda dapat secara opsional mempertahankan karakter pengantar, pemisah, dan terminator dari format daftar standar bahasa Anda. Lihat Format contoh , di bawah ini.

Contoh data

Semua contoh ini digunakan L = 3 5 6 7 8 10 11 12 14 16 17 18 19 20 21 22 24.

N = 33 5 - 8 10 - 12 14 16 - 22 24

N = 43 5 - 8 10 11 12 14 16 - 22 24

N = 53 5 6 7 8 10 11 12 14 16 - 22 24

N = 83 5 6 7 8 10 11 12 14 16 17 18 19 20 21 22 24

Format contoh

Untuk input
L = [3,5,6,7,8,10,11,12,14,16,17,18,19,20,21,22,24]dan N = 3
semua baris di bawah ini adalah contoh respons yang valid, baik sebagai daftar aktual maupun sebagai string:

[3,5,"-",8,10,"-",12,14,16,"-",22,24]
[3,5,-,8,10,-,12,14,16,-,22,24]
[3,5-8,10-12,14,16-22,24]
3,5-8,10-12,14,16-22,24

Hal yang sama berlaku dengan format daftar lain, suka {1 2 3}dan (1; 2; 3)lain - lain. Meminta!

Adm
sumber
Apakah perlu menggunakan -atau kita diizinkan menggunakan simbol yang berbeda?
mil
@miles Akankah simbol yang berbeda menyelamatkan Anda byte?
Adám
Saya berpikir untuk menggunakan infinity _sehingga saya dapat tetap beroperasi pada array numerik dalam J.
miles
@miles Ah, ya, kenapa tidak Anda teruskan saja dan lakukan itu, tetapi buat tidak tentang hal itu, dan jika Anda dapat diganggu, tuliskan solusi kotak (saya anggap lebih lama) dengan '-'. Anda mungkin juga dapat merangkaikan semuanya sebelum memasukkan tanda hubung, bukan?
Adám
Apakah yang berikut ini valid? [3,5,-8,10,-12,14,16,-22,24](ini tampaknya merupakan format yang paling masuk akal dalam hal jenis)
Leaky Nun

Jawaban:

7

Python 2 , 132 115 byte

-17 byte berkat Leaky Nun

x,n=input()
o=[]
i=1
while x:
 t=x[0]
 while[t+i]==x[i:i+1]:i+=1
 o+=[[t,'-',t+i-1],x[:i]][i<n];x=x[i:];i=1
print o

Cobalah online!

tongkat
sumber
115 byte
Leaky Nun
Akan while t+i==x[i]:bekerja Atau apakah saya melewatkan sesuatu?
Zacharý
@ Zacharý itu akan pecah jika imenjadi lebih tinggi dari ukuranx
Rod
6

Jelly ,  26 25  23 byte

-2 byte terima kasih kepada Erik the Outgolfer (dengan membawa pernyataan if ke dalam tautan utama)

Ḣ;Ṫj”-
IỊ¬1;œṗ⁸¹ÇL<¥?€F

Tautan diad mengembalikan daftar dalam [3,5,"-",8,10,"-",12,14,16,"-",22,24]format.

Cobalah online! (footer terpisah dengan spasi, untuk mencetak format contoh data).

Bagaimana?

Ḣ;Ṫj”- - Link 1, format a run: list R
Ḣ      -     head
  Ṫ    -     tail
 ;     -     concatenate
    ”- -     literal '-'
   j   -     join

IỊ¬1;œṗ⁸¹ÇL<¥?€F - Main link: list L, number N
I                - incremental differences
 Ị               - insignificant? (<=1)
  ¬              - not
   1;            - prepend a 1
       ⁸         - chain's left argument, L
     œṗ          - partition (L) at truthy indexes
              €  - for €ach row, R, in L:
             ?   -   if:
            ¥    -   condition: last two links as a dyad:
          L      -     length of R
           <     -     is less than N?
        ¹        -   then: identity - do nothing, yields R
         Ç       -   else: call the last link (1) as a monad with argument  R
               F - flatten into a single list
Jonathan Allan
sumber
Tautan monadik?
Leaky Nun
heh, dan yang "istimewa" pada saat itu.
Jonathan Allan
Mengatur ulang barang Anda sedikit membantu untuk -2.
Erik the Outgolfer
Barang bagus, terima kasih @EriktheOutgolfer!
Jonathan Allan
4

Pyth, 23 byte

sm?<ldvzd[hd\-ed).ga=hZ

Cobalah online

Bagaimana itu bekerja

sm?<ldvzd[hd\-ed).ga=hZkQ

                        Q    autoinitialized to eval(input())
                 .g          group by k ↦
                    =hZ          Z += 1, returning new value (Z is autoinitialized to 0)
                   a   k         absolute difference with k
 m                           map d ↦
  ?                              if
    ld                               length of d
   <  vz                             less than eval(z) (z is autoinitialized to input())
        d                        then d
         [hd\-ed)                else [d[0], '-', d[-1]]
s                            concatenate
Anders Kaseorg
sumber
3

Japt , 24 byte

óÈÄ¥Yîl ¨V?Zv +'-+Zo :Z

Cobalah online!

Penjelasan

óÈ   Ä ¥ YÃ ®   l ¨ V?Zv +'-+Zo :Z
óXY{X+1==Y} mZ{Zl >=V?Zv +'-+Zo :Z}   Ungolfed
                                      Implicit: U = input array, V = input integer
óXY{      }                           Group U into runs such that for each pair X, Y:
    X+1==Y                              Y is exactly 1 more than X.
            mZ{                   }   Map each run Z to:
               Zl >=V?                  If Z has at least V items:
                      Zv     Zo           Z.unshift() and Z.pop() (the first and last items)
                         +'-+             joined with a hyphen.
                                :       Otherwise:
                                 Z        just Z.
                                      Implicit: output result of last expression
Produksi ETH
sumber
2

Mathematica, 128 byte

(s=#2;t=r=1;While[t<Length@s,If[s[[t+1]]-s[[t]]==1,r++,r=1];If[r==#,s[[t-#+3;;t]]="-";r--];t++];s//.{b___,a_,a_,c___}:>{b,a,c})&


memasukkan

[3, {3,5,6,7,8,10,11,12,14,16,17,18,19,20,21,22,24}]

keluaran

{3, 5, "-", 8, 10, "-", 12, 14, 16, "-", 22, 24}

Cobalah online!

J42161217
sumber
di sini
Leaky Nun
2

APL, 38 byte

{∊⍺{⍺>≢⍵:⍵⋄2⌽'-',2↑¯1⌽⍵}¨⍵⊂⍨1,1≠2-⍨/⍵}
marinus
sumber
1

PHP 7, 137 136 134 117 110 108 byte

for($a=$argv,$i=2;$n=$a[$i++];$k<$a[1]||array_splice($a,$i,$k-2,"-"))for($k=print"$n ";$a[$i+$k]-++$k==$n;);

Diambil Ldari argumen pertama, daftarkan elemen setelahnya. Jalankan dengan -nratau coba online .

Ganti $L=($a=$argv)dengan $a=$argv,$L=(+1 byte) untuk PHP <7.

kerusakan

for($a=$argv,$i=2;              # import input
    $n=$a[$i++];                # loop $n through list elements
    $k<$a[1]||                      # 3. if streak length ($k) is >=L ($a[1])
        array_splice($a,$i,$k-2,"-")    # then replace with "-"
)
for($k=print"$n ";                  # 1. print element and space
    $a[$i+$k]-++$k==$n;);           # 2. find consecutive numbers
Titus
sumber
1

Retina , 101 byte

\d+
$*
\b(1+) (?=1\1\b)
$1X
T`X` `\b((X)|1)+\b(?=.*¶(?<-2>1)+(?(2)(?!))11)
T`X`-
-1+(?=-)|¶1+

1+
$.&

Cobalah online! Mengambil daftar yang dipisahkan ruang Lpada baris pertama dan integer Npada baris kedua. Penjelasan: Tahap pertama mengubah input menjadi unary. Tahap kedua mengubah ruang antara bilangan bulat berurutan menjadi X. Tahap ketiga mencari deret beruntun yang panjangnya kurang dari Ndan mengubah Xkembali ke spasi. Tahap keempat mengubah Xs menjadi -(ini adalah 3 byte lebih pendek daripada menggunakan -s di tempat pertama.) Tahap kelima menghapus semua bilangan bulat yang masih tersisa di tengah proses, dan juga N, sementara tahap terakhir mengubah kembali ke desimal.

Neil
sumber
1

Ruby, 68 byte

->n,l{l.slice_when{|x,y|x<y-1}.map{|x|x[n-1]?x.minmax.uniq*?-:x}*?,}

Mengembalikan string seperti misalnya 3,5-8,10-12,14,16-22,24.

Cobalah online!

daniero
sumber
1

J , 40 byte

;@((](,_,{:)/)^:(<:#)&.>]<;.1~1,1<}.-}:)

Cobalah online!

Gunakan _bukan -.

Penjelasan

;@((](,_,{:)/)^:(<:#)&.>]<;.1~1,1<}.-}:)  Input: integer N (LHS), array L (RHS)
                                  }.      Behead L
                                     }:   Curtail L
                                    -     Subtract elementwise to get the increments
                                1<        Test if greater than 1
                              1,          Prepend a 1
                        ]                 Get L
                         <;.1~            Partition L into boxes using the previous array
                     & >                  Operate on each box (partition) with N
              ^:                            If
                   #                          The length of the partition
                 <:                           Is greater than or equal to N
   (](     )/)                                Reduce (right-to-left) it using
         {:                                     Tail
       _,                                       Prepend _
      ,                                         Append to LHS
                     &.>                    Box the result
;@                                        Raze - join the contents in each box
mil
sumber
0

Jelly, 39 37 36 byte

IỊṣ0;€1ṁ@
ÇL€<Ɠ¬TịÇḊ€Ṗ€F;€”-FyµŒgQ€F

Cobalah online

Membawa array melalui argumen, dan integer via STDIN. TIO link menggunakan footer ÇGsehingga output dipisahkan oleh ruang.

Bagaimana? (Array: a, Integer: n)

(`f`)
IỊṣ0;€1ṁ@
I          Deltas of `a`
 Ị         Insignificant (x -> abs(x)<=1) applied to each element
  ṣ0       Split at occurrences of `0`.
    ;€1    Append `1` to each element
       ṁ@  `a` shaped like that
ÇL€<Ɠ¬TịÇḊ€Ṗ€F;€”-FyµŒgQ€F
Ç                            `f`
 L€                          Length of each element
   <Ɠ                        x -> x < n applied to each element
     ¬                       Logical not of each element (because Jelly doesn't have <= nor >= atoms)
      T                      Nonzero indexes
       ịÇ                    Index `f` at those indexes
         Ḋ€Ṗ€                x -> x[1:-1] applied to each element
             F               Flatten
              ;€”-           Append a hyphen to each element
                  F          Flatten
                   y         Translate (replaces all elements to be deleted with a hyphen)
                    µ        Start a new monadic link
                     Œg      Group runs of equal elements
                       Q€    Uniquify each element (make runs of hyphens one hypen)
                         F   Flatten, yet again.

Saya kira saya jatuh ... datar satu ini.

Zacharý
sumber
0

JavaScript (ES6), 126 119 byte

(e,c)=>{for(i=0,R='';i<e.length;R+=(R&&',')+(u-m>=c?m+'-'+--u:e.slice(z,i))){m=u=e[i],z=i;while(e[++i]==++u);}return R}

Fungsi anonim. Mengambil input dalam urutan Array L, Integer Ndan mengembalikan hasilnya sebagai string yang dipisahkan koma.

R. Kap
sumber
Gunakan currying untuk menyimpan satu byte e=>c=>.
TheLethalCoder
0

Dyalog APL v16.0, 82 80 78 76 75 65 62 byte

{S/⍨1,⍨2≠/S←'-'@(⍸⊃∨/(-0,⍳⍺-3)⌽¨⊂(⍴⍵)↑∧/¨(⍺-1),/¯1⌽1=-2-/⍵)⊢⍵}

Wow, ini ... buruk. Mungkin ada solusi yang jauh lebih pendek dengan stensil.

Cobalah online!

Selamat datang saran bermain golf!

Zacharý
sumber
Ya, bagaimana dengan itu?
Zacharý
Maaf, tempat yang salah.
Adám
^ Apa maksudmu?
Zacharý
Komentar saya didasarkan pada tantangan yang berbeda.
Adám
Saya berasumsi bahwa jika Anda memiliki solusi, Adám, maka ia menggunakan v16 builtins?
Zacharý