ความเท่าเทียมกันของการเปลี่ยนแปลง


14

พื้นหลัง

ความเท่าเทียมกันของการเปลี่ยนแปลง , ตามที่กำหนดโดยวิกิพีเดียเป็นดังนี้

เครื่องหมายหรือการลงลายมือชื่อของการเปลี่ยนแปลงσนั้นแทน sgn (σ) และกำหนดให้เป็น +1 ถ้าσคือ even และ −1 ถ้าσเป็นเลขคี่

เครื่องหมายของการเปลี่ยนแปลงสามารถแสดงอย่างชัดเจนว่า

sgn (σ) = (−1) ^ N (σ)

โดยที่ N (σ) คือจำนวนผู้รุกรานในσ

อีกทางเลือกหนึ่งสัญญาณของการเปลี่ยนแปลงσสามารถกำหนดได้จากการสลายตัวลงในผลิตภัณฑ์ของ transpositions เป็น

sgn (σ) = (−1) ^ m

โดยที่ m คือจำนวน transpositions ในการย่อยสลาย

สำหรับคนที่ไม่ชอบซุปอักษรกรีกในคณิตศาสตร์ของพวกเขาฉันจะลองและทำให้คำจำกัดความง่ายขึ้นด้วยตัวอย่าง (เช่นขโมยมาจากวิกิพีเดีย)

ตัวอย่าง

พิจารณาอาร์เรย์การป้อนข้อมูลและการเปลี่ยนแปลงของมันสมมติว่า{1, 2, 3, 4, 5} {3, 4, 5, 2, 1}เพื่อที่จะได้รับจากอาร์เรย์เดิมเพื่อการเปลี่ยนแปลงของคุณต้องสลับดัชนี0และ2, 1และ3แล้วและ2 4แม้ว่านี่จะไม่ใช่วิธีการแก้ปัญหาที่ไม่ซ้ำกัน แต่ความเท่าเทียมกันถูกกำหนดไว้อย่างดีดังนั้นจึงใช้ได้กับทุกกรณี

เนื่องจากต้องการการสลับ 3 ครั้งเราจึงติดป้ายการเปลี่ยนแปลงนี้ด้วยความoddเท่าเทียมกัน อย่างที่คุณคาดไว้การเปลี่ยนแปลงที่ต้องใช้จำนวนครั้งที่แลกเปลี่ยนนั้นมีความevenเท่าเทียมกัน

ท้าทาย

ความท้าทายของคุณคือการเขียนโปรแกรมเป็นไบต์น้อยที่สุดเพื่อกำหนดความเท่าเทียมกันของการเปลี่ยนแปลง โปรแกรมหรือฟังก์ชั่นของคุณจะต้อง:

  • ยอมรับเป็นอาร์กิวเมนต์สองอินพุตอาร์เรย์ (หรือสตริง) ที่เป็นตัวแทนของชุดก่อนและหลังการเปลี่ยนแปลง
  • ส่งคืนหรือพิมพ์อักขระสำหรับเลขคู่eหรือoคี่ให้เปลี่ยนรูป
  • ควรสมมติว่าดัชนีทั้งหมดในอาร์เรย์หรือสตริงมีค่าที่ไม่ซ้ำกัน

กรณีทดสอบ

สมมติว่าคุณประกาศฟังก์ชันที่ชื่อf:

f([10], [10]) == "e"
f([10, 30, 20], [30, 20, 10]) == "e"
f([10, 30, 20, 40], [30, 20, 40, 10]) == "o"

นี่คือโปรแกรมที่สั้นที่สุดในหน่วยไบต์ชนะ!


4
คนไม่ชอบรูปแบบผลลัพธ์ที่เข้มงวด ความจริงสำหรับคู่และคู่หมั้นสำหรับคู่คี่? (หรือวิธีอื่น ๆ )
CalculatorFeline

จริง ๆ แล้วฉันหวังว่าจะรักษารูปแบบผลลัพธ์ที่ฉันระบุไว้เว้นแต่ว่าจะมีคนอื่นสนใจจริงๆ แก้ไขเดี๋ยวก่อนฉันจะประนีประนอม
Patrick Roberts

@CatsAreFluffy ดีกว่าไหม
Patrick Roberts

ฉันเดาว่าเราจะเห็น!
CalculatorFeline

ราตรีสวัสดิ์! ต่อไปนี้เป็นคำแนะนำสำหรับเมื่อคุณกลับมาที่สิ่งนี้ (แต่โปรดตรวจสอบด้วยตัวเอง): [10], [10] -> e(ไม่มีการเปลี่ยนใจ) [10 30 20], [30 20 10] -> e(สองรายการ) [10 30 20 40], [30 20 40 10] -> o(การย้ายที่สามครั้ง)
Luis Mendo

คำตอบ:


5

เยลลี่, 13 12 ไบต์

żṗ2</€⁺Sị“oe

ลองออนไลน์!

มันทำงานอย่างไร

żṗ2</€⁺Sị“oe  Main link. Arguments: A, B (lists)

ż             Zip A with B. Yields an array of pairs [x, σ(x)].
 ṗ2           Generate all pairs [[x, σ(x)], [y, σ(y)]].
   </€        Reduce each pair by </€.
              This maps [[x, σ(x)], [y, σ(y)]] to [x < y, σ(x) < σ(y)].
      ⁺       Repeat the previous link, i.e., execute </€ once more.
              This maps [x < y, σ(x) < σ(y)] to ((x < y) < (σ(x) < σ(y))), which is
              true if and only if x > y and σ(x) < σ(y).
       S      Sum. This counts the number of inversions.
        ị“oe  Retrieve the letter at the corresponding index.
              Indexing is 1-based and modular, so an odd sum retrieves the first
              letter, an even sum the second.

1
นั่นเล็กมากอย่างน่าประทับใจ รุ่งโรจน์!
Patrick Roberts

6

MATL , 17 16 ไบต์

ลบ 1 ไบต์ด้วยคำแนะนำของ Dennis

2$St!<Rz2\'oe'w)

ใช้ได้กับภาษาปัจจุบัน (15.0.0)

ลองออนไลน์ !

คำอธิบาย

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

โปรดทราบว่าทั้งสองอินพุตอาร์เรย์สามารถสลับกันได้และผลลัพธ์จะเหมือนกัน ดังนั้นจึงไม่สำคัญว่าอาเรย์ใดที่ถือว่าเป็น "ต้นฉบับ" และ "เปลี่ยนแปลง"

2$S     % implicitly take two row vectors. Sort second and apply the indices
        % of that sorting to the first
t!      % duplicate. Transpose into column vector
<       % true for elements of the column vector that exceed those of the 
        % row vector. Gives a 2D array with all pairs of comparisons
R       % keep only upper triangular part of that array
z       % number of nonzero elements. This is the number of inversions
2\      % parity of that number: gives 0 or 1
'oe'w   % push string 'eo' below the top of the stack
)       % apply index to produce 'e' or 'o'. An index 1 refers to the first
        % element, whereas 0 refers to the last. Implicitly display 

1
นี่เป็นทางออกที่ฉลาดจริงๆ!
Alex A.

@AlexA ขอบคุณ! ฉันได้แก้ไขคำตอบเพื่อให้ชัดเจนว่าส่วนที่สั่งซื้อล่วงหน้าทำอะไรเราจัดเรียงแถวลำดับหนึ่งจากนั้นเรียงลำดับใหม่ที่จำเป็นสำหรับการเรียงลำดับนั้นจะถูกนำไปใช้กับอาร์เรย์อื่น
Luis Mendo

1
คุณควรเพิ่มการทำดัชนีแบบแยกส่วนใน MATL นั่นจะประหยัดได้ 3 ไบต์ที่นี่
Dennis

@Dennis ใช่ฉันมักจะคิดเกี่ยวกับที่ ... แต่ในปัจจุบันมันใช้รูปแบบที่ค่าลบมีความหมายที่แตกต่างกัน ผมเลือกว่าเพื่อให้มีดัชนีในรูปแบบx(1:end-2)อื่น ๆ xได้โดยไม่ต้องแสดงให้เห็นอย่างชัดเจนขนาดของ ไม่แน่ใจว่ามันเป็นตัวเลือกที่ดี แต่ฉันเดาว่ามันจะสายเกินไปที่จะเปลี่ยนตอนนี้ :-) บางทีฉันอาจจะหาวิธีที่ใช้งานร่วมกันได้เพื่อเพิ่มการทำดัชนีแบบแยกส่วน
Luis Mendo

... และดัชนีที่เกินความยาวปัจจุบันจะถูกใช้เพื่อกำหนดค่าใหม่ แต่ดัชนี0มีความหมายของ "รายการสุดท้าย" ดังนั้นฉันจึงสามารถบันทึกไบต์ (ลบส่วนเพิ่ม) ขอบคุณสำหรับความคิด!
Luis Mendo

5

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

ดูเหมือนว่าไม่มีใครใช้วิธีนี้มาก่อน: โดยทั่วไปฉันแค่ใช้ดีเทอร์มิแนนต์ของเมทริกซ์การเปลี่ยนรูปที่สอดคล้องกัน การแสดงออกผลตอบแทนปัจจัยการเปลี่ยนแปลงของเมทริกซ์ที่กำหนดโดยเวกเตอร์det(eye(nnz(a))(a,:)) aจากนั้นเป็นเพียงเรื่องของการแยกอักขระที่ถูกต้องออกจากสตริงขึ้นอยู่กับผลลัพธ์

p=@(v)eye(nnz(v))(v,:);@(a,b)'ole'(det(p(a)*p(b))+2)

2
ความคิดที่ดีที่จะใช้ปัจจัย Ole!
Luis Mendo

5

Haskell, 58 ไบต์

k%l|m<-zip k l=cycle"eo"!!sum[1|(a,b)<-m,(c,d)<-m,a<c,b>d]

การใช้งาน:

*Main> [8,3,5]%[5,3,8]
'o'

วิธีการเช่นเดียวกับคำตอบของฉันหลาม ความภาคภูมิใจ haskeller cycleบันทึกไบต์ที่มี


1
คุณสามารถเขียนcycle"eo"!!...แทนการ"eo"!!mod(...)2บันทึกหนึ่งไบต์
ภูมิใจ haskeller

4

Python 2, 68 ไบต์

lambda*M:"eo"[sum(a<b<M>A>B for a,A in zip(*M)for b,B in zip(*M))%2]

การใช้งาน:

>>> f=lambda*M:"eo"[sum(a<b<M>A>B for a,A in zip(*M)for b,B in zip(*M))%2]
>>> f([8,3,5],[5,3,8])
'o'

นับจำนวนคู่ผกผันของรายการซิปสองรายการคือ i, e คุณค่า(a,A)และ(b,B)จากแต่ละรายการที่ดัชนีเดียวกันด้วยและa<b A>Bการเปรียบเทียบเหล่านี้รวมกันa<b<M>A>Bโดยใช้คุณสมบัติที่รายการMมากกว่าจำนวนใด ๆ ผลรวมจะได้รับการโมดูโลแล้ว 2 และกลายเป็นหรือeo


3

JavaScript (ES6), 73 ไบต์

(a,b)=>"eo"[r=0,g=a=>a.map((e,i)=>a.slice(i).map(d=>r^=d<e)),g(a),g(b),r]

เนื่องจากเราสนใจในความเท่าเทียมกันเพียงแค่การยกเลิกการแปลงทรานส์แบบอื่นก็เป็นการยกเลิก ตัวห้อยอาร์เรย์ของ JavaScript อย่างสะดวกสบายไม่ใช่หลายมิติ


1
สถานที่น่าสนใจสำหรับเครื่องหมายจุลภาค .. ไม่รู้ว่าคุณทำได้ อย่าลืมเกี่ยวกับคำสาป -1 ไบต์
Patrick Roberts

2

Mathematica, 77 ไบต์

If[Mod[Plus@@Length/@(Join[{0},#]&)/@PermutationCycles[#][[1]],2]==0,"e","o"]&

ฉันเห็นด้วย!


ฟังก์ชั่นที่มีประโยชน์ชื่อยาว ๆ น่าเสียดาย!
Patrick Roberts

น่ารำคาญใช่มั้ย Cyclesฉันเกลียดชัง มันกระแทกขนาดของPermutationCyclesชื่อและแม้แต่PermutationCyclesโง่กลับCyclesวัตถุ! `
CalculatorFeline

2

Mathematica, 31 ไบต์

If[Tr[Signature/@{##}]==0,o,e]&

ลายเซ็น [รายการ] ให้ลายเซ็นของการเปลี่ยนแปลงที่จำเป็นในการวางองค์ประกอบของรายการตามลำดับบัญญัติ

เราสามารถจัดลำดับรายการหนึ่งไปยังอีกรายการหนึ่งได้โดยจัดลำดับใหม่หนึ่งรายการไปยังคำสั่งซื้อใด ๆ (ในกรณีนี้คือคำสั่งมาตรฐาน) และเรียงลำดับรายการนี้เป็นรายการสุดท้าย เครื่องหมายของการเปลี่ยนแปลงโดยรวมคือแม้ถ้าสัญญาณของการเปลี่ยนลำดับย่อยทั้งสองมีค่าเท่ากัน

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