Згорнути послідовні цілі числа


22

Супутнє: Скажіть мені, скільки математичних проблем я повинен робити!

Виклик

З огляду на суворо позитивний, суворо зростаючий цілий список L та ціле число 3 ≤ N ≤ довжина L, замініть середні цілі цілі послідовні цілі пробіги L довжиною ≥ N на один тире -.

Правила

  • Горизонтальний пробіл не має значення.
  • Ви можете додатково зберегти символи введення, роздільника та термінатора формату списку за замовчуванням у вашій мові. Див. Приклади форматування нижче.

Приклади даних

Всі ці приклади використовують 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

Форматування прикладів

Для входів
L = [3,5,6,7,8,10,11,12,14,16,17,18,19,20,21,22,24]та N = 3
всіх наведених нижче рядків - приклади дійсних відповідей, як фактичних списків, так і як рядків:

[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

Те саме стосується інших форматів списку, як-от {1 2 3}і (1; 2; 3)т. Д. Сумніви? Запитай!


Чи потрібно використовувати -чи нам дозволено використовувати інший символ?
милі

@miles Чи інший символ врятує вас байтами?
Adám

Я думаю про використання нескінченності, _щоб я міг продовжувати працювати на числових масивах у Дж.
миль

@miles Ага, так, чому б ти не пішов і зробиш це, але не зроби це з цього приводу, і якщо тебе можуть турбувати, напишіть (я вважаю, набагато довше) в коробці рішення '-'. Ви також можете впорядкувати все перед тим, як вставити тире, ні?
Adám

Чи дійсне наступне? [3,5,-8,10,-12,14,16,-22,24](здається, це формат, який має найбільше сенс щодо типів)
Leaky Nun

Відповіді:


7

Python 2 , 132 115 байт

-17 байт завдяки 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

Спробуйте в Інтернеті!



Було б while t+i==x[i]:працювати? Або я щось пропускаю?
Zacharý

@ Zacharý це зламається, якщо iотримати більше, ніж розмірx
стрижень

6

Желе ,  26 25  23 байт

-2 байти завдяки Еріку Попелу (за допомогою виведення заяви у головне посилання)

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

Дядічне посилання, що повертає список у [3,5,"-",8,10,"-",12,14,16,"-",22,24]форматі.

Спробуйте в Інтернеті! (нижній колонтитул відокремлюється пробілами для друку формату прикладу даних).

Як?

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

Монадійне посилання?
Leaky Nun

хе, і "особливий" у цьому.
Джонатан Аллан


Приємні речі, дякую @EriktheOutgolfer!
Джонатан Аллан

4

Pyth, 23 байти

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

Спробуйте в Інтернеті

Як це працює

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 байти

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

Спробуйте в Інтернеті!

Пояснення

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



1

PHP 7, 137 136 134 117 110 108 байт

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

Бере Lз першого аргументу, перелічіть елементи після цього. Запустіть -nrабо спробуйте в Інтернеті .

Замініть $L=($a=$argv)на $a=$argv,$L=(+1 байт) для PHP <7.

зламатися

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

Сітківка , 101 байт

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

1+
$.&

Спробуйте в Інтернеті! Приймає розділений пробілом список Lу першому рядку та ціле число Nу другому рядку. Пояснення: Перший етап перетворює вхід в одинаковий. Другий етап змінює простір між послідовними цілими числами на an X. Третій етап шукає прогони послідовних цілих чисел, довжина яких менша Nта змінює їх Xs назад на пробіли. Четвертий етап змінює Xs на -(це було на 3 байти коротше, ніж використання -s в першу чергу.) П'ятий етап видаляє всі цілі числа, що залишилися в середині пробігу, а також N, тоді як остаточний етап перетворюється назад у десятковий.



1

J , 40 байт

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

Спробуйте в Інтернеті!

Використовує _замість -.

Пояснення

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

Желе, 39 37 36 байт

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

Спробуйте в Інтернеті

Займає масив через аргументи, а ціле число через STDIN. Посилання TIO використовує колонтитул, ÇGтому висновок розділений пробілом.

Як? (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.

Я здогадуюсь, що я впав ... квартира на цьому.


0

JavaScript (ES6), 126 119 байт

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

Анонімна функція. Здійснює введення в порядку Array L, Integer Nі повертає результат у вигляді рядка, розділеного комою.


Використовуйте каррі, щоб зберегти байт e=>c=>.
TheLethalCoder

0

Dyalog APL v16.0, 82 80 78 76 75 65 62 байт

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

Ого, це ... погано. Мабуть, набагато коротше рішення з трафаретом.

Спробуйте в Інтернеті!

Пропозиції з гольфу вітаються!


Так, що з цим?
Zacharý

Вибачте, неправильне місце.
Adám

^ Що ти маєш на увазі?
Zacharý

Мій коментар був заснований на іншому виклику.
Адам

Я припускаю, що якщо у вас є рішення, Adám, то воно використовує v16 вбудовані?
Zacharý
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.