Xが3より大きく、XとYの間に少なくとも2つの差がある


11

私はいくつかのC ++をゴルフしようとしています。この条件を短くすることは可能ですか?

X > 3 & X - Y > 1

(もちろん、空白の削除は別として。)

だから、X少なくともです4X >= Y + 2

XおよびYは、[0,5]間隔の整数です。

ビット単位の数式を見つけようとしましたが、失敗しました。


1
@JoeZ。CodeGolfの場合 どうして?それが働いている限り...
クリスティ

4
@Cristyはい、そうですが、(これまでのところ)ゴルフのアドバイスについて尋ねる質問は非常にまれですが、アドバイスを求める質問のほとんどは実際には一般的なプログラミングの質問です-これはトピック外です。それゆえ、人々の最初の反応が「ああそれは実際にSOに属する別の質問」である理由を理解することができます。私は実際にこれらの将来をもっと見たいです、そしていつかそれらのためのタグがあるかもしれません、そして、あなたがこのサイトを使う方法を知っていることはすぐに明らかになるでしょう。;)
マーティン・エンダー

4
0から5までの整数の場合、で同じことができますx*x-y*y>9。同じ文字数ですが、そのアプローチのショートカット/代替を見つけることができるかもしれません。それを見るもう一つの方法。
ジオビット

5
使用Pythonの:3<x>y+1
avall

2
Pythonの演算子の優先順位を持つ多くのソリューション、たとえばを見つけましたy+3<2^xが、Cの演算子の優先順位は異なります。7文字の解決策があると確信しています。代わりにC演算子の優先順位を処理するようにスクリプトを修正する必要があります
Claudiu 14

回答:


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のルールに従って、子が親より優先順位の低い演算子を持つことはできません。可能性を減らすために、私は1桁のリテラルのみを許可し、2項演算子には2つの定数の子はありません。2桁のリテラルを持つソリューションや、2項演算子を使用して定数を作成するソリューションは考えられませんでした。次に、各式が[0、5]について評価され、一致する場合は出力されます。


私は本当に好きx*x-y*y>9です。おそらく、複数桁の定数も試してみるべきでしょうか?(また、括弧)
ジョン・ドヴォルザーク

@JanDvorak私も。「xとyの間の距離」の論理をうまく表現しています。これをチャートにプロットすると、より明らかになると思います。
sehe

@JanDvorakかっこが小さなソリューションになるとは思いません。より小さなソリューションは、最大8文字で、そのうち2文字がxyで、2文字が括弧でなければならず、ロジックは4文字のみです。2桁の定数でブルートフォーサーを実行してみますが、実際に結果が得られるとは思いません。
orlp

x、y、定数、1組の括弧、2つの演算子はどうですか?
ジョン・ドヴォルザーク

@JanDvorakノックアウト(a#b)$c、フォーマットです。うちabc2でなければならないxyのための3つの可能な場所残し、[0-9xy]との唯一のフリップxy。興味深い演算子のみがな+-*/&|^<>ので、9つの可能性があります。したがって、合計可能性は3 * 12 * 2 * 9 * 9 <
5832

0

(素晴らしい)ゴルフへの応答orlp

正しさが最初に来なければならない

  • これらのほとんどは、いくつかの整数型に分類されます。これには、OPのバージョンが含まれます
  • 興味深いことに、彼ら仕事をしているint16_tので、仮定があります。おそらく、ビットシフトは32ビットintで+16にする必要があります(最近ではほとんどどこにでもあります)。これにより、キャラクターが大きくなります...

それを書く唯一の「正しい」方法は(x>3) && (x > y+1)、IMOで、これはx>3&x>y+1(9文字)までゴルフすることができます。

(あなたは本当に、符号なしネスは、C ++の表現に「伝染性」である特に以来、考慮に(大きい方)unsigned型の可能性を取る必要があります。私は適切であること、「固定」としstatic_cast<>、Sちょっと目的を台無しにしてしまいます...)

更新

次のテストにより、どの式が実際に確実機能するかを把握できました。

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文字より短くはありませんが、最初の文字は正しいものです!
sehe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.