2

このコードを逆にして、周囲に境界線のあるひし形を印刷できるようにしようとしています。入れ子になったループ/一連のループを反転する最良の方法は何ですか? 私はコードをいじってみましたが、すべてがごちゃごちゃして順番が狂っています。何かアドバイス?

また、上部の星の両側に偶数の . を作成する方法はありますか? 私がそれを機能させることができた唯一の方法は、両側に均等な量を印刷することです...

コンソールに表示される内容は次のとおりです: http://i.imgur.com/h55r2.jpg

これが私のコードです:

public class SixTester {

    public static void main(String[] args)
    {
            int i,j,k;
            int numOfRows = 8;  // Made this a variable, so that the program can make any size diamond (try playing around with different values eg. 2 or 16)

            // Step 1. The first Dash
            for(i=0;i<numOfRows*2 +2;i++)
                    System.out.print(" "); // Number of spaces is double the number of rows in your 'Half Pyramid'
            System.out.println("-");

            // Step 2. The First half diamond
            for (j=0; j<numOfRows ; j++ )
            {
                    for(k=numOfRows*2; k>1+j*2; k--)
                            System.out.print(" ");

                    System.out.print("_/");
                    for (i=0; i< 2+j*4; i++)
                    {
                            // Prepare the Star rectangle, Note that it starts half the way (rows/2)
                            if(j >= numOfRows/2 && (i>j*2- numOfRows/2 && i<j*2+ numOfRows/2)) {
                                    System.out.print("*");                                 
                            }
                            else
                                    System.out.print(".");
                    }
                    System.out.println("\\_");
            }
            // Next Step  - Make the bottom pyramid...but how to reverse?
    }
}
4

2 に答える 2

2

これは最もエレガントな方法ではありませんが、機能します。あなたのコードが「しかしどうやって逆にするの?」と言っているところにこれらの行を挿入してください。コードの変更をコメントでマークしました

        // COUNT BACKWARDS NOW. YOU WANT LARGEST ROW FIRST, OTHERWISE IT'S OK EXCEPT...
        for (j=numOfRows-1; j>=0 ; j-- ) 
        {
                for(k=numOfRows*2; k>1+j*2; k--)
                        System.out.print(" ");

                System.out.print("\\_"); // BORDERS ARE BACKWARDS. PUT BORDER ON OTHER SIDE
                for (i=0; i< 2+j*4; i++)
                {
                        if(j >= numOfRows/2 && (i>j*2- numOfRows/2 && i<j*2+ numOfRows/2)) {
                                System.out.print("*");                                 
                        }
                        else
                                System.out.print(".");
                }
                System.out.println("_/"); // PUT BORDER ON OTHER SIDE
        }

        for(i=0;i<numOfRows*2 +2;i++)
                System.out.print(" ");
        System.out.println("-");
于 2012-11-20T01:59:25.987 に答える
0

このようなビルダーを書いた場合...

public static interface Reflection {
    String reflect(String str);
}

public static class Builder {
    private List<String> lines = new ArrayList<String>();
    private StringBuilder builder = new StringBuilder();
    public void newLine() {
        lines.add(builder.toString());
        builder = new StringBuilder();
    }
    public void repeat(String section, int count) {
        for (int i = 0; i < count; i++) {
            builder.append(section);
        }
    }
    public void padLeft(String section, int count) {
        while (builder.length() < count) {
            builder.append(section, 0, section.length());
        }
    }
    public void reflectX(Reflection reflection) {
        List<String> reflected = new ArrayList<String>();
        for (String line : lines) {
            StringBuilder tmp = new StringBuilder();
            tmp.append(reflection.reflect(line));
            tmp.reverse();
            tmp.append(line);
            reflected.add(tmp.toString());
        }
        lines = reflected;
    }
    public void reflectY(Reflection reflect) {
        List<String> reflection = new ArrayList<String>();
        for (String line : lines) {
            reflection.add(reflect.reflect(line));
        }
        Collections.reverse(reflection);
        lines.addAll(reflection);
    }
    public String build() {
        StringBuilder tmp = new StringBuilder();
        for (String line : lines) {
            tmp.append(line);
            tmp.append('\n');
        }
        return tmp.toString();
    }
    public void write(String string) {
        builder.append(string);
    }
}

次に、コードコードを次のように単純化しますが、それは単なるオーバー エンジニアリングです。

int nRows = 8;
int pad = 20;
Builder builder = new Builder();

builder.write("_");
builder.padLeft(" ", pad);
builder.newLine();

for (int i = 0; i < nRows; i++) {
    int dots = i * 2 + 1;
    int stars = i >= 4 ? 4 : 0;
    builder.repeat("*", stars);
    builder.repeat(".", dots - stars);
    builder.write("\\");
    if (i < nRows - 1) {
        builder.write("_");
    }
    builder.padLeft(" ", pad);
    builder.newLine();
}
builder.reflectX(new Reflection() {
    @Override
    public String reflect(String str) {
        return str.replace('\\', '/');
    }
});
builder.reflectY(new Reflection() {
    @Override
    public String reflect(String str) {
        return str.replace("\\", "%x").replace("/", "\\").replace("%x", "/").
                replace("_\\", "%x").replace("/_", "_/").replace("%x", "\\_");
    }
});
System.out.println(builder.build());

結果

               __                   
             _/..\_                 
           _/......\_               
         _/..........\_             
       _/..............\_           
     _/.....********.....\_         
   _/.......********.......\_       
 _/.........********.........\_     
/...........********...........\    
\...........********.........../    
 \_.........********........._/     
   \_.......********......._/       
     \_.....********....._/         
       \_.............._/           
         \_.........._/             
           \_......_/               
             \_.._/                 
               __                   
于 2012-11-20T03:38:58.260 に答える