Java Asterisk Rectangle [geschlossen]


15

Für meine CS-Klasse hat uns mein Kursleiter den Auftrag gegeben, ein Rechteck aus Sternchen mit diagonalen Linien in Java zu erstellen.

Er sagte uns auch, wir sollten es in so wenigen Bytes wie möglich schreiben. Ich habe es auf 190 Bytes reduziert, aber ich muss ein paar finden, um diesen Code noch weiter zu vereinfachen und die Bytes zu verringern. Kann mir jemand dabei helfen?

Dieser Code ist funktionsfähig:

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)?"*":" ");}}}

Eingabe ist 10 10.

Ausgabe:

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

25
Leiten Sie ihn nicht zu SO weiter. er wird lebendig gefressen.
Undichte Nonne

3
Können Sie die Ausgabe und die technischen Daten des Programms erläutern? dh Beispiel Eingabe / Ausgabe usw.
TheLethalCoder

25
Ich bin nicht ganz sicher, warum dies knapp abgestimmt wird. Dies ist definitiv keine allgemeine Programmierfrage. Es ist so ziemlich eine Standard- Tipp- Frage, die sehr thematisch ist. Ich bin mir nicht sicher, ob wir eine Hausaufgabenpolitik haben, obwohl das OP, soweit ich das sehe, sogar ihre eigenen Anstrengungen zeigt, also glaube ich nicht, dass daran wirklich etwas falsch ist?
Martin Ender

3
@ NathanMerrill Ratschläge für spezielle Golfprobleme sind definitiv nicht unangebracht .
Martin Ender

3
@LeakyNun wir essen keine Menschen am Leben, wir töten sie zuerst;)

Antworten:


1

logischerweise sollte es jedes Mal Asterik ("*") geben i == j&i+j==w-1 (für Diagonalen), i == 0& j == 0(für obere und linke Seite) und j == w-1& i==h-1 (für rechte und untere Seite) ein ) geben.

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

Ich weiß nicht, ob dies ein Beispiel für die Logik ist, die verwendet werden kann, oder ob es sich um einen vollständig ausgeführten Code handelt. Wenn es der zweite Fall ist, gibt es hier viel zu golfen. Zum Beispiel die nutzlosen System.out.println()und alle nutzlosen Leerzeichen zwischen den OR-Pipes ( ||) und dem ternären Operator.
Yytsi

1
Dies ist nur ein Beispiel für die Logik von @TuukkaX.
Abbas Kararawala

1

Der von Ihnen angegebene Code könnte folgendermaßen reduziert werden:

  • Ersetze "*" durch 42 und "" durch '' (nutze den Zeichencode für *)
  • Bewegen Sie ((y - x)% 3) an den Anfang der zu multiplizierenden Elemente und entfernen Sie die umgebende Klammer
  • entferne umgebende Klammern von (x> w - 2) und von ((y - x)% 3 * y% (h - 1) * x == 0)

Der resultierende Code wäre:

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:' ');}}}

Hinweis: In der Beispielausgabe der Frage fehlt die letzte Zeile! Die Ausgabe des Beispielcodes ist unterschiedlich.


0

Ich habe kein Java auf meinem Computer, daher kann ich das nicht testen, aber ich denke, es sollte für 174 Bytes funktionieren und könnte fast definitiv mehr Golf spielen

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?"*":" ");}}

Leerraum zur Verdeutlichung eingefügt:

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 ? "*":" ");
    }
}

print "* \ n" für das letzte Zeichen in jeder Zeile, "*" für alle ersten und letzten Zeilen und die erste Spalte und "*" für alle Zeiten, in denen die Summe aus Zeile und Spalte gerade ist, andernfalls wird gedruckt ""

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.