Cho một hoán vị không có hai số nguyên liên tiếp cạnh nhau


18

Thử thách

Cho một số nguyên n 4 , xuất ra một hoán vị của các số nguyên [0, n-1] với thuộc tính không có hai số nguyên liên tiếp (số nguyên có độ chênh lệch tuyệt đối 1) nằm cạnh nhau.

Ví dụ

  • 4[1, 3, 0, 2]
  • 5[0, 2, 4, 1, 3]
  • 6[0, 2, 4, 1, 3, 5]
  • 7[0, 2, 4, 1, 5, 3, 6]

Bạn có thể sử dụng lập chỉ mục 1 thay thế (sử dụng số nguyên [1, n] thay vì [0, n-1] ).

Mã của bạn phải chạy trong thời gian đa thức trong n , vì vậy bạn không thể thử tất cả các hoán vị và kiểm tra từng cái.


Khi bạn nói "xuất ra một hoán vị", bạn có nghĩa là một danh sách? Hoặc chúng ta có thể tạo ra một hàm thực hiện ánh xạ hoán vị chính nó?
xnor

@xnor Nó nên được xuất ra ở một số dạng người có thể đọc được. Tôi không quan tâm chính xác làm thế nào.
Anush

Sẽ [[1,3],[0,2]]là một định dạng đầu ra chấp nhận được?
Xù xì

@Shaggy Thật tuyệt vời. Nó có nghĩa là 1,3,0,2?
Anush

Câu trả lời:


31

Thạch , 3 2 byte

ḂÞ

Sắp xếp các số nguyên trong [1, ..., n] theo LSB của chúng.

Hãy thử trực tuyến!


Ồ Thật là tuyệt vời.
Anush

2
Sắp xếp theo LSB, có nghĩa là mọi người khác di chuyển về đầu, nhưng định nghĩa của Jelly có yêu cầu các số trong mỗi nửa vẫn giữ nguyên thứ tự ban đầu không? Nếu không, 100 (4) có thể nằm cạnh 101 (5) và vẫn được sắp xếp bởi LSBiến. Không bị lỗi mã của bạn, nhưng có lẽ nhận xét mô tả chưa hoàn tất?
WGroleau

1
@WGroleau Có, Þsắp xếp ổn định, vì nó được triển khai bằng sortedhàm Python , được đảm bảo ổn định .
dùng202729

3
Thuật toán đối với tôi ấn tượng hơn kích thước nhỏ, ở sự thông minh của nó. Bạn cũng có thể, tôi cho rằng, đảo ngược thứ tự bit, sắp xếp và đảo ngược nó trở lại.
WGroleau

4
Chỉ có thể có 65536 chương trình Jelly hai byte khác nhau. Thật đáng kinh ngạc khi rất nhiều trong số đó hóa ra là câu trả lời cho các thách thức ppcg.
Anush




6

Haskell, 22 byte

f là một hàm của n trả về một danh sách được sắp xếp phù hợp. Tôi đang sử dụng tùy chọn 1 chỉ mục.

f n=[2,4..n]++[1,3..n]

6

Octave , 17 byte

@(x)[2:2:x,1:2:x]

Hãy thử trực tuyến!

Điều này sử dụng phương pháp tương tự như nhiều người khác. Nối hai vectơ, một vectơ có tất cả các số chẵn trong phạm vi bao gồm 2 ... x và tất cả các số lẻ trong phạm vi bao gồm 1 ... x . Cú pháp khá rõ ràng, vì vậy tôi sẽ không giải thích điều đó.


1
Không 32bên cạnh nhau trong f(4)?
pyjama

Rất tiếc ... đã sửa. Cùng một số byte. :-)
Stewie Griffin

5

JavaScript (ES6), 40 byte

f=
n=>[...Array(i=n)].map(_=>(i+--i)%(n|1))
<input type=number min=4 oninput=o.textContent=f(+this.value).join`\n`><pre id=o>

Chỉnh sửa: Đã lưu 1 byte nhờ @Arnauld.


5

Gaia , 2 byte

r∫

Hãy thử trực tuyến!

Điều này chỉ đơn giản (ổn định) ort tạo ra các số nguyên trong phạm vi [1, đầu vào] bởi pa r ity của chúng.


Nhận xét tương tự như trên Jelly: thuật toán hoặc định nghĩa của ngôn ngữ có đảm bảo rằng hai nửa vẫn giữ nguyên thứ tự ban đầu không?
WGroleau

@WGroleau Có, ở Gaia, toán tử meta sắp xếp ổn định.
Ông Xcoder

5

R , 39 36 35 byte

function(x)c(seq(2,x,2),seq(1,x,2))

Hãy thử trực tuyến!


Có một NA kéo dài cho số lẻ.
JayCe


Vợ có lỗi. Chúng tôi phải đi xe đạp trước khi tôi có thể sửa nó. Nhưng bạn đã cạo một số byte quá.
ngm

Vâng tôi cảm thấy tồi tệ khi yêu cầu bạn thêm byte vì vậy tôi phải tìm cách loại bỏ một số ... nó hoạt động tốt.
JayCe



4

Japt, 4 byte

Bạn cũng có thể thay thế ubằng vđể có được một thứ tự khác nhau.

õ ñu

Thử nó

Hoặc, nếu chúng ta có thể tạo ra một mảng gồm 2 mảng:

õ ó

Thử nó


Về mặt kỹ thuật, cái thứ hai đưa ra một danh sách các số được phân tách bằng dấu phẩy ;-) Cả hai đều thất bại 4; bạn có thể sửa cái đầu tiên bằng cách thay đổi uthành vhoặc othành õ.
Sản phẩm ETH

3

Toán học, 50 -> 47 -> 42 byte

p = Join[Range[2, #, 2], Range[1, #, 2]] &

Hãy thử trực tuyến!

Cảm ơn người dùng202729 vì đã chỉ ra tiềm năng tối ưu hóa gấp đôi Tham gia [] bắt nguồn từ Flatten [] và sử dụng các hàm thuần túy.

Tôi muốn thêm hai nhận xét.

1) Khá đơn giản để xây dựng một hoán vị cụ thể mà không có sự giảm hoặc tăng liên tiếp cho n> = 4 như yêu cầu n OP.

Nó bao gồm hai danh sách liên tiếp.

Đối với chẵn n, đây là:
list1 = (2,4, ..., n / 2)
list2 = (1,3, ..., n / 2-1)

Đối với n lẻ, chúng ta có:
list1 = (2,4, ..., Tầng [n / 2])
list2 = (1,3, ..., Tầng [n / 2])

Đối với "thuật toán" này, chỉ cần đưa ra một quyết định (n chẵn hoặc lẻ), phần còn lại chỉ là ghi n số.

Một giải pháp Mathicala có thể được cung cấp ở đầu.

2) Một câu hỏi liên quan là có bao nhiêu hoán vị như vậy tồn tại như một hàm của n.

Toán học, 124 byte

a[0] = a[1] = 1; a[2] = a[3] = 0;
a[n_] := a[n] = (n + 1)*a[n - 1] - (n - 2)*a[n - 2] - (n - 5)*a[n - 3] + (n - 3)*a[n - 4]

Hãy thử trực tuyến!

Thí dụ:

a[#] & /@ Range[4, 12]

{2, 14, 90, 646, 5242, 47622, ​​479306, 5296790, 63779034}

Để đếm số lượng hoán vị như vậy là một vấn đề tiêu chuẩn.

Với n = 4 có 2: {{2,4,1,3}, {3,1,4,2}}

Với n = 5 có 14: {{1,3,5,2,4}, {1,4,2,5,3}, {2,4,1,3,5}, {2,4, 1,5,3}, {2,5,3,1,4}, {3,1,4,2,5}, {3,1,5,2,4}, {3,5,1, 4.2}, {3,5,2,4,1}, {4,1,3,5,2}, {4,2,5,1,3}, {4,2,5,3, 1}, {5,2,4,1,3}, {5,3,1,4,2}}

Số a (n) của các hoán vị này tăng lên nhanh chóng: 2, 14, 90, 646, 5242, 47622, ​​479306, 5296790, 63779034, ...

Đối với n lớn tỷ lệ a (n) / n! dường như đạt đến giới hạn 1 / e ^ 2 = 0.135335 ... Tôi không có bằng chứng nghiêm ngặt nào nhưng đó chỉ là phỏng đoán từ bằng chứng số. Bạn có thể kiểm tra điều này bằng cách chạy chương trình trực tuyến.

Chương trình trên (dựa trên tài liệu tham khảo được đưa ra dưới đây) tính toán những con số này.

Bạn có thể tìm thêm thông tin trong chuỗi liên quan trên OEIS: A002464 . Vấn đề của Hertzsprung: cách sắp xếp n vị vua không tấn công trên một bảng n X n, với 1 trong mỗi hàng và cột. Ngoài ra số lượng hoán vị của chiều dài n mà không tăng hoặc giảm liên tiếp.


@ Stewie Griffin Vì tôi là người mới ở đây, vui lòng giải thích chi tiết hơn về ý của bạn. Trong nhận xét đầu tiên của tôi, tôi đã cung cấp một thuật toán và một mã giải quyết vấn đề trong thời gian đa thức. Do đó nó nên được coi là một giải pháp cho thách thức. Phần thứ hai mở rộng vấn đề thú vị. Do đó nó nên được coi là một bình luận.
Tiến sĩ Wolfgang Hintze

Tôi đã tự do sửa đổi một chút về trình của bạn để mã Mathicala của bạn đứng đầu. Với những thách thức về môn đánh gôn, bắt buộc phải cung cấp mã thực tế (ngắn nhất có thể). Cách tôi định dạng nó trở thành một câu trả lời Mathicala như bạn có thể dự định, và vẫn có lời giải thích ban đầu của bạn bên dưới nó. Nếu bạn cảm thấy thiếu một cái gì đó hoặc tôi đã chỉnh sửa không chính xác câu trả lời ban đầu của bạn, vui lòng tự chỉnh sửa lại. Chào mừng đến với PPCG! :)
Kevin Cruijssen

@ Kevin Cruijssen Cảm ơn bạn rất nhiều vì sự chào đón nồng nhiệt và việc chỉnh sửa bài viết ngây thơ của tôi. Bây giờ tôi đã thêm một chương trình Mathicala cho nhận xét thứ hai. Mà hầu hết có lẽ không phải là lege artis. Hầu hết tôi không biết cách tạo liên kết "dùng thử trực tuyến".
Tiến sĩ Wolfgang Hintze

Bất kỳ liên kết có thể được tạo ra bằng cách sử dụng [some text](the_link). Đối với liên kết "Dùng thử trực tuyến" nói riêng, trang web https://tio.run/ được lưu trữ bởi chính @Dennis của chúng tôi chứa các liên kết đến tất cả các loại ngôn ngữ lập trình. Ngôn ngữ Wolfram (Mathicala) là một trong số đó. Ở trên cùng, bạn có thể nhấp vào nút phát để chạy mã hoặc nút siêu liên kết để sao chép "Thử trực tuyến". (đánh dấu-) liên kết. Và bạn có thể chia mã của mình thành "Mã" thực tế (gửi của bạn), với một tiêu đề / chân trang tùy chọn để in (khá-) in một hoặc nhiều testcase.
Kevin Cruijssen

Xin lỗi cho nhận xét hơi thẳng thừng của tôi, và thiếu trả lời sau đó! Câu trả lời xuất hiện trong hàng đánh giá và tôi không nhận thấy mã vì định dạng. Không có gì lạ khi người dùng mới đăng "những quan sát thú vị" cho các thách thức, mà không cung cấp câu trả lời thực sự cho nó. Mặc dù nó được thực hiện với mục đích tốt, nhưng đó không phải là những gì trang web nói về. Tôi nghĩ rằng đây là một câu trả lời. Đáng lẽ tôi nên trả lời bình luận của bạn, nhưng tôi đã vội vàng và không thể viết bình luận mới, vì vậy thay vào đó tôi chỉ xóa bình luận cũ. Xin lỗi! Và chào mừng đến với trang web! Tôi hy vọng bạn sẽ dính xung quanh! :)
Stewie Griffin



2

Khoảng trắng , 161 byte

Đây là bản đệ trình chính thức, chưa hoàn thành: Hãy thử trực tuyến!

push_0   
read_n	
		push_0   
retreive_n			push_1  		
subtract	   dup_and_out[ 
 	
 	]label_s'
   
'push_2  		 
subtract	   dup[ 
 ]jump_next_if_neg:
		  
:dup_and_out[ 
 	
 	]else_jump_back:
 
 
:label_ss'
    
'push_0   
retreive_n			push_2  		 
subtract	   dup_and_out[ 
 	
 	]dup[ 
 ]jump_next:
 
    
:label_ssss'
      
'push_2  		 
subtract	   dup[ 
 ]jump_end_if_neg:
		   
:dup_and_out[ 
 	
 	]else_jump_back:
 
    
:label_sss'
     
'end



Hãy thử trực tuyến!

Tôi đã hy sinh một vài byte để chương trình thực thi mà không có bất kỳ lỗi nào, tôi tin rằng tôi có thể mất khoảng 7-8 byte và nó vẫn xuất ra chính xác, nhưng nó cũng sẽ xuất ra các thông báo lỗi và không ai muốn điều đó.

Giải thích về Byte đầy đủ:

[Space][Space][Space][N]                   Push a 0 on the stack
[Tab][Tab][N][Tab][Tab][Tab][Tab]          Read input value and store in heap
[Space][Space][Space][N]                   Push a 0 on the stack again
[Tab][Tab][Tab]                            Retrieve the value from the heap
[Space][Space][Tab][Tab][N]                Push a -1 on the stack
[Tab][Space][Space][Space]                 Add -1 to value
[Space][N][Space]                          Duplicate 
[Tab][N][Space][Tab]                       Output
[N][Space][Space][Space][N]                Set First Label
[Space][Space][Tab][Tab][Space][N]         Push a -2 on the stack
[Tab][Space][Space][Space]                 Subtract 2 from value
[Space][N][Space]                          Duplicate
[N][Tab][Tab][Space][Space][N]             If negative, jump to second label
[Space][N][Space]                          Duplicate
[Tab][N][Space][Tab]                       Output
[N][Space][N][Space][N]                    Jump back to first label
[N][Space][Space][Space][Space][N]         Set Second Label
[Space][Space][Space][N]                   Push a 0 on the stack
[Tab][Tab][Tab]                            Retrieve input value from heap again
[Space][Space][Tab][Tab][Space][N]         Push a -2 on the stack
[Tab][Space][Space][Space]                 This time, Add a -2 to the value
[Space][N][Space]                          Duplicate
[Tab][N][Space][Tab]                       Output
[Space][N][Space]                          Duplicate
[N][Space][N][Space][Tab][N]               Jump to third label
[N][Space][Space][Space][Tab][N]           Set third label
[Space][Space][Tab][Tab][Space][N]         Push a -2 on the stack
[Tab][Space][Space][Space]                 Subtract 2 from value
[Space][N][Space]                          Duplicate
[N][Tab][Tab][Space][Space][Space][N]      Jump to end if negative
[Space][N][Space]                          Duplicate
[Tab][N][Space][Tab]                       Output
[N][Space][N][Space][Tab][N]               Jump back to third label
[N][Space][Space][Space][Space][Space][N]  Set fourth label/end
[N][N][N]                                  Terminate

Một số điều để chơi golf: push_0, read_STDIN_as_int, push_0, retrievecó thể là push_0, duplicate_0, read_STDIN_as_int, retrieveđể lưu một byte. Và nhãn thứ nhất có thể là nhãn trống NSSNthay vì NSSSN(và sau đó nhãn thứ hai có thể là NSSSN; thứ ba NSSTN; và thứ tư NSSSSN). Điều này sẽ tiết kiệm 8 byte là tốt. Ngoài ra, bạn có thể loại bỏ cái đầu tiên Jump_to_third_labelvì bạn đã có Set_third_labelquyền bên dưới nó rồi. Tổng cộng: 140 byte ; (hoặc có ý kiến: Hãy thử trực tuyến .) -3 byte nếu bạn xóa NNNthoát.
Kevin Cruijssen


1

Gol> <> , 14 byte

FL:2%Z}:3=?$|B

Hãy thử trực tuyến!

Ví dụ chương trình đầy đủ & Cách thức hoạt động

1AGIE;GDlR~
FL:2%Z}:3=?$|B

1AG          Register row 1 as function G
   IE;       Take number input; halt on EOF
      GD     Call G and print the stack
        lR~  Empty the stack
             Repeat indefinitely

F           |   Repeat n times...
 L              Push loop counter (0..n-1)
  :2%Z}         If even, move to bottom of the stack
       :3=?$    If top == 3, swap top two
                  This is activated only once to make [2 0 3 1]
             B  Return


1

Java 8, 56 byte

n->{for(int i=n;i>0;)System.out.println((i+--i)%(n|1));}

Cảng @Neil JavaScript (ES6) câu trả lời 's .

Hãy thử trực tuyến.


Câu trả lời cũ 66 byte:

n->{String[]r={"",""};for(;n-->0;)r[n%2]+=n+" ";return r[0]+r[1];}

Hãy thử trực tuyến.

Giải trình:

n->{                  // Method with integer parameter and String return-type
  String[]r={"",""};  //  Result-Strings, both starting empty
  for(;n-->0;)        //  Loop in the range (n, 0]
    r[i%2]+=i+" ";    //   Append `i` and a space to one of the two result-Strings,
                      //   depending on if it is even (first) or odd (second)
  return r[0]+r[1];}  //  Return the two result-Strings appended to each other

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.