不規則な配列をシャッフルする


23

不規則配列は、各要素が正数の未知数の配列である配列です。

たとえば、次は不規則配列です。

[[1,2,3],[4],[9,10]]               Shape:  3,1,2
[[1],[2],[3]]                      Shape:  1,1,1
[[1,2,3,4,5,6,8]]                  Shape:  7

以下は不規則配列ではありません

[1]   Each element will be an array
[]    The array will contain at least 1 element
[[1,2,3],[]]  Each subarray will contain at least 1 integer

不規則配列を入力し、整数をシャッフルした不規則配列を返す必要があります

  • 出力配列は、入力配列と同じ形状でなければなりません。配列の形状を各サブ配列の長さとして定義します。
  • 各整数には、可能性のある各場所に現れる可能性が等しくなければなりません。
  • あなたの言語の組み込みランダムはランダムであると仮定できます。

私が渡された場合たとえば、: [[4],[1,2,3],[4]]、その後、[[1],[4,4,2],[3]]有効な出力されますが、考え[[4,1,3],[3],[4]]たり[[4],[4],[1,2,3]]しません。



1
入力は常に2D配列ですか?
デニス

回答:


17

Jelly、Jellyのコードページの3バイト

FẊṁ

説明:

FẊṁ
F    flatten list
 Ẋ   shuffle the output from the previous line
  ṁ  unflatten the list, shaping it like…

プログラムは不完全であるため(2番目の引数が指定されていないため)、デフォルトではプログラム入力を使用します。したがって、出力は入力と同じサブリストパターンを持ちます。

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


4
うわー、unflattenはきちんとした予期しないコマンドです。
魔法のタコUr

3
左の引数はフラットである必要がないため、Unflattenは最良の用語ではないかもしれません。ニーモニックはカビです。
デニス

@Dennis:それは、整数ではなく要素としてリストを含む入力不規則配列でこのチャレンジに対して正しく動作しないことを意味しますか?(最初に内部リストを平坦化するため)それは少し残念ですが、不規則な配列のタイプに関係なく機能すると期待できます。(更新:確認しましたが、1つだけでなく複数のフラット化レイヤーの両方F機能しているようです。)

の左の引数は、単なるフラットリストではなく、何でもかまいません。例:tio.run/nexus/jelly#@
デニス

1
ああ、私はそれを非平坦化操作と呼びます。左の引数はフラットリストとして扱われます(リストが要素として含まれているだけですが、それらの要素は不透明として解釈されています)。実は、私たちはunflatteningが何であるかに同意するが、平坦化とは何か...に同意疑い

7

PowerShell v2 +、86バイト

param($n)$a=$n-split'[^\d]'-ne''|sort{random};-join($n-split'\d+'-ne''|%{$_+$a[$i++]})

文字列操作を介して動作します。入力は配列を表す文字列として、あなたの言語で機能するどんな形式でも渡されます。;-)

-split数字以外の入力を出力しsortrandomスクリプトブロック(ソートへの入力ごとに異なるランダムな重みを割り当てる)に基づいて入力を保存し、それをに格納し$aます。次にsplit、今度は数値を入力し、それぞれの出力に対して、からの対応する数値と文字列連結された現在の値(通常は角括弧とコンマ)を入力します$a。それは-join一緒に文字列に戻され、出力は暗黙的です。

PS C:\Tools\Scripts\golfing> .\shuffle-a-ragged-array.ps1 "@(@(1,2,3),4)"
@(@(3,2,1),4)

PS C:\Tools\Scripts\golfing> .\shuffle-a-ragged-array.ps1 "@(@(1,2,3),4)"
@(@(1,2,4),3)

PS C:\Tools\Scripts\golfing> .\shuffle-a-ragged-array.ps1 "[[4],[1,2,3],[4]]"
[[4],[2,4,3],[1]]

PS C:\Tools\Scripts\golfing> .\shuffle-a-ragged-array.ps1 "[[10],[1,2,3],[5]]"
[[10],[5,2,1],[3]]

PS C:\Tools\Scripts\golfing> .\shuffle-a-ragged-array.ps1 "[[10],[1,2,3],[5]]"
[[5],[10,2,1],[3]]


3

JavaScript(ES6)、78 75バイト

x=>x.map(y=>y.map(z=>+s.splice(Math.random()*s.length,1)),s=eval(`[${x}]`))

.splice()コードゴルフのチャレンジで使用したことを覚えているのはこれが初めてです...

事前に配列をシャッフルすることにより、2バイトをオフにゴルフできます。

x=>x.map(y=>y.map(z=>s.pop()),s=eval(`[${x}]`).sort(_=>Math.random()-.5))

ただし、これはほとんどの場合、最後の整数を最初に置くように見えるので、整数が均一に分布していないと仮定します。


「あなたの言語の組み込みランダムはランダムであると仮定できます。」
コナーオブライエン

@ ConorO'Brien「各整数は、可能性のある各場所に出現する可能性が等しくなければなりません。」
ETHproductions

sort一貫性のない比較キーを指定すると、正しく機能しません。言語のランダムがランダムであっても、この状況ではその種類は誤動作し、それがあなたが見ているバイアスを生み出しているものです。そのため、2番目の解決策は間違っていると思います。


2

Brachylog、17バイト

c@~P,?:{l~l}a.cP,

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

説明

基本的に、入力と同じ「形状」を持つ変数要素を持つサブリストのリストを作成し、すべてを単一のリストに連結すると、入力の連結を単一のリストにシャッフルする必要があることを述べます。

c@~P,                 Concatenate the Input into a single list. Shuffle it and call that P.
     ?:{   }a.        The Output is the result of applying this to each element of the input:
        l~l               The Output is a list of same length as the Input.    
             .cP,     P is the concatenation of the sublists of the Output.

1

Perl、37バイト

36バイトのコード+ -pフラグ。

@n=/\d+/g;s/\d+/splice@n,rand@n,1/ge

実行するには:

perl -pE '@n=/\d+/g;s/\d+/splice@n,rand@n,1/ge' <<< "[[4],[1,2,3],[4]"

説明:

@ n = / d + / g#すべての整数を@nに保存する
s / \ d + /#各整数を...に置き換えます
splice @ n、rand @ n、1 / ge#@nのランダムな位置にある要素(@nから削除されます)

1

05AB1E、17バイト

˜.r¹vDyg£DˆgF¦}}¯

˜                 Unflatten input
 .r               tmp = shuffle(flattened_input)
   ¹v             For each sub-array
     Dyg£         Take the first length(current_array) elements from tmp
         Dˆ       Append the result to a global array
           gF¦}   Remove the first elements from tmp
               }  End for
                ¯ Display the global array

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

05AB1Eまたは2sableの解決策を待っています。これは、まだわかりませんが、平坦化/成形機能が組み込まれています:)。


1

APL、35バイト

私はかろうじてPerlを打ち負かしています。

{Z[?⍨⍴Z]⊂⍨(⍳⍴Z←∊⍵)∊⊃¨{⍵+⊃⌽⍺}\⍳¨⍴¨⍵}

例えば:

      {Z[?⍨⍴Z]⊂⍨(⍳⍴Z←∊⍵)∊⊃¨{⍵+⊃⌽⍺}\⍳¨⍴¨⍵}(1 2 3)(,4)(9 10)
┌──────┬─┬───┐
│10 3 2│1│9 4│
└──────┴─┴───┘

説明:

  • 平坦化された配列内のサブ配列の開始の対応するインデックスを見つけます。
    • ⍳¨⍴¨⍵:サブ配列ごとに、インデックスのリストを取得します
    • {⍵+⊃⌽⍺}\:最初のサブ配列から始めて、配列の最後の値を次の配列の各値に追加します。
    • ⊃¨:開始位置である配列の最初の項目を取得します
    • (⍳⍴Z←∊⍵)∊:平坦化された配列をに保存しZます。サブ配列が開始する場所をマークするビットベクトルを生成します。
  • 平坦化された配列をシャッフルします。
    • ?⍨⍴Z:のランダムな順列を生成しZます。
    • Z[... ]:置換しZます。
  • ⊂⍨:ビットベクトルに従って、サブ配列の順列を分割します。

1
その場で交換できます。割り当てにより、変数をフラット化できました。A⊣(∊A)←(∊A)[?⍨≢∊A←⎕]
Adám16年

@Adám:うわー、それができるとは知らなかった。これを行うことができる機能のリストはありますか?
マリヌス

1
はい。また、変更された割り当てでも機能します。
アダム16

1

Pyth、15バイト

tPc.SsQ.u+NlYQ0

リストの入力を受け取り、結果を出力するプログラム。

テストスイート

使い方

tPc.SsQ.u+NlYQ0  Program. Input: Q
       .u    Q0  (1) Reduce Q with starting value 0, returning all results:
         +        Add
          N       the current value
           lY     to the length of the next element of Q
     sQ          Flatten Q
   .S            (2) Randomly shuffle
  c              Chop (1) at every location in (2)
tP               Discard the first and last elements
                 Implicitly print

1

PHP、105バイト

$m=array_merge(...$i=$_GET[i]);shuffle($m);foreach($i as$v)$o[]=array_splice($m,0,count($v));print_r($o);

おかげで105バイトに削減 user59178

元の回答:

PHP、132バイト

$i=$_GET['i'];$m=call_user_func_array('array_merge',$i);shuffle($m);foreach($i as$v){$o[]=array_splice($m,0,count($v));}print_r($o);

$m=array_merge(...$i=$_GET[i]);は25バイト短く$i=$_GET['i'];$m=call_user_func_array('array_merge',$i);、同じことをします。また、{}後にドロップすると、さらにforeach2バイト節約できます。
user59178 16

1

バッシュ、 63、58バイト

編集:

  • 最適化されたsed式、-5バイト

注意:

Bashは多次元配列を実際にはサポートしていません(ある程度しかシミュレートできないため)代わりに、このプログラムは、タスクの説明に示されているように、頑丈な配列の「シリアル化された」テキスト表現を受け入れ、[[1,2,3],[4],[9,10]]出力を提供します同じ形式で。

ゴルフ

printf `sed 's/\w\+/%d/g'<<<$1` `grep -Po '\d+'<<<$1|shuf`

テスト

>./shuffle []
[]

>./shuffle [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
[11,12,9,5,3,6,1,15,14,2,13,7,10,8,4]

>./shuffle [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
[9,15,11,10,7,6,1,14,2,3,12,5,4,13,8]

>./shuffle [[1,2,3],[4],[9,10]]
[[10,2,4],[9],[3,1]]

>./shuffle [[1,2,3],[4],[9,10]]
[[3,4,1],[10],[2,9]]

素晴らしいボーナスは、任意の深さの頑丈な配列をフィードできることです。

./shuffle [[1,[2,[3,[99,101]]],[4],[9,10]]
[[9,[4,[1,[101,2]]],[10],[3,99]]

引き続き正常に動作します。

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


0

オクターブ、60バイト

@(a)mat2cell([a{:}](randperm(sum(s=cellfun(@numel,a)))),1,s)

0

MATLAB、84バイト

function b=g(c);a=[c{:}];a=a(randperm(numel(a)));b=mat2cell(a,1,cellfun('length',c))

0

Java、368バイト

interface Z{int w(int i);default Z m(int n,int s){return i->w(i)+i>=n?s:0;}static int[][]f(int[][]r){int L=0,o=0,x,d,e=0;Z u=i->0,v=i->i;for(int[]a:r){d=a.length;L+=d;u=u.m(L,1);v=v.m(L,-d);}int[]c=new int[L];for(;e<L;)c[e++]=(int)(L*Math.random());for(int[]a:r){for(x=0;x<a.length;){d=c[x+o];e=v.w(d);d=u.w(d);L=a[x];a[x++]=r[d][e];r[d][e]=L;}o+=a.length;}return r;}}

この方法static int[][] f( int[][] r ){...}は課題を解決します。インポートを避け、使いやすいようにデフォルトのメソッドを追加するために、独自の機能インターフェースをロールバックすることにしました

interface Z{ //define my own functional interface instead of importing

  int w(int i);

  //return a new lambda
  //where w(int i) adds the value s
  //to the result when i is greater than n
  default Z m(int n,int s){
      return i->w(i)+i>=n?s:0;
  }

  static int[][]f(int[][]r){
      int L=0,o=0,x,d,e=0;
      Z u=i->0, //lambda to convert a flattened index to the input's first dimension index
        v=i->i; //lambda to convert a flattened index to the input's second dimension index
      for(int[]a:r){
          d=a.length;
          L+=d; //running total of the lengths
          u=u.m(L,1); //increment the 1st conversion by 1 at every array length
          v=v.m(L,-d); //decrement the 2nd conversion by the array length after that length
      }
      int[]c=new int[L]; //will contain flattened index swapping positions
      for(;e<L;) //randomize the swap positions
          c[e++]=(int)(L*Math.random());
      for(int[]a:r){ //swap the elements from the input
          for(x=0;x<a.length;){
              d=c[x+o]; //flattened swap index
              e=v.w(d); //convert swap index to 2nd dimension index
              d=u.w(d); //convert swap index to 1st dimension index
              L=a[x];
              a[x++]=r[d][e];
              r[d][e]=L;
          }
          o+=a.length; //increment offset for flattened index array
      }
      return r;
  }

}

0

Mathematica、67バイト

ReplacePart[#,Thread[RandomSample@Position[#,_Integer]->Union@@#]]&

説明:これは、2D不規則配列内のすべての整数の位置のリストをシャッフルします。 Union@@の略ですFlatten@

注:角かっこで{}はなく、角かっこが使用されます[]

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