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!


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:



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

Un lien monadique?
Leaky Nun

heh, et un "spécial" à cela.
Jonathan Allan


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

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

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!



2

APL, 38 octets

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

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

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.


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!


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

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.


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.


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!


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ý
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.