Recolher números inteiros consecutivos

22

Relacionado: Diga-me quantos problemas de matemática eu tenho que fazer!

Desafio

Dada uma lista inteira estritamente ascendente estritamente positiva L e um número inteiro 3 ≤ N ≤ comprimento de L, substitua os inteiros médios das execuções inteiras consecutivas de L de comprimento ≥ N com um único traço -.

Regras

  • O espaço em branco horizontal é irrelevante.
  • Opcionalmente, você pode preservar os caracteres introdutor, separador e terminador do formato de lista padrão do seu idioma. Veja exemplos de formato abaixo.

Exemplos de dados

Todos esses exemplos usam 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

Exemplos de formato

Para as entradas
L = [3,5,6,7,8,10,11,12,14,16,17,18,19,20,21,22,24]e N = 3
todas as linhas abaixo, são exemplos de respostas válidas, como listas reais e como strings:

[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

O mesmo se aplica a outros formatos de lista, como {1 2 3}e (1; 2; 3)etc. Em dúvida? Ask!

Adão
fonte
É necessário usar -ou podemos usar um símbolo diferente?
milhas
@miles Um símbolo diferente salvará você em bytes?
Adám
Estou pensando em usar o infinito _para que eu possa continuar operando em matrizes numéricas em J.
miles
@miles Ah, sim, por que você não faz isso, mas não se preocupe, e se você puder se incomodar, escreva a solução em caixa (presumo que por muito mais tempo) '-'. Você também pode ser capaz de restringir tudo antes de inserir traços, não?
Adám
O seguinte é válido? [3,5,-8,10,-12,14,16,-22,24](este parece ser o formato que faz mais sentido em termos de tipos)
Leaky Nun

Respostas:

7

Python 2 , 132 115 bytes

-17 bytes graças 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

Experimente online!

Cajado
fonte
115 bytes
Freira vazada
Funcionaria while t+i==x[i]:? Ou eu estou esquecendo de alguma coisa?
Zacharý
@ Zachary iria quebrar se iobter maior do que o tamanho dex
Rod
6

Geléia ,  26 25  23 bytes

-2 bytes graças a Erik the Outgolfer (trazendo a instrução if para o link principal)

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

Um link diádico retornando uma lista no [3,5,"-",8,10,"-",12,14,16,"-",22,24]formato.

Experimente online! (o rodapé separa com espaços, para imprimir o formato de exemplo de dados).

Quão?

Ḣ;Ṫ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
fonte
Um link monádico?
Leaky Nun
heh, e um "especial" nisso.
Jonathan Allan
Reorganizar um pouco as coisas ajuda a -2.
Erik the Outgolfer
Coisas legais, obrigado @EriktheOutgolfer!
Jonathan Allan
4

Pitão, 23 bytes

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

Experimente online

Como 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
fonte
3

Japt , 24 bytes

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

Experimente online!

Explicação

óÈ   Ä ¥ 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
fonte
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}]

saída

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

Experimente online!

J42161217
fonte
aqui
Leaky Nun
2

APL, 38 bytes

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

PHP 7, 137 136 134 117 117 108 108 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;);

Retirado Ldo primeiro argumento, liste os elementos depois disso. Corra com -nrou experimente online .

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

demolir

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
fonte
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+
$.&

Experimente online! Leva a lista separada por espaços Lna primeira linha e o número inteiro Nna segunda linha. Explicação: O primeiro estágio converte a entrada em unário. O segundo estágio altera o espaço entre números inteiros consecutivos para um X. O terceiro estágio procura execuções de números inteiros consecutivos cujo comprimento seja menor que Ne muda seus Xs de volta para espaços. O quarto estágio altera Xs para -(isso foi 3 bytes mais curto do que usar -s em primeiro lugar.) O quinto estágio exclui todos os números inteiros ainda deixados no meio de uma execução, bem como N, enquanto o estágio final é convertido novamente em decimal.

Neil
fonte
1

Ruby, 68 bytes

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

Retorna uma string como por exemplo 3,5-8,10-12,14,16-22,24.

Experimente online!

daniero
fonte
1

J , 40 bytes

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

Experimente online!

Usa em _vez de -.

Explicação

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

Geléia, 39 37 36 bytes

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

Experimente online

Toma a matriz por meio de argumentos e o número inteiro via STDIN. O link TIO usa o rodapé ÇGpara que a saída seja separada por espaço.

Quão? (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.

Eu estou supondo que eu caí ... plana em um presente.

Zacharý
fonte
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}

Uma função anônima. Recebe a entrada na ordem Array L, Integer Ne retorna o resultado como uma sequência separada por vírgula.

R. Kap
fonte
Use currying para salvar um 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-/⍵)⊢⍵}

Uau, isso é ... ruim. Provavelmente há uma solução muito mais curta com estêncil.

Experimente online!

Sugestões de golfe são bem-vindas!

Zacharý
fonte
Sim, e daí?
Zacharý
Desculpe, lugar errado.
Adám
^ Como assim?
Zacharý
Meu comentário foi baseado em um desafio diferente.
Adám 27/07/17
Estou assumindo que, se você tem uma solução, Adám, ela utiliza built-in v16?
Zacharý