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!


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!



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

Tautan monadik?
Leaky Nun

heh, dan yang "istimewa" pada saat itu.
Jonathan Allan


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

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

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!



2

APL, 38 byte

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

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

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.


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!


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

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.


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.


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!


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ý
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.