벡터의 모든 뚜렷한 순열을 출력합니다


9

도전:

잠재적으로 긴 양의 정수 목록의 모든 고유 순열을 출력합니다. 테스트 할 때 벡터에 1,000 개 미만의 숫자가 있다고 가정 할 수 있지만 이론적으로 크기에 관계없이 숫자가 둘 이상인 모든 벡터에 대해 프로세스가 작동해야합니다.

제한 사항 :

  • 메모리 사용량을 O (n ^ 2) 로 제한해야합니다 . 여기서 n 은 입력 벡터의 요소 수입니다. O (n!)을 가질 수 없습니다 . 즉, 모든 순열을 메모리에 저장할 수 없습니다.
  • 시간 복잡도를 O (result size * n)로 제한해야합니다 . 모든 숫자가 같으면 O (n) 이고, 모두 고유하면 O (n! * n) 입니다. 즉, 순열을 만들 수없고 다른 모든 순열과 비교하여 구별을 확인할 수 없습니다 (즉, O (n! ^ 2 * n) ).
  • 시간 및 메모리 제한이 충족되었음을 보여주는 경험적 측정이 허용됩니다.
  • 순열은 실제로 저장 / 출력 할 수 없으므로 순열을 인쇄 / 출력해야합니다.

프로그램을 충분히 오래 실행하면 이론적으로 모든 순열이 출력되어야합니다!

뚜렷한 순열 :

리스트 [1, 1, 2] 에는 6 개가 아닌 [1, 1, 2] , [1, 2, 1][2, 1, 1]의 세 가지 순열이 있습니다. 출력 순서를 선택할 수 있습니다.


관리 가능한 테스트 사례 :

Input: 
[1, 2, 1]
Output:
[1, 1, 2]
[1, 2, 1]
[2, 1, 1] 

Input:
[1, 2, 3, 2]
Output:
[1, 2, 2, 3]
[1, 2, 3, 2]
[1, 3, 2, 2]
[2, 1, 2, 3]
[2, 1, 3, 2]
[2, 2, 1, 3]
[2, 2, 3, 1]
[2, 3, 1, 2]
[2, 3, 2, 1]
[3, 1, 2, 2]
[3, 2, 1, 2]
[3, 2, 2, 1]

Input:
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
Output:
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

더 큰 테스트 사례 :

이것에 대한 모든 순열을 출력하는 것은 불가능하지만 충분한 시간을 주면 이론적으로 작동해야합니다 (그러나 무제한 메모리는 아님).

Input:
[1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899, 900]

모든 순열이 고유하고 결국 모든 순열이 인쇄 될 것임을 어떻게 알 수 있는지 설명해야합니다.

이것은 바이트 단위의 가장 짧은 코드가 이깁니다.


2
이러한 복잡성 요구 사항을 충족하는 참조 구현이 있습니까?
Steven H.

1
요구 사항을 충족하는 알고리즘을 만드는 것이 너무 어렵지 않아야합니다 (그렇지만 골프는 아니지만) 저는 프로그래머 나 수학자가 아닙니다. 저는 겸손한 도전 작가 일뿐입니다. 나는 너희들을 위해 까다로운 물건을 남길 것이다 :)
Stewie Griffin

6
코드 골프는 일반적으로 내장 기능과 언어 기능을 영리하게 사용하기 때문에 제한 특성을 고려할 때 이것이 가장 빠른 코드로 더 나아질 것이라고 생각합니다.
Uriel

3
"너무 힘들지 않아야한다"≠ "가능하다"
Fatalize

1
생성 기능이 수용 가능합니까 아니면 인쇄 / 출력 솔루션에 상용구를 추가해야합니까?
Jonathan Allan

답변:


6

자바 스크립트 (ES6), 177 169 바이트

a=>{s=''+a
do{console.log(a)
k=a.findIndex((e,i)=>a[i-1]>e)
if(~k)t=a[k],a[k]=a[l=a.findIndex(e=>e>t)],a[l]=t,a=a.map((e,i)=>i<k?a[k+~i]:e)
else a.reverse()}while(a!=s)}

메모리 O (len (array))와 시간 O (len (array) * len (output))이 있다고 생각되는 잘 알려진 다음 사전 편법 순열 생성 알고리즘을 사용합니다. (배열 요소는 역순으로 간주되므로 ; 등을 2, 2, 1, 1열거합니다 2, 1, 2, 1.1, 2, 2, 1


5

파이썬 3sympy (50?) 81 바이트

lambda a:[print(v)for v in sympy.iterables.multiset_permutations(a)]
import sympy

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

생성기 함수가 허용 가능한 경우 50 바이트 :

import sympy
sympy.iterables.multiset_permutations

구현은 오픈 소스이며 현재 git hub 에서 사용할 수 있습니다 . 함수를 작성할 때 983 행에 있습니다.

나는 그렇게 생각하지만, 그렇지 않은 경우 알려면 점근 경계를 충족시킵니다.


파이썬 2, (411?) 439 바이트

파이썬 2에서 골프 버전 (우리가 다루지 않아도되는 경우도 무시 함) (여전에는 내장 기능을 사용함 itertools.permutations function)은 439 바이트 또는 411 ( for v in h(input()):print v)을 생성하는 것보다 인쇄 할 추가 상용구가없는 411에 있습니다 .

from itertools import*
def h(a,z=-1,g=1):
 x=[v for v in[g,[[v,a.count(v)]for v in set(a)]][g==1]if 0<v[1]];S=sum([v[1]for v in x])
 if x==x[:1]:k,v=x[0];yield[k for i in range([[0,z][z<=v],v][z<1])]
 elif all(v<2for k,v in x):
    for p in permutations([v[0]for v in x],[z,None][z<0]):yield list(p)
 else:
    z=[S,z][z>-1];i=0
    for k,v in x:
     x[i][1]-=1
     for j in h([],z-1,x):
        if j:yield[k]+j
     x[i][1]+=1;i+=1
for v in h(input()):print v

(참고 : 이것은 파이썬 2 골프 탭을 사용하고 들여 쓰기를위한 공간을 사용합니다)


쓰기 할 필요가 없다 "는 함수를 작성시 라인 983에있다" : 최신 커밋 퍼머 수 github.com/sympy/sympy/blob/... .
orlp

@orlp 이미 거기에 영구 링크가 없습니까?
Outgolfer Erik

@EriktheOutgolfer '최신 버전'이 아닌 특정 커밋에 연결되었으므로 향후 변경으로 인해 링크가 오래되지 않습니다.
orlp

2

C ++ (gcc) , 203 바이트

분명히 C ++은 이것을 내장 함수로 가지고 있습니다 ...

#import<bits/stdc++.h>
using namespace std;main(){vector<int>v;int x;while(cin>>x)v.push_back(x);sort(v.begin(),v.end());do{for(int y:v)cout<<y<<' ';puts("");}while(next_permutation(v.begin(),v.end()));}

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

Ungolfed 코드 : TIO 링크.

이 사용하는 O(n)메모리 (보장 std::vector)과 최적의 런타임.

코드의 일부 최적화 :

  • (G ++ 더 이상 사용되지 않는 확장 프로그램) import대신 사용include
  • bits/stdc++.h여러 개의 필요한 헤더 대신 (사전 컴파일 된 헤더에 다른 모든 헤더가 포함되어 있음)를 사용하십시오 . 종종 컴파일 시간이 느려집니다.
  • using namespace std이는 나쁜 생각 것으로 알려져 .
  • 개행을 쓰는 puts("")대신 사용하십시오 cout<<'\n'. 이것은 C 프로그램에서는 정상이지만 나에게는 이상하게 느낍니다. 그래서 나는 이것이 언급되어야한다고 생각합니다.
  • main반환 값 ( int)은 생략 할 수 있습니다.

그렇지 않으면 (공백 삭제 제외) C ++에서 자주 프로그래밍하는 것과 같은 방식입니다.

몇 가지 가능한 최적화 : (기본적으로 이것이 허용되는지는 모르겠습니다) :

  • 요소를 입력하기 전에 배열 크기를 입력하십시오. 이렇게하면 동적 크기 배열이 가능하며 전체 저장 바이트는 30 바이트 입니다.
  • 출력을 구분 기호로 분리하지 마십시오. 따라서 출력은 좋아 1 1 2 3 1 1 3 2 1 2 1 3 1 2 3 1 1 3 1 2 1 3 2 1 2 1 1 3 2 1 3 1 2 3 1 1 3 1 1 2 3 1 2 1 3 2 1 1합니다 1 2 1 3. 이를 통해 9 바이트를 더 절약 할 수 있습니다.
  • C에서는 헤더를 생략 할 수 있지만 #importC ++에서 헤더 없이 이러한 함수를 사용하는 더 짧은 방법이 있는지 또는 더 짧은 헤더 이름 이 있는지 모르겠습니다 .

어쩌면 당신은 왜 std::sort시간 복잡성을 오버플로하지 않는지 언급해야 할 것입니다
l4m2

또한 2 바이트 절약using namespace std;main(){vector<int>v;for(int x;cin>>x;v.push_back(x));sort(v.begin(),v.end());do for(int y:v)cout<<y<<' ';while(puts(""),next_permutation(v.begin(),v.end()));}
l4m2

#import<bits/stdc++.h>@#define Q v.begin(),v.end())@using namespace std;main(){vector<int>v;for(int x;cin>>x;v.push_back(x));sort(Q;do for(int y:v)cout<<y<<' ';while(puts(""),next_permutation(Q);}@는 개행입니다
l4m2


2

자바 스크립트 (Node.js를) , 137 (128) 123 바이트

s=>f(x=c=[],s.map(g=i=>g[i]=-~g[i]));f=i=>Object.keys(g).map(i=>g(i,--g[i]||delete g[i],f(x[c++]=i),c--))<1&&console.log(x)

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

s=>
    f(
        x=c=[],
        s.map(g=i=>g[i]=-~g[i]) // O(n) if all same, <=O(n^2) if different
    )
;
f=i=>
    Object.keys(g).map( // for(i in g) breaks when other items get removed
        i=>g(
            i,
            --g[i]||delete g[i], // O(left possible numbers)<O(child situations)
            f(x[c++]=i),
            c--
        )
    )<1
&&
    console.log(x)

0

APL (NARS), 156 자, 312 바이트

r←d F w;i;k;a;m;j;v
r←w⋄→0×⍳1≥k←↑⍴w⋄a←⍳k⋄j←i←1⋄r←⍬⋄→C
A: m←i⊃w⋄→B×⍳(i≠1)∧j=m
   v←m,¨(d,m)∇w[a∼i]
   →H×⍳0=↑⍴v⋄⎕←∊d,v
H: j←m
B: i+←1
C: →A×⍳i≤k

G←{⍬F⍵[⍋⍵]}

그것들은 F와 G가 togheter를 사용하는 두 가지 함수입니다 ... G 먼저 배열을 그 지정된 배열에 적용하는 것보다 F 함수를 적용하고 요소가 이미 발견되면 재귀로 가지 않는 것이 더 나은 관찰을 사용하여 순열을 씁니다. (모든 결과가 이미 발견되었으므로). 이것이 모든 제한에 맞는지 모르겠습니다 ... 테스트 :

  G 1 1 2
1 1 2 
1 2 1 
2 1 1 

  G 1 2 3 2
1 2 2 3 
1 2 3 2 
1 3 2 2 
2 1 2 3 
2 1 3 2 
2 2 1 3 
2 2 3 1 
2 3 1 2 
2 3 2 1 
3 1 2 2 
3 2 1 2 
3 2 2 1 

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