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


13

นี่คือคำถามสัมภาษณ์ของ Google ดูที่นี่สำหรับลิงค์ youtube

งาน:

ค้นหา 2 จำนวนเต็มจากรายการที่ไม่ได้เรียงลำดับซึ่งรวมเป็นจำนวนเต็มที่กำหนด

  1. ให้ลิสต์รายการจำนวนเต็มที่ไม่มีการเรียงลำดับค้นหา 2 จำนวนเต็มที่รวมกับค่าที่กำหนดพิมพ์จำนวนเต็ม 2 จำนวนเหล่านี้และระบุความสำเร็จ (ออก 0) พวกเขาไม่จำเป็นต้องเป็นตัวเลขใด ๆ (เช่นจำนวนเต็ม 2 ตัวแรกที่รวมกับหมายเลขที่ถูกต้อง) คู่ใด ๆ ที่ผลรวมของค่าจะทำงาน
  2. จำนวนเต็มบวกและมากกว่าศูนย์
  3. รายการจำนวนเต็มสามารถอยู่ในโครงสร้างข้อมูลใด ๆ รวมถึงไฟล์จำนวนเต็ม - หนึ่งจำนวนเต็มต่อบรรทัด
  4. หากไม่พบจำนวนเต็มให้ระบุความล้มเหลว (ออก 1)
  5. ต้องส่งคืนจำนวนเต็มสองจำนวนที่ตำแหน่งต่างกันในรายการ (เช่นคุณไม่สามารถส่งคืนหมายเลขเดิมจากตำแหน่งเดิมสองครั้ง)

(หมายเหตุ: ในวิดีโอสิ่งเหล่านี้ไม่ตรงตามข้อกำหนด 'ผู้สัมภาษณ์' เปลี่ยนหลายครั้งของเขา)

เช่น.

sum2 8 <<EOF
1
7
4
6
5
3
8
2
EOF

พิมพ์3และ5ออกจากสถานะเป็น 0 โปรดทราบว่าในสิ่งนี้1,7และ2,6จะได้รับอนุญาตผลลัพธ์

sum2 8 <<EOF
1
2
3
4

ส่งคืนสถานะการออก 1 เนื่องจากไม่มีคอมโบที่เป็นไปได้ 4,4ไม่อนุญาตตามกฎ 5


15
นี่อาจเป็นคำถามที่ยอดเยี่ยมหากมีโอกาสที่จะสลัดปลายหลวมในSandboxก่อน ยกตัวอย่างเช่นสิ่งนี้ฉันคาดว่าจะเขียนฟังก์ชั่นที่ส่งกลับค่าเท็จหรือคู่ของตัวเลข
Neil

2
ในตัวอย่างทำไมคู่ที่ส่งคืนคือ (3,5) และไม่ใช่ (1,7)
Rod

4
จะมีคู่ "แรก" ในรายการที่ไม่ได้เรียงลำดับได้อย่างไร นั่นคือความขัดแย้งในตัวเองโดยเนื้อแท้
Peter Taylor

23
ฉันไม่คิดว่าทางออก 0 / ทางออก 1 เป็นความคิดที่ดี หลายภาษาไม่สามารถอยู่ได้อย่างง่ายดายเช่นนั้นและโดยทั่วไปจะได้รับอนุญาตให้ออกโดยมีข้อผิดพลาด (เช่นเพิกเฉยต่อคำสั่งซื้อ)ภาษากอล์ฟจำนวนมากไม่มีวิธีง่าย ๆ ในการออกจากรหัสทางออกที่ฉันคิดว่า
2017

2
ในความคิดที่สองมีคำตอบบางอย่างที่ต้องใช้ความพยายามในการสร้างรหัสทางออก 1 ดังนั้นจึงเป็นการดีกว่าที่จะไม่เปลี่ยนแปลงข้อกำหนดในขณะนี้
Luis Mendo

คำตอบ:


5

Bash, 84 ไบต์

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

while read V;do((V<$1))&&{ ((T=R[V]))&&echo $T $V&&exit;((R[$1-V]=V));};done;exit 1

วิธี

ในขณะที่เราสามารถอ่านจำนวนเต็ม V จากอินพุตสตรีมหากน้อยกว่าเป้าหมาย $ 1 แล้วถ้าได้เห็น $ 1-V แล้วพิมพ์ $ 1-V และ V และออก 0 (อื่น ๆ ) บันทึกผู้สมัครสำหรับทางออก $ 1-V 1


4

Brachylogขนาด 9 ไบต์

h⊇Ċ.+~t?∧

ลองออนไลน์!

สมมติว่าฉันเข้าใจความท้าทายอย่างถูกต้อง ...

คำอธิบาย

h⊇Ċ          Ċ ('couple') has two elements, and is a subset of the head of the input
  Ċ.         Output = Ċ
   .+~t?     The sum of the elements of the Output is the tail of the Input
        ∧    (disable implicit unification)

4

Perl 6 , 59 ไบต์

$_=get;put lines().combinations(2).first(*.sum==$_)//exit 1

ลอง
ใช้โดยไม่ได้ผล

ขยาย:

$_ = get;            # get one line (the value to sum to)

put                  # print with trailing newline
    lines()          # get the rest of the lines of input
    .combinations(2) # get the possible combinations
    .first(          # find the first one
      *.sum == $_    # that sums to the input
    )
  //                 # if there is no value (「Nil」)
    exit 1           # exit with a non-zero value (「put」 is not executed)

4

JavaScript ES6, 58 70 68 64 ไบต์

a=>b=>{for(i in a)if(a.includes(b-a[i],i+1))return[a[i],b-a[i]]}

ส่งคืนคู่ของตัวเลขในรูปแบบของอาร์เรย์ถ้าพบมิฉะนั้นจะส่งกลับundefinedค่าเท็จ

f=a=>b=>{for(i in a)if(a.includes(b-a[i],i+1))return[a[i],b-a[i]]}

console.log(f([1,7,4,6,5,3,8,2])(8));
console.log(f([1,2,3,4,5,6,7,8])(8));
console.log(f([1,2,3,4])(8));
console.log(f([2,2])(4));


ตัวอย่างคือ3, 5แต่ผลลัพธ์นี้1, 7...
Neil

@ Neil ขอโทษฉันได้แก้ไขกฎเพราะฉันทำผิดพลาด 1,7 ไม่เป็นไร
philcolbourn

1
มันจะไม่ทำงานf([2,2] 4)ใช่ไหม
หน้าผา

1
@cliffroot ควรใช้กับกรณีนี้
Tom

1
นีซincludesเคล็ดลับ
Neil

4

JavaScript (ES6), 61 57 56 ไบต์

ใช้เวลาอาร์เรย์ของจำนวนเต็มaและผลรวมที่คาดหวังในไวยากรณ์ความดีความชอบs (a)(s)ส่งคืนคู่ของจำนวนเต็มที่ตรงกันเป็นอาร์เรย์หรือundefinedหากไม่มีคู่ดังกล่าวอยู่

a=>s=>(r=a.find((b,i)=>a.some(c=>i--&&b+c==s)))&&[r,s-r]

จัดรูปแบบและแสดงความคิดเห็น

a =>                      // given an array of integers (a)
  s => (                  // and an expected sum (s)
    r = a.find((b, i) =>  // look for b at position i in a such that:
      a.some(c =>         //   there exists another c in a:
        i-- &&            //     - at a different position
        b + c == s        //     - satisfying b + c == s
      )                   //   end of some()
    )                     // end of find(): assign the result to r
  ) &&                    // if it's not falsy:
  [r, s - r]              // return the pair of integers

ทดสอบ


3

เยลลี่ 14 ไบต์

ŒcS=⁹$$ÐfḢṄo⁶H

ลองออนไลน์!

นี่คือฟังก์ชั่น (ไม่ใช่โปรแกรมเต็มรูปแบบ) ที่ส่งออกไปยังเอาต์พุตมาตรฐาน (ลิงก์ TIO มี wrapper ที่เรียกใช้ฟังก์ชันและไม่สนใจค่าส่งคืน)

โปรแกรมนี้อาจสั้นลง 4 ไบต์หากไม่ใช่สำหรับข้อกำหนดรหัสออก การส่งคืนรหัสทางออก 1 ในเยลลี่นั้นค่อนข้างยาก (เป็นไปได้ว่ามีวิธีการทำเช่นนี้ที่ฉันพลาดไปมากขึ้น)

คำอธิบาย

ŒcS=⁹$$ÐfḢṄo⁶H
Œc                All pairs of values from {the first argument}
       Ðf         Take only those which
  S=⁹               sum to {the second argument}
     $$           Parse the preceding three builtins as a group
         Ḣ        Take the first result (0 if there are no results)

          Ṅ       Output this result (plus a newline) on standard output
           o⁶     If this value is falsey, replace it with a space character
             H    Halve every element of the value

เราสามารถลดลงครึ่งหนึ่งจำนวนเต็มในคู่ทุกเพียงแค่ปรับดังนั้นo⁶Hจะทำอะไรถ้าเราพบว่ามีผลอื่น ๆ กว่าจะกลับค่าที่ส่งกลับไร้ประโยชน์ที่ไม่ได้อยู่แล้วที่เกี่ยวข้อง (คนทำหน้าที่เป็นวิธีการเดียวไบต์สะดวกในการกำหนดผลตอบแทนการทำงานของ ค่าเริ่มต้นภายใต้กฎ PPCG) อย่างไรก็ตามหากเราไม่พบผลลัพธ์เราจะพยายามลดช่องว่างลงครึ่งหนึ่งการดำเนินการที่ไม่มีความหมายจึงทำให้ล่าม Jelly ผิดพลาด โชคดีที่ความผิดพลาดนี้สร้างรหัสออก 1


3

Perl 5 , 51 ไบต์

รหัส 46 ไบต์ + สำหรับ 5 ไบต์สำหรับ-pliค่าสถานะ

$\="$_ $v"if$h{$v=$^I-$_};$h{$_}=1}{$\||exit 1

ลองออนไลน์!

แนวคิดคือการวนซ้ำในรายการอินพุต: บนตัวเลขx( $_) หากก่อนหน้านี้เราเห็นn-x( $^I-$_) จากนั้นเราจะพบสิ่งที่เรากำลังมองหาและตั้งค่า$\เป็นสองค่านี้ ( "$_ $v") ในตอนท้ายหาก$\ไม่ได้ตั้งค่าเราexit 1ก็จะพิมพ์ออกมาโดยปริยาย


แท็บตัวอักษรทำงานแทนอักขระสองตัวได้^Iหรือไม่

@ ais523 ดูเหมือนว่าฉันทำไม่ได้ บางทีมันอาจเป็นไปได้สำหรับ Perl รุ่นเก่ากว่า
Dada

3

Röda , 60 56 ไบต์

f s,a{seq 1,s|{|x|[[x,s-x]]if[x in a,s-x in a-x]}_|pull}

ลองออนไลน์!

รหัสนี้จะพ่นข้อผิดพลาดหากไม่มีคำตอบ มันสร้างคู่ที่เป็นไปได้ทั้งหมดที่สามารถสร้างผลรวมsคือ 1, s-1, 2, s-2, 3, s-3, ... แล้วมันจะตรวจสอบถ้าตัวเลขทั้งสองอยู่ในอาร์เรย์aและถ้าเป็นเช่นผลักดันให้พวกเขาที่จะสตรีม pullอ่านหนึ่งค่าจากสตรีมและส่งคืน หากไม่มีค่าในสตรีมจะมีข้อผิดพลาดเกิดขึ้น a-xส่งคืนอาร์เรย์aด้วยการxลบ


3

Python 2, 60 ไบต์

สั้น ๆ นี้จนกว่ากฎที่ออกจากรหัส 1 จะได้รับการชี้แจง ตอนนี้ออกโดยมีข้อผิดพลาดหากไม่พบสิ่งใด

-5 ไบต์ขอบคุณ @Peilonrayz

-4 ไบต์ขอบคุณ @Rod

ลองออนไลน์

a,s=input()
while a:
 x=a.pop()
 if s-x in a:r=s-x,x
print r

@Peilonrayz ไม่ได้ตระหนักว่าขอบคุณ!
Dead Possum

@Peilonrayz สิ่งนี้จะเป็นการละเมิดกฎ fith: ต้องส่งคืนจำนวนเต็มสองจำนวนที่ตำแหน่งต่างกันในรายการ (เช่นคุณไม่สามารถส่งคืนหมายเลขเดิมจากตำแหน่งเดิมสองครั้ง)
Dead Possum

3
คุณสามารถใช้ช่องว่าง + แท็บสำหรับการเยื้องแบบผสมเพื่อลด 2 ไบต์หรือเปลี่ยนinput() เป็นลด 4 ไบต์
Rod

@Rod ขอบคุณ! ข้อมูลน่าจะดีกว่า
Dead Possum

2
@Eric Duminil ใช่ มันเทียบเท่ากับeval(raw_input())(ฉันคิดว่า)
Yytsi

2

C ++ 133 ไบต์ (รวบรวมด้วย clang 4 และ gcc 5.3 -std = c ++ 14)

#include <set>
auto f=[](auto s,int v,int&a,int&b){std::set<int>p;for(auto i:s)if(p.find(i)==end(p))p.insert(v-i);else{a=v-i;b=i;}};

C 108 ไบต์

void f(int*s,int*e,int v,int*a,int*b){do{int*n=s+1;do if(v-*s==*n){*a=*s;*b=*n;}while(++n<e);}while(++s<e);}

1
ยินดีต้อนรับสู่เว็บไซต์! แต่น่าเสียดายที่ผมคิดว่าคุณต้องเพิ่ม 15 ไบต์และอีกไม่กี่สำหรับ#include <set> std::setแม้ว่าคุณจะสามารถประหยัดจำนวนไบต์ได้หากคุณลบวงเล็บปีกกาออกp.insert(v-i);
James

@DJMcMayhem โอ้ขอบคุณ ดังนั้นฉันควรรวม main () หรือไม่
em2er

@ em2er mainไม่คุณไม่จำเป็นต้องมี เราพิจารณา (เว้นแต่จะระบุไว้เป็นอย่างอื่นในการท้าทาย) ว่าฟังก์ชั่นเป็นการส่งที่ถูกต้อง (ยินดีต้อนรับสู่เว็บไซต์ btw!)
Dada

ไม่การส่งฟังก์ชั่นนั้นใช้ได้ (และสั้นกว่ามากเพราะคุณสามารถรับอินพุตเป็นอาร์กิวเมนต์) คุณเพียงแค่ต้องนับรวมถึงสิ่งที่คุณต้องการส่ง
James

1
@DJMcMayhem @Dada ขอบคุณมาก! ฉันไม่แน่ใจด้วยendเหมือนกัน แต่มันรวบรวมใน gcc โดยไม่ต้องstd::(และถ้าไม่แน่นอน)
em2er

2

Haskell , 34 ไบต์

(n:v)#s|elem(s-n)v=(n,s-n)|1<2=v#s

ลองออนไลน์!

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


[2,2]#4ผมเกรงว่าวิธีนี้ไม่ได้ผลสำหรับปัจจัยการผลิตเช่น
Laikoni

@Laikoni ขอบคุณฉันยังไม่ได้อ่านความท้าทายมากพอ เวอร์ชั่นใหม่นี้ควรถูกต้อง (และสั้นกว่า ^^)
Leo

2

PowerShell, 109 97 ไบต์

param($i,$a)($c=0..($a.count-1))|%{$c-ne($f=$_)|%{if($a[$f]+$a[$_]-eq$i){$a[$f,$_];exit}}};exit 1

รับข้อตกลง 12 ไบต์ที่ AdmBorkBork นำเสนอ

คำอธิบาย

# Get the parameter passed where $i is the addition target from the array of numbers in $a
param($i,$a)

($c=0..($a.count-1))|%{
    # We are going to have two loops to process the array elements.
    # The first loop element will be held by $f
    $f=$_
    # Create a second loop that will be the same as the first except for the position of $f to
    # prevent counting the same number twice. 
    $c|?{$_-ne$f}|%{
        # Check if the number at the current array indexes add to the target value. If so print and exit.
        if($a[$f]+$a[$_]-eq$i){$a[$f],$a[$_];exit}        
    }

}
# If nothing was found in the loop then we just exit with error.
exit 1

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

ตัวอย่างการใช้งาน

หากรหัสด้านบนถูกบันทึกเป็นฟังก์ชั่น s

s 8 @(1,2,3,4)
s 8 @(1,7,4,6,5,3,8,2) 

คุณสามารถประหยัดอีกสองสามไบต์โดยการกำจัด$cและวนลูปลง -($a.count-1)..1|%{$f=$_;--$_..0|%{if...
AdmBorkBork

2

R, 49 ไบต์

function(x,y){r=combn(x,2);r[,colSums(r)==y][,1]}

สิ่งนี้จะพบการรวมกัน 2 ชุดของxและส่งกลับเมทริกซ์ จากนั้นหาผลรวมทีละคอลัมน์และหาผลรวมทั้งหมดที่เท่ากับy(ดังนั้นหากไม่มี[,1]ส่วนท้ายจะพิมพ์ผลรวมทั้งหมดที่ผลรวมเท่ากับy)


2

Japt , 9 ไบต์

บันทึกจำนวนมากด้วย @ETHproductions

à2 æ_x ¥V

ลองออนไลน์!

คำอธิบาย

à2 æ_x ¥V
à2         // Creates all combinations of the input, length 2
   æ       // Returns the first item where:
    _x     //     The sum of the two items in each set
       ¥V  //     == Second input   

ตัวอย่าง

Input:        [1,2,3], 4
à2         // [[1,2],[1,3],[2,3]]
   æ_x     // [3,    4,    5    ]
       ¥V  //  3!=4, 4==4 ✓
Output:    //  1,3

2

Javascript, 114 96 86 84 ไบต์

a=>b=>{c=b.length;for(x=0;x<c;x++)for( y=x;++y<c;)if(b[x]+b[y]==a)return[b[x],b[y]]}

บันทึก 1 ไบต์ขอบคุณ @Cyoce และอีก 8 ไบต์ขอบคุณ @ETHProductions

สิ่งนี้จะคืนค่า tuple พร้อมชุดแรกของ list-elements ที่รวมเข้ากับอินพุตที่กำหนดหรือไม่มีสิ่งใดที่ไม่ตรงกัน ฉันได้ลบvars ในฟังก์ชั่น; REPL.it ขัดข้องโดยไม่มีพวกเขา แต่ Chrome Dev Console จัดการสิ่งนี้ได้ดี ...

ลองออนไลน์!


ไม่ออกจากรหัส 1 เนื่องจากความท้าทายขอเฉพาะอินพุตที่ไม่ถูกต้อง มันเป็นคำตอบที่ไม่ถูกต้องในตอนนี้ แต่ฉันได้ถาม OP เกี่ยวกับข้อกำหนดนี้สำหรับภาษาที่ไม่สามารถทำได้อย่างง่ายดาย
Rɪᴋᴇʀ

@ Matt ใช่กฎนั้นถูกตั้งข้อสังเกต: y=x+1ดูแลสิ่งนั้น
steenbergh

1
คุณสามารถใช้a=>b=>...เพื่อบันทึกไบต์
Cyoce

1
for(y=x;++y<b.length;){คุณสามารถบันทึกอีกสามไบต์ด้วย นอกจากนี้คุณสามารถลบวงเล็บทั้งหมดยกเว้นชุดนอกสุดและคุณสามารถลบช่องว่างหลังreturn
ETHproductions

1

Clojure, 77 ไบต์

#(first(mapcat(fn[i a](for[b(drop(inc i)%):when(=(+ a b)%2)][a b]))(range)%))

nilผลตอบแทนที่แรกคู่ดังกล่าวหรือ


1

Haskell, 62 ไบต์

r=return;s#[]=r 1;s#(a:b)|elem(s-a)b=print(a,s-a)>>r 0|1<2=s#b

ฉันยังไม่รู้ว่าสิ่งใดที่ได้รับอนุญาตจากความท้าทายและสิ่งที่ไม่ ฉันจะหาฟังก์ชั่นที่พิมพ์ตัวเลขคู่หนึ่งแล้วส่งคืนค่า 0 หากมีวิธีแก้ปัญหาและไม่พิมพ์อะไรเลยและคืนค่า 1 หากไม่มีวิธีแก้ปัญหา ในฐานะที่เป็นพิมพ์ I / O ที่ฉันต้องยกคืนค่าลงใน IO-Monad (ผ่านreturn) Num a => IO aและประเภทที่เกิดขึ้นจริงของการทำงานคือ

ตัวอย่างการใช้งาน (พร้อมค่าส่งคืนที่พิมพ์โดยตัวแทน):

*Main> 4 # [2,2]
(2,2)
0

ลองออนไลน์! .

หากได้รับอนุญาตให้ยกข้อยกเว้นfailจะบันทึกบางส่วน (รวม 51):

s#[]=fail"";s#(a:b)|elem(s-a)b=print(a,s-a)|1<2=s#b

1

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

ŒcS=¥ÐfḢZ

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

ลองออนไลน์!

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

ŒcS=¥ÐfḢZ  Main link. Argument: A (array of integers), n (integer)

Œc         Yield all 2-combinations of different elements of A.
     Ðf    Filter by the link to the left.
    ¥        Combine the two links to the left into a dyadic chain.
  S            Take the sum of the pair.
   =           Compare the result with n.
       Ḣ   Head; extract the first pair of the resulting array.
           This yields 0 if the array is empty.
        Z  Zip/transpose the result.
           This doesn't (visibly) alter pairs, but it raise a TypeError for 0.

1

โนวา 101 ไบต์

q(Int[] a,Int x)=>a{if(Int y=a.firstWhere({a.contains(x-a.remove(0))}))return [y,x-y];System.exit(1)}

สิ่งหนึ่งที่ดีเกี่ยวกับรหัสกอล์ฟคือมันช่วยให้ฉันพบข้อบกพร่องในภาษาของฉัน เช่นพื้นที่ที่จำเป็นระหว่างและreturn[y,x-y]

เมื่อฉันเพิ่มฟังก์ชั่น push / pop ใน Array.nova และแก้ไขการคืนสินค้าจะเป็น 96 ไบต์:

q(Int[] a,Int x)=>a{if(Int y=a.firstWhere({a.contains(x-a.pop())}))return[y,x-y];System.exit(1)}

การใช้งาน:

class Test {
    static q(Int[] a,Int x)=>a{if(Int y=a.firstWhere({a.contains(x-a.remove(0))}))return [y,x-y];System.exit(1)}

    public static main(String[] args) {
        Console.log(q([1, 2, 3, 4, 5], 8)) // [5, 3]
        Console.log(q([1, 2, 3, 4, 5], 5)) // [1, 4]
        Console.log(q([1, 2, 3, 4], 8)) // exit code 1
    }
}

แก้ไข: นอกจากนี้ยังมีวิธีนี้ที่ 73 ไบต์ (69 โดยใช้ป๊อป) เช่นกัน:

q(Int[] a,Int x)=>[Int y=a.firstOrThrow({a.contains(x-a.remove(0))}),x-y]

ก่อนหรือโยนจะมีข้อยกเว้นซึ่งจะไม่ถูกตรวจจับและในที่สุดก็ออกจากโปรแกรมด้วยรหัสทางออก 1;)

วิธีนี้ดูเหมือนอ่านง่ายขึ้นเช่นกัน


0

Pyth, 12 ไบต์

hfqsThQ.ceQ2

คำอธิบาย

       .ceQ2   Get all pairs from the second input
 fqsThQ        Find the ones whose sum is the first input
h              Take the first (exits with error code 1 if there aren't any)

0

PHP, 88 ไบต์

for($i=1;$a=$argv[$k=++$i];)for(;$b=$argv[++$k];)if($a+$b==$argv[1])die("$a $b");die(1);

รับอินพุตจากอาร์กิวเมนต์บรรทัดรับคำสั่งรวมก่อน -nrทำงานด้วย

โชคดีที่die/ exitออก0เมื่อคุณให้สตริงเป็นพารามิเตอร์

ฉันพยายามรวมลูปเข้าด้วยกัน แต่จะต้องเริ่มต้นอีกต่อไปและทดสอบในครั้งนี้


วันร้าย ๆ? for($i=1;$a=$argv[$k=++$i];)for(;$b=$argv[++$k];)$a+$b!=$argv[1]?:die(!0);และคุณควรดูcodegolf.stackexchange.com/questions/120803/
JörgHülsermann

0

Mathematica, 76 ไบต์

f::e="1";If[(l=Cases[#~Subsets~{2},x_/;Tr@x==#2])=={},Message@f::e,First@l]&

ค่อนข้างตรงไปตรงมา: #~Subsets~{2}รับชุดย่อย 2 องค์ประกอบทั้งหมดของรายการจากนั้นCases[...,x_/;Tr@x==#2]เลือกเฉพาะชุดที่มีผลรวมเป็นจำนวนที่เราต้องการ หากไม่มีสิ่งเหล่านี้ให้If[l=={}, Message@f::e,First@l]พิมพ์ข้อความแสดงข้อผิดพลาดf::e : 1ที่เรากำหนดไว้ก่อนหน้า (เนื่องจากฉันไม่รู้ว่า "ทางออกสถานะ 1" อาจมีความหมายสำหรับ Mathematica); มิฉะนั้นจะส่งคืนรายการแรกในรายการคู่ที่รวมกับสิ่งที่ถูกต้อง

หากเราได้รับอนุญาตให้ส่งคืนค่าเท็จแทนการทำสิ่งที่สถานะออกแปลกรหัสต่อไปนี้มี 58 ไบต์:

If[(l=Cases[#~Subsets~{2},x_/;Tr@x==#2])=={},1<0,First@l]&

0

สกาลา, 55 41 ไบต์

(l,n)=>l combinations 2 find(_.sum==n)get

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


0

Ruby, 53 48 ไบต์

->a,s{p(a.combination(2).find{|x,y|x+y==s})?0:1}

อินพุต: a คือรายการ s คือผลรวมที่คาดหวัง

หากพบตัวเลข 2 ตัวให้พิมพ์และส่งกลับ 0 มิฉะนั้นคืนค่า 1 ตามที่ระบุไว้


0

TI-Basic, 59 ไบต์

Prompt L1
Prompt X
While 1
L1(1→B
seq(L1(C),C,2,dim(L1→L1
If sum(not(X-L1-B
Then
Disp B,X-B
Return
End
End

คำอธิบาย:

Prompt L1               # 4 bytes, input array like "{1, 2, 3}"
Prompt X                # 3 bytes, Input target sum
While 1                 # 3 bytes, until the list is empty
L1(1→B                  # 7 bytes, try the first element (now B)
seq(L1(C),C,2,dim(L1→L1  # 18 bytes, remove first element from list
If sum(not(X-L1-B       # 10 bytes, if any element in the list plus B is the target
Then                    # 2 bytes, then...
Disp B,X-B              # 7 bytes, print it and it's "complement"
Return                  # 2 bytes, and exit gracefully
End                     # 2 bytes
End                     # 1 byte

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


0

CJam, 23 ไบต์

l~_,1>{e!2f<::+#)}{;;}?

อินพุตคือ sum numbersการป้อนข้อมูลเป็นตัวอย่างเช่น6 [3 2 3]. ปล่อยจำนวนบวกสำหรับความจริงและสตริงว่างหรือ 0 สำหรับความเท็จ

คำอธิบาย:

l~    e# Read input and evaluate:  | 7 [3 2 3]
_     e# Duplicate:                | 7 [3 2 3] [3 2 3]
,     e# Take the length:          | 7 [3 2 3] 3
1>{   e# If more than 1:           | 7 [3 2 3]
  e!  e#   Unique permutations:    | 7 [[2 3 3] [3 2 3] [3 3 2]]
  2f< e#   Slice each to length 2: | 7 [[2 3] [3 2] [3 3]]
  ::+ e#   Some each:              | 7 [5 5 6]
  #   e#   Index:                  | -1
  )   e#   Increment:              | 0
}{    e# Else:                     | 7 [3 2 3]
  ;   e#   Pop                     | 7
  ;   e#   pop                     |
}?    e# Endif
e# Implicit output: 0
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.