X lớn hơn 3 với ít nhất 2 chênh lệch giữa X và Y


11

Tôi đang cố gắng để chơi golf xuống C ++. Có thể làm cho điều kiện này ngắn hơn?

X > 3 & X - Y > 1

(Tất nhiên, ngoài việc loại bỏ khoảng trắng, tất nhiên.)

Vì vậy, Xlà ít nhất 4nhưng X >= Y + 2.

XYlà các số nguyên trong khoảng [0,5].

Tôi đã cố gắng tìm một số công thức bitwise nhưng không thành công.


1
@JoeZ. Cho CodeGolf? Tại sao? Miễn là nó hoạt động ...
Cristy

4
@Cristy đúng vậy, nhưng (cho đến nay) những câu hỏi về tư vấn chơi gôn rất hiếm trong khi hầu hết các câu hỏi xin lời khuyên thực sự chỉ là những câu hỏi lập trình chung - không có chủ đề. Do đó, tôi có thể hiểu tại sao phản ứng đầu tiên của mọi người có thể là "ồ đó là một câu hỏi khác thực sự thuộc về SO", mà không nghĩ đó có thể là về lời khuyên chơi golf. Tôi thực sự muốn thấy nhiều hơn những thứ này trong tương lai, và có thể sẽ có một thẻ cho họ một ngày nào đó hoặc lâu hơn, và sẽ rõ ràng ngay lập tức rằng bạn biết cách sử dụng trang web này. ;)
Martin Ender

4
Nếu chúng là các số nguyên nằm trong khoảng 0..5, bạn có thể làm điều tương tự với x*x-y*y>9. Đó là cùng một lượng ký tự, nhưng bạn có thể tìm thấy một lối tắt / thay thế cho phương pháp đó. Chỉ là một cách khác để nhìn vào nó.
Geobits

5
Sử dụng Python:3<x>y+1
trước

2
Tôi đã tìm thấy rất nhiều giải pháp với ưu tiên toán tử của Python, ví dụ y+3<2^x, nhưng ưu tiên toán tử của C thì khác. Tôi cá là có một giải pháp 7 char, thay vào đó, tôi phải sửa đổi tập lệnh của mình để xử lý ưu tiên của nhà điều hành C
Claudiu

Câu trả lời:


11

Sau khi vũ phu buộc mọi sự kết hợp hữu ích của các biểu tượng dưới 9 ký tự, tôi thấy rằng không có giải pháp nào nhỏ hơn x>3&x-y>1.

Để giải trí, đây là một số giải pháp 9 ký tự thú vị mà người tìm kiếm vũ phu tìm thấy:

-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

Buộc cưỡng bức đã được thực hiện trong Python, xây dựng các cây cú pháp từ trên xuống trong đó không có đứa trẻ nào có thể có toán tử có độ ưu tiên thấp hơn cha mẹ của nó theo quy tắc của C. Để cắt giảm các khả năng tôi chỉ cho phép các chữ số một chữ số và không có toán tử nhị phân nào có thể có hai con không đổi. Tôi không thể nghĩ ra bất kỳ giải pháp nào có nghĩa đen hai chữ số, hoặc một giải pháp xây dựng hằng số bằng toán tử nhị phân. Sau đó, mỗi biểu thức được ước tính cho [0, 5] và nếu nó khớp với nó sẽ được in.


Tôi thực sự thích x*x-y*y>9. Có lẽ bạn cũng nên thử hằng số nhiều chữ số? (cũng là dấu ngoặc đơn)
John Dvorak

@JanDvorak tôi cũng vậy. Nó thể hiện tốt logic của "khoảng cách giữa x và y". Tôi nghĩ rằng nếu bạn vẽ biểu đồ này trong biểu đồ, nó sẽ trở nên rõ ràng hơn.
sehe 11/03/2015

@JanDvorak Tôi không nghĩ rằng dấu ngoặc đơn có thể là một giải pháp nhỏ hơn. Một giải pháp nhỏ hơn có thể có tối đa 8 ký tự, trong đó 2 phải xyvà 2 phải là dấu ngoặc đơn, chỉ để lại 4 ký tự logic. Tôi sẽ thử chạy forcer brute với hằng số 2 chữ số, nhưng tôi thực sự không nghĩ rằng nó sẽ cho kết quả.
orlp 11/03/2015

Làm thế nào về, x, y, một hằng, một cặp dấu ngoặc đơn và hai toán tử?
John Dvorak

@JanDvorak Gõ mình, (a#b)$clà định dạng. Trong số abchai phải xy, để lại 3 vị trí có thể [0-9xy]và chỉ một lần lật xy. Chỉ có các nhà khai thác thú vị +-*/&|^<>, vì vậy 9 khả năng. Do đó, tổng khả năng ít hơn 3 * 12 * 2 * 9 * 9 <5832
orlp 11/03/2015

0

Để đáp ứng với các golf (tuyệt vời) bằng cách orlp:

Sự đúng đắn phải đến trước

  • Hầu hết các phân tích này cho một số loại số nguyên. Điều này bao gồm phiên bản từ OP
  • Điều thú vị là họ làm việc cho int16_t- vì vậy có giả định. Có lẽ sự thay đổi bit sẽ cần +16 cho int 32 bit (điều đó khá nhiều ở mọi nơi trong những ngày này). Điều này làm cho họ trở thành một nhân vật lớn hơn ...

Cách "chính xác" duy nhất để viết nó, IMO là (x>3) && (x > y+1), có thể được đánh xuống x>3&x>y+1(9 ký tự).

(Bạn thực sự cần xem xét khả năng của các loại không dấu (lớn hơn), đặc biệt vì tính không dấu là "dễ lây lan" trong các biểu thức C ++. Tôi cho rằng "sửa chữa" với các static_cast<>s thích hợp sẽ đánh bại mục đích ...)

CẬP NHẬT

Với các thử nghiệm sau đây, tôi đã có thể tìm ra biểu thức nào thực sự hoạt động đáng tin cậy:

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

Đầu ra trên coliru, ở đây để tham khảo:

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

Tóm lược

Vì đây là về "chi phí" của việc lặp lại các yếu tố mã nguồn, bạn có thể sử dụng bảng tra cứu. Bạn có thể "ẩn" bảng tra cứu, vì vậy nó cũng là

 LUT[x][y]

hoặc là

 LUT[x*6+y]

Tất nhiên, bạn có thể là người phạm tội và khó hiểu và đổi tên LUT

 L[x][y]

Vậy "phiên bản" của tôi là ... 7 ký tự . (Hoặc thực hiện nếu một chức năng và L(x,y)thậm chí còn ngắn hơn).

Hoặc, quan trọng hơn: chính xác, có thể kiểm tra và duy trì.


Đã thêm một golf "thật". Không ngắn hơn 9 ký tự, nhưng ký tự đầu tiên là chính xác!
sehe 11/03/2015
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.