Réduire les entiers consécutifs

22

Connexes: dites-moi combien de problèmes mathématiques je dois faire!

Défi

Étant donné une liste d'entiers strictement positifs strictement ascendants L et un entier 3 ≤ N ≤ longueur de L, remplacez les entiers intermédiaires des séries entières consécutives de L de longueur ≥ N par un seul tiret -.

Règles

  • L'espace horizontal n'est pas pertinent.
  • Vous pouvez éventuellement conserver les caractères introducteur, séparateur et terminateur du format de liste par défaut de votre langue. Voir Exemples de format , ci-dessous.

Exemples de données

Tous ces exemples utilisent 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

Exemples de format

Pour les entrées
L = [3,5,6,7,8,10,11,12,14,16,17,18,19,20,21,22,24]et N = 3
toutes les lignes ci-dessous sont des exemples de réponses valides, à la fois sous forme de listes réelles et de chaînes:

[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

La même chose s'applique à d'autres formats de liste, comme {1 2 3}et (1; 2; 3)etc. En cas de doute? Demander!

Adam
la source
Est-il nécessaire d'utiliser -ou sommes-nous autorisés à utiliser un autre symbole?
miles
@miles Un symbole différent vous fera-t-il économiser des octets?
Adám
Je pense à utiliser l'infini _pour pouvoir continuer à fonctionner sur des tableaux numériques en J.
miles
@miles Ah, oui, pourquoi ne pas aller de l'avant et faire ça, mais ne vous en faites pas, et si vous pouvez être dérangé, écrivez la solution en boîte (je suppose beaucoup plus longue) avec '-'. Vous pourriez également être en mesure de tout filtrer avant d'insérer des tirets, non?
Adám
Les éléments suivants sont-ils valides? [3,5,-8,10,-12,14,16,-22,24](cela semble être le format le plus logique en termes de types)
Leaky Nun

Réponses:

7

Python 2 , 132 115 octets

-17 octets grâce à 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

Essayez-le en ligne!

Barre
la source
115 octets
Leaky Nun
Ça while t+i==x[i]:marcherait? Ou est-ce que je manque quelque chose?
Zacharý
@ Zacharý, il se briserait s'il dépassait ila taille dex
Rod
6

Gelée ,  26 25  23 octets

-2 octets grâce à Erik l'Outgolfer (en introduisant l'instruction if dans le lien principal)

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

Un lien dyadique renvoyant une liste au [3,5,"-",8,10,"-",12,14,16,"-",22,24]format.

Essayez-le en ligne! (le pied de page est séparé par des espaces pour imprimer le format d'exemple de données).

Comment?

Ḣ;Ṫ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
la source
Un lien monadique?
Leaky Nun
heh, et un "spécial" à cela.
Jonathan Allan
Réorganiser un peu vos trucs aide à -2.
Erik the Outgolfer du
Jolies choses, merci @EriktheOutgolfer!
Jonathan Allan
4

Pyth, 23 octets

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

Essayez-le en ligne

Comment ça marche

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
la source
3

Japt , 24 octets

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

Essayez-le en ligne!

Explication

óÈ   Ä ¥ 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
ETHproductions
la source
2

Mathematica, 128 octets

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


contribution

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

sortie

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

Essayez-le en ligne!

J42161217
la source
ici
Leaky Nun
2

APL, 38 octets

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

PHP 7, 137 136 134 117 117 110 108 octets

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

Prend Ldu premier argument, liste les éléments après cela. Courez avec -nrou essayez-le en ligne .

Remplacez $L=($a=$argv)par $a=$argv,$L=(+1 octet) pour PHP <7.

panne

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
la source
1

Rétine , 101 octets

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

1+
$.&

Essayez-le en ligne! Prend la liste séparée par des espaces Lsur la première ligne et l'entier Nsur la deuxième ligne. Explication: La première étape convertit l'entrée en unaire. La deuxième étape change l'espace entre des entiers consécutifs en un X. La troisième étape recherche des séries d'entiers consécutifs dont la longueur est inférieure à Net change leur Xs en espaces. La quatrième étape change le Xs en -(ce qui était 3 octets plus court que l'utilisation de -s en premier lieu.) La cinquième étape supprime tous les nombres entiers encore laissés au milieu d'une course, ainsi que N, tandis que la dernière étape se reconvertit en décimale.

Neil
la source
1

Rubis, 68 octets

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

Renvoie une chaîne comme par exemple 3,5-8,10-12,14,16-22,24.

Essayez-le en ligne!

daniero
la source
1

J , 40 octets

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

Essayez-le en ligne!

Utilise _au lieu de -.

Explication

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

Gelée, 39 37 36 octets

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

Essayez-le en ligne

Prend le tableau via des arguments et l'entier via STDIN. Le lien TIO utilise le pied de page ÇGafin que la sortie soit séparée par des espaces.

Comment? (Array: a, Entier 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.

Je suppose que je suis tombé ... à plat sur celui-ci.

Zacharý
la source
0

JavaScript (ES6), 126 119 octets

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

Une fonction anonyme. Prend l'entrée dans l'ordre Array L, Integer Net renvoie le résultat sous la forme d'une chaîne séparée par des virgules.

R. Kap
la source
Utilisez le curry pour enregistrer un octet e=>c=>.
TheLethalCoder du
0

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

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

Wow, c'est ... mauvais. Il existe probablement une solution beaucoup plus courte avec le pochoir.

Essayez-le en ligne!

Suggestions de golf bienvenues!

Zacharý
la source
Ouais, qu'en est-il?
Zacharý
Désolé, mauvais endroit.
Adám
^ Que voulez-vous dire?
Zacharý
Mon commentaire était basé sur un défi différent.
Adám
Je suppose que si vous avez une solution, Adám, alors elle utilise des buildins v16?
Zacharý