비정형 배열 섞기


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 배열입니까?
Dennis

답변:


17

젤리, 젤리 코드 페이지에서 3 바이트

FẊṁ

설명:

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

프로그램이 불완전하기 때문에 ( 두 번째 인수가 명시되지 않음) 기본값은 프로그램 입력을 사용하는 것입니다. 따라서 출력은 입력과 동일한 서브리스트 패턴을 갖습니다.

온라인으로 사용해보십시오!


4
와우, unflatten은 깔끔하고 예기치 않은 명령입니다.
Magic Octopus Urn

3
왼쪽 인수가 평평하지 않아도되므로 Unflatten 이 가장 좋은 용어는 아닙니다. 니모닉은 곰팡이 입니다.
Dennis

@Dennis : 정수가 아닌 요소로 목록을 포함하는 입력 비정형 배열 에서이 문제에 대해 올바르게 작동하지 않는다는 것을 의미합니까 (내부 목록을 먼저 평탄화하기 때문에)? 조금 실망 스럽습니다. 비정형 배열의 유형에 관계없이 작동 할 것으로 예상됩니다. (업데이트 : 체크, 그것은 보인다 모두 F, 단지 하나의 평탄화 여러 계층을 위해 작동합니다.)

나는 왼쪽 주장이 단순한 목록이 아니라 무엇이든 될 수 있음을 의미 합니다. 예를 들면 다음과 같습니다. tio.run/nexus/jelly#@/9wZ@P///@jow11FIxidRSijXUUTEC0qY6CWWzs/…
Dennis

1
아, 나는 그것을 평평하지 않은 작업이라고 부릅니다. 왼쪽 인수는 단순 목록으로 취급됩니다 (목록은 요소로 포함되지만 해당 요소는 불투명으로 해석됩니다). 실제로, 나는 우리가 unflattening이 무엇인지에 동의한다고 생각하지만 flattening이 무엇인지에 동의하지 않습니다…

7

PowerShell v2 +, 86 바이트

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

문자열 조작을 통해 작동합니다. 입력 형식이 작동 어떤의 배열을 나타내는 문자열로 전달됩니다 당신의 언어입니다. ;-)

-split숫자가 아닌 입력을 스크립트 블록 sort에 기반하여 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

자바 스크립트 (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

루비, 47 바이트

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

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

펄, 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 바이트

간신히 펄을 때리고 있습니다. 내가 놓친 것이 있어야합니다.

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

예 :

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

설명:

  • 평면 배열에서 하위 배열의 시작에 해당하는 인덱스를 찾습니다.
    • ⍳¨⍴¨⍵: 각 하위 배열에 대해 인덱스 목록을 가져옵니다.
    • {⍵+⊃⌽⍺}\: 첫 번째 하위 배열부터 시작하여 배열의 마지막 값을 다음 배열의 각 값에 추가합니다.
    • ⊃¨: 배열의 시작 항목 인 첫 번째 항목을 가져옵니다.
    • (⍳⍴Z←∊⍵)∊: 평평한 배열을에 저장합니다 Z. 하위 배열이 시작될 위치를 표시하는 비트 벡터를 생성합니다.
  • 평평한 배열을 섞습니다.
    • ?⍨⍴Z:의 임의 순열을 생성합니다 Z.
    • Z[... ]: permute Z.
  • ⊂⍨: 비트 벡터에 따라 순열을 하위 배열로 나눕니다.

1
전체 교체를 수행 할 수 있습니다. 과제를 통해 변수를 평탄화 할 수있었습니다.A⊣(∊A)←(∊A)[?⍨≢∊A←⎕]
Adám

@ Adám : 와우, 나는 당신이 그렇게 할 수 있다는 것을 몰랐습니다. 이를 수행 할 수있는 기능 목록이 있습니까?
marinus

1
. 그리고 그것은 작동 도 수정이 할당 된.
Adám

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

1

세게 때리다, 63, 58 바이트

EDITS :

  • 최적화 된 sed 식, -5 바이트

노트 :

강타는 정말 작업 설명, 예에 도시 된 바와 같이, 그래서 대신에,이 프로그램은, 견고한 배열의 "직렬화"텍스트 표현을 받아 들일 것이다, (그들은 단지 어느 정도, 시뮬레이션 할 수 있습니다) 다차원 배열을 지원하지 않습니다 [[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

자바, 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@@#]]&

설명 : 2D 비정형 배열에서 모든 정수의 위치 목록을 섞습니다. Union@@짧다Flatten@

참고 : 괄호 {}대신 구불 구불 한 괄호 가 사용됩니다 [].

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.