C (gcc), 82 byte
n;f(x,y,a,b)int*x,*y;{for(n=0;a;)--b&&*x*2-*y>y[1]?++y:(++b,--a,n+=abs(*x++-*y));}
Ini membutuhkan input sebagai dua array integer dan panjangnya (karena C tidak memiliki cara untuk mendapatkan panjangnya). Ini dapat ditunjukkan untuk dijalankan O(a+b)
karena salah satu a
atau b
dikurangi pada setiap iterasi dari loop, yang berakhir ketika a
mencapai 0
(dan b
tidak dapat dikurangi di bawah 0
).
Cobalah online!
n; // define sum as an integer
f(x,y,a,b) // function taking two arrays and two lengths
int*x,*y; // use k&r style definitions to shorten function declaration
{
for(n=0; // initialize sum to 0
a;) // keep looping until x (the first array) runs out
// we'll decrement a/b every time we increment x/y respectively
--b&& // if y has ≥1 elements left (b>1, but decrements in-place)...
*x*2-*y>y[1]? // ... and x - y > [next y] - x, but rearranged for brevity...
++y: // increment y (we already decremented b earlier);
(++b, // otherwise, undo the in-place decrement of b from before...
--a,n+=abs(*x++-*y)) // decrement a instead, add |x-y| to n, and then increment x
;}
Beberapa catatan:
Alih-alih mengindeks ke dalam array, menambah pointer dan dereferencing secara langsung menghemat byte yang cukup untuk itu layak ( *x
vs x[a]
dan y[1]
vs y[b+1]
).
The --b&&
Kondisi memeriksa b>1
secara tidak langsung - jika b
ini 1
, akan mengevaluasi ke nol. Karena ini memodifikasi b
, kita tidak perlu mengubahnya di cabang pertama dari terner (yang maju y
), tetapi kita perlu mengubahnya kembali di cabang kedua (yang maju x
).
Tidak return
diperlukan pernyataan, karena ilmu hitam. (Saya pikir itu karena pernyataan terakhir yang akan dievaluasi akan selalu berupa n+=...
ekspresi, yang menggunakan register yang sama dengan yang digunakan untuk nilai pengembalian.)