Contraer enteros consecutivos

22

Relacionado: ¡ Dime cuántos problemas matemáticos tengo que hacer!

Reto

Dada una lista entera estrictamente positiva estrictamente ascendente L y un número entero 3 ≤ N ≤ longitud de L, reemplace los enteros medios de las series enteras consecutivas de L de longitud ≥ N con un solo guión -.

Reglas

  • El espacio en blanco horizontal es irrelevante.
  • Opcionalmente, puede conservar los caracteres de introducción, separación y terminación del formato de lista predeterminado de su idioma. Ver ejemplos de formatos , a continuación.

Ejemplos de datos

Todos estos ejemplos usan 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

Ejemplos de formato

Para las entradas
L = [3,5,6,7,8,10,11,12,14,16,17,18,19,20,21,22,24]y N = 3
todas las líneas a continuación hay ejemplos de respuestas válidas, tanto como listas reales como cadenas:

[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

Lo mismo se aplica con otros formatos de lista, como {1 2 3}y (1; 2; 3)etc. ¿Tiene dudas? ¡Pedir!

Adán
fuente
¿Es necesario usar -o se nos permite usar un símbolo diferente?
millas
@miles ¿Un símbolo diferente le ahorrará bytes?
Adám
Estoy pensando en usar infinito _para poder seguir operando en matrices numéricas en J.
millas
@miles Ah, sí, ¿por qué no sigues adelante y haces eso, pero no te preocupes por eso, y si puedes molestarte, escribe la solución en caja (supongo que mucho más tiempo) '-'? También es posible que pueda clasificar todo antes de insertar guiones, ¿no?
Adám
¿Es válido lo siguiente? [3,5,-8,10,-12,14,16,-22,24](este parece ser el formato que tiene más sentido en términos de tipos)
Leaky Nun

Respuestas:

7

Python 2 , 132115 bytes

-17 bytes gracias a 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

Pruébalo en línea!

Barra
fuente
115 bytes
Leaky Nun
Funcionaria while t+i==x[i]:? ¿O me estoy perdiendo algo?
Zacharý
@ Zacharý se rompería si ifuera más grande que el tamaño de x
Rod
6

Jalea ,  26 25  23 bytes

-2 bytes gracias a Erik the Outgolfer (al traer la declaración if al enlace principal)

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

Un enlace diádico que devuelve una lista en el [3,5,"-",8,10,"-",12,14,16,"-",22,24]formato.

Pruébalo en línea! (el pie de página se separa con espacios, para imprimir el formato de ejemplo de datos).

¿Cómo?

Ḣ;Ṫ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
fuente
¿Un enlace monádico?
Leaky Nun
je, y uno "especial" en eso.
Jonathan Allan
Reorganizar un poco tus cosas ayuda para -2.
Erik the Outgolfer
Buenas cosas, gracias @EriktheOutgolfer!
Jonathan Allan
4

Pyth, 23 bytes

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

Pruébalo en línea

Cómo funciona

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
fuente
3

Japt , 24 bytes

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

Pruébalo en línea!

Explicación

óÈ   Ä ¥ 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
ETHproducciones
fuente
2

Mathematica, 128 bytes

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


entrada

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

salida

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

Pruébalo en línea!

J42161217
fuente
aquí
Leaky Nun
2

APL, 38 bytes

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

PHP 7, 1371361341171010108 bytes

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

Toma Ldel primer argumento, enumere los elementos después de eso. Ejecutar -nro probarlo en línea .

Reemplace $L=($a=$argv)con $a=$argv,$L=(+1 byte) para PHP <7.

Descompostura

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
Tito
fuente
1

Retina , 101 bytes

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

1+
$.&

Pruébalo en línea! Toma la lista separada por espacios Len la primera línea y el número entero Nen la segunda línea. Explicación: La primera etapa convierte la entrada a unario. La segunda etapa cambia el espacio entre enteros consecutivos a an X. La tercera etapa busca corridas de enteros consecutivos cuya longitud es menor Ny Xvuelve a cambiar sus espacios a espacios. La cuarta etapa cambia la Xs a -(esto fue 3 bytes más corto que usar -s en primer lugar). La quinta etapa elimina todos los enteros que aún quedan en el medio de una ejecución, así como N, mientras que la etapa final se convierte de nuevo a decimal.

Neil
fuente
1

Ruby, 68 bytes

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

Devuelve una cadena como por ejemplo 3,5-8,10-12,14,16-22,24.

Pruébalo en línea!

daniero
fuente
1

J , 40 bytes

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

Pruébalo en línea!

Usos en _lugar de -.

Explicación

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

Gelatina, 39 37 36 bytes

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

Pruébalo en línea

Toma la matriz a través de argumentos, y el entero a través de STDIN. El enlace TIO utiliza el pie de página, ÇGpor lo que la salida está separada por espacios.

¿Cómo? (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.

Supongo que me caí ... de plano en este caso.

Zacharý
fuente
0

JavaScript (ES6), 126 119 bytes

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

Una función anónima. Toma la entrada en el orden Array L, Integer Ny devuelve el resultado como una cadena separada por comas.

R. Kap
fuente
Usa el curry para guardar un byte e=>c=>.
TheLethalCoder
0

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

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

Wow, esto es ... malo. Probablemente haya una solución mucho más corta con stencil.

Pruébalo en línea!

Sugerencias de golf bienvenidas!

Zacharý
fuente
Si, que hay de eso?
Zacharý
Lo siento, lugar equivocado.
Adám
^ ¿Qué quieres decir?
Zacharý
Mi comentario se basó en un desafío diferente.
Adám
Supongo que si tiene una solución, Adám, ¿entonces utiliza v16 incorporadas?
Zacharý