Düzensiz bir diziyi karıştır


23

Düzensiz bir dizi, her bir öğenin bilinmeyen sayıda pozitif tam sayı dizisi olduğu bir dizidir.

Örneğin, aşağıdaki düzensiz diziler:

[[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

Aşağıdaki düzensiz dizileri değildir :

[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

Düzensiz bir dizi girmeniz ve karıştırılan tamsayılarla düzensiz bir dizi döndürmeniz gerekir.

  • Çıkış dizisi , giriş dizisiyle aynı şekilde olmalıdır . Dizinin şeklini her alt dizinin uzunluğu olarak tanımlarız .
  • Her bir tamsayı, her olası konumda görünmesi için eşit derecede muhtemel bir şansa sahip olmalıdır.
  • Dilinizin yerleşik rastgele rastgele olduğunu varsayabilirsiniz.

Ben geçirilen Örneğin,: [[4],[1,2,3],[4]], o zaman [[1],[4,4,2],[3]]geçerli bir çıkış olurdu, ama [[4,1,3],[3],[4]]ya [[4],[4],[1,2,3]]olmaz.



1
Giriş her zaman 2B dizi olacak mı?
Dennis,

Yanıtlar:


17

Jelly'in kod sayfasındaki Jelly, 3 byte

FẊṁ

Açıklama:

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

Program tamamlanmadığından ( belirtilen ikinci bir argümana sahip olmadığından), varsayılan program girişini kullanmaktır; bu nedenle çıkışın, girdi ile aynı alt liste modeline sahip olmasına neden olur.

Çevrimiçi deneyin!


4
Vay, unflatten düzgün ve beklenmedik bir komuttur.
Sihirli Ahtapot Urn

3
Unflatten , sol argümanın düz olması gerekmediğinden en iyi terim olmayabilir. Anımsatıcı kalıptır .
Dennis,

@Dennis: Bu, tam sayılardan ziyade listeleri içeren bir girdi düzensiz dizisinde bu zorluk için doğru çalışmayacağı anlamına mı geliyor (ilk önce iç listeleri düzleştireceği için)? Bu biraz hayal kırıklığı yaratıyor, düzensiz dizinin türüne bakılmaksızın çalışmasını beklersiniz. (Güncelleme: Kontrol ettim, öyle görünüyor ki hem Fve değil sadece bir düzleşme çoklu katmanlar için çalışır.)

Yani, sol argüman sadece düz bir liste değil, her şey olabilir. Örneğin: tio.run/nexus/jelly#@/9wZ@P////@jow11FIxidRSijXUUTEC0qY6CWWzs/…
Dennis

1
Oh, buna düzensiz bir işlem diyebilirim; sol argüman düz bir liste olarak ele alınır (sadece listelerde elementler bulunur ancak bu elementler opak olarak yorumlanır). Aslında,

7

PowerShell v2 +, 86 bayt

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

Dize manipülasyonu ile çalışır. Girdi biçimi hangisiyse, onu içinde diziyi temsil eden bir dize olarak geçirilen sizin dilinizde. ;-)

-splitRakam olmayanlar üzerindeki girdiyi siler, sortbunlar randomkod bloğunu temel alır (sıralamaya her girdi için farklı bir rasgele ağırlık atayacak), bunu içine kaydeder $a. Daha sonra splittekrar giriş yaptık , bu kez rakamlar ve her biri için geçerli sayıyı (genellikle parantez ve virgüller) dize ile karşılık gelen sayıyla birleştirildi $a. Bu -joinbirlikte bir dizgede tekrar ediniyor ve çıktısı örtük.

Örnekler

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 bayt

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

Bu .splice()kod golf mücadelesinde ilk kullandığım zamanı hatırlıyorum ...

Diziyi önceden karıştırıp iki byte'la golf oynayabilirsiniz:

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

Ancak, bu son tamsayıyı çoğu zaman ilk kez koyar gibi görünüyor, bu yüzden tamsayıların eşit dağılmadığını varsayıyorum.


“Dilinin yerleşik rastgele rastgele olduğunu varsayabilirsin.”
Conor O'Brien,

@ ConorO'Brien "Her tamsayı her olası konumda görünmek için eşit derecede muhtemel bir şansa sahip olmalıdır."
ETHProductions,

sorttutarsız bir karşılaştırma anahtarı verildiğinde düzgün çalışmıyor. Dil rastgele olsa bile, sıralama bu durumda arızalanır ve görmekte olduğunuz önyargıyı yaratan şey de budur. Bu nedenle, ikinci çözümün yanlış olduğunu düşünüyorum.

2

Ruby, 47 bayt

->a{b=a.flatten.shuffle;a.map{|x|x.map{b.pop}}}

2

Brachylog , 17 bayt

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

Çevrimiçi deneyin!

açıklama

Temelde, Girdi ile aynı "şekle" sahip değişken elemanlara sahip bir alt liste listesi yaratırız ve daha sonra her şeyi tek bir listede birleştirirsek, girişin tek bir listede karıştırılmasıyla sonuçlanması gerektiğini belirtiriz. .

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 bayt

36 bayt kodu + -pbayrak.

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

Çalıştırmak için:

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

açıklamalar:

@ n = / d + / g # tüm sayıları @da saklar
s / \ d + / #, her tamsayıyı ... ile değiştirir
splice @ n, rand @ n, 1 / ge #, @n (@n'den silinir) rasgele bir pozisyonda bir element

1

05AB1E , 17 bayt

˜.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

Çevrimiçi deneyin!

Henüz bilmiyorum bazı düzensiz / kalıplama yerleşik kullanarak 05AB1E veya 2sable çözüm bekliyorum :).


1

APL, 35 bayt

Zorlukla Perl'i bile yendim, kaçırdığım bir şey olmalı.

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

Örneğin:

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

Açıklama:

  • Düzleştirilmiş bir dizideki alt dizilerin başlangıçlarının karşılık gelen dizinlerini bulun:
    • ⍳¨⍴¨⍵: Her alt dizi için indekslerin listesini alın
    • {⍵+⊃⌽⍺}\: İlk alt diziden başlayarak, dizideki son değeri bir sonraki dizideki her değere ekleyin.
    • ⊃¨: dizilerin ilk başlangıç ​​noktası olan öğeleri al
    • (⍳⍴Z←∊⍵)∊: düzleştirilmiş diziyi içinde saklayın Z. Alt dizilerin başlaması gereken yerleri işaretleyen bir bit vektörü oluşturun.
  • Düzleştirilmiş diziyi karıştır:
    • ?⍨⍴Z: rastgele bir permütasyon oluşturmak Z.
    • Z[... ]: izin ver Z.
  • ⊂⍨: Alt dizilerde permütasyonu bit vektörüne göre ayırın.

1
Yerinde değiştirme yapabilirsiniz. Atama değişkeni düzleştirmenize izin verdi:A⊣(∊A)←(∊A)[?⍨≢∊A←⎕]
Adám

@ Adám: vay, bunu yapabileceğini bilmiyordum. Bunu hangi fonksiyonların yapabileceği bir liste var mı?
marinus

1
Evet . Ve aynı zamanda değiştirilmiş ödev ile çalışır .
18’de

1

Pyth, 15 bayt

tPc.SsQ.u+NlYQ0

Bir listenin girişini alan ve sonucu basan bir program.

Test odası

Nasıl çalışır

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 bayt

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

sayesinde 105 bayta düşürüldü user59178.

Orijinal cevap:

PHP , 132 bayt

$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 byte daha kısa $i=$_GET['i'];$m=call_user_func_array('array_merge',$i);ve aynı şeyi yapar. Buna ek olarak {}, foreach2 bayttan daha fazla tasarruf etmek için sonradan bırakabilirsiniz .
user59178

1

Bash, 63, 58 bayt

DÜZENLEMELER:

  • Optimize edilmiş sed ifadesi biraz, -5 bayt

Not:

Bash gerçekten görev açıklamasında, örneğin gösterildiği gibi bunun yerine, bu program, bir sağlam dizinin bir "tefrika" metin temsilini kabul edecek, (yalnızca bir ölçüde simüle edilebilir) çok boyutlu diziler desteklemez: [[1,2,3],[4],[9,10]]ve çıkışı sağlamak aynı biçimde.

golfed

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

Ölçek

>./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]]

Güzel bir bonus, keyfi bir derinliğe sahip sağlam dizileri besleyebilmenizdir:

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

ve yine de düzgün çalışacaktır.

Çevrimiçi deneyin!


0

Oktav, 60 bayt

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

0

MATLAB , 84 bayt

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

0

Java, 368 bayt

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;}}

yöntem static int[][] f( int[][] r ){...}zorluğu çözer. içe aktarma işleminden kaçınmak için kendi işlevsel arabirimimi almaya ve kullanım kolaylığı için varsayılan bir yöntemi eklemeye karar verdi

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 Bayt

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

Açıklama: Bu, 2B düzensiz dizisindeki tüm tam sayıların konum listesini karıştırır. Union@@İçin KısaFlatten@

Not: Köşeli parantezler {}, parantez yerine kullanılır [].

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.