X ที่มากกว่า 3 มีความแตกต่างอย่างน้อย 2 อย่างระหว่าง X และ Y


11

ฉันกำลังพยายามตีกอล์ฟ C ++ บางตัว เป็นไปได้ไหมที่ทำให้สภาพนี้สั้นลง?

X > 3 & X - Y > 1

(นอกเหนือจากการลบช่องว่างออกแน่นอน)

ดังนั้นXอย่างน้อยแต่4X >= Y + 2

XและYเป็นจำนวนเต็มในช่วง [0,5]

ฉันพยายามค้นหาสูตร bitwise แต่ล้มเหลว


1
@JoeZ สำหรับ CodeGolf? ทำไม? ตราบใดที่มันคือการทำงาน ...
Cristy

4
@ Cristy ใช่พวกเขา แต่ (จนถึงตอนนี้) คำถามที่ถามเกี่ยวกับคำแนะนำเกี่ยวกับการเล่นกอล์ฟนั้นหายากมากในขณะที่คำถามส่วนใหญ่ที่ขอคำแนะนำนั้นเป็นคำถามทั่วไปสำหรับการเขียนโปรแกรมเท่านั้น ดังนั้นฉันสามารถเข้าใจว่าทำไมปฏิกิริยาแรกของผู้คนอาจจะเป็น "โอ้เป็นคำถามที่เป็นจริงดังนั้น" โดยไม่คิดว่ามันอาจเป็นคำแนะนำเกี่ยวกับการเล่นกอล์ฟ ฉันต้องการเห็นสิ่งเหล่านี้เพิ่มเติมในอนาคตและอาจจะมีแท็กสำหรับพวกเขาสักวันหรือมากกว่านั้นและจะมีความชัดเจนทันทีที่คุณรู้วิธีใช้ไซต์นี้ ;)
Martin Ender

4
หากพวกเขาเป็นจำนวนเต็มระหว่าง 0..5 x*x-y*y>9รวมคุณสามารถทำสิ่งเดียวกันกับ มันมีจำนวนอักขระเท่ากัน แต่คุณอาจพบทางลัด / ทางเลือกอื่นสำหรับวิธีการนั้น อีกวิธีหนึ่งในการมองมัน
Geobits

5
ใช้งูหลาม:3<x>y+1
Avall

2
ฉันพบวิธีแก้ปัญหามากมายด้วยลำดับความสำคัญของตัวดำเนินการของ Python เช่นy+3<2^xกัน แต่ลำดับความสำคัญของตัวดำเนินการของ C นั้นแตกต่างกัน ฉันเดิมพันว่ามีวิธีแก้ปัญหา 7 ตัวเพียงแค่ต้องปรับเปลี่ยนสคริปต์ของฉันเพื่อจัดการกับลำดับความสำคัญของตัวดำเนินการ C แทน
Claudiu

คำตอบ:


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

การบังคับให้เดรัจฉานกระทำใน Python โดยสร้างทรีไวยากรณ์จากบนลงล่างซึ่งไม่มีลูกที่มีโอเปอเรเตอร์ที่มีลำดับความสำคัญต่ำกว่าพาเรนต์ตามกฎของ C เพื่อลดความเป็นไปได้ฉันอนุญาตให้ใช้ตัวอักษรหลักเดียวเท่านั้นและไม่มีตัวดำเนินการแบบไบนารีที่อาจมีเด็กสองคนคงที่ ฉันไม่สามารถคิดถึงวิธีแก้ปัญหาใด ๆ ที่มีตัวอักษรสองหลักหรือที่สร้างค่าคงที่โดยใช้ตัวดำเนินการแบบไบนารี จากนั้นแต่ละนิพจน์จะถูกประเมินสำหรับ [0, 5] และหากตรงกับที่ได้รับการพิมพ์


x*x-y*y>9ผมชอบ บางทีคุณควรลองค่าคงที่หลายหลักเช่นกัน? (เช่นวงเล็บ)
John Dvorak

@ JanDvorak ฉันด้วย มันแสดงให้เห็นถึงตรรกะของ "ระยะห่างระหว่าง x และ y" ฉันคิดว่าถ้าคุณพล็อตมันในแผนภูมิมันจะชัดเจนขึ้น
sehe

@JanDvorak ฉันไม่คิดว่าวงเล็บจะเป็นทางออกที่เล็กกว่าได้ โซลูชันที่เล็กกว่าสามารถมีอักขระได้สูงสุด 8 ตัวโดยต้องมีxy2 ตัวและ 2 ต้องเป็นวงเล็บซึ่งเหลือตรรกะเพียง 4 ตัวเท่านั้น ฉันจะลองเรียกใช้ตัวหาค่าเดรัจฉานด้วยค่าคงที่ 2 หลัก แต่ฉันไม่คิดว่ามันจะให้ผลลัพธ์
orlp

แล้ว, x, y, ค่าคงที่, วงเล็บหนึ่งคู่และโอเปอเรเตอร์สองอัน?
John Dvorak

@JanDvorak ทำให้ตัวคุณเอง(a#b)$cเป็นรูปแบบ ออกจากabcทั้งสองต้องxและyออกจาก 3 สถานที่เป็นไปได้สำหรับและเพียงหนึ่งพลิก[0-9xy] xyมีผู้ให้บริการที่น่าสนใจเท่านั้น+-*/&|^<>ดังนั้นมีความเป็นไปได้ 9 ข้อ ดังนั้นความเป็นไปได้ทั้งหมดจึงน้อยกว่า 3 * 12 * 2 * 9 * 9 <5832
orlp

0

ในการตอบสนองต่อกอล์ฟ (ยอดเยี่ยม) โดยorlp:

ความถูกต้องจะต้องมาก่อน

  • การแบ่งส่วนใหญ่เหล่านี้เป็นจำนวนเต็มบางประเภท ซึ่งรวมถึงรุ่นจาก OP
  • ที่น่าสนใจที่พวกเขาทำทำงานint16_t- จึงมีการสันนิษฐาน น่าจะเป็นบิตกะจะต้อง 16 สำหรับ 32 บิต ints (ที่สวยมากทุกที่ในวันนี้) นี่ทำให้พวกเขากลายเป็นตัวละครที่ใหญ่กว่า ...

วิธีการเขียนที่ "ถูกต้อง" เท่านั้น IMO คือ(x>3) && (x > y+1)ซึ่งอาจลงไปที่x>3&x>y+1(9 ตัวอักษร)

(คุณจำเป็นต้องพิจารณาความเป็นไปได้ของชนิดที่ไม่ได้ลงนาม (ใหญ่กว่า) โดยเฉพาะอย่างยิ่งเมื่อเครื่องหมายที่ไม่ได้ลงนามคือ "ติดต่อ" ในการแสดงออก C ++ ฉันคิดว่า "แก้ไข" ว่าด้วยความเหมาะสมstatic_cast<>s จะเอาชนะวัตถุประสงค์ ... )

UPDATE

จากการทดสอบต่อไปนี้ฉันสามารถทราบได้ว่านิพจน์ใดทำงานได้อย่างน่าเชื่อถือ:

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

เอาต์พุตบน coliru ที่นี่เพื่อการอ้างอิง:

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 ตัวอักษร แต่ตัวแรกจะถูกต้อง!
sehe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.