सी (जीसीसी), 82 बाइट्स
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));}
यह दो पूर्णांक सरणियों और उनकी लंबाई के रूप में इनपुट लेता है (चूंकि सी के पास उनकी लंबाई अन्यथा प्राप्त करने का कोई तरीका नहीं है)। इसे चलाने के लिए दिखाया जा सकता है O(a+b)
क्योंकि लूप के प्रत्येक पुनरावृत्ति पर a
या तो b
घटाया जाता है, जो तब a
पहुंचता है जब पहुंचता है 0
(और b
नीचे नहीं घटाया जा सकता है 0
)।
इसे ऑनलाइन आज़माएं!
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
;}
कुछ नोट:
सरणियों में अनुक्रमित करने के बजाय, संकेत को बढ़ाते हुए और dereferencing सीधे इसके लिए पर्याप्त बाइट्स बचाता है इसके लायक ( *x
बनाम x[a]
और y[1]
बनाम y[b+1]
)।
--b&&
के लिए शर्त चेकों b>1
एक राउंडअबाउट रास्ते में - अगर b
है 1
, तो यह शून्य करने के लिए मूल्यांकन करेंगे। चूंकि यह संशोधित होता है b
, इसलिए हमें इसे टर्नरी की पहली शाखा (जिसे अग्रिम y
) में बदलने की आवश्यकता नहीं है, लेकिन हमें इसे दूसरी (जो अग्रिम x
) में बदलने की आवश्यकता है ।
किसी return
कथन की आवश्यकता नहीं है, क्योंकि काला जादू। (मुझे लगता है कि यह इसलिए है क्योंकि मूल्यांकन किए जाने वाले अंतिम कथन में हमेशा n+=...
अभिव्यक्ति होगी, जो उसी रजिस्टर का उपयोग करता है जो रिटर्न मानों के लिए उपयोग किया जाता है।)