ให้การเรียงสับเปลี่ยนโดยไม่มีจำนวนเต็มต่อเนื่องสองตัวติดกัน


18

ท้าทาย

รับจำนวนเต็มn ≥ 4เอาท์พุทการเปลี่ยนแปลงของจำนวนเต็ม[0, n-1]ด้วยคุณสมบัติที่ไม่มีจำนวนเต็มต่อเนื่องสองตัว (จำนวนเต็มที่มีผลต่างแน่นอน 1) อยู่ติดกัน

ตัวอย่าง

  • 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]

คุณสามารถใช้การจัดทำดัชนี 1 แบบแทน (ใช้จำนวนเต็ม[1, n]แทน[0, n-1] )

รหัสของคุณจะต้องทำงานในเวลาพหุนามในnดังนั้นคุณจึงไม่สามารถลองเปลี่ยนลำดับและทดสอบแต่ละอันได้


เมื่อคุณพูดว่า "output a permutation" คุณหมายถึงรายการไหม หรือเราสามารถสร้างฟังก์ชั่นที่ใช้แมปการเรียงสับเปลี่ยนได้หรือไม่?
xnor

@ xnor ควรแสดงผลลัพธ์ในรูปแบบที่มนุษย์อ่านได้ ฉันไม่สนใจวิธีการอย่างแน่นอน
Anush

จะ[[1,3],[0,2]]เป็นรูปแบบผลลัพธ์ที่ยอมรับได้หรือไม่
Shaggy

@Shaggy มันไม่ดี มันหมายถึง 1,3,0,2 หรือเปล่า
Anush

คำตอบ:


31

เจลลี่ , 3 2 ไบต์

ḂÞ

จัดเรียงจำนวนเต็มใน[1, ... , n]โดย LSB

ลองออนไลน์!


ว้าว! นั่นช่างยอดเยี่ยม
Anush

2
“ จัดเรียงตาม LSB” หมายความว่าทุก ๆ คนย้ายไปที่จุดเริ่มต้น แต่คำจำกัดความของเจลลี่ต้องการให้ตัวเลขในแต่ละครึ่งยังคงอยู่ในลำดับเดิมหรือไม่ ถ้าไม่ใช่ 100 (4) อาจอยู่ถัดจาก 101 (5) และยังคง“ เรียงลำดับตาม LSB” ไม่ได้เป็นความผิดของรหัสของคุณ แต่บางทีความคิดเห็นที่อธิบายไม่สมบูรณ์?
WGroleau

1
@WGroleau ใช่Þมั่นคงเรียงลำดับเพราะดำเนินการโดยใช้ Python sortedฟังก์ชั่นที่รับประกันได้ว่าจะมีเสถียรภาพ
user202729

3
อัลกอริทึมน่าประทับใจสำหรับฉันมากกว่าขนาดเล็กในความฉลาดของมัน คุณสามารถฉันก็สมมุติย้อนกลับลำดับบิตจัดเรียงและย้อนกลับได้
WGroleau

4
สามารถมีได้เพียง 65536 โปรแกรมสองไบต์ Jelly ที่แตกต่างกันเท่านั้น มันน่าอัศจรรย์มากที่กลายเป็นคำตอบสำหรับความท้าทายของ ppcg
Anush


8

Python 3 , 40 , 38 ไบต์

lambda n:[*range(1,n,2),*range(0,n,2)]

ลองออนไลน์!

มันทำงานได้O(n)ทันเวลา

ขอบคุณเดนนิสที่ช่วยประหยัด 2 ไบต์!


ผู้ชนะรางวัลที่เร็วที่สุด! :)
Anush

วิ่งเร็วที่สุดหรือโพสต์ครั้งแรก
WGroleau

2
@WGroleau โพสต์ครั้งแรก
user202729


6

Haskell, 22 ไบต์

f คือฟังก์ชันของ n ที่ส่งคืนรายการที่เรียงลำดับอย่างเหมาะสม ฉันใช้ตัวเลือกการจัดทำดัชนี 1 ตัว

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

6

อ็อกเทฟ 17 ไบต์

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

ลองออนไลน์!

วิธีนี้ใช้วิธีเดียวกับวิธีอื่น ๆ Concatenate สองเวกเตอร์หนึ่งที่มีทั้งหมดจำนวนแม้จะอยู่ในช่วงที่รวม2 ... xและทุกเลขคี่รวมในช่วง1 ... x ไวยากรณ์ควรจะค่อนข้างชัดเจนดังนั้นฉันจะไม่อธิบาย


1
ไม่ได้3และ2อยู่ติดกันf(4)ใช่มั้ย
pajonk

โอ๊ะโอ ... แก้ไขแล้ว จำนวนไบต์เดียวกัน :-)
Stewie Griffin


5

Gaia 2 ไบต์

r∫

ลองออนไลน์!

เพียงแค่นี้ (มั่นคง) Orts จำนวนเต็มในช่วง[1, การป้อนข้อมูล]โดยปีของพวกเขาR ity


ความคิดเห็นแบบเดียวกับ Jelly: อัลกอริทึมหรือคำจำกัดความของภาษารับประกันว่าทั้งสองแบ่งเท่า ๆ กันตามลำดับเดิมหรือไม่
WGroleau

@WGroleau ใช่ใน Gaia ตัวเรียงลำดับ meta-operator นั้นเสถียร
นาย Xcoder

5

R , 39 36 35 ไบต์

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

ลองออนไลน์!


มี NA ต่อท้ายสำหรับตัวเลขคี่
JayCe


ความผิดของภรรยา เราต้องไปปั่นจักรยานก่อนที่จะแก้ไขได้ แต่คุณก็ต้องโกนไบท์ด้วยเช่นกัน
ngm

ใช่ฉันรู้สึกไม่ดีที่ขอให้คุณเพิ่มไบต์ดังนั้นฉันต้องหาวิธีลบบางอย่าง ... มันใช้งานได้ดี
JayCe



4

Japt, 4 ไบต์

คุณสามารถแทนที่uด้วยvเพื่อรับใบสั่งซื้ออื่น

õ ñu

ลองมัน

หรือถ้าเราสามารถใช้อาร์เรย์ 2 อาร์เรย์ได้:

õ ó

ลองมัน


ในทางเทคนิคที่สองผลลัพธ์รายการของตัวเลขคั่นด้วยเครื่องหมายจุลภาค ;-) ทั้งสองล้มเหลวใน4น่าเสียดาย; คุณสามารถแก้ไขคนแรกโดยการเปลี่ยนuไปvหรือเพื่อo õ
ETHproductions

3

Mathematica, 50 -> 47 -> 42 ไบต์

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

ลองออนไลน์!

ขอบคุณ user202729 สำหรับการชี้ให้เห็นถึงศักยภาพการเพิ่มประสิทธิภาพสองเท่าเข้าร่วม [] ติดตั้ง Flatten [] และใช้ฟังก์ชันบริสุทธิ์

ฉันต้องการเพิ่มข้อสังเกตสองข้อ

1) มันค่อนข้างตรงไปตรงมาที่จะสร้างการเปลี่ยนแปลงที่เฉพาะเจาะจงโดยไม่ล้มหรือเพิ่มขึ้นอย่างต่อเนื่องสำหรับ n> = 4 ตามที่ร้องขอใน OP

ประกอบด้วยสองรายการต่อเนื่อง

สำหรับแม้แต่ n คือ:
list1 = (2,4, ... , n / 2)
list2 = (1,3, ... , n / 2-1)

สำหรับคี่เรามี:
list1 = (2,4, ... , ชั้น [n / 2])
list2 = (1,3, ... , ชั้น [n / 2])

สำหรับ "อัลกอริทึม" นี้ต้องทำการตัดสินใจเพียงครั้งเดียว (n เสมอหรือคี่) ที่เหลือก็แค่เขียนตัวเลข n

โซลูชัน Mathematica ที่เป็นไปได้นั้นมีให้ที่ด้านบน

2) คำถามที่เกี่ยวข้องคือจำนวนการเปลี่ยนแปลงดังกล่าวมีอยู่เป็นฟังก์ชันของ n

Mathematica, 124 ไบต์

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]

ลองออนไลน์!

ตัวอย่าง:

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

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

การนับจำนวนการเปลี่ยนลำดับดังกล่าวเป็นปัญหามาตรฐาน

สำหรับ n = 4 มี 2: {{2,4,1,3}, {3,1,4,2}}

สำหรับ n = 5 มี 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}}

จำนวน (n) ของพีชคณิตเหล่านี้เพิ่มขึ้นอย่างรวดเร็ว: 2, 14, 90, 646, 5242, 47622, ​​479306, 5296790, 63779034, ...

สำหรับขนาดใหญ่ n อัตราส่วน a (n) / n! ดูเหมือนว่าจะถึงขีด จำกัด 1 / e ^ 2 = 0.135335 ... ฉันไม่มีข้อพิสูจน์ที่เข้มงวด แต่มันเป็นเพียงการคาดเดาจากหลักฐานเชิงตัวเลข คุณสามารถทดสอบสิ่งนี้ได้โดยพยายามเรียกใช้โปรแกรมออนไลน์

โปรแกรมด้านบน (อ้างอิงจากที่ระบุด้านล่าง) คำนวณตัวเลขเหล่านี้

ท่านสามารถหาข้อมูลเพิ่มเติมได้ในลำดับที่เกี่ยวข้องใน OEIS: A002464 ปัญหาของ Hertzsprung: วิธีการจัดการราชาที่ไม่ถูกโจมตีบนกระดาน n X n โดยมี 1 ในแต่ละแถวและคอลัมน์ จำนวนการเรียงสับเปลี่ยนของความยาว n โดยไม่เพิ่มขึ้นหรือลดลงอย่างต่อเนื่อง


@ Stewie Griffin เนื่องจากฉันใหม่ที่นี่โปรดอธิบายรายละเอียดเพิ่มเติมว่าคุณหมายถึงอะไร ในคำพูดแรกของฉันฉันได้ให้อัลกอริทึมและรหัสที่แก้ปัญหาในเวลาพหุนาม ดังนั้นจึงควรพิจารณาวิธีการแก้ปัญหาที่ท้าทาย ส่วนที่สองขยายปัญหาที่น่าสนใจ ดังนั้นจึงควรถือว่าเป็นความคิดเห็น
ดร. Wolfgang Hintze

ฉันใช้เสรีภาพในการแก้ไขการส่งของคุณเล็กน้อยดังนั้นรหัส Mathematica ของคุณจึงอยู่ด้านบนสุด ด้วยความท้าทายของ code-golf จำเป็นต้องระบุรหัสจริง (สั้นที่สุด) วิธีที่ฉันจัดรูปแบบมันจะกลายเป็นคำตอบทางคณิตศาสตร์ตามที่คุณตั้งใจจะให้เป็นและยังมีคำอธิบายต้นฉบับของคุณด้านล่าง หากคุณรู้สึกว่ามีบางอย่างขาดหายไปหรือฉันแก้ไขคำตอบแรกไม่ถูกต้องคุณสามารถแก้ไขด้วยตนเองได้อีกครั้ง ยินดีต้อนรับสู่ PPCG! :)
Kevin Cruijssen

@ Kevin Cruijssen ขอบคุณมากสำหรับการต้อนรับที่อบอุ่นและการแก้ไขข้อเสนอที่ไร้เดียงสาของฉัน ตอนนี้ฉันได้เพิ่มโปรแกรม Mathematica สำหรับคำพูดที่สอง ซึ่งส่วนใหญ่อาจไม่ได้ใช้ศิลปะ ส่วนใหญ่ฉันไม่รู้วิธีการสร้างลิงค์ "ลองออนไลน์" ที่ดี
ดร. Wolfgang Hintze

การเชื่อมโยงใด ๆ [some text](the_link)ที่สามารถสร้างขึ้นโดยใช้ สำหรับลิงก์ "ลองออนไลน์" โดยเฉพาะเว็บไซต์https://tio.run/ที่โฮสต์โดย@Dennisของเราเองนั้นมีลิงก์ไปยังภาษาการเขียนโปรแกรมทุกประเภท ภาษา Wolfram (Mathematica) เป็นหนึ่งในนั้น ที่ด้านบนคุณสามารถคลิกปุ่มเล่นเพื่อเรียกใช้รหัสหรือปุ่มเชื่อมโยงหลายมิติเพื่อคัดลอก "ลองออนไลน์" (markup-) การเชื่อมโยง และคุณสามารถแบ่งรหัสของคุณเป็น "รหัส" จริง ๆ (การส่งของคุณ) ด้วยส่วนหัว / ท้ายกระดาษที่เป็นตัวเลือกสำหรับ (สวย -) การพิมพ์หนึ่งหรือหลายแบบทดสอบ
Kevin Cruijssen

ขอโทษสำหรับความเห็นที่ค่อนข้างทื่อของฉันและขาดการตอบกลับหลังจากนั้น! คำตอบปรากฏในคิวการตรวจทานและฉันไม่ได้สังเกตรหัสเพราะการจัดรูปแบบ ไม่ใช่เรื่องแปลกที่ผู้ใช้ใหม่โพสต์ "การสังเกตที่น่าสนใจ" สู่ความท้าทายโดยไม่ต้องให้คำตอบที่แท้จริง ในขณะที่ดำเนินการโดยสุจริต แต่มันไม่เกี่ยวกับเว็บไซต์ ฉันคิดว่านี่เป็นคำตอบที่ดี ฉันควรจะตอบความคิดเห็นของคุณ แต่ฉันรีบและไม่สามารถเขียนความคิดเห็นใหม่ดังนั้นฉันเพิ่งลบเก่า ขอโทษ! และยินดีต้อนรับสู่เว็บไซต์! ฉันหวังว่าคุณจะติดอยู่! :)
Stewie Griffin



2

ช่องว่าง 161 ไบต์

นี่คือการส่งอย่างเป็นทางการที่ไม่ใส่เครื่องหมาย: ลองออนไลน์!

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



ลองออนไลน์!

ฉันเสียสละสักสองสามไบต์เพื่อให้โปรแกรมทำงานได้โดยไม่มีข้อผิดพลาดฉันเชื่อว่าฉันอาจเสียประมาณ 7-8 ไบท์และมันก็จะออกอย่างถูกต้อง แต่มันก็จะส่งข้อความผิดพลาดและไม่มีใครต้องการ

คำอธิบายแบบเต็มไบต์:

[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

บางสิ่งในการเล่นกอล์ฟ: push_0, read_STDIN_as_int, push_0, retrieveสามารถpush_0, duplicate_0, read_STDIN_as_int, retrieveบันทึกเป็นไบต์ได้ และป้ายกำกับแรกอาจเป็นป้ายว่างเปล่าที่มีNSSNแทนNSSSN(และจากนั้นป้ายกำกับที่สองสามารถเป็นNSSSNที่สามNSSTNและที่สี่NSSSSN) สิ่งนี้ควรประหยัด 8 ไบต์เช่นกัน นอกจากนี้คุณสามารถลบรายการแรกJump_to_third_labelเนื่องจากคุณมีSet_third_labelสิทธิ์ด้านล่างอยู่แล้ว ทั้งหมด: 140 ไบต์ ; (หรือมีความคิดเห็น: ลองออนไลน์ ) -3 ไบต์ถ้าคุณลบNNNออก
Kevin Cruijssen


1

Gol> <> , 14 ไบต์

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

ลองออนไลน์!

ตัวอย่างโปรแกรมเต็มรูปแบบและวิธีการทำงาน

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 ไบต์

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

ท่าเรือ@Neil JavaScript (ES6) คำตอบของ

ลองออนไลน์


คำตอบ 66 ไบต์เก่า:

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

ลองออนไลน์

คำอธิบาย:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.