折叠连续的整数


22

相关:告诉我我必须做多少数学问题!

挑战

给定一个严格正的严格递增整​​数列表L和L的长度3≤N≤的整数,用一个破折号替换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.上对数字数组进行运算
英里

@miles啊,是的,您为什么不继续这样做,但请不要这样做,如果您可以打扰,请用写下(我假设更长的时间)盒装解决方案'-'。您也许还可以在插入破折号之前对所有内容进行字符串化处理,对吗?
亚当

以下有效吗?[3,5,-8,10,-12,14,16,-22,24](这似乎是在类型方面最有意义的格式)
Leaky Nun

Answers:



6

果冻 26 25  23 字节

感谢Outgolfer的Erik -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

单声道链接?
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

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,14,16,“-”,22,24}

在线尝试!



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在线尝试

对于PHP <7,替换$L=($a=$argv)$a=$argv,$L=(+1字节)。

分解

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。说明:第一阶段将输入转换为一元。第二阶段将连续整数之间的间隔更改为X。第三阶段寻找长度小于的连续整数的游程N并将其Xs换回空格。第四阶段将Xs 更改为-(比起-第一位使用s 短3个字节。)第五阶段将删除运行中间仍剩余的所有整数,以及N,最后一步则将其转换回十进制。


1

Ruby,68个字节

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

返回一个字符串,例如3,5-8,10-12,14,16-22,24

在线尝试!


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因此输出以空格分隔。

怎么样?(阵列:a,整数: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并以逗号分隔的字符串返回结果。


使用currying保存一个字节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-/⍵)⊢⍵}

哇,这很糟糕。模具的解决方案可能要短得多。

在线尝试!

欢迎打高尔夫球!


是的,那又如何呢?
扎卡里

对不起,错误的地方。
阿达姆(Adám)

^你是什么意思?
扎卡里

我的评论是基于另一个挑战。
阿达姆(Adám)

我假设如果您有一个解决方案,Adám,那么它将利用v16内置函数?
扎卡里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.