Przetasuj poszarpany układ

23

Poszarpana tablica to tablica, w której każdy element jest tablicą o nieznanej liczbie dodatnich liczb całkowitych.

Na przykład następujące tablice są poszarpane:

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

Poniższe tablice nie są poszarpane:

[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

Musisz wprowadzić nierówną tablicę i zwrócić nierówną tablicę z losowymi liczbami całkowitymi

  • Tablica wyjściowa musi mieć taki sam kształt jak tablica wejściowa. Definiujemy kształt tablicy jako długość każdej podtablicy.
  • Każda liczba całkowita musi mieć jednakową szansę na pojawienie się w każdej możliwej lokalizacji.
  • Możesz założyć, że losowo wbudowany język jest przypadkowy.

Na przykład, jeśli zdałem w: [[4],[1,2,3],[4]], wtedy [[1],[4,4,2],[3]]byłoby ważne wyjście, ale [[4,1,3],[3],[4]]czy [[4],[4],[1,2,3]]nie.

Nathan Merrill
źródło
Związane z.
Martin Ender,
1
Czy wejście zawsze będzie tablicą 2D?
Dennis,

Odpowiedzi:

17

Galaretka, 3 bajty na stronie kodowej Jelly

FẊṁ

Wyjaśnienie:

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

Ponieważ program jest niekompletny ( nie podano drugiego argumentu), domyślnie jest używane wejście programu; powoduje więc, że wyjście ma taki sam wzorzec listy podrzędnej jak wejście.

Wypróbuj online!


źródło
4
Wow, unflatten to fajne i nieoczekiwane polecenie.
Magic Octopus Urn
3
Unflatten może nie być najlepszym terminem, ponieważ lewy argument nie musi być płaski. Mnemonik to pleśń .
Dennis,
@Dennis: Czy to oznacza, że ​​nie zadziałałoby to poprawnie w przypadku tablicy wejściowej obdartej, która zawierała listy jako elementy, a nie liczby całkowite (ponieważ najpierw spłaszczy listy wewnętrzne)? To trochę rozczarowujące, można by oczekiwać, że zadziała niezależnie od typu poszarpanej tablicy. (Aktualizacja: Sprawdziłem, wydaje się, że zarówno Fi praca dla wielu warstw spłaszczenie, a nie tylko jednego.)
Mam na myśli, że lewym argumentem może być cokolwiek, nie tylko płaska lista. Na przykład: tio.run/nexus/jelly#@/9wZ@P///@jow11FIxidRSijXUUTEC0qY6CWWzs/…
Dennis,
1
Och, nazwałbym to spłaszczoną operacją; lewy argument jest traktowany jako płaska lista (akurat zdarza się, że zawiera listy jako elementy, ale te elementy są interpretowane jako nieprzejrzyste). Podejrzewam, że zgadzamy się co do tego, czym jest spłaszczenie, ale nie zgadzamy się co do spłaszczenia…
7

PowerShell v2 +, 86 bajtów

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

Działa poprzez manipulację ciągiem. Dane wejściowe są przekazywane jako ciąg znaków reprezentujący tablicę, w dowolnym formacie odpowiednim dla Twojego języka. ;-)

-splitwypisuje dane nie będące cyframi, sortsą oparte na randombloku skryptu (który przypisuje inną losową wagę dla każdego wejścia do sortowania), przechowuje to w $a. Następnie splitwprowadzamy ponownie, tym razem na cyfrach, i dla każdego z nich wyprowadzamy bieżącą wartość (zwykle nawiasy i przecinki) łączoną łańcuchem z odpowiednią liczbą z $a. Jest to -joinedytowane razem z powrotem w ciąg, a dane wyjściowe są niejawne.

Przykłady

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]]
AdmBorkBork
źródło
5

Python 2 , 89 bajtów

from random import*
x=input();r=sum(x,[]);shuffle(r)
print[[r.pop()for _ in t]for t in x]

Wypróbuj online!

Dennis
źródło
Nie znam tak dobrze Pythona, ale nie mogłeś shuffle(r=sum(x,[]))?
Conor O'Brien,
1
Nie, tasuj tasuje na miejscu i zwraca Brak .
Dennis
3

JavaScript (ES6), 78 75 bajtów

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

To pierwszy raz, kiedy pamiętam grę .splice()w golfa kodowego ...

Możesz zagrać w golfa o dwa bajty, uprzednio tasując tablicę:

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

Wydaje się jednak, że przez większość czasu to ostatnia liczba całkowita jest na pierwszym miejscu, więc założę, że liczby całkowite nie są równomiernie rozmieszczone.

ETHprodukcje
źródło
„Możesz założyć, że losowo wbudowany język jest przypadkowy.”
Conor O'Brien,
@ ConorO'Brien „Każda liczba całkowita musi mieć równie prawdopodobne szanse na pojawienie się w każdej możliwej lokalizacji”.
ETHproductions
sortnie działa poprawnie, gdy otrzyma niespójny klucz porównania. Nawet jeśli losowość języka jest losowa, jego rodzaj będzie działać nieprawidłowo w tej sytuacji, i właśnie to powoduje tendencyjność, którą widzisz. Dlatego uważam, że drugie rozwiązanie jest nieprawidłowe.
2

Ruby, 47 bajtów

->a{b=a.flatten.shuffle;a.map{|x|x.map{b.pop}}}
Lee W.
źródło
2

Brachylog , 17 bajtów

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

Wypróbuj online!

Wyjaśnienie

Zasadniczo tworzymy listę list podrzędnych z elementami zmiennymi, które mają ten sam „kształt” co Dane wejściowe, a następnie stwierdzamy, że jeśli połączymy wszystko w jedną listę, musi to doprowadzić do przetasowania połączenia danych wejściowych w jedną listę .

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.
Fatalizować
źródło
1

Perl, 37 bajtów

36 bajtów kodu + -pflaga.

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

Aby uruchomić:

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

Objaśnienia:

@ n = / d + / g # zapisz wszystkie liczby całkowite w @n
s / \ d + / # zamień każdą liczbę całkowitą na ...
splice @ n, rand @ n, 1 / ge # element w losowej pozycji @n (który jest usuwany z @n)
Dada
źródło
1

05AB1E , 17 bajtów

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

Wypróbuj online!

Czekam na rozwiązanie 05AB1E lub 2sable przy użyciu wbudowanego spłaszczania / formowania, którego jeszcze nie wiem :).

Osable
źródło
1

APL, 35 bajtów

Ledwo biję Perla, coś musi mi brakować.

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

Na przykład:

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

Wyjaśnienie:

  • Znajdź odpowiednie indeksy początków pod-tablic w spłaszczonej tablicy:
    • ⍳¨⍴¨⍵: Dla każdej pod-tablicy uzyskaj listę indeksów
    • {⍵+⊃⌽⍺}\: Zaczynając od pierwszej pod-tablicy, dodaj ostatnią wartość w tablicy do każdej wartości w następnej tablicy.
    • ⊃¨: zdobądź pierwsze elementy tablic, które są miejscami początkowymi
    • (⍳⍴Z←∊⍵)∊: przechowuj spłaszczoną tablicę w Z. Wygeneruj wektor bitowy, w którym te oznaczają miejsca, w których powinny się zacząć pod-tablice.
  • Potasuj spłaszczony układ:
    • ?⍨⍴Z: wygeneruj losową permutację Z.
    • Z[... ]: permute Z.
  • ⊂⍨: Podziel permutację na pod-tablice zgodnie z wektorem bitowym.
marinus
źródło
1
Możesz dokonać wymiany na miejscu. Przypisanie pozwoliło spłaszczyć zmienną:A⊣(∊A)←(∊A)[?⍨≢∊A←⎕]
Adám
@ Adám: wow, nie wiedziałem, że możesz to zrobić. Czy istnieje lista funkcji, które mogą to zrobić?
marinus
1
Tak . I działa również ze zmodyfikowanym przypisaniem.
Adám
1

Pyth, 15 bajtów

tPc.SsQ.u+NlYQ0

Program, który pobiera dane z listy i drukuje wynik.

Zestaw testowy

Jak to działa

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
TheBikingViking
źródło
1

PHP , 105 bajtów

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

zredukowane do 105 bajtów dzięki user59178.

Oryginalna odpowiedź:

PHP , 132 bajty

$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);
Arthur Shveida
źródło
$m=array_merge(...$i=$_GET[i]);jest o 25 bajtów krótszy niż $i=$_GET['i'];$m=call_user_func_array('array_merge',$i);i robi to samo. Ponadto można upuścić {}po, foreachaby zapisać 2 kolejne bajty.
user59178,
1

Grzmotnąć, 63, 58 bajtów

EDYCJE:

  • Zoptymalizowane wyrażenie sed nieco, -5 bajtów

Uwaga:

Bash tak naprawdę nie obsługuje tablic wielowymiarowych (można je tylko symulować, do pewnego stopnia), więc zamiast tego program zaakceptuje „zserializowaną” reprezentację tekstową wytrzymałej tablicy, jak pokazano w opisie zadania, np .: [[1,2,3],[4],[9,10]]i zapewnia dane wyjściowe w tym samym formacie.

Grał w golfa

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

Test

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

Dobrą zaletą jest to, że możesz karmić je wytrzymałymi tablicami o dowolnej głębokości:

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

i nadal będzie działać poprawnie.

Wypróbuj online!

zepelin
źródło
0

Oktawa, 60 bajtów

@(a)mat2cell([a{:}](randperm(sum(s=cellfun(@numel,a)))),1,s)
rahnema1
źródło
0

MATLAB , 84 bajty

function b=g(c);a=[c{:}];a=a(randperm(numel(a)));b=mat2cell(a,1,cellfun('length',c))
MattWH
źródło
0

Java, 368 bajtów

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

metoda static int[][] f( int[][] r ){...}rozwiązuje wyzwanie. Postanowiłem stworzyć własny interfejs funkcjonalny, aby uniknąć importu i dodać domyślną metodę dla łatwości użycia

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

}
Jack Ammo
źródło
0

Mathematica, 67 bajtów

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

Objaśnienie: To tasuje listę pozycji wszystkich liczb całkowitych w niewyrównanej tablicy 2D. Union@@jest skrótem odFlatten@

Uwaga: {}Zamiast wsporników stosowane są nawiasy kwadratowe [].

Kelly Lowder
źródło