Javaアスタリスクの長方形[閉じた]


15

私のCSクラスでは、インストラクターが、Javaで斜めの線が描かれたアスタリスクで作られた長方形を作成する割り当てを与えてくれました。

彼はまた、できる限り少ないバイト数で書き込むように言っています。190バイトに削減しましたが、このコードをさらに単純化してバイト数を減らすためにいくつかを見つける必要があります。誰でもこれで私を助けることができますか?

このコードは機能的です:

interface d{static void main(String[]a){for(int z=0,w=new Byte(a[0]),h=new Byte(a[1]);z<h*w;){int y=z/w,x=z++%w;System.out.print((x>w-2)?"*\n":(y%(h-1)*x*((y-x)%3)==0)?"*":" ");}}}

入力は10 10です。

出力:

**********
**  *  * *
* *  *  **
*  *  *  *
**  *  * *
* *  *  **
*  *  *  *
**  *  * *
* *  *  ** 

25
彼をSOにリダイレクトしないでください。彼は生きて食べられます。
リーキー修道女

3
プログラムの出力と仕様を明確にできますか?例の入力/出力など
TheLethalCoder

25
これがなぜ投票されるのか、私には完全にはわかりません。これは、間違いなく一般的なプログラミングの質問ではありません。これはかなり標準的なヒントの質問であり、非常に話題になっています。宿題についての方針があるかどうかはわかりませんが、OPが彼ら自身の努力さえ示しているのを見ることができるので、私はこれに本当に何の問題もないと思いますか?
マーティンエンダー

3
特定のゴルフの問題に関する@NathanMerrillのアドバイスは、間違いなくトピックから外れていません
マーティンエンダー

3
@LeakyNun私たちは生きている人を食べない、最初に彼らを殺す;)

回答:


1

論理的には、毎回アスタリック( "*")が存在する必要がありますi == ji+j==w-1(対角線の場合)、i == 0j == 0(上部の行と左側の)、j == w-1i==h-1 (右側と下部の行の)。

class d {
    public static void main(String[] a) {
        for(int i=0,w=new Byte(a[0]),h=new Byte(a[1]);i<h;i++) {
            for(int j=0;j<w;j++) {
                System.out.print(i==0 || j==0 || i==h-1 || i+j==w-1 || j==w-1 || i==j ? "*":" ");
            }
            System.out.println();
        }
    }
}

これが使用できるロジックの例なのか、完全にゴルフされたコードなのかはわかりません。2番目の場合は、ここでゴルフをすることがたくさんあります。そのような役に立たない、としてSystem.out.println()、すべてまたはパイプの間に無駄な空白文字(||)および三項演算子。
Yytsi

1
これは、ロジック@TuukkaXの単なる例です。
アッバスカララワラ

1

あなたが提供したコードは、これを行うことで減らすことができます:

  • 「*」を42に、「」を「」に置き換えます(*の文字コードを利用)
  • ((y-x)%3)乗算するものの先頭に移動し、周囲の括弧を削除します
  • (x> w-2)および((y-x)%3 * y%(h-1)* x == 0)から周囲の括弧を削除します

結果のコードは次のようになります。

interface r{static void main(String[]a){for(int z=0,w=new Byte(a[0]),h=new Byte(a[1]);z<h*w;){int y=z/w,x=z++%w;System.out.print(x>w-2?"*\n":(y-x)%3*y%(h-1)*x==0?42:' ');}}}

注:質問の出力例には最後の行がありません!サンプルコードの出力は異なります。


0

私は実際にコンピューターにJavaがないので、これをテストすることはできませんが、174バイトで動作するはずで、ほぼ間違いなくもっとゴルフできると思います

class d{static void main(String[]a){for(int i=0,w=new Byte(a[0]),h=new Byte(a[1]);i<h;i++)for(int j=0;j<w;j++)System.out.print(j==w-1?"*\n":i%h-1==0||!j||i+j%2==0?"*":" ");}}

明確にするために空白を入れました:

class d {
    static void string main(String[] a) {
        for(int i=0,w=new Byte(a[0]),h=new Byte(a[1]);i<h;i++)
            for(int j=0;j<w;j++)
                System.out.print(j==w-1 ? "*\n" : i % h-1 == 0 || !j || i+j % 2 == 0 ? "*":" ");
    }
}

各行の最後の文字に「* \ n」、最初と最後のすべての行と最初の列に「*」、行と列の合計が偶数の場合に「*」を印刷します。 「」

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.