Перемішайте нерівний масив


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
Чи завжди вхід буде двовимірним масивом?
Денніс

Відповіді:


17

Желе, 3 байти в кодовій сторінці Jelly

FẊṁ

Пояснення:

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

Оскільки програма неповна ( не вказано другий аргумент), за замовчуванням використовується введення програми; таким чином, приводить до того, що вихід має той самий шаблон підпису, що і вхідний.

Спробуйте в Інтернеті!


4
Нічого собі, unlatten - це акуратна і несподівана команда.
Чарівна урва восьминога

3
Unflatten не може бути найкращим терміном, оскільки лівий аргумент не повинен бути рівним. Мнемоніка - цвіль .
Денніс

@Dennis: Це означає, що він би не працював правильно для цього виклику на вхідному розрізаному масиві, який містив списки як елементи, а не цілі числа (тому що він спочатку згладить внутрішні списки)? Це трохи розчаровує, ви б очікували, що він буде працювати незалежно від типу, який мав розірваний масив. (Оновлення: я перевірив, здається, що обидва Fі працюють для декількох шарів згладжування, а не лише одного.)

Я маю на увазі, що лівим аргументом може бути що завгодно, а не лише плоский список. Наприклад: tio.run/nexus/jelly#@/9wZ@P///@jow11FIxidRSijXUUTEC0qY6CWWzs/…
Dennis

1
О, я б назвав це незаплямованою операцією; лівий аргумент трактується як плоский список (просто трапляється, що списки містяться як елементи, але ці елементи трактуються як непрозорі). Насправді я підозрюю, що ми погоджуємося з тим, що таке

7

PowerShell v2 +, 86 байт

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

Працює за допомогою рядкових маніпуляцій. Введення передається як рядок, що представляє масив, у будь-якому форматі, який працює для вашої мови. ;-)

-splits виведіть вхід на нецифрові цифри, sorts їх на основі randomблоку скриптів (який присвоює різну випадкову вагу для кожного входу до сортування), зберігає їх у $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()в коді-гольф виклик ...

Ви можете покататися на двох байтах, попередньо перемістивши масив:

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

Однак це здається, що останнє ціле число ставлять спочатку більшу частину часу, тому я буду вважати, що цілі числа розподілені не рівномірно.


"Ви можете припустити, що ваша мова вбудована випадково."
Conor O'Brien

@ ConorO'Brien "Кожне ціле число повинно мати однаково ймовірний шанс відображатися у кожному можливому місці".
ETHproductions

sortне працює належним чином при наданні непослідовного ключа порівняння. Навіть якщо мова є випадковою, її сортування буде несправним у цій ситуації, і саме це створює упередженість, яку ви бачите. Як таке, я вважаю, що друге рішення є неправильним.


2

Брахілог , 17 байт

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

Спробуйте в Інтернеті!

Пояснення

В основному ми створюємо список підсписів із змінними елементами, який має ту ж "форму", що і Input, і потім констатуємо, що якщо ми об'єднаємо все в єдиний список, це повинно призвести до перетасування конкатенації вхідних даних в єдиний список .

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 або 2-дюймовий за допомогою вбудованого розмотування / формування, я ще не знаю :).


1

APL, 35 байт

Я ледве навіть не б'ю Перла, повинно бути щось, чого мені не вистачає.

{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ám

@ Adám: Нічого, я не знав, що ти можеш це зробити. Чи є список, які функції можуть це зробити?
Марін

1
Так . І він працює і з модифікованим призначенням.
Адам

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);і робить те саме. Крім того, ви можете залишити {}після, foreachщоб зберегти ще 2 байти.
user59178

1

Bash, 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

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

Математика, 67 байт

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

Пояснення: Це перетасовує список позицій усіх цілих чисел у двовимірному нерівному масиві. Union@@короткий дляFlatten@

Примітка: Кронштейни Squiggly {}використовуються замість дужок [].

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.