Свернуть последовательные целые числа

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 Сохранит ли байты другой символ?
Адам
Я думаю об использовании бесконечности, _чтобы я мог продолжать работать с числовыми массивами в J.
мили
@ Майлз Ах, да, почему бы вам не пойти дальше и не сделать это, но сделать не об этом, и если вы можете быть обеспокоены, напишите (я предполагаю, гораздо дольше) в штучной упаковке решение '-'. Вы также можете быть в состоянии привести в порядок все, прежде чем вставлять тире, нет?
Адам
Является ли следующее действительным? [3,5,-8,10,-12,14,16,-22,24](этот формат кажется наиболее
Дрянная Монахиня,

Ответы:

7

Python 2 , 132 115 байт

-17 байт благодаря Лаки Нун

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

Попробуйте онлайн!

прут
источник
115 байтов
прохудившаяся монахиня
Будет while t+i==x[i]:работать? Или я что-то упустил?
Захари
@ Zacharý это сломалось бы, если бы iстановилось выше, чем размерx
Род
6

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

-2 байта благодаря Эрику Аутгольферу (перенеся оператор if в основную ссылку)

Ḣ;Ṫ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
Джонатан Аллан
источник
Монадическая ссылка?
Утренняя монахиня
хех, и "особенный" в этом.
Джонатан Аллан
Перестановка ваших вещей немного помогает для -2.
Эрик Outgolfer
Хорошие вещи, спасибо @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
ETHproductions
источник
2

Mathematica, 128 байт

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


вход

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

выход

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

Попробуйте онлайн!

J42161217
источник
здесь
Leaky Nun
2

APL, 38 байт

{∊⍺{⍺>≢⍵:⍵⋄2⌽'-',2↑¯1⌽⍵}¨⍵⊂⍨1,1≠2-⍨/⍵}
Мэринус
источник
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
Titus
источник
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во второй строке. Пояснение: Первый этап преобразует ввод в унарный. На втором этапе пространство между последовательными целыми числами изменяется на X. Третий этап ищет серии последовательных целых чисел, длина которых меньше, Nи меняет их Xобратно на пробелы. Четвертый этап изменяет 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.

Я предполагаю, что упал ... безрезультатно на этом.

Zachary
источник
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-/⍵)⊢⍵}

Вау, это ... плохо. Там, вероятно, гораздо более короткое решение с трафаретом.

Попробуйте онлайн!

Предложения по игре в гольф приветствуются!

Zachary
источник
Да что насчет этого?
Захари
Извините, неправильное место.
Адам
^ Что ты имеешь в виду?
Захари
Мой комментарий был основан на другой проблеме.
Адам
Я предполагаю, что если у вас есть решение, Adám, то оно использует встроенные v16?
Захари