एक्स और वाई के बीच कम से कम 2 अंतर के साथ एक्स 3 से अधिक है


11

मैं कुछ सी ++ नीचे गोल्फ की कोशिश कर रहा हूं। क्या इस स्थिति को कम करना संभव है?

X > 3 & X - Y > 1

(व्हाट्सएप को हटाने के अलावा, निश्चित रूप से।)

तो, Xकम से कम है 4लेकिन X >= Y + 2

Xऔर Y[0,5] अंतराल में पूर्णांक हैं।

मैंने कुछ बिटवाइज़ फॉर्मूला खोजने की कोशिश की है लेकिन असफल रहा।


1
@JoeZ। CodeGolf के लिए? क्यों? जब तक यह काम कर रहा है ...
क्रिस्टी

4
@Cristy हाँ वे हैं, लेकिन (अभी तक) गोल्फ सलाह के बारे में सवाल बहुत दुर्लभ हैं, जबकि सलाह के लिए पूछ रहे अधिकांश प्रश्न वास्तव में सिर्फ सामान्य प्रोग्रामिंग प्रश्न हैं - जो ऑफ-टॉपिक हैं। इसलिए, मैं समझ सकता हूं कि लोगों की पहली प्रतिक्रिया क्यों हो सकती है, "ओह, यह एक और सवाल है जो वास्तव में एसओ पर है", बिना यह सोचे कि यह गोल्फ सलाह के बारे में भी हो सकता है। मैं वास्तव में भविष्य में इनमें से अधिक देखना चाहता हूं, और शायद किसी दिन उनके लिए एक टैग होगा और यह तुरंत स्पष्ट हो जाएगा कि आप इस साइट का उपयोग करना जानते हैं। ;)
मार्टिन एंडर

4
यदि वे 0..5 समावेशी के बीच पूर्णांक हैं, तो आप एक ही काम कर सकते हैं x*x-y*y>9। यह वर्णों की समान राशि है, लेकिन आप उस दृष्टिकोण का शॉर्टकट / विकल्प ढूंढ सकते हैं। बस इसे देखने का एक और तरीका है।
जियोबिट्स

5
अजगर का उपयोग करें:3<x>y+1
avall

2
मैंने पायथन के ऑपरेटर पूर्वता के साथ बहुत सारे समाधान पाए, उदाहरण के लिए y+3<2^x, लेकिन सी के ऑपरेटर पूर्वता अलग है। मैं शर्त लगा रहा हूं कि एक 7-चार समाधान है, बस मेरी स्क्रिप्ट को संशोधित करने के लिए सी ऑपरेटर पूर्ववर्तीता से निपटने के लिए है
क्लाउडी

जवाबों:


11

9 अक्षरों के नीचे प्रतीकों के हर उपयोगी संयोजन को मजबूर करने के बाद, मैंने पाया है कि इससे छोटा कोई समाधान नहीं है x>3&x-y>1

मस्ती के लिए यहां कुछ फनी 9 कैरेक्टर सॉल्यूशन मिला ब्रूट फॉरेसर:

-x<~y>4>x
~y+x>2>>y
x*x-y*y>9
~y>x/~3*x
-3>>y>y-x
~y+x<<y>2

पायथन में ब्रूट फोर्सिंग किया गया था, ऊपर-नीचे सिंटैक्स पेड़ों का निर्माण किया गया, जहां कोई भी बच्चा सी के नियमों के अनुसार अपने माता-पिता की तुलना में कम पूर्ववर्ती ऑपरेटर नहीं हो सकता है। संभावनाओं पर कटौती करने के लिए मैंने केवल एकल अंक शाब्दिक की अनुमति दी, और किसी भी बाइनरी ऑपरेटर के पास दो निरंतर बच्चे नहीं हो सकते हैं। मैं संभवतः किसी भी समाधान के बारे में नहीं सोच सकता था जिसमें दो अंकों का शाब्दिक होगा, या एक जो एक बाइनरी ऑपरेटर का उपयोग करके एक निरंतर बनाता है। तब प्रत्येक अभिव्यक्ति का मूल्यांकन [0, 5] के लिए किया गया था और यदि यह मेल खाता है तो यह प्रिंट हो जाता है।


मुझे वास्तव में पसंद है x*x-y*y>9। शायद आपको मल्टी-डिजिट कॉन्स्टेंट भी आज़माना चाहिए? (यह भी, कोष्ठक)
जॉन ड्वोरक

@JDDvorak मुझे भी। यह "x और y के बीच की दूरी" के तर्क को अच्छी तरह से व्यक्त करता है। मुझे लगता है कि यदि आप इसे एक चार्ट में प्लॉट करते हैं, तो यह अधिक स्पष्ट हो जाएगा।
सेह

@JanDvorak मुझे नहीं लगता कि कोष्ठक कभी भी एक छोटा समाधान हो सकता है। एक छोटा समाधान अधिकतम 8 वर्णों का हो सकता है xy, जिनमें से 2 को होना चाहिए , और 2 को कोष्ठक होना चाहिए, जिसमें तर्क के केवल 4 वर्ण हों। मैं 2 अंकों के स्थिरांक के साथ ब्रूट फॉरेसर चलाने की कोशिश करूँगा, लेकिन मुझे नहीं लगता कि यह कोई परिणाम देगा।
orlp

कैसे के बारे में, एक्स, वाई, एक स्थिर, कोष्ठक और दो ऑपरेटरों की एक जोड़ी?
जॉन ड्वोरक

@JanDvorak अपने आप को बाहर दस्तक, (a#b)$cप्रारूप है। में से abcदो में होना चाहिए xऔर y, के लिए 3 संभावित स्थानों छोड़ने [0-9xy], और का केवल एक फ्लिप xy। केवल दिलचस्प ऑपरेटर हैं +-*/&|^<>, इसलिए 9 संभावनाएं। इस प्रकार कुल संभावनाएँ 3 * 12 * 2 * 9 * 9 <5832 से कम हैं।
orlp

0

द्वारा (भयानक) गोल्फों की प्रतिक्रिया में orlp:

सुधार पहले आना चाहिए

  • इनमें से अधिकांश कुछ पूर्णांक प्रकारों के लिए टूट जाते हैं। इसमें ओपी से संस्करण शामिल है
  • दिलचस्प बात यह है कि वे क्या कर के लिए काम करते int16_tहैं - तो वहाँ धारणा है। संभवतः 32 बिट्स के लिए बिट शिफ्ट्स +16 की आवश्यकता होगी (जो इन दिनों हर जगह बहुत अधिक है)। यह उन्हें एक चरित्र बड़ा बनाता है ...

इसे लिखने का एकमात्र "सही" तरीका है, IMO (x>3) && (x > y+1), जिसे नीचे x>3&x>y+1(9 वर्णों) तक गढ़ा जा सकता है ।

(आपको वास्तव में (बड़े) अहस्ताक्षरित प्रकारों की संभावना को ध्यान में रखने की आवश्यकता है, खासकर जब से अहस्ताक्षरित-सी + + अभिव्यक्तियों में "संक्रामक" है। मुझे लगता है कि "फिक्सिंग" है कि उपयुक्त static_cast<>एस के साथ उद्देश्य को हराना होगा ...)

अपडेट करें

निम्नलिखित परीक्षणों के साथ मैं यह पता लगाने में सक्षम हुआ कि कौन से भाव वास्तव में मज़बूती से काम करते हैं:

Live On Coliru

#define REPORT(caption, expr) do {\
    do_report(caption, [](T x, T y) -> bool { return (expr); }, #expr); } while (false)

template <typename T> struct driver {
    static void run() {
        std::cout << "\n" << __PRETTY_FUNCTION__ << "\n";

        // the only two correct implementations:
        REPORT("MASTER"  , (x>3) && (x>y+1));
        REPORT("GOLF"    , x>3&x>y+1);
        REPORT("lookup"  , "000000000000000000000000111000111100"[x*6+y]-'0');

        // failing sometimes:
        REPORT("question", (x>3)&(x-y>1));
        REPORT("orlp0"   , x>3&x-y>1);
        REPORT("orlp2"   , ~y+x>2>>y);
        REPORT("orlp3"   , x*x-y*y>9);
        REPORT("orlp4"   , ~y>x/~3*x);
        REPORT("orlp5"   , -3>>y>y-x);
        REPORT("orlp6"   , ~y+x<<y>2);

        // failing always
        REPORT("orlp1"   , -x<~y>4>x);
    }
private:
    static void do_report(std::string const& caption, bool (*f)(T,T), char const* expression) {
        std::string r;
        for (T x = 0; x < 6; ++x) for (T y = 0; y < 6; ++y) r += f(x, y)?'1':'0';
        bool const correct = "000000000000000000000000111000111100" == r;
        std::cout << (correct?"OK\t":"ERR\t") << r << "\t" << caption << "\t" << expression << "\n";
    }
};

int main() {
    driver<int8_t>::run();
    driver<int16_t>::run();
    driver<int32_t>::run();
    driver<int64_t>::run();

    driver<uint8_t>::run();
    driver<uint16_t>::run();
    driver<uint32_t>::run();
    driver<uint64_t>::run();
}

कोलिरु पर आउटपुट, संदर्भ के लिए यहां:

static void driver<T>::run() [with T = signed char]
OK  000000000000000000000000111000111100    MASTER  (x>3) && (x>y+1)
OK  000000000000000000000000111000111100    GOLF    x>3&x>y+1
OK  000000000000000000000000111000111100    lookup  "000000000000000000000000111000111100"[x*6+y]-'0'
OK  000000000000000000000000111000111100    question    (x>3)&(x-y>1)
OK  000000000000000000000000111000111100    orlp0   x>3&x-y>1
OK  000000000000000000000000111000111100    orlp2   ~y+x>2>>y
OK  000000000000000000000000111000111100    orlp3   x*x-y*y>9
OK  000000000000000000000000111000111100    orlp4   ~y>x/~3*x
OK  000000000000000000000000111000111100    orlp5   -3>>y>y-x
OK  000000000000000000000000111000111100    orlp6   ~y+x<<y>2
ERR 000000000000000000000000000000000000    orlp1   -x<~y>4>x

static void driver<T>::run() [with T = short int]
OK  000000000000000000000000111000111100    MASTER  (x>3) && (x>y+1)
OK  000000000000000000000000111000111100    GOLF    x>3&x>y+1
OK  000000000000000000000000111000111100    lookup  "000000000000000000000000111000111100"[x*6+y]-'0'
OK  000000000000000000000000111000111100    question    (x>3)&(x-y>1)
OK  000000000000000000000000111000111100    orlp0   x>3&x-y>1
OK  000000000000000000000000111000111100    orlp2   ~y+x>2>>y
OK  000000000000000000000000111000111100    orlp3   x*x-y*y>9
OK  000000000000000000000000111000111100    orlp4   ~y>x/~3*x
OK  000000000000000000000000111000111100    orlp5   -3>>y>y-x
OK  000000000000000000000000111000111100    orlp6   ~y+x<<y>2
ERR 000000000000000000000000000000000000    orlp1   -x<~y>4>x

static void driver<T>::run() [with T = int]
OK  000000000000000000000000111000111100    MASTER  (x>3) && (x>y+1)
OK  000000000000000000000000111000111100    GOLF    x>3&x>y+1
OK  000000000000000000000000111000111100    lookup  "000000000000000000000000111000111100"[x*6+y]-'0'
OK  000000000000000000000000111000111100    question    (x>3)&(x-y>1)
OK  000000000000000000000000111000111100    orlp0   x>3&x-y>1
OK  000000000000000000000000111000111100    orlp2   ~y+x>2>>y
OK  000000000000000000000000111000111100    orlp3   x*x-y*y>9
OK  000000000000000000000000111000111100    orlp4   ~y>x/~3*x
OK  000000000000000000000000111000111100    orlp5   -3>>y>y-x
OK  000000000000000000000000111000111100    orlp6   ~y+x<<y>2
ERR 000000000000000000000000000000000000    orlp1   -x<~y>4>x

static void driver<T>::run() [with T = long int]
OK  000000000000000000000000111000111100    MASTER  (x>3) && (x>y+1)
OK  000000000000000000000000111000111100    GOLF    x>3&x>y+1
OK  000000000000000000000000111000111100    lookup  "000000000000000000000000111000111100"[x*6+y]-'0'
OK  000000000000000000000000111000111100    question    (x>3)&(x-y>1)
OK  000000000000000000000000111000111100    orlp0   x>3&x-y>1
OK  000000000000000000000000111000111100    orlp2   ~y+x>2>>y
OK  000000000000000000000000111000111100    orlp3   x*x-y*y>9
OK  000000000000000000000000111000111100    orlp4   ~y>x/~3*x
OK  000000000000000000000000111000111100    orlp5   -3>>y>y-x
OK  000000000000000000000000111000111100    orlp6   ~y+x<<y>2
ERR 000000000000000000000000000000000000    orlp1   -x<~y>4>x

static void driver<T>::run() [with T = unsigned char]
OK  000000000000000000000000111000111100    MASTER  (x>3) && (x>y+1)
OK  000000000000000000000000111000111100    GOLF    x>3&x>y+1
OK  000000000000000000000000111000111100    lookup  "000000000000000000000000111000111100"[x*6+y]-'0'
OK  000000000000000000000000111000111100    question    (x>3)&(x-y>1)
OK  000000000000000000000000111000111100    orlp0   x>3&x-y>1
OK  000000000000000000000000111000111100    orlp2   ~y+x>2>>y
OK  000000000000000000000000111000111100    orlp3   x*x-y*y>9
OK  000000000000000000000000111000111100    orlp4   ~y>x/~3*x
OK  000000000000000000000000111000111100    orlp5   -3>>y>y-x
OK  000000000000000000000000111000111100    orlp6   ~y+x<<y>2
ERR 000000000000000000000000000000000000    orlp1   -x<~y>4>x

static void driver<T>::run() [with T = short unsigned int]
OK  000000000000000000000000111000111100    MASTER  (x>3) && (x>y+1)
OK  000000000000000000000000111000111100    GOLF    x>3&x>y+1
OK  000000000000000000000000111000111100    lookup  "000000000000000000000000111000111100"[x*6+y]-'0'
OK  000000000000000000000000111000111100    question    (x>3)&(x-y>1)
OK  000000000000000000000000111000111100    orlp0   x>3&x-y>1
OK  000000000000000000000000111000111100    orlp2   ~y+x>2>>y
OK  000000000000000000000000111000111100    orlp3   x*x-y*y>9
OK  000000000000000000000000111000111100    orlp4   ~y>x/~3*x
OK  000000000000000000000000111000111100    orlp5   -3>>y>y-x
OK  000000000000000000000000111000111100    orlp6   ~y+x<<y>2
ERR 000000000000000000000000000000000000    orlp1   -x<~y>4>x

static void driver<T>::run() [with T = unsigned int]
OK  000000000000000000000000111000111100    MASTER  (x>3) && (x>y+1)
OK  000000000000000000000000111000111100    GOLF    x>3&x>y+1
OK  000000000000000000000000111000111100    lookup  "000000000000000000000000111000111100"[x*6+y]-'0'
ERR 000000000000000000000000111001111100    question    (x>3)&(x-y>1)
ERR 000000000000000000000000111001111100    orlp0   x>3&x-y>1
ERR 111111011111001111000111111011111101    orlp2   ~y+x>2>>y
ERR 011111001111000111000011111001111100    orlp3   x*x-y*y>9
ERR 111111111111111111111111111111111111    orlp4   ~y>x/~3*x
ERR 111111011111001111000111111011111101    orlp5   -3>>y>y-x
ERR 111111011111001111000111111011111101    orlp6   ~y+x<<y>2
ERR 000000000000000000000000000000000000    orlp1   -x<~y>4>x

static void driver<T>::run() [with T = long unsigned int]
OK  000000000000000000000000111000111100    MASTER  (x>3) && (x>y+1)
OK  000000000000000000000000111000111100    GOLF    x>3&x>y+1
OK  000000000000000000000000111000111100    lookup  "000000000000000000000000111000111100"[x*6+y]-'0'
ERR 000000000000000000000000111001111100    question    (x>3)&(x-y>1)
ERR 000000000000000000000000111001111100    orlp0   x>3&x-y>1
ERR 111111011111001111000111111011111101    orlp2   ~y+x>2>>y
ERR 011111001111000111000011111001111100    orlp3   x*x-y*y>9
ERR 111111111111111111111111111111111111    orlp4   ~y>x/~3*x
ERR 111111011111001111000111111011111101    orlp5   -3>>y>y-x
ERR 111111011111001111000111111011111101    orlp6   ~y+x<<y>2
ERR 000000000000000000000000000000000000    orlp1   -x<~y>4>x

सारांश

चूंकि स्रोत कोड तत्वों को दोहराने की "लागत" के बारे में, आप एक लुकअप तालिका का उपयोग कर सकते हैं। आप लुकअप तालिका को "छिपा" सकते हैं, इसलिए यह या तो है

 LUT[x][y]

या

 LUT[x*6+y]

बेशक आप पांडित्यपूर्ण हो सकते हैं और LUT का नाम बदल सकते हैं

 L[x][y]

तो मेरा "संस्करण" है ... 7 वर्ण । (या यदि कोई फ़ंक्शन है और L(x,y)इससे भी छोटा है)।

या, अधिक महत्वपूर्ण बात: सही, परीक्षण योग्य और बनाए रखने योग्य।


एक "सच" गोल्फ जोड़ा। 9 अक्षरों से छोटा नहीं है, लेकिन पहला सही है!
सेह
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.