คู่ที่ไม่ได้สั่งซื้อทั้งหมดระหว่างองค์ประกอบของอาร์เรย์


11

งาน:

ส่งคืนอาร์เรย์ที่มีคู่ที่เป็นไปได้ทั้งหมดระหว่างองค์ประกอบของอาร์เรย์

ตัวอย่าง

จากผลตอบแทนa=["a", "b", "c", "d"];b=[["a","b"],["a","c"],["a","d"],["b","c"],["b","d"],["c","d"]]

คู่สามารถจะอยู่ในลำดับใด ๆ ตราบเท่าที่อยู่รวมกันเป็นไปได้ทั้งหมดจะถูกรวมและเห็นได้ชัดว่าเป็นเหมือนกัน["b","d"]["d","b"]

อินพุต

[a-z]อาร์เรย์ขององค์ประกอบที่ไม่ซ้ำกันสตริงประกอบด้วยตัวอักษรจากชั้นเรียน

เอาท์พุต

อาร์เรย์ 2d ที่มีองค์ประกอบของอินพุตอาร์เรย์ที่เป็นไปได้ทั้งหมด

กรณีทดสอบ

input=["a","b","c"];
//output=[["a","b"],["a","c"],["b","c"]]

input=["a","b","c","d","e"];
//output=[["a","b"],["a","c"],["a","d"],["a","e"],["b","c"],["b","d"],["b","e"],["c","d"],["c","e"],["d","e"]]

หมายเหตุ:ฉันไม่พบสิ่งที่เหมือนกันสำหรับความท้าทายนี้ หากมีอยู่แจ้งเตือนฉันด้วยความคิดเห็นเพื่อวางคำถาม


2
ฉันไม่ชัดเจนว่าจะเกิดอะไรขึ้นเมื่อค่าอินพุตซ้ำหรือไม่เรียงตามลำดับ กรณีทดสอบทั่วไปเพิ่มเติมจะช่วยให้มี
xnor

@ Adámไม่ใช่คู่หูที่เกี่ยวข้องกับการมี 2 รายการ
Mr. Xcoder

ปัญหานี้ไม่รวมการจับคู่องค์ประกอบกับตัวเองซึ่งจะไม่ซ้ำซ้อนมากขึ้นสิบเอ็ด
CalculatorFeline

@ xnor ไม่ได้คิดเกี่ยวกับการทำซ้ำค่าเพราะปัญหาดั้งเดิมของฉันในที่ทำงานเกี่ยวข้องกับกลุ่มบุคคลที่ไม่ซ้ำใคร ฉันเดาว่าฉันควรเพิ่มความเป็นเอกลักษณ์เป็นเงื่อนไขหรือไม่?
alexandros84

@ alexandros84 เอกลักษณ์จะไม่เป็นไร สิ่งที่ควร["c","b","a"]กลับมา?
xnor

คำตอบ:



8

Haskell , 29 ไบต์

f(a:b)=map((,)a)b++f b
f _=[]

ลองออนไลน์! ตัวอย่างการใช้งาน: อัตราผลตอบแทนf ["a","b","c"][("a","b"),("a","c"),("b","c")]


ด้วยแฟล็ก-XTupleSectionsสิ่งนี้สามารถสั้นลงเป็น 27 ไบต์อย่างไรก็ตามแฟล็กจะต้องถูกนับ:

f(a:b)=map(a,)b++f b
f _=[]

ลองออนไลน์!


ฉันคิดว่าคุณสามารถบันทึกหนึ่งไบต์โดยการปรับเปลี่ยนกรณี BE f l=lไป
Kritzefitz

@ Kritzefitz ฉันเกรงว่าจะไม่ทำงานเนื่องจากรายการว่างทั้งสองรายการมีประเภทที่แตกต่างกันดังนั้นตัวตรวจสอบประเภทของ Haskell จะบ่น
Laikoni

จุดดี. ฉันไม่คิดอย่างนั้น
Kritzefitz


6

Haskell, 25 ไบต์

f l=[(x,y)|x<-l,y<-l,x<y]

ลองออนไลน์!

ด้านนอก ( x) และด้านใน ( y) ห่วงผ่านรายการการป้อนข้อมูลและให้ทั้งคู่เฉพาะในกรณีที่(x,y)x < y



5

เสียงเรียกเข้า, 50 48

AX<esc>qqYplX@qq@qqrYpllDkxh@rq:g/./norm@r<cr>:g/X/d<cr>dG

รับอินพุตในแบบฟอร์ม

abcd

และเอาท์พุทเป็น

ad
ac
ab
bd
bc
cd

คำอธิบาย

ก่อนอื่นต่อAX<esc>ท้ายXอินพุตเพื่อจัดการอินพุต 2 ความยาวซึ่งจำเป็นสำหรับเหตุผลที่ชัดเจนในไม่ช้า

จากนั้นแมโครแบบเรียกซ้ำตัวแรกของฟอร์มqq...@qq@qมา (บันทึกแมโครqเรียกใช้ตัวเองอีกครั้งในตอนท้ายจบการบันทึกจากนั้นเรียกใช้ตัวเองหนึ่งครั้ง) ในเนื้อความของแมโครYpทำซ้ำบรรทัดปัจจุบันlแบ่งออกจากแมโครหากบรรทัดมีความยาวหนึ่งอักขระและXลบ อักขระตัวแรกในบรรทัด นี่คือผลลัพธ์สุดท้ายของการผลิต

abcdX
abcX
abX
aX
X
X

ละเว้นXสำหรับตอนนี้ทั้งหมดที่เราต้องทำคือการเปิดตัวอย่างเช่นเข้าabcdX ab / ac / ad / aXนี่คือความสำเร็จด้วยมาโครซ้ำสองqr...@rq.

ในแมโครนี้เราจะทำซ้ำบรรทัดแรก ( Yp) จากนั้นลบทุกอย่างยกเว้นอักขระสองตัวแรกโดยเลื่อนไปทางขวาสอง ( ll) และลบไปที่ท้ายบรรทัด ( D) เนื่องจากเคอร์เซอร์อยู่บนkxอักขระที่สองของบรรทัดจะลบอักขระตัวที่สองจากบรรทัดก่อนหน้าซึ่งจะเป็นอักขระที่เพิ่งจับคู่กับอักขระตัวแรกบนบรรทัด กระบวนการนี้จะเริ่มต้นซ้ำอีกครั้งจากจุดเริ่มต้นของบรรทัด ( h) หลาย ๆ ครั้งตามความจำเป็นเนื่องจากลักษณะการเรียกซ้ำของแมโคร

ตอนนี้มันเป็นเพียงเรื่องของการทำงานแมโครในทุกบรรทัดซึ่งสามารถทำได้ด้วยการที่:g/./norm@r(ฉันไม่แน่ใจว่าทำไมพฤติกรรมนี้แตกต่างกว่า:%norm@rแต่พอจะพูดหลังไม่ทำงานตามที่ตั้งใจไว้.) เส้นที่มีXจะถูกลบด้วย:g/X/d, และบรรทัดที่ว่างเปล่าในตอนท้ายที่เหลือเป็นผลมาจากการก่อสร้างของแมโครจะทำความสะอาดด้วยrdG


คำตอบที่ดี จะใช้เวลาสำหรับฉันที่จะผ่านมันไป
alexandros84





3

Python ขนาด 53 ไบต์

บันทึก 2 ไบต์ด้วย @CalculatorFeline

lambda a:[(x,y)for i,x in enumerate(a)for y in a[:i]]

ลองออนไลน์!


1
a[i+1:]สามารถa[:i]
CalculatorFeline

การมีชื่อผู้ใช้ที่มีความยาวทำให้สามารถแสดงความคิดเห็นสั้น ๆ ได้ง่ายๆเพียงแค่กล่าวถึงผู้ใช้ดังกล่าวข้างต้น
CalculatorFeline

3

คู่ , 49 48 ไบต์

@(x)[imag(y=(y=triu(x+j*x',1))(~~y)) real(y) '']

ฟังก์ชั่นไม่ระบุชื่อที่หลีกเลี่ยง built-in ( nchoosek)

ลองออนไลน์!

คำอธิบาย

x+j*x'xใช้กระจายเสียงเพื่อสร้างเมทริกซ์ของตัวเลขที่ซับซ้อนที่ชิ้นส่วนจริงและจินตภาพคู่ทุกจุดรหัสจากการป้อนข้อมูลที่

y=triu(...,1)เก็บส่วนที่เป็นรูปสามเหลี่ยมไว้ด้านบนยกเว้นเส้นทแยงมุมทำให้องค์ประกอบที่เหลือเป็นศูนย์ yผลที่ได้คือกำหนดให้กับตัวแปร

y=(...)(~~y)yยังคงมีเลของค์ประกอบในรูปแบบของเวกเตอร์คอลัมน์ซึ่งได้รับมอบหมายให้ตัวแปร

imag(...)และreal(...)แยกส่วนที่แท้จริงและจินตภาพ

[... ... ''] แปลงกลับเป็นถ่านเพื่อสร้างผลลัพธ์


ดี! ความท้าทายทั้งหมดนั้นน่าสนใจจริงๆ ฉันใช้เวลาประมาณหนึ่งชั่วโมงครึ่งในการหารหัส es5 ของฉัน (มีคุณลักษณะด้านล่าง) ฉันมีความสุขที่ได้สร้างคำตอบที่น่าสนใจมากมาย ..
alexandros84







1

JavaScript ES6, 52 ไบต์

a=>a.map((x,i)=>a.slice(0,i).map(y=>[x,y])).slice(1)

หากมีเช่นflatMapนั้นจะประหยัดไบต์จำนวนมาก


เฮ้คำตอบที่ดี! ตรวจสอบคำตอบ es5 ของฉันในขณะที่ฉันศึกษาของคุณถ้าคุณต้องการ ข้อเสนอแนะใด ๆ ที่จะได้รับการชื่นชม (บวก / สร้างสรรค์ฮ่าฮ่า)
alexandros84

1
Firefox 30 comprehensions a=>[for(x of[...a])for(y of(a.shift(),a))[x,y]]อาร์เรย์สามารถจำลองแผนที่แบนเช่น
Neil

@Neil มีไวยากรณ์ขั้นสูงจริงๆอยู่ที่นั่น ... ฉันต้อง google อย่างน้อยสามสิ่งเพื่อที่จะเริ่มเข้าใจการแสดงออกของคุณ คือโอเปอเรเตอร์การแพร่กระจายความเข้าใจของอาเรย์คืออะไรและอะไรคือ [x, y] ในตอนท้าย (ยังไม่พบคำตอบสำหรับสิ่งนั้น)
alexandros84

1
@ alexandros84 [x,y]ท้ายที่สุดเป็นบิตง่าย ๆ มันเป็นแค่ตัวอักษรอาร์เรย์
Neil

1
อีกทั้งตัวดำเนินการสเปรดก็อยู่ที่นั่นเพื่อคัดลอกอาร์เรย์เท่านั้นเนื่องจากฉันกลายพันธุ์ภายในวง
Neil

1

Pythonขนาด 55 ไบต์

f=lambda s:[(s[0],j)for j in s[1:]]+f(s[1:])if s else[]

ลองออนไลน์!

นานกว่าคำตอบของ Python อื่น ๆ แต่ใช้เทคนิคที่แตกต่างกันดังนั้นฉันคิดว่ามันคุ้มค่าที่จะโพสต์


ไม่มีเวลาที่จะตรวจสอบฉันหวังว่าจะเป็นเทคนิคที่แตกต่างกันจริงๆทำให้ฉัน upvoted
alexandros84

ฉันคิดว่านี่เป็นวิธีที่คล้ายกันมากกับคำตอบ Python 3 ของ @ ovs
Neil





1

Python ขนาด 74 ไบต์

f=lambda a:[(c,d) for i,c in enumerate(a) for j,d in enumerate(a) if i<j]

1
ยินดีต้อนรับสู่ PPCG! คุณสามารถตีกอล์ฟนี้: 1) แทนที่ชื่อตัวแปร 2-char ด้วย 1-char 2) ลบช่องว่างที่ไม่จำเป็น 3) นี่เป็นตัวอย่างคุณต้องทำให้มันเป็นแลมบ์ดาฟังก์ชั่นหรือโปรแกรมเต็ม
Erik the Outgolfer

สนามกอล์ฟขนาด 10 ไบต์: 64 ไบต์
Mr. Xcoder

1

Javascript (ES 5) จาก 108 ถึง 78 ไบต์

ฉันโพสต์คำตอบของฉันในวันนี้ แต่เห็นได้ชัดว่าฉันสัญญาว่าจะไม่ยอมรับคำตอบของฉัน:

x=input;
a=[];

for(n=0;n<(x.length-1);n++){for(i=n+1;i<(x.length);i++){a.push([x[n],x[i]]);}}

1
ยินดีต้อนรับสู่ PPCG; เราคาดว่าผลงานที่ส่งจะเล่นกอล์ฟรวมถึงการลบช่องว่างที่ไม่จำเป็นออกไป
HyperNeutrino

ไท ฉันสงสัยเช่นนี้: ฉันควรรวม x = input; A = []; ในคำตอบของฉันหรือไม่? พรุ่งนี้ฉันจะแก้ไข
alexandros84

คุณสามารถส่งฟังก์ชั่นหรือทำโปรแกรมเต็มรูปแบบได้ ตั้งแต่คุณใช้aคุณจะต้องกำหนดมัน xแต่คุณสามารถทำให้การทำงานของ
HyperNeutrino

ดีกว่ามากตอนนี้ @HperperNeutrino
alexandros84

1
ฉันคิดว่าคุณสามารถยกเว้นเครื่องหมายอัฒภาคและบรรทัดว่างเพื่อประหยัดพื้นที่ได้ ผมยังคิดว่าคุณสามารถเปลี่ยนไปfor(i=n+1;i<(x.length);i++) for(i=n;++i<x.length;)ในทำนองเดียวกันคุณสามารถเปลี่ยนn<(x.length-1);n++เป็นn++<x.length-1
musicman523

0

J , 17 ไบต์

({~$#:I.@,)#\</#\

ลองออนไลน์!

คำอธิบาย

({~$#:I.@,)#\</#\  Input: string S
               #\  Get the length of each prefix of S
           #\      Get the length of each prefix of S again
             </    Test using greater than (<) between each
         ,         Flatten
      I.@          Find the indices where the value is 1
   $               Shape of that table
    #:             Convert the indices to the base represented by the shape
 {~                Index into S at those values
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.