配列内の最小グループ


14

前書き

次の配列を見てみましょう。

[1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1]

グループは、互いに隣接して同じ桁で構成されています。上記の配列には、5つの異なるグループがあります。

[1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1]

 1, 1, 1 
          2, 2
                1, 1, 1, 1
                            2, 2, 2
                                     1, 1, 1

これらの最小グループはです[2, 2]ので、出力します[2, 2]

別の例を見てみましょう。

[3, 3, 3, 4, 4, 4, 4, 5, 5, 4, 4, 3, 3, 4, 4]

 3, 3, 3
          4, 4, 4, 4
                      5, 5
                            4, 4
                                  3, 3
                                        4, 4

同じ長さのグループが複数あることがわかります。最小のグループは次のとおりです。

[3, 3], [4, 4], [4, 4] and [5, 5].

したがって[3, 3], [4, 4], [4, 4], [5, 5]、適切な形式で出力するだけです。これらは任意の順序で出力できます。

タスク

正の整数のみで構成される配列を指定すると、配列から最小のグループが出力されます。配列には少なくとも1つの整数が含まれると想定できます。

テストケース

Input: [1, 1, 2, 2, 3, 3, 4]
Output: [4]

Input: [1]
Output: [1]

Input: [1, 1, 10, 10, 10, 100, 100]
Output: [1, 1], [100, 100]

これはであるため、バイト数が最小の提出が勝ちです!



入力は文字列にすることができますか?
downrep_nation

@downrep_nationうーん、それならどうしますか?複数桁の整数でそれができるなら、それは問題ありません。
アドナン

intはサイズによって非常に制限され、文字列はそうではありません。だからこそ、
私が

@downrep_nationわかりました。では、最後のテストケースでどのように入力を提供しますか?11101010100100入力に対して正しいように見えません:p。
アドナン

回答:


5

Pyth、 14 12 11

mM_MmhbrQ8

テストスイート

ジャクベのおかげで2バイト!そしてisaacgのおかげで1バイト!

残念ながら、ランレングスデコードは、期待どおりの動作をしませんが、マイナーな回避策で動作しますが、手動実装よりも少し長くなります。

mr]d9.mhbrQ8

これを見つけたのはジャクベの功績です。


ところで、rldは機能しますが、ペアのリストを提供する必要がありますmr]d9.mhbrQ8
。–ジャクベ

ランレングスデコーディングの詳細:ランレングスデコーディングでは、個々のペアではなく、ランレングスエンコーディングが返すものなどのペアのリストが必要です。
isaacg

.bmYN==mM_M
isaacg

@isaacgああ、それは理にかなっている、私はそれを十分に考えていなかったと思う。また、そのマップトリックはすてきです、ありがとう!
FryAmTheEggman

8

Mathematica、24バイト

MinimalBy[Length]@*Split

これは、リストに適用できる2つの関数の構成です。Split連続する番号のすべてのグループを取得し、MinimalBy[Length]最小の長さのグループを選択します。


くそー、これをテストするためにMathematicaを起動しました... +1 :)
マーティン・エンダー

今、私はこれをあまりにも簡単にしていないのではないかと思っています:/。
アドナン

4

Haskell、38バイト

import Data.Lists
argmins length.group

使用例:argmins length.group $ [3,3,3,4,4,4,4,5,5,4,4,3,3,4,4]-> [[4,4],[3,3],[4,4],[5,5]]

等しい要素のグループを作成し、最小の長さのグループを見つけます。


のドキュメントはどこにありますData.Listsか?
リン

@Lynn:Data.Lists。このページの再エクスポートされたモジュールへのリンクも参照してください。argminsたとえば、Data.List.Extras.Agrmaxからのものです
nimi

3

Python 2、120バイト

import re
r=[x.group().split()for x in re.finditer(r'(\d+ )\1*',input())]
print[x for x in r if len(x)==min(map(len,r))]

入力を末尾のスペースを含むスペースで区切られた整数の文字列として受け取り、文字列のリストのリストを出力します。戦略は、正規表現(\d+ )\1*(1つ以上のスペースで区切られた整数に一致し、末尾にスペースがあります)を使用してグループを検索し、スペースでそれらを整数のリストに分割し、長さが最小グループ長に等しいグループを出力することです。

オンラインで試す


2

C#、204バイト

void f(string o){var r=Regex.Matches(o,@"([0-9])\1{0,}").Cast<Match>().OrderBy(x=>x.Groups[0].Value.Length);foreach(var s in r){foreach(var z in r)if(s.Length>z.Length)return;Console.WriteLine(s.Value);}}

すべてのゴルフエゾランが同じ方法で入力を取得することを考えると、文字列を使用することが公平かどうかはわかりませんが、配列入力を要求しました。

それがどのように見えるか

権利なし:

    public static void f(string inp)
    {

        var r = Regex.Matches(inp, @"([0-9])\1{0,}").Cast<Match>().OrderBy(x => x.Groups[0].Value.Length);

        foreach (Match s in r)
        {
            foreach (Match z in r)
                if (s.Length > z.Length)
                    return;

        Console.WriteLine(s.Value);
        }


    }

一致配列の最小一致を取得する方法が必要です。ほとんどのバイトがそこで無駄になります。私はLINQとラムダのことを始めようとしています。


技術的には、文字列は配列です。
リーキー修道女

1

Python 2.x、303バイト

x=input()
r=[q[2]for q in filter(lambda l:(len(l[2])>0)&((l[0]<1)or(x[l[0]-1]!=x[l[0]]))&((l[1]>len(x)-1)or(x[l[1]]!=x[l[1]-1]))&(len(filter(lambda k:k==l[2][0],l[2]))==len(l[2])),[(a,b,x[a:b])for a in range(0,len(x))for b in range(0,len(x)+1)])]
print filter(lambda k:len(k)==min([len(s)for s in r]),r)

最もgliい。コード。今まで。

入力:形式の配列、r'\[(\d,)*(\d,?)?\]'
つまり、数字のpython配列

出力:配列の配列(最小のグループ)、入力配列に現れる順序

追加の偶然の機能(作成するつもりはなかった機能):

  • 入力は空の配列にすることができます。出力は空の配列になります。
  • に変更minするmaxと、最大のグループの配列が返されます。
  • 実行するとprint r、すべてのグループが順番に印刷されます。

1

MATL、15バイト

Y'tX<tb=bw)wTX"

オンラインで試す

入力はのようなベクトルで、[1 2 3 4]出力は各列が最小グループの1つである行列です。例:

1 100
1 100

3番目のテストケース。

説明:

Y'    %// Run length encoding, gives 2 vectors of group-lengths and values
t     %// Duplicate group lengths
X<    %// Minimum group length
tb    %// Duplicate and get vector of group lengths to the top
=     %// Find which group lengths are equal to the minimum
bw)   %// And get the values of those groups
wTX"  %// Repeats the matrix of minimum-length-group values by the minimum group length

1

ゼリー、22 17 16バイト

I0;œṗ¹L=¥ÐfL€Ṃ$$

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

I0;œṗ¹L=¥ÐfL€Ṃ$$     Main link. List: z = [a,b,c,...]

I                    Compute [b-a, c-b, d-c, ...]
 0;                  Concatenate 0 in front: [0, b-a, c-b, d-c, ...]
   œṗ                Split z where the corresponding item in the above array is not zero.
      L=¥Ðf          Filter sublists whose length equal:
           L€Ṃ$      the minimum length throughout the list.

     ¹         $     (grammar stuffs)

1

JavaScript(ES6)、106

a=>(a.map((v,i)=>v==a[i-1]?g.push(v):h.push(g=[v]),h=[]),h.filter(x=>!x[Math.min(...h.map(x=>x.length))]))

テスト

f=a=>(a.map((v,i)=>v==a[i-1]?g.push(v):h.push(g=[v]),h=[]),h.filter(x=>!x[Math.min(...h.map(x=>x.length))]))

console.log=x=>O.textContent+=x+'\n'

;[[1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1]
, [3, 3, 3, 4, 4, 4, 4, 5, 5, 4, 4, 3, 3, 4, 4]
, [1, 1, 2, 2, 3, 3, 4]
, [1]
, [1, 1, 10, 10, 10, 100, 100]]
.forEach(t=>console.log(t+' -> '+f(t).join` `))
<pre id=O></pre>


動作しh.map(length)ませんか?
リーキー修道女

@KennyLauいいえ、それがlength機能するには、文字列のメソッドではなく、引数として文字列を持つ関数でなければなりません
-edc65

1
@ edc65実際には、Stringのプロパティ。メソッドではありません。
チャールズ

1

JavaScript(ES6)、113バイト

a=>a.map(n=>n==c[0]?c.push(n):b.push(c=[n]),c=b=[])&&b.sort((a,b)=>a[l]-b[l],l='length').filter(e=>e[l]==b[0][l])

1

網膜、91 85 80 79 77 76 75 74バイト

M!`\b(\d+)(,\1\b)*
(,()|.)+
$#2:$&
O#`.+
s`^(.*\b(.+:).*)¶(?!\2).+
$1
.+:
<empty-line>

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

説明

入力は1,1,10,10,10,100,100です。

最初の行は、同じ用語を持つグループに一致します。

M!`\b(\d+)(,\1\b)*

入力は次のようになります。

1,1
10,10,10
100,100

次の2行は、行にカンマの数を追加します。

(,()|.)+
$#2:$&

入力は次のようになります。

1:1,1
2:10,10,10
1:100,100

次に、次の行でソートされ、最初の番号をインデックスとして探します。

O#`.+

入力は次のようになります。

1:1,1
1:100,100
2:10,10,10

次に、次の2行で長さが異なる場所を見つけ、それ以降はすべて削除します。

s`^(.*\b(.+:).*)¶(?!\2).+
$1

入力は次のようになります。

1:1,1
1:100,100

次に、これらの2行によって番号が削除されます。

.+:
<empty-line>

入力は次のようになります。

1,1
100,100

@Adnanありがとう、修正。
リーキー修道女

1

APL、25文字

{z/⍨(⊢=⌊/)≢¨z←(1,2≠/⍵)⊂⍵}

英語で:

  • 数値が先行する数値と異なる引数splitをzに入れます。
  • 各部分配列の長さを計算する
  • ブール値を生成する各長さと最小値を比較します...
  • ... zを減らすために使用されます

通勤。通勤。通勤!⍵⊂⍨1,2≠/⍵
ザカリー

1

J、31バイト

[:(#~[:(=<./)#@>)]<;.1~1,2~:/\]

入力は値の配列です。出力はボックス化された配列の配列です。

使用法

   f =: [:(#~[:(=<./)#@>)]<;.1~1,2~:/\]
   f 1 1 2 2 3 3 4
┌─┐
│4│
└─┘
   f 3 3 3 4 4 4 4 5 5 4 4 3 3 4 4
┌───┬───┬───┬───┐
│5 5│4 4│3 3│4 4│
└───┴───┴───┴───┘

説明

[:(#~[:(=<./)#@>)]<;.1~1,2~:/\]  Input: s
                              ]  Identity function, get s
                         2       The constant 2
                             \   Operate on each overlapping sublist of size 2
                          ~:/      Check if each pair is unequal, 1 if true else 0
                       1,        Prepend a 1 to that list
                 ]               Identity function, get s
                  <;.1~          Using the list above, chop s at each true index
[:(             )                Operate on the sublists
             #@>                 Get the length of each sublist
     [:(    )                    Operate on the length of each sublist
         <./                     Get the minimum length
        =                        Mark each index as 1 if equal to the min length else 0
   #~                            Copy only the sublists with min length and return

1

Clojure、65バイト

#(let[G(group-by count(partition-by + %))](G(apply min(keys G))))

5 +としてidentity関数として使用(+ 5):)残りは明らかでGあるはずで、関数として使用され、対応する値を返すキーが与えられるハッシュマップです。


1

Brachylog、6バイト

ḅlᵒlᵍh

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

入力変数を介して入力し、出力変数を介して出力します。

ḅ         The list of runs of consecutive equal elements of
          the input
 lᵒ       sorted by length
   lᵍ     and grouped by length
          has the output variable
     h    as its first element.

とは異なりグループは連続していない等しい要素をlᵒグループ化しますが、最も短い長さのグループを見つける必要がありますが、出力のグループの順序は各グループの最初の要素の位置によって決定されるため、これᵍhᵐ疑似メタプレディケートによる重複排除の一種として機能する可能性があります。


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