連続する整数を折りたたみます


22

関連:私がしなければならない数学の問題をいくつ教えてください!

チャレンジ

厳密に正の厳密に昇順の整数リストLおよびLの整数3≤N≤長さが与えられた場合、長さ≥NのLの連続整数実行の中間整数を単一のダッシュで置き換え-ます。

ルール

  • 水平方向の空白は関係ありません。
  • オプションで、言語のデフォルトのリスト形式のイントロデューサー、セパレーター、およびターミネーター文字を保持できます。以下のフォーマットの例を参照してください。

データ例

これらの例はすべてを使用しています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

回答:



6

ゼリー 26 25  23 バイト

-2バイト、Erik the Outgolferに感謝(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

モナドリンク?
リーキー修道女

へー、そしてその「特別な」もの。
ジョナサンアラン


@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

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

オンラインでお試しください!L1行目にスペースで区切られたリストを取り、N2行目に整数を取ります。説明:最初のステージは、入力を単項に変換します。2番目の段階では、連続する整数間のスペースをに変更しますX。3番目の段階では、長さがより小さい整数の連続した実行を探し、NそれらXのsをスペースに戻します。4番目のステージはXsをsに変更し-ます(これは-、最初のsを使用するよりも3バイト短くなりました。)5番目のステージは、実行中に残っているすべての整数を削除します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ため、出力はスペースで区切られます。

どうやって?(配列: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、結果をコンマ区切りの文字列として返します。


カリー化を使用してバイトを保存します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-/⍵)⊢⍵}

うわー、これは...悪いです。おそらくステンシルを使用したはるかに短いソリューションがあります。

オンラインでお試しください!

ゴルフの提案を歓迎します!


ええ、それはどうですか?
ザカリー

すみません、間違った場所です。
アダム

^どういう意味ですか?
ザカリー

私のコメントは別の挑戦に基づいていました。
アダム

アダムのソリューションがある場合、v16ビルトインを利用すると思いますか?
ザカリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.