Ardışık tam sayıları daralt


22

İlgili: Bana ne kadar matematik problemi yapmam gerektiğini söyle!

Meydan okuma

Kesinlikle pozitif, kesinlikle artan bir tamsayı listesi L ve 3 ≤ N ≤ L tamsayı verilirse, L'nin ardışık tamsayı aralıklarının orta tamsayılarını tek bir tire ile değiştirin -.

kurallar

  • Yatay boşluk hiç önemli değil.
  • İsteğe bağlı olarak dilinizin varsayılan liste biçiminin tanıtıcı, ayırıcı ve sonlandırıcı karakterlerini koruyabilirsiniz. Aşağıdaki Format örnekleri bölümüne bakın.

Veri örnekleri

Bütün bu örnekler kullanır 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

Örnekleri biçimlendir

Girişler
L = [3,5,6,7,8,10,11,12,14,16,17,18,19,20,21,22,24]ve N = 3
aşağıdaki satırların tümü, hem gerçek listeler hem de dizeler olarak geçerli yanıtların örnekleridir:

[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

Aynısı, diğer liste formatları gibi {1 2 3}, (1; 2; 3)vb. İçin de geçerlidir . Sor!


Kullanmamız gerekli mi, -yoksa farklı bir sembol kullanmamıza izin var mı?
mil

@miles Farklı bir simge bayt kurtarır mı?
Adám

Ben sonsuzluk kullanarak düşünüyorum _ben sayısal J. diziler üzerinde çalışan kalabilir, böylece
mil

@miles Ah, evet, neden devam etmiyorsunuz ve bunu yapmıyorsunuz, ama bununla ilgili bir şey yapmıyorsunuz ve eğer rahatsız edilebiliyorsanız, (çok daha fazla varsayırım) kutulu çözümü yazınız '-'. Ayrıca, çizgi koymadan önce her şeyi dizge haline getirebilirsiniz, değil mi?
Adám

Aşağıdaki geçerli mi? [3,5,-8,10,-12,14,16,-22,24](bu tür açısından en anlamlı olan format gibi görünüyor)
Leaky Nun

Yanıtlar:



6

Jöle ,  26 25  23 bayt

- Outgolfer Erik sayesinde -2 bayt (if ifadesini ana linke getirerek)

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

Biçimde bir liste döndüren ikili bir bağlantı [3,5,"-",8,10,"-",12,14,16,"-",22,24].

Çevrimiçi deneyin! (altbilgi, veri örnek biçimini yazdırmak için boşluklarla ayrılır).

Nasıl?

Ḣ;Ṫ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

Monadik bir bağlantı mı?
Leaky Nun

heh ve bunda "özel" olanı.
Jonathan Allan,


Güzel şeyler, teşekkürler @EriktheOutgolfer!
Jonathan Allan

4

Pyth, 23 bayt

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

Çevrimiçi deneyin

Nasıl çalışır

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 bayt

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

Çevrimiçi deneyin!

açıklama

óÈ   Ä ¥ 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 bayt

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


giriş

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

çıktı

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

Çevrimiçi deneyin!



2

APL, 38 bayt

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

1

PHP 7, 137 136 134 117 110 108 bayt

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

Alır Lilk argüman, bundan sonra liste elemanlarından. Çevrimiçi olarak çalıştırın -nrveya deneyin .

PHP <7 için (+1 byte) $L=($a=$argv)ile değiştirin $a=$argv,$L=.

Yıkmak

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 bayt

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

1+
$.&

Çevrimiçi deneyin! Lİlk satırdaki boşlukla ayrılmış listeyi Nve ikinci satırdaki tam sayıyı alır. Açıklama: İlk aşama girdiyi birime dönüştürür. İkinci aşamada, bir ardışık tamsayılar arasındaki boşluk değiştirir X. Üçüncü aşamada, uzunluğu daha küçük olan ardışık tamsayıların çalışması aranır Nve Xalanlarını tekrar değiştirir. Dördüncü aşama Xs'yi değiştirir -(bu, -ilk etapta s kullanımından 3 bayt daha kısadır .) Beşinci aşama, bir koşunun ortasında hala kalan tüm tamsayıları silerken N, son aşama ondalık basamağa geri döner.


1

Ruby, 68 bayt

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

Örneğin gibi bir dize döndürür 3,5-8,10-12,14,16-22,24.

Çevrimiçi deneyin!


1

J , 40 bayt

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

Çevrimiçi deneyin!

Kullanımları _yerine -.

açıklama

;@((](,_,{:)/)^:(<:#)&.>]<;.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

Jöle, 39 37 36 bayt

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

Çevrimiçi deneyin

Diziyi argümanlar ve tamsayı STDIN üzerinden alır. TIO bağlantısı altbilgiyi kullanır, ÇGböylece çıktı boşlukla ayrılır.

Nasıl? (Dizi: 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.

Ben düştü ... tahmin ediyorum daireyi bu sefer.


0

JavaScript (ES6), 126 119 bayt

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

Anonim bir işlev. Siparişte girdi alır Array L, Integer Nve sonucu virgülle ayrılmış bir dizge olarak döndürür.


Bir bayttan tasarruf etmek için körleştirmeyi kullanın e=>c=>.
TheLethalCoder

0

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

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

Vay, bu ... kötü. Stencil ile muhtemelen çok daha kısa bir çözüm var.

Çevrimiçi deneyin!

Golf önerileri hoş geldiniz!


Evet, ne hakkında?
Zacharý

Üzgünüm, yanlış yer.
Adám

^ Ne demek istiyorsun?
Zacharý,

Benim yorumum farklı bir mücadeleye dayanıyordu.
Adám

Bir çözümünüz varsa, Adám, o zaman v16 yerleşiklerini kullandığını farz ediyorum.
Zacharý
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.