ค้นหาฝาแฝดที่ไม่ซ้ำกัน


28

คุณจะได้รับสองอาร์เรย์ / รายการ / เวกเตอร์ของจำนวนเต็มไม่เป็นลบและB งานของคุณคือการส่งออกที่สูงที่สุดจำนวนเต็มNที่ปรากฏทั้งในและBและยังเป็นที่ไม่ซ้ำกันทั้งในและB


กรณีทดสอบ:

A, B -> เอาท์พุท

[6], [1, 6] -> 6
[1, 2, 3, 4], [4, 5, 6, 7] -> 4
[0, 73, 38, 29], [38, 29, 73, 0] -> 73
[1, 3, 4, 6, 6, 9], [8, 7, 6, 3, 4, 3] -> 4
[2, 2, 2, 6, 3, 5, 8, 2], [8, 7, 5, 8] -> 5
[12, 19, 18, 289, 19, 17], [12, 19, 18, 17, 17, 289] -> 289
[17, 29, 39, 29, 29, 39, 18], [19, 19, 18, 20, 17, 18] -> 17
[17, 29, 39, 29, 29, 39, 18, 18], [19, 19, 18, 20, 17, 18] -> 17

คำตอบ:


7

เยลลี่ขนาด 7 ไบต์

fċ@ÐṂ;Ṁ

ลองออนไลน์!

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

fċ@ÐṂ;Ṁ  Main link. Left argument: A. Right argument: B

f        Filter; keep those elements of A that appear in B.
   ÐṂ    Yield all elements of the result for which the link to left yields a
         minimal value (2).
 ċ@        Count the occurrences of the element...
     ;     in the concatenation of A and B.
      Ṁ  Take the maximum.

7

Bash + coreutils, 49 ไบต์

U()(sort -rn|uniq -u$1)
(U<<<$1;U<<<$2)|U D|sed q

ขอบคุณ @seshoumara สำหรับการเล่นกอล์ฟ 1 ไบต์!

ลองออนไลน์!

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

uniqรับอินพุตที่เรียงลำดับแล้วดำเนินการอย่างใดอย่างหนึ่งหรือหลายอย่างขึ้นอยู่กับแฟล็กบรรทัดคำสั่ง

U<<<$1และU<<<$2เรียกใช้ฟังก์ชันUด้วยอาร์กิวเมนต์บรรทัดคำสั่งที่หนึ่งและที่สองเป็นอินพุต สำหรับแต่ละรายการsort -rn|uniq -uจะถูกดำเนินการเรียงลำดับอินพุตเป็นตัวเลข ( -n) และเรียงลำดับจากมากไปน้อย ( -r) สำหรับuniqซึ่งจะพิมพ์เฉพาะบรรทัดที่ไม่ซ้ำกัน ( -u)

การส่งออกของทั้งสอง (องค์ประกอบที่ไม่ซ้ำของแต่ละอาร์เรย์) จะถูกตัดแบ่งและประปาคือU D
sort -rn|uniq -uDเวลานี้uniqจะพิมพ์บรรทัดที่ซ้ำกัน ( -D) และเฉพาะการทำซ้ำครั้งแรกของแต่ละรายการ

ในขณะที่หน้าคนบอกว่ามันจะพิมพ์ซ้ำทั้งหมด-uสาเหตุที่เพิ่มมา-Dในการพิมพ์เกิดขึ้นครั้งแรกของบรรทัดที่ซ้ำกันเท่านั้น uniq -dลักษณะการทำงานนี้จะประสบความสำเร็จได้ตามปกติด้วย

สุดท้ายsed qออกจากทันทีโดยลดอินพุต (องค์ประกอบที่ไม่ซ้ำกันของทั้งสองอาร์เรย์) ไปที่บรรทัดแรก เนื่องจากเอาต์พุตถูกเรียงลำดับจากมากไปน้อยนี่คือค่าสูงสุด


6

Pyth, 12 9 ไบต์

ลองมัน

eS@Fm.m/d

บันทึกแล้ว 3 ไบต์ขอบคุณ Mr. Xcoder

คำอธิบาย

eS@Fm.m/d
    m  /d   Count the occurrences of each element.
     .m     Take only those that appear the minimum number of times.
  @F        Apply the above to A and B and take the intersection.
eS          Take the largest.

ดี! โซลูชันของฉันมีขนาด 12 ไบต์เช่นกัน
Mr. Xcoder

ตีกอล์ฟโซลูชันของฉันลงสักครู่9 ไบต์ (โดยใช้eS@Fm.m/d) และรับอินพุตเป็นรายการของสองรายการ
Mr. Xcoder

@ Mr.Xcoder ที่ดูเหมือนจะแตกต่างกันพอที่จะตอบ

เนื่องจากฉันเป็นผู้ท้าทายความสามารถฉันลังเลที่จะโพสต์ข้อความ คุณสามารถใช้และให้เครดิตกล่าวถึงวิธีการปัจจุบันของคุณเป็นทางเลือก (ถ้าต้องการแน่นอน)
Mr. Xcoder



5

Husk , 7 ไบต์

→►≠OfEΠ

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

คำอธิบาย

นี่เป็นคำตอบแบบ Husk แรกต่อ (ab) ใช้ฟังก์ชัน "max by" ใหม่

→►≠OfEΠ  Implicit input, say [[3,2,1,3],[1,2,3,4]]
      Π  Cartesian product: [[3,1],[2,1],[3,2],[2,2],[1,1],[3,3],[1,2],[3,1],[3,4],[2,3],[1,3],[3,2],[2,4],[3,3],[1,4],[3,4]]
    fE   Keep those that have equal elements: [[2,2],[1,1],[3,3],[3,3]]
   O     Sort: [[1,1],[2,2],[3,3],[3,3]]
 ►≠      Find rightmost element that maximizes number of other elements that are not equal to it: [2,2]
→        Take last element: 2

4

Bash + coreutils, 60 ไบต์

f()(sort -rn<<<"$1"|uniq -u);grep -m1 -wf<(f "$1") <(f "$2")

ลองใช้ออนไลน์

Bash, 89 ไบต์

c()(for e;{((e^$1||r++,2^r));});for x in $1 $2;{((x<r))||c $x $1||c $x $2||r=$x;};echo $r

TIO


1
การใช้งานsort -rnที่มีsed qในตอนท้ายแทนการtail -1ที่จะโกน 1 ไบต์ พบกับgrep -wfbtw +1
seshoumara

@seshoumara ขอบคุณสำหรับเคล็ดลับในความเป็นจริงฉันสามารถโกน 3 ไบต์ด้วย -m1 grep ตัวเลือก
Nahuel Fouilleul


3

J, 23 ไบต์

>./@([-.-.)&(-.-.@~:#])

(-.-.@~:#]) ลบออกจากรายการองค์ประกอบที่ซ้ำ ๆ

& ทำเช่นนี้กับทั้งสอง

([-.-.) เราต้องการ A จุดตัด B นี่คือวลีเทียบเท่า: "A ลบ (A ลบ B)"

>./ รับสูงสุด

ลองออนไลน์!


e.~#]เท่าที่คุณสามารถแทนที่ส่วนที่ตัดกับ การเล่นกอล์ฟนี้ได้พิสูจน์แล้วว่าเป็นเรื่องที่ยากลำบาก ... ฉันพยายามใช้/.-key ถึงไม่ประสบความสำเร็จ ( ((1=#)/.~#~.)สำหรับส่วนแรกซึ่งมีความยาว 2 ไบต์ต่อการนับ)
โคล

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

2

PowerShell , 94 ไบต์

param($a,$b)filter f($x){$x|group|?{$_.count-eq1}}
(f($a|sort|?{$_-in((f $b).Name)}))[-1].Name

ลองออนไลน์!

ใช้อินพุต$aและ$bเป็นอาร์เรย์ โครงสร้างfilterที่groups องค์ประกอบการป้อนข้อมูลอาร์เรย์ด้วยกันและดึงออกเฉพาะผู้ที่มีcount -eqUAL ไป1(เช่นเฉพาะผู้ที่เป็นเอกลักษณ์ในอาร์เรย์การป้อนข้อมูล)

บรรทัดถัดไปจะสร้างอัลกอริทึม ครั้งแรกที่เราsort $aแล้วดึงออกมาจากผู้ที่มีรายการที่ไม่ซ้ำกันของ-in $bสิ่งเหล่านั้นมีเอกลักษณ์เฉพาะตัวที่ใหญ่ที่สุด[-1]และเราเลือก.Nameสิ่งนั้น ที่เหลืออยู่บนไปป์ไลน์


2

Javascript (ES6), 102 86 75 71 ไบต์

a=>b=>Math.max(...a.map(e=>(g=x=>x.map(y=>y-e||x--,x=1)|!x)(a)*g(b)*e))

ขอบคุณ @justinMariner ที่ได้รับจาก 102 ถึง 86

ขอบคุณ @tsh จากการรับ 86 ถึง 75

ขอบคุณ @Arnauld ที่ได้รับตั้งแต่ 75 ถึง 71

ลองออนไลน์!


ยินดีต้อนรับสู่ PPCG! เท่าที่ผมสามารถบอกได้ว่านี้ไม่ได้ตรวจสอบให้แน่ใจว่าeการแสดงขึ้นเพียงครั้งเดียวในและa b
Martin Ender

@ มาร์ตินเอนเดอร์ขอบคุณ! แก้ไขคำตอบเพื่อแสดงรายละเอียดที่ฉันพลาดไป!
เนท

1
ฉันไม่เคยคิดที่จะใช้lastIndexOfสิ่งนั้นมันช่างฉลาด คุณสามารถลดขนาดนี้ได้ถึง 86 ไบต์: ลองออนไลน์! . ตรวจสอบเคล็ดลับ JSสำหรับข้อมูลเพิ่มเติม
Justin Mariner

1
ดูเหมือนว่าการใช้(g=x=>x.filter(y=>y==e).length==1)จะสั้นกว่า
tsh

1
ฉันคิดว่าอัน นี้ก็ผ่านกรณีขอบทั้งหมด (71 ไบต์)
Arnauld

2

Haskell , 57 53 ไบต์

x?y|let v!x=filter(==v)x==[v]=maximum[a|a<-x,a!x,a!y]

ลองออนไลน์!

UPD:ขอบคุณ @Laikoni


ยินดีต้อนรับสู่การเล่น PPCG และ Haskell โดยเฉพาะ! นี่เป็นคำตอบแรกที่ดี! สองสิ่งเล็ก ๆ : คุณสามารถประกาศfเป็นตัวดำเนินการมัดและเขียน[1|...]==[1]แทนsum[1|...]==1การบันทึกไบต์
Laikoni

ในกรณีที่คุณไม่ได้เห็นพวกเขาแล้วที่นี่มีการเชื่อมโยงบางอย่างที่อาจจะน่าสนใจ: คอลเลกชันของเราเคล็ดลับการเล่นกอล์ฟใน Haskellที่คู่มือกับกฎระเบียบของการเล่นกอล์ฟใน Haskellและของ Monads และผู้ชาย , Haskell ห้องแชทของเรา
Laikoni

1
ซับใน!ด้วยการandบันทึกสองไบต์เพิ่มเติม: ลองออนไลน์!
Laikoni

2

ภาษา Wolfram (Mathematica)ขนาด 40 ไบต์

Max@Cases[Tally@#⋂Tally@#2,{x_,1}:>x]&

ลองออนไลน์!

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

Tally@# ให้รายการองค์ประกอบที่เป็นเอกลักษณ์ของอินพุตแรกพร้อมกับการนับ: เช่น Tally[{2,2,2,6,3,5,8,2}]{{2,4},{6,1},{3,1},{5,1},{8,1}}อัตราผลตอบแทน

Tally@#2ทำเช่นเดียวกันสำหรับรายการที่สองและค้นหาคู่ที่มีอยู่ในทั้งสอง จากนั้นเราเลือกCasesคู่ที่ลงท้ายด้วย1การรับองค์ประกอบแรกของแต่ละผลลัพธ์ซึ่งทำให้เรามีรายการของคู่แฝดที่ไม่ซ้ำกันทั้งหมด ในที่สุดMaxส่งกลับแฝดที่ไม่ซ้ำกันที่ใหญ่ที่สุด


2

Röda , 48 ไบต์

{m={|n|sort|count|[_]if[_=n]};[_()|m 1]|m 2|max}

ลองออนไลน์!

แรงบันดาลใจจากคำตอบ jq ของ jq170727คำตอบของ

คำอธิบาย:

{ /* Anonymous function, takes input from the stream */
  m={|n|        /* Local function m with parameter n: */
    sort|count| /*   Count unique values in the stream */
    [_]if[_=n]  /*   For each value, push it to the stream if its count is n */
  };
  [      /* For each list in the stream: */
    _()| /*   Flat it (push its values to the stream) */
    m 1  /*   Push values that appear only once to the stream */
  ]|
  m 2|   /* Push values that appear twice to the stream */
  max    /* Find the max value in the stream */
}

2

F # (. NET Core) , 117 115 114 111 108 ไบต์

115 114 ไบต์

ทางออกอื่นcountByในเวลานี้:

let u x=x|>Seq.countBy id|>Seq.filter(fun a->snd a=1)|>Seq.map fst|>set
let f x y=Set.intersect(u x)(u y)|>Seq.max

ลองออนไลน์!

117 111 ไบต์

let u x=x|>Seq.filter(fun a->x|>Seq.filter((=)a)|>Seq.length=1)|>set
let f x y=Set.intersect(u x)(u y)|>Seq.max

ลองออนไลน์!

100% F #! ยินดีต้อนรับความช่วยเหลือใด ๆ !

ได้รับรางวัล 6 ไบต์ด้วยสัญลักษณ์นำหน้า!

108 ไบต์

let f a b=Set.intersect(set a)(set b)|>Seq.filter(fun x->a@b|>Seq.filter(fun y->y=x)|>Seq.length<3)|>Seq.max

@ฟังก์ชั่นคือ concat! ขอบคุณ @ Ayb4btu สำหรับอัลกอริทึมนี้

ลองออนไลน์!



2

Pip , 17 16 ไบต์

MX{_Na=_Nb=1FIa}

นี่คือฟังก์ชันที่รับสองรายการเป็นอาร์กิวเมนต์ ลองออนไลน์!

คำอธิบาย

  {            }  Define function, args are a & b:
            FIa    Filter elements of a on this function:
   _Na              Count of element in a
      =_Nb          equals count of element in b
          =1        equals 1
                  This gives a function that returns a list of unique twins
MX                Modify it to take the max and return that instead

2

APL (Dyalog) , 18 ตัวอักษร = 23 ไบต์ *

เนื้อหาของโปรแกรมเต็มรูปแบบ พร้อมต์สำหรับรายการของรายการจาก STDIN ทำงานร่วมกับรายการจำนวนเท่าใดก็ได้ ส่งออกไปยัง STDOUT

⌈/∊∩/{⊂⍺⍴⍨1=≢⍵}⌸¨⎕

ลองออนไลน์!

 พรอมต์สำหรับการป้อนข้อมูลที่ประเมินจาก STDIN

{}⌸¨ สำหรับแต่ละรายการให้เรียกใช้ฟังก์ชันต่อไปนี้สำหรับแต่ละองค์ประกอบที่ไม่ซ้ำกันในรายการนั้นโดยใช้องค์ประกอบที่ไม่ซ้ำกันเป็นอาร์กิวเมนต์ซ้าย ( ) และรายการดัชนีที่ปรากฏเป็นอาร์กิวเมนต์ที่ถูกต้อง ( ):

≢⍵ จำนวนครั้งของดัชนี (เช่นจำนวนครั้งที่เกิดขึ้น)

1= เท่ากับ 1

⍺⍴⍨ ใช้สิ่งนั้นเพื่อปรับรูปร่างองค์ประกอบเฉพาะ (เช่นให้รายการว่างถ้าไม่ซ้ำกัน)

ตอนนี้เรามีสองรายการขององค์ประกอบที่ไม่ซ้ำกันสำหรับแต่ละรายการอินพุต (แม้ว่าแต่ละองค์ประกอบเป็นรายการและมีรายการที่ว่างเปล่าเป็นสารตกค้างจากองค์ประกอบที่ไม่ซ้ำกัน)

∩/ สี่แยก (ลดลง)

ϵ รายการ (แผ่)

⌈/ สูงสุด (ลดลง)


* ในคลาสสิกนับเป็น⎕U2338


1

MATL , 13 ไบต์

,iSY'1=)]X&X>

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

,      % Do twice
  i    %   Take input: array
  S    %   Sort array
  Y'   %   Run-length encode: pushes array of values and array of run lengths
  1=   %   Compare each run length with 1
  )    %   Use as logical index. This keeps only values that have appeared once
]      % End
X&     % Intersection of the two arrays
X>     % Maximum of array. Implicitly display

1

PHP, 98 ไบต์

<?foreach(($c=array_count_values)($_GET[a])as$a=>$n)$n-1||$c($_GET[b])[$a]-1||$a<$r||$r=$a;echo$r;

ให้อาร์เรย์เป็นพารามิเตอร์ GET และab


คิดว่าคุณสามารถสลับพารามิเตอร์ GET เหล่านั้นเป็นค่าคงที่ได้
Progrock

@Progrock นั่นไม่ใช่วิธีการป้อนข้อมูลที่ถูกต้อง
ติตัส

วลีคำถามที่ A และ B ได้รับเป็นอาร์เรย์ และบอกว่าวิธีการอินพุตและเอาต์พุตที่สมเหตุสมผล .... ไม่ว่าฉันจะสามารถติดตามลิงก์นั้นได้อย่างง่ายดาย ชอบสูตรของคุณมาก (ฉายาในรุ่น 5.6 ล้าสมัยไปแล้ว)
Progrock

1

Java 8, 133 ไบต์

a->b->{long r;for(java.util.Collections c=null;;a.remove(r))if(b.contains(r=c.max(a))&c.frequency(a,r)*c.frequency(b,r)==1)return r;}

คำอธิบาย:

ลองที่นี่

a->b->{                  // Method with two ArrayList<Long> parameters and long return-type
  long r;                //  Result-long
  for(java.util.Collections c=null; 
                         //  Create a java.util.Collections to save bytes
      ;                  //  Loop indefinitely
       a.remove(r))      //    After every iteration, remove the current item
    if(b.contains(r=c.max(a)) 
                         //   If the maximum value in `a` is present in `b`,
       &c.frequency(a,r)*c.frequency(b,r)==1)
                         //   and this maximum value is unique in both Lists:
      return r;          //    Return this value
                         //  End of loop (implicit / single-line body)
}                        // End of method


1

JavaScript ES5 122 121 114 ไบต์

function f(a,b){for(i=a.sort().length;--i+1;)if(a[i]!=a[i+1]&&a[i]!=a[i-1]&&!(b.split(a[i]).length-2))return a[i]}

ฉันใหม่ที่นี่ดังนั้นฉันไม่รู้จริงๆว่าฉันสามารถลบนิยามฟังก์ชันและใส่เนื้อหาของมัน (ซึ่งจะช่วยฉัน 17 ไบต์)

นี่คือตัวอย่างการทำงาน: 122 121 114

122 ถึง 121 ไบต์: การตัดการเริ่มต้นใน a สำหรับ

121 ถึง 114 ไบต์: bต้องเป็นสตริง


2
ยินดีต้อนรับสู่ PPCG! คุณไม่สามารถลบคำจำกัดความของฟังก์ชันได้ แต่คุณสามารถใช้ฟังก์ชัน lambda แทน (ฉันไม่รู้ JS ดังนั้นฉันจึงไม่สามารถช่วยคุณได้)
Mr. Xcoder

ขอบคุณสำหรับการล้างออก ฉันไม่คิดว่าฟังก์ชั่นแลมบ์ดาสามารถบันทึกตัวละครใด ๆ แต่ฉันจะลอง นอกจากนี้เนื่องจากคุณพูดว่า "อนุญาตให้ใช้วิธี / รูปแบบอินพุตและเอาต์พุตใด ๆ ที่สมเหตุสมผล" ฉันสามารถยอมรับสตริงเป็นbและบันทึกได้b=''+b,หรือไม่?
Piyin

ฉันไม่จัดการเพื่อให้ได้ถึง 115 ไบต์ แต่ผมไม่ทราบว่า f=(a,b)=>{for(b=''+b,i=a.sort().length;--i+1;)if(a[i]!=a[i+1]&&a[i]!=a[i-1]&&!(b.split(a[i]).length-2))return a[i]}JavaScript:
Mr. Xcoder

1
ใช่แน่ใจว่าอินพุตสตริงจะใช้ได้
Mr. Xcoder

แต่จาวาสคริปต์ที่คุณสร้างขึ้นจะเป็น ES5 ไม่ใช่ ES6 มีการโพสต์คำตอบ ES6 ไว้แล้วซึ่งเป็นสาเหตุที่ฉันโพสต์ ES5 และขอขอบคุณสำหรับการตอบคำถามที่สองฮิฮิ
Piyin


1

Jq 1.5 , 76 ไบต์

def m(n):[.[indices(.[])|select(length==n)[]]]|unique[];[map(m(1))|m(2)]|max

ขยาย

def m(n): # function to emit elements of multiplicity n
  [
    .[                         # select elements with
         indices(.[])          # number of indices in the array
       | select(length==n)[]   # equal to specified multiplicity
    ]
  ] | unique[]                 # emit deduped values
;

[
    map(m(1))   # collect multiplicity 1 elements from each array
  | m(2)        # collect multiplicity 2 elements
] | max         # choose largest of these elements

ลองออนไลน์!

นี่คือวิธีแก้ไขปัญหาอื่นซึ่งมีความยาวเท่ากัน:

def u:[keys[]as$k|[.[$k]]-(.[:$k]+.[$k+1:])]|add;map(u)|.[0]-(.[0]-.[1])|max

ขยาย

def u: # compute unique elements of input array
  [
      keys[] as $k                   # for each index k
    | [.[$k]] - (.[:$k]+.[$k+1:])    # subtract other elements from [ .[k] ]
  ]                                  # resulting in [] if .[k] is a duplicate
  | add                              # collect remaining [ .[k] ] arrays
;
  map(u)                             # discard duplicates from each input array
| .[0]-(.[0]-.[1])                   # find common elements using set difference
| max                                # kepp largest element

ลองออนไลน์!


1

APL, 47 ไบต์

{1↑R[⍒R←((1={+/⍵=A}¨A)/A←⍺)∩(1={+/⍵=B}¨B)/B←⍵]}

ประกาศฟังก์ชันที่ไม่ระบุชื่อที่ใช้สองเวกเตอร์กำจัดองค์ประกอบที่ซ้ำกันจากนั้นค้นหาองค์ประกอบที่ใหญ่ที่สุดในจุดตัดของผลลัพธ์

A←⍺และB←⍵การจัดเก็บข้อโต้แย้งส่งผ่านไปยังฟังก์ชั่นในและAB

a=bส่งกลับเวกเตอร์ 1 ในแต่ละดัชนีที่มีค่าเท่ากับa bถ้าaเป็นสเกลาร์ (เช่นปริมาณเดี่ยวและไม่ใช่เวกเตอร์) จะส่งคืนเวกเตอร์ที่มี 1 ทุกที่ที่องค์ประกอบbเป็นaและ 0 เมื่อไม่ได้เป็น ตัวอย่างเช่น:

Input: 1=1 2 3
Output: 1 0 0

{+/⍵=A}: ฟังก์ชั่นที่ไม่ระบุชื่อซ้อนกัน; ค้นหาการเกิดขึ้นของการโต้แย้งในเวกเตอร์Aและเพิ่มขึ้นเช่นหาจำนวนการเกิดขึ้นของการโต้แย้งในA

1={+/⍵=A}¨A: ใช้ฟังก์ชั่นที่ไม่ระบุชื่อซ้อนกับแต่ละองค์ประกอบใน A และหาคนที่เท่ากับ 1 คือองค์ประกอบที่ไม่ซ้ำกัน

((1={+/⍵=A}¨A)/A←⍺): เมื่อพบตำแหน่งขององค์ประกอบที่ไม่ซ้ำกันให้เลือกเฉพาะองค์ประกอบเหล่านี้ในเวกเตอร์ดั้งเดิม ( /เลือกจากองค์ประกอบอาร์กิวเมนต์ด้านขวาซึ่งตำแหน่งสอดคล้องกับ 1 ในอาร์กิวเมนต์ซ้าย)

R←((1={+/⍵=A}¨A)/A←⍺)∩(1={+/⍵=B}¨B)/B←⍵: ทำซ้ำกระบวนการสำหรับอาร์กิวเมนต์ที่สอง ตอนนี้เรามีองค์ประกอบเฉพาะแล้วหาจุดตัดนั่นคือองค์ประกอบทั่วไปแล้วเก็บมันไว้ในเวกเตอร์R

R[⍒R]: เข้าถึงองค์ประกอบของRตามลำดับที่ลดลง

1↑R[⍒R]: ใช้องค์ประกอบแรกของ Rเมื่อมันเรียงลำดับลดลง

กรณีทดสอบ:

Input: 17 29 39 29 29 39 18 18 {1↑R[⍒R←((1={+/⍵=A}¨A)/A←⍺)∩(1={+/⍵=B}¨B)/B←⍵]} 19 19 18 20 17 18
Output: 17

1

J , 30 ไบต์

[:>./@,[*([*+/"1(1=*/)+/)@(=/)

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

ฉันเริ่มต้นด้วยการทดสอบที่ทั้งสองรายการซ้อนทับกัน=/(แทรกการทดสอบความเท่าเทียมกันระหว่างสมาชิกทั้งหมดของรายการ:

   a =. 1 3 4 6 6 9
   b =. 8 7 6 3 4 3
   ]c=. a =/ b 
0 0 0 0 0 0
0 0 0 1 0 1
0 0 0 0 1 0
0 0 1 0 0 0
0 0 1 0 0 0
0 0 0 0 0 0

มากกว่าหนึ่ง 1 ในคอลัมน์เดียวกันหมายความว่าตัวเลขไม่ซ้ำกันสำหรับอาร์กิวเมนต์ซ้าย (6 ในกรณีนี้) ในแถว - สำหรับอาร์กิวเมนต์ที่ถูกต้อง (3)

จากนั้นฉันจะรวมแถวทั้งหมดและคอลัมน์ทั้งหมดเพื่อค้นหาว่ามีรายการใดซ้ำกันบ้าง:

   +/ c
0 0 2 1 1 1
   +/"1 c
0 2 1 1 1 0

ฉันค้นหาผลิตภัณฑ์คาร์ทีเซียนของรายการด้านบนและตั้งค่าสมาชิกมากกว่า 1 เป็น 0

    m =. (+/"1 c) (1=*/) +/c
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 1 1 1
0 0 0 1 1 1
0 0 0 1 1 1
0 0 0 0 0 0

ฉันปิดบังเมทริกซ์ความเสมอภาค c กับ m เพื่อค้นหาองค์ประกอบเฉพาะที่มีร่วมกันทั้งรายการและทวีคูณอาร์กิวเมนต์ซ้ายด้วยสิ่งนี้

]l =. a * m * c
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 4 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0

จากนั้นฉันเรียบรายการและค้นหาองค์ประกอบสูงสุด:

 >./,l 
4

ลองออนไลน์!


1

C # (. NET Core) , 66 + 31 = 97 65 + 31 = 96 ไบต์

a=>b=>a.Intersect(b).Where(x=>a.Concat(b).Count(y=>y==x)<3).Max()

ลองออนไลน์!

+31 ไบต์สำหรับ using System;using System.Linq;

ฉันรับแรงบันดาลใจจากคำตอบของ @ aloisdg อย่างไรก็ตามแทนที่จะค้นหาค่าที่ไม่ซ้ำกันในทั้งสองอาร์เรย์ฉันกลับลำดับของการดำเนินการเพื่อให้intersectเป็นอันดับแรกจากนั้นหาค่าสูงสุดของรายการที่เกิดขึ้นสองครั้งเมื่อมีการต่อเชื่อมอาร์เรย์และอยู่ในจุดตัด ฉันสามารถใช้<3เป็นCountอย่างน้อย 2 สำหรับค่าใด ๆ ตามที่จะเป็นในทั้งสองอาร์เรย์

กิตติกรรมประกาศ

-1 ไบต์ขอบคุณ @aloisdg และคำแนะนำของเขาที่จะใช้การFuncแกง


1
ความคิดดี! ฉันชอบมันมาก
aloisdg พูดว่า Reinstate Monica


ด้วยการแกงคุณสามารถชนะ 1 ไบต์! ลองออนไลน์!
aloisdg พูดว่า Reinstate Monica

0

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

@(x)max(intersect(cellfun(@(x){x(sum(x'==x)==1)},x){:}))

ฟังก์ชั่นไม่ระบุชื่อที่ใช้เป็นอินพุตอาร์เรย์ของสองอาร์เรย์ที่เป็นตัวเลข

ลองออนไลน์!

คำอธิบาย

สำหรับแต่ละ ( cellfun(@(x)...)) ของทั้งสองอาร์เรย์อินพุตสิ่งนี้จะสร้างเมทริกซ์ของการเปรียบเทียบความเท่าเทียมกันแบบคู่ระหว่างรายการของมัน ( x.'==x); รักษา ( x(...)) เฉพาะรายการที่ผลรวมคอลัมน์คือ1( sum(...)==1); และแพ็คผลลัพธ์ในเซลล์ ( {...}) จุดตัด ( intersect) ของผลลัพธ์ทั้งสอง ( {:}) ถูกคำนวณและใช้ค่าสูงสุด ( max(...))


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