チャンク+数字のリストを列挙する


11

10進数のリストがあります。

4, 4, 4, 7, 7, 9, 9, 9, 9, 2, 2, 2, 4, 4

10進数のリストはアイテムと呼ばれます。同じ番号と隣接する番号をグループ化することにより、これらのアイテムから「チャンク」を形成できます。各チャンクに、1から始まり、元のリストにチャンクが現れる順序で1ずつ増加する一意の番号を割り当てたいと思います。したがって、指定された例の出力は次のようになります。

1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5

入力フォーマット

数字のリスト。(0-9)必要に応じて、このリストを読むために言語組み込みを使用できます。エンコーディング:ASCII

出力フォーマット

区切り文字で区切られた一連の10進数。プログラムは常に同じ区切り文字を使用する必要があります。区切り文字は0ビットより長くする必要があります。エンコーディング:ASCII

標準の抜け穴が適用されます。


8
厳密な入出力形式の特定の理由は何ですか?
無関係な文字列

2
@UnrelatedStringうーん、それらを緩めます。
noɥʇʎԀʎzɐɹƆ

8
IOは依然としてかなり厳格です。「入力と出力はリストとして」と言うだけで、サイトのデフォルトでそれを処理してもらうことはできませんか?
ジョーキング

2
リストが空でないと仮定できますか?
ジョーキング

1
定義によるリストにはすでに区切り文字があります。それがリストだからです。私もあなたがどういうことかわかりませんYou may use your language built-ins to read this list however you want.。それは、投稿にリストコンバーターへの文字列を含める必要があるということですか?そして、している私たちは、リストとして出力する許可されていますか?
ジョーキング

回答:


7

Python 3.8(プレリリース)、41バイト

lambda l,n=0:[n:=n+(l!=(l:=x))for x in l]

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

:=割り当て式の魔法のセイウチを賞賛してください。


Python 2、42バイト

n=0
for x in input():n+=x!=id;id=x;print n

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


うーん、これはPythでどれくらい続くのでしょうか?
noɥʇʎԀʎzɐɹƆ

えっ、私は避けid、それは... 2バイト長だから
エリックをOutgolfer

素敵なアイデアOOFid
U10-フォワード

@noɥʇʎԀʎzɐɹƆ8バイトの簡単な翻訳:オンラインで試してみてください!
isaacg



3

ゼリー6 5バイト

ŒɠµJx

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

保存された1バイトのおかげUnrelatedString

配列としての入力と出力(開始/終了ブラケット付き)

使い方

ŒɠµJx - Main link, takes one argument:                       [7, 7, 5, 5, 5, 1]
Œɠ    - Get the lengths of consecutive elements:             [2, 3, 1]
  µ   - Call these lengths A
   J  - range(length(A))                                     [1, 2, 3]
    x - Repeat each element by the corresponding value in A: [1, 1, 2, 2, 2, 3]


1
@UnrelatedStringこれらのすべての新しい絡み合った原子!
ケアニコインヘリンガー












1

Perl 5、27バイト

s/\d/$i+=$&!=$p;$p=$&;$i/ge

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

コマンドラインオプション-pは、perlにSTDINからの入力行を「デフォルト変数」に読み込ませます$_。次に、すべての数字を$_counter で検索置換します$i。また$i、前の桁とは異なる各桁ごとに増加します。これは、最初の桁にもあるため、カウンターはから始まり1ます。前の数字はに保存され$pます。


1

Pyth13 11バイト

s.e*]hkhbr8

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

         r8  # Run-length encode (implicit argument is the input) (-> [[frequency, char], ...]
 .e          # Enumerated map (current element is b, index is k) over rQ8
   *]hk      # [ k+1 ] *
       hb    #           b[0]
s            # Reduce list on + ([a]+[b] = [a,b])

-Mr. Xcoderのおかげで2バイト


hMsM._+0nVt-2バイトの場合。
Mr Xcoder

あなたのアプローチを維持したい場合は、rQ8同じであるr8.nすることができsために-2だけでなく
氏Xcoder

ああ、ドキュメントはどの関数が暗黙的に取るかについて言及していませんでしたQ
-ar4093

1

Scala、75バイト

s=>s.scanLeft(("",0))((x,y)=>(y,x._2+(if(x._1!=y)1 else 0))).tail.map(_._2)

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

入力と出力がコンマで区切られた文字列(リストではなく)でなければならない場合、102バイト。

s=>s.split(", ").scanLeft(("",0))((x,y)=>(y,x._2+(if(x._1!=y)1 else 0))).tail.map(_._2).mkString(", ")

1

ゼリー、5バイト

nƝÄŻ‘

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

私は最初は4バイト(同じプログラムですが、なしŻ)を目指していましたが、すぐに1を監視するために先頭に追加する必要があることにすぐに気づきました...別の方法を使用するため、実際にこれを保持します。

LLiLi+1,1i<|L|



1

JavaScript(ES6)、30バイト

入力を整数の配列として受け取ります。

a=>a.map(p=n=>i+=p!=(p=n),i=0)

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

コメント済み

a =>                // a[] = input array
  a.map(p =         // initialize p to a non-numeric value
  n =>              // for each value n in a[]:
    i +=            //   increment i if:
      p != (p = n), //     p is not equal to n; and update p to n
    i = 0           //   start with i = 0 (chunk counter)
  )                 // end of map()

1

PHP、52バイト

while(''<$d=$argv[++$x])echo$i+=$argv[$x-1]!=$d,' ';

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

コマンドラインを介した入力、への出力STDOUT

厄介な'0' == 0比較バグ修正のための@ Night2へのThx !


@ Night2良いキャッチ!更新および修正。THX!
640KB



0

Add ++、23バイト

D,f,@*,BGd€bL$bLRz€¦XBF

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

使い方

D,f,@*,     - Define a function, f, that takes one argument:  [7 7 5 5 5 1]
       BG   - Group neighbouring elements together:           [[[7 7] [5 5 5] [1]]]          
       d    - Duplicate:                                      [[[7 7] [5 5 5] [1]] [[7 7] [5 5 5] [1]]]
       €bL  - Get the length of each:                         [[[7 7] [5 5 5] [1]] [2 3 1]]
       $bLR - Length, then range of length:                   [[2 3 1] [1 2 3]]
       z    - Zip together:                                   [[2 1] [3 2] [1 3]]
       €¦X  - Reduce each by repetition:                      [[1 1] [2 2 2] [3]]
       BF   - Flatten:                                        [1 1 2 2 2 3]
            - Due to the * in the function definition,
                 return the whole stack:                      [1 1 2 2 2 3]


0

Retina 0.8.2、34バイト

\b\d+\b(?<=(\b(\3|(\d+))\D*)*)
$#3

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

\b\d+\b

各番号を順番に一致させます。

(?<=(...)*)

できるだけ多くの一致を後方検索し始めます。(次のエントリは、後読みが機能する方法であるため、右から左の順序になります。)

\D*

区切り文字をスキップします。

(\3|(\d+))

前回と同じ番号を一致させようとしますが、失敗した場合は、任意の番号を一致させますが、新しい番号を一致させる必要があったことを忘れないでください。

\b

整数が一致していることを確認してください。

$#3

新しい番号の数を数えます。



0

C(gcc) 62 61バイト

これは、完全なプログラムが関数の送信よりも短い場合に私が行った数少ないエントリの1つです!

最初のパスでは、以前の値は気にしないのでargv、どこかへのポインターであり、[0..9]の間にある可能性は非常に低いという事実に依存します。

s;main(i,j){for(;~scanf("%d,",&i);j=i)printf("%d ",s+=j!=i);}

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



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.