बिना ब्रांचिंग के अधिकतम 3 नंबर ज्ञात करें


17

इस बार आपके लक्ष्य के चारों ओर 3 पूर्णांक (- (2 ^ 31) से 2 ^ 31 - 1 बाइनरी 2 के पूरक में) को बिना ब्रांच या लूप के उपयोग के लिए ढूंढना है।

आपको केवल उपयोग करने की अनुमति है

  • असमानता / समानता ( ==, >, >=, <, <=, !=) के रूप में ये गिनती 2 टोकन।

  • अंकगणित ( +, -, *, /)

  • लॉजिकल ऑपरेटर्स ( !नहीं, &&और, || या)

  • बिटवाइज़ ऑपरेटर्स ( ~नहीं, &और, |या, ^XOR, <<, >>, >>>गणित और तार्किक छोड़ दिया और सही बदलाव)

  • स्थिरांक। 0 टोकन

  • परिवर्तनशील कार्य। 0 टोकन

इनपुट 3 वैरिएबल के रूप में a, bऔर c। अधिकतम संख्या आउटपुट करें।

मानक परमाणु कोड-गोल्फ नियम लागू होते हैं। यदि आपके कोई प्रश्न हैं, तो कृपया उन्हें टिप्पणियों में छोड़ दें। एक टोकन विशेष नियमों के साथ उपरोक्त में से कोई भी है।


एक अतिरिक्त कार्य को परिभाषित करने के बारे में क्या? यदि यह अनुमति है, तो कितने टोकनों की गिनती होती है?
afuous

@voidpigeon आपको केवल एक फ़ंक्शन की अनुमति है, वह जो 3 इनपुट और आउटपुट लेता है।
qwr

1
पहली नज़र में, मैंने सोचा, " हम पहले भी ऐसा कर चुके हैं। " , लेकिन मुझे लगता है कि तुलना करने वालों की लागत में 2 बदलाव खेल को काफी बदल देते हैं।
प्रिमो

@primo मैंने विशेष रूप से 3 इनपुट के लिए कहा क्योंकि यह वास्तव में कुछ दिलचस्प सुधारों की अनुमति देता है
qwr

2
क्या हम इनबिल्ट फ़ंक्शंस का उपयोग कर सकते हैं?
पंजीकृत उपयोगकर्ता

जवाबों:


7

जावास्क्रिप्ट 10 टोकन

बिट फ़िडलिंग के बजाय <और * का उपयोग करके संपादित करें - जैसा कि टिप्पणियों में बताया गया है, बिट्स ऑपरेशन सीमा (30 लाख से अधिक) के पास इनपुट के लिए विफल हो सकते हैं

function Max(x,y,z)
{
  var d=y-x;
  x=y-d*(d<0);
  d=x-z;
  return x-d*(d<0);
}

C 8 टोकन

भाषा अज्ञेय वास्तव में, भाषा की तरह कोई भी सी करेगा। पिकी होने के लिए, मानक सी में यह पोर्टेबल नहीं है क्योंकि सही शिफ्ट संकेत का विस्तार नहीं कर सकती है (लेकिन सामान्य कार्यान्वयन में ऐसा होता है)।

C (और C ++, C #, और जावा मुझे लगता है) में हम बड़े अस्थायी मूल्यों का उपयोग करके आसानी से अतिप्रवाह की समस्याओं को संभाल सकते हैं:

int Max(int x, int y, int z)
{
    long long X = x;
    long long Y = y;
    long long Z = z;
    long long D = Y-X;
    X=Y-((D>>63)&D);
    D=X-Z;
    return (int) (X-((D>>63)&D));
}

1
मैं picky जा रहा हूं, लेकिन C का उपयोग करके intआपका कोड x = 2147483647, y = -2, z = 0 के लिए काम नहीं करता है। आपकी पसंद अगर आप इसे बदलना चाहते हैं
qwr

10

जावास्क्रिप्ट

6 टोकन

function maxOf3(a, b, c) {
    (b>a) && (a=b);
    (c>a) && (a=c);
    return a;
}

6
+1 मैं शॉर्टकट मूल्यांकन को ब्रांचिंग के एक प्रकार के रूप में देखता हूं, लेकिन यह नियमों में निषिद्ध नहीं है
edc65

11
मैं इसे ब्रांचिंग, हाहा
जस्टफुल

2
@ edc65 यह है। अनुमति देना &&और ||इसकी निगरानी करना संभव था, जिसे शोषित की बजाय इंगित किया जाना चाहिए।
प्रिमो

@primo यह एक दिलचस्प मुद्दा था। मेरा मानना ​​है कि कुछ CISC आर्किटेक्चर के पास निर्देश हैं जिनमें सशर्त बयान शामिल हैं, इसलिए मुझे यकीन नहीं है कि उन लोगों को कैसे गिना जाएगा।
qwr

2
मुझे लगता है कि यह 4 टोकन यानी 2 होना चाहिए &&, <और >=एक काम और के रूप में 0 मायने रखता है के रूप में प्रयोग किया जाता है
क्लाइड लोबो

6

सी: 10 टोकन

int max(int a, int b, int c)
{
    a += (b > a) * (b - a);
    a += (c > a) * (c - a);
    return a;
}

@ ओपनोरक्लोज़ के उत्तर से प्रेरित, लेकिन सी में परिवर्तित हो गया और शॉर्ट सर्किट बूलियन ऑपरेटरों के बजाय गुणा का उपयोग करके शाखाहीन बना दिया।



2

कई भाषाएं (पायथन) (10 टोकन)

def max3(x,y,z):
    m = x ^ ((x ^ y) & -(x < y))
    return m ^ ((m ^ z) & -(m < z))

print max3(-1,-2,-3) # -1
print max3(-1,2,10) # 10

https://graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax

ओह, किसी ने पहले से ही इसे पोस्ट किया :)


आपको नए कार्य बनाने की अनुमति नहीं है
qwr

अच्छा ठीक है! टिप्पणियों को नहीं पढ़ा :)
मर्डोक्स

@qwr मुझे यह नहीं मिला, आपने कहा: You are only allowed to have one function, the one that takes the 3 inputs and outputs.यह वास्तव में यही उत्तर है। 2 प्रिंट सिर्फ टेस्ट केस हैं
क्रंचर

1
@ क्रंचर मैं max2(max2(x,y),z)शुरू में किए गए उत्तर का संपादन किया :)
मर्डोक्स

@ मर्दोक्सक्स आह। वेल +1
क्रंचर

1

सी ++ 11: 15 टोकन

केवल अंकगणित और बिटवाइज़ ऑपरेटरों का उपयोग करना (चूंकि समानता और बूलियन तर्क ऑपरेटर इसे बहुत आसान बनाते हैं) ...

#include <iostream>

auto max(int32_t a, int32_t b, int32_t c)->int32_t {
  return c - ((c - (a - ((a - b) & (a - b) >> 31))) & (c - (a - ((a - b) & (a - b) >> 31))) >> 31);
}

auto main()->int {
  // test harness
  std::cout << max(9, 38, 7) << std::endl;
  return EXIT_SUCCESS;
}

बड़ी संख्या के लिए विफल (> 2 ^ 30), टिप्पणी देखें codegolf.stackexchange.com/questions/32476/#comment68870_32477
edc65

मुझे ठीक लगता है: ideone.com/pEsvG3
दंगा

क्या आपने कमेंट पढ़े? मुझे लगता है कि 2 बिलियन 0 से अधिक है [ ideone.com/vlcnq9 ]
edc65

ओह समझा; हाँ, यह आपकी अन्य टिप्पणी में उन नंबरों के साथ एक समस्या है, जब एक 0 शामिल है। लेकिन 2 ^ 30 के लिए नहीं जैसा कि आपने कहा। ideone.com/LicmXa
Riot

यह 0 शामिल नहीं है। समस्या बड़ी संख्या और अतिप्रवाह हैं, अधिकतम प्रयास करें (2000000000, -200000000, 1111111111)।
edc65

0

जे (प्रतिस्पर्धा नहीं)

मैं बस सोच रहा था कि जम्मू में एक समाधान क्या दिखेगा। यह एक ,और एक का उपयोग करता है #, इसलिए यह प्रतिस्पर्धा नहीं होगी।

((a<b),(b<c),(c<a))#b,c,a

यह प्रतिस्पर्धा करेगा, लेकिन 9 टोकन के साथ बहुत लंबा है:

(b*a<:b)+(c*b<c)+(a*c<a)

0

हमारी निम्नलिखित धारणाएँ हैं:

  • max (a; b) = (a + b + | ab |) / 2

  • अधिकतम (एक; ख ग) = अधिकतम (अधिकतम (एक; ख); ग)

  • abs (a) = (a + (a >> 31)) ^ (a >> 31)

हम छद्म कोड का उपयोग कर सकते हैं:

फ़ंक्शन अधिकतम (ए, बी, सी)

{

out1 = ((a + b) + ((((ab) + ((ab) >> 31)) ^ ((ab) >> 31)) div 2

out2 = ((out1 + c) + (((out1-c) + ((out1-c) >> 31)) ^ ((out1-c) >> 31)) div 2

वापसी २

}


कृपया वास्तविक कोड लिखें, और अपने उत्तर में टोकन की गिनती प्रदान करें।
प्रोग्रामफॉक्स

0

C # (दूसरा प्रयास)

मुझे मिल गया ... कोई एकीकृत कार्य नहीं ...

लेकिन क्या इसे अन्य एकीकृत डेटाटिप्स या सिर्फ सादे इंट का उपयोग करने की अनुमति है? यदि अनुमति दी जाए तो मैं प्रस्ताव करूंगा:

int foo2(int a, int b, int c)
{
   var x = new SortedList<int,int>();

   x[a] = 1;
   x[b] = 1;
   x[c] = 1;

   return x.Keys[2];
}

0

जावास्क्रिप्ट 8 टोकन

हालाँकि, @ openorclose के उत्तर के समान है, मैं वास्तव में असाइनमेंट के लिए तार्किक ऑपरेटरों का उपयोग करता हूं।

function max( a, b, c ) {
    x=( a > b && a) || b;
    return ( x > c && x ) || c;
}

बेला


0

आर (10 टोकन)

function max(a, b, c) {
  max <- a
  max <- max + (b - max) * (b > max)
  max <- max + (c - max) * (c > max)
  return(max)
}

0

ब्रेनफक (प्रतिस्पर्धा नहीं)

>,[-<+>>>+<<]>,[-<+>>>+<<]>[>[-<->>]<<]<[-]>[-]>[-]<<<[->>>>+<<<<]>>>>[-<+>>>+<<]>,[-<+>>>+<<]>[>[-<->>]<<]<<

0

टीआईएस -100, 8 ऑपरेशन

MOV ACC UP #A
SUB UP     #B
SUB 999
ADD 999
ADD UP     #B
SUB UP     #C
SUB 999
ADD 999
ADD UP     #C
MOV ACC DOWN

प्रदाता (यूपी) केवल MOV करते हैं, इसलिए कोड में नहीं दिखाया गया है शायद तब काम न करें जब 999 किनारे के पास भी हो


-1

VBA (6 टोकन)

 Function max3(a As Integer, b As Integer, c As Integer)
 i = IIf(a >= b And a >= c, a, IIf(b >= c, b, c))
 max3 = i
 End Function  

यकीन नहीं है कि यह शाखा नहीं है।


यह केवल शाखाओं में बंटी हुई है। विशेष रूप से, सर्वव्यापी टर्नरी ऑपरेटर (जो कि यह अनिवार्य रूप से है) अनुमत कार्यों में से एक नहीं है।
tomsmeding

धन्यवाद @tomsmeding, क्या मैं पूछ सकता हूँ कि सर्वव्यापी टर्नेरी ऑपरेटर क्या है (क्या यह IIF है (मेरे कोड में?)
एलेक्स

हाँ क्षमा करें, सर्वव्यापी के साथ मेरा मतलब था कि यह हर भाषा में बहुत अधिक मौजूद है, और टर्नरी ऑपरेटर आपका IIf, इनलाइन-इफ है। सबसे अधिक भाषाओं में, यह, उदाहरण के लिए, a>=b ? a : b। यह वास्तव में शाखा है।
tomsmeding

-1

जावास्क्रिप्ट: 4 टोकन (** "असाइनमेंट" की व्यापक व्याख्या पर आधारित है!)

जाहिर है मेरा 4 का स्कोर बेहद उदार / उदार है!

उस स्कोर पर पहुंचने के लिए मैंने "असाइनमेंट" (सवाल में 0 टोकन के लायक) शामिल किया है, इसमें एडिटिव असाइनमेंट, सबट्रेक्टिव असाइनमेंट, मल्टीपलेटिव असाइनमेंट और XOR-ing ( ^=) असाइनमेंट जैसी चीजें शामिल हैं।

function f(a, b, c) {
  d = a;
  d -= b;
  d = d >= 0;

  a *= d;  //a = a if (a>=b), else 0
  d ^= true; //invert d
  b *= d;  //b = b if (b<a), else 0

  a += b;  //a is now max(a,b)

  d = a;
  d -= c;
  d = d >= 0;

  a *= d;  //a = a if (a>=c), else 0
  d ^= true; //invert d
  c *= d;  //c = c if (c<a), else 0
  a += c;  //a is now max(max(a,b),c)

  return a;
}

अगर उन कार्य वास्तव में स्कोर की गिनती 14 है :)


क्योंकि d -= bवास्तव में ऐसा ही है d = d - b, मैं कहूंगा कि आप अंकगणित का उपयोग करें और आपको इसे टोकन के रूप में गिनना चाहिए।
प्रोग्राम फॉक्स

हां, मुझे एहसास है कि - मैं (मजाक में) "असाइनमेंट" के अर्थ का लाभ उठाने की कोशिश कर रहा था। मुझे लगता है कि मैंने इसे काफी स्पष्ट किया है!
16
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.