Temukan dua bilangan bulat dari daftar tidak berurutan untuk dijumlahkan ke input

13

Ini adalah pertanyaan wawancara Google, lihat di sini untuk tautan youtube.

Tugas:

Temukan 2 bilangan bulat dari daftar tidak berurutan yang menjumlahkan bilangan bulat yang diberikan.

  1. Diberikan daftar bilangan bulat yang tidak berurutan, temukan 2 bilangan bulat yang menjumlahkan nilai yang diberikan, cetak 2 bilangan bulat ini, dan tunjukkan keberhasilan (keluar 0). Mereka tidak perlu angka tertentu (yaitu 2 bilangan bulat pertama yang menjumlahkan ke angka yang tepat), setiap pasangan yang menjumlahkan nilai akan bekerja.
  2. bilangan bulat positif dan lebih besar dari nol.
  3. daftar bilangan bulat dapat berada dalam struktur data apa pun termasuk file bilangan bulat - satu bilangan bulat per baris.
  4. jika tidak ada bilangan bulat yang ditemukan, tunjukkan kegagalan (keluar 1).
  5. dua bilangan bulat pada posisi berbeda dalam daftar harus dikembalikan. (yaitu Anda tidak dapat mengembalikan nomor yang sama dari posisi yang sama dua kali)

(Catatan: dalam video, ini bukan persyaratan. 'Pewawancara' mengubah beberapa kali.)

misalnya.

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

Mencetak 3dan 5keluar dari status adalah 0. Perhatikan bahwa ini 1,7dan 2,6juga akan diizinkan hasilnya.

sum2 8 <<EOF
1
2
3
4

Mengembalikan status keluar 1 karena tidak ada kombo yang mungkin. 4,4tidak diizinkan, sesuai aturan 5.

philcolbourn
sumber
15
Ini bisa menjadi pertanyaan yang bagus jika memiliki kesempatan untuk menyingkirkan beberapa ujung longgar di Sandbox terlebih dahulu. Misalnya, untuk hal seperti ini saya berharap untuk menulis fungsi yang mengembalikan nilai salah atau sepasang angka.
Neil
2
Dalam contoh, mengapa pasangan yang dikembalikan adalah (3,5) dan bukan (1,7)?
Rod
4
Bagaimana mungkin ada pasangan "pertama" dalam daftar yang tidak diurusi? Itu inheren kontradiktif dengan diri sendiri.
Peter Taylor
23
Saya tidak berpikir hal keluar 0 / keluar 1 adalah ide yang bagus. Banyak bahasa tidak bisa dengan mudah seperti itu, dan itu umumnya diperbolehkan untuk keluar dengan kesalahan (yaitu abaikan STDERR) Banyak bahasa golf bahkan tidak memiliki cara mudah untuk keluar dengan kode keluar saya pikir
Rɪᴋᴇʀ
2
Setelah dipikir-pikir, beberapa jawaban telah melalui upaya untuk menghasilkan kode keluar 1, jadi mungkin lebih baik untuk tidak mengubah persyaratan sekarang
Luis Mendo

Jawaban:

5

Bash, 84 byte

Implementasi saya atas (kira-kira) solusi insinyur Google tetapi menggunakan bash dan aliran input - bukan solusi saya, jadi ini tidak masuk hitungan.

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

metode

sementara kita bisa membaca integer V dari input stream jika kurang dari target $ 1 maka jika sudah terlihat $ 1-V maka cetak $ 1-V dan V dan keluar 0 (selain itu) simpan kandidat untuk input $ 1-V keluar 1

philcolbourn
sumber
4

Brachylog , 9 byte

h⊇Ċ.+~t?∧

Cobalah online!

Dengan asumsi saya memahami tantangan dengan benar ...

Penjelasan

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)
Fatalisasi
sumber
4

Perl 6 , 59 byte

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

Cobalah
Cobalah tanpa hasil yang mungkin

Diperluas:

$_ = 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)
Brad Gilbert b2gills
sumber
4

JavaScript ES6, 58 70 68 64 byte

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

Mengembalikan sepasang angka dalam bentuk array jika ditemukan, jika tidak undefined, mengembalikan nilai falsy.

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));

Tom
sumber
Contohnya adalah 3, 5ini tapi output 1, 7...
Neil
@Neil, maaf, saya telah mengubah aturan karena saya mengacaukannya. 1,7 ok
philcolbourn
1
Tidak akan berhasil f([2,2] 4)?
cliffroot
1
@cliffroot harusnya berfungsi untuk kasus itu sekarang
Tom
1
includesTrik yang bagus .
Neil
4

JavaScript (ES6), 61 57 56 byte

Mengambil array bilangan bulat a dan jumlah yang diharapkan sdalam sintaks currying (a)(s). Mengembalikan sepasang bilangan bulat yang cocok sebagai array, atau undefinedjika tidak ada pasangan seperti itu.

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

Diformat dan dikomentari

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

Uji

Arnauld
sumber
3

Jelly , 14 byte

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

Cobalah online!

Ini adalah fungsi (bukan program lengkap) yang output ke output standar. (TIO link memiliki pembungkus yang menjalankan suatu fungsi dan mengabaikan nilai kembali.)

Program ini bisa lebih pendek 4 byte jika bukan karena persyaratan kode keluar; mengembalikan kode keluar 1 di Jelly cukup sulit. (Mungkin ada cara terser untuk melakukan ini yang saya lewatkan.)

Penjelasan

Œ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

Kami dapat membagi dua setiap bilangan bulat dalam pasangan dengan baik, sehingga o⁶Htidak akan melakukan apa pun jika kami menemukan hasilnya, selain mengembalikan nilai pengembalian tidak berguna yang tidak relevan pula (metode melayani sebagai byte tunggal yang mudah digunakan untuk menentukan fungsi pengembalian nilai awal, di bawah aturan PPCG). Namun, jika kami tidak menemukan hasil, kami akhirnya mencoba untuk membagi dua karakter antariksa, operasi yang sangat tidak berarti sehingga menyebabkan penerjemah Jelly mogok. Untungnya, kerusakan ini menghasilkan kode keluar 1.


sumber
3

Perl 5 , 51 byte

46 byte kode + untuk 5 byte untuk -pliflag.

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

Cobalah online!

Idenya adalah untuk beralih pada daftar input: pada angka x( $_), jika kita sebelumnya melihat n-x( $^I-$_) maka kita menemukan apa yang kita cari, dan mengatur $\ke dua nilai ini ( "$_ $v"). Pada akhirnya, jika $\tidak disetel, maka kami exit 1, jika tidak maka akan dicetak secara implisit.

Dada
sumber
Apakah tab literal menggantikan dua karakter ^I?
@ ais523 Sepertinya saya tidak bisa. Mungkin itu mungkin pada versi Perl yang lebih lama.
Dada
3

Röda , 60 56 byte

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

Cobalah online!

Kode ini menimbulkan kesalahan jika tidak ada jawaban. Ini menghasilkan semua pasangan yang mungkin yang dapat membentuk jumlah s, yaitu. 1, s-1, 2, s-2, 3, s-3, ... Kemudian memeriksa jika kedua angka dalam array adan jika demikian, mendorong mereka ke sungai. pullmembaca satu nilai dari aliran dan mengembalikannya. Jika tidak ada nilai di aliran, itu melempar kesalahan. a-xmengembalikan array adengan xdihapus.

fergusq
sumber
3

Python 2, 60 byte

Ini singkat, sampai aturan dengan keluar dengan kode 1 diklarifikasi. Sekarang keluar dengan kesalahan jika tidak ada yang ditemukan.

-5 byte terima kasih kepada @Peilonrayz

-4 byte terima kasih kepada @Rod

Cobalah online

a,s=input()
while a:
 x=a.pop()
 if s-x in a:r=s-x,x
print r
Possum Mati
sumber
@Peilonrayz Tidak menyadarinya, terima kasih!
Dead Possum
@Peilonrayz Ini akan melanggar aturan fith: dua bilangan bulat pada posisi berbeda dalam daftar harus dikembalikan. (yaitu Anda tidak dapat mengembalikan nomor yang sama dari posisi yang sama dua kali)
Dead Possum
3
Anda dapat menggunakan spasi + tab untuk indentasi campuran untuk mengurangi 2 byte atau beralih keinput() untuk mengurangi 4 byte
Rod
@Rod, terima kasih! Input tampaknya lebih baik
Dead Possum
2
@Eric Duminil Ya. Ini setara dengan eval(raw_input())(saya pikir).
Yytsi
2

C ++ 133 byte (dikompilasi dengan dentang 4 dan 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 byte

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);}
em2er
sumber
1
Selamat datang di situs ini! Sayangnya, saya pikir Anda perlu menambahkan 15 byte #include <set>dan beberapa lagi std::set. Meskipun Anda juga dapat menyimpan beberapa byte jika Anda menghapus kawat gigi di sekitarp.insert(v-i);
James
@DJMcMayhem oh, terima kasih. Jadi haruskah saya memasukkan main ()?
em2er
@ em2er Tidak, Anda tidak perlu memasukkan main. Kami menganggap (kecuali dinyatakan sebaliknya dalam tantangan) bahwa suatu fungsi adalah pengiriman yang valid. (selamat datang di situs btw!)
Dada
Tidak, pengiriman fungsi baik-baik saja. (Dan jauh lebih pendek karena Anda dapat mengambil input sebagai argumen) Anda hanya perlu menghitung apa saja yang dibutuhkan oleh kiriman Anda.
James
1
@DJMcMayhem @Dada terima kasih banyak! saya tidak yakin dengan endterlalu, tetapi kompilasi pada gcc tanpa std::(dan set jika tidak tentu saja)
em2er
2

Haskell , 34 byte

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

Cobalah online!

Untuk setiap elemen daftar, fungsi ini memeriksa apakah (elemen-penjumlahan) ada di bagian berikut dari daftar. Mengembalikan pasangan pertama yang ditemukannya. Jika fungsi mencapai akhir daftar itu melempar kesalahan "pola non-lengkap" dan keluar dengan kode 1.

Leo
sumber
Saya khawatir pendekatan ini tidak berfungsi untuk input seperti [2,2]#4.
Laikoni
@Laikoni Terima kasih, saya belum membaca tantangan dengan cukup baik. Versi baru ini harus benar (dan lebih pendek ^^)
Leo
2

PowerShell, 109 97 byte

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

Mengambil kesepakatan 12 byte yang ditawarkan AdmBorkBork

Penjelasan

# 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

Aturan saat ini mencari kode keluar yang berfungsi. Mereka dapat dihapus dan hanya memeriksa nomor yang dikembalikan dan palsu.

Contoh Penggunaan

Jika kode di atas disimpan sebagai fungsi s

s 8 @(1,2,3,4)
s 8 @(1,7,4,6,5,3,8,2) 
Mat
sumber
Anda dapat menyimpan beberapa byte lagi dengan menghilangkan $cdan memutar ke bawah -($a.count-1)..1|%{$f=$_;--$_..0|%{if...
AdmBorkBork
2

R, 49 byte

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

Ini menemukan semua 2-kombinasi xdan mengembalikan matriks. Kemudian, jumlahkan dengan kolom dan temukan semua jumlah yang sama dengan y(jadi tanpa [,1]bagian pada akhirnya akan mencetak semua kombinasi yang jumlahnya sama dengan y)

David Arenburg
sumber
2

Japt , 9 byte

Menyimpan banyak byte berkat produk @ETH

à2 æ_x ¥V

Cobalah online!

Penjelasan

à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   

Contoh

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

Javascript, 114 96 86 84 byte

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

Disimpan 1 byte berkat @Cyoce dan 8 byte lainnya berkat @ETHProductions

Ini mengembalikan tupel dengan kombinasi elemen daftar pertama yang meringkaskan input yang diberikan, atau tidak sama sekali tanpa kecocokan. Saya telah menghapus vars dalam fungsi; REPL.itu macet tanpa mereka, tetapi Chrome Dev Console menangani ini dengan baik ...

Cobalah online!

steenbergh
sumber
Tidak keluar dari kode 1, karena tantangan secara khusus meminta input yang tidak valid. Ini jawaban yang tidak valid untuk saat ini, tetapi saya telah meminta OP tentang persyaratan ini untuk bahasa yang tidak dapat melakukannya dengan mudah.
Rɪᴋᴇʀ
@Matt Yes, that rule is observed: y=x+1 takes care of that.
steenbergh
1
You can use a=>b=>... to save a byte
Cyoce
1
You can save another three bytes with for(y=x;++y<b.length;){. Also, you can remove all sets of braces except the outermost one, and you can remove the space after return
ETHproductions
1

Clojure, 77 bytes

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

Returns the first such pair or nil.

NikoNyrh
sumber
1

Haskell, 62 bytes

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

I still don't know what's allowed by the challenge and what not. I'm going for a function that prints a pair of numbers and returns 0 if there's a solution and prints nothing and returns 1 if there's no solution. As printing is I/O, I have to lift the return values into the IO-Monad (via return) and the actual type of the function is Num a => IO a.

Usage example (with return value printed by the repl):

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

Try it online!.

If raising exceptions is allowed, fail will save some bytes (total 51):

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

Jelly, 9 bytes

ŒcS=¥ÐfḢZ

Jelly has no way of setting the exit code to arbitrary values, so this produces a TypeError for input without a valid solution that will cause the parent interpreter to exit with exit code 1.

Try it online!

How it works

Œ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.
Dennis
sumber
1

Nova, 101 bytes

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

One nice thing about code golf is that it helps me find bugs in my language. e.g. the space required between return and [y,x-y].

Once I add push/pop functions to Array.nova and fix return, would be 96 bytes:

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

Usage:

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
    }
}

Edit: Also, there's this way at 73 bytes (69 using pop), too:

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

firstOrThrow will throw an Exception, which will be uncaught and therefore ultimately exiting the program with exit code 1. ;)

This way seems more readable too.

Braden Steffaniak
sumber
0

Pyth, 12 bytes

hfqsThQ.ceQ2

Explanation

       .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)

sumber
0

PHP, 88 bytes

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

takes input from command line arguments, sum first. Run with -nr.

Fortunately, die/ exit exits with 0 when you give it a string as parameter.

I tried to merge the loops to one; but it requires a longer initialization and test this time.

Titus
sumber
Bad day? for($i=1;$a=$argv[$k=++$i];)for(;$b=$argv[++$k];)$a+$b!=$argv[1]?:die(!0); and you should have a look on this codegolf.stackexchange.com/questions/120803/…
Jörg Hülsermann
0

Mathematica, 76 bytes

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

Fairly straightforward: #~Subsets~{2} gets all 2-element subsets of the list, then Cases[...,x_/;Tr@x==#2] picks only the ones whose sum is the number we want. If there are none of these, If[l=={}, Message@f::e,First@l] prints the error message f::e : 1 that we defined earlier (since I have no idea what else "exit status 1" might mean for Mathematica); otherwise, it returns the first entry in the list of pairs that sum to the correct thing.

If we're allowed to return a falsey value instead of doing that weird exit status thing, the following code has 58 bytes:

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

Scala, 55 41 bytes

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

Returns a list of the two numbers if they exist and throws an error otherwise. Uncaught, this error will result in an exit status of 1.

Brian McCutchon
sumber
0

Ruby, 53 48 bytes

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

Input: a is the list, s is the expected sum.

If the 2 numbers are found, print them and return 0, otherwise return 1, as in the specification.

G B
sumber
0

TI-Basic, 59 bytes

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

Explanation:

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

If the program did not exit gracefully, it will cause an error when there are not enough elements in the list for it to continue.

pizzapants184
sumber
0

CJam, 23 bytes

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

Input is sum numbers. For example: 6 [3 2 3]. Leaves a positive number for truthy and an empty string or 0 for falsey.

Explanation:

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
Esolanging Fruit
sumber