Skip to content

Instantly share code, notes, and snippets.

@jakobkogler
Last active October 21, 2016 20:02
Show Gist options
  • Save jakobkogler/84e166cad4521204b689d5bed7671325 to your computer and use it in GitHub Desktop.
Save jakobkogler/84e166cad4521204b689d5bed7671325 to your computer and use it in GitHub Desktop.
Diamant-Beispiel

Diamant-Adhoc

Naive (einfache) Lösung

Hilfsmethode

Zuerst definiere ich eine kleine Hilfsmethode, die es ermöglicht mehrere Zeichen auszugeben.

public static void print_multiple_chars(char c, int count) {
    while (count > 0)
    {
        System.out.print(c);
        count--;
    }
}

Dadurch brauchen wir in der main-Methode nicht jedes mal diese while-Schleife schreiben und vermeiden dadurch Code-Duplikate.

Hauptmethode

Man kann jede Zeile des Diamanten durch 3 Zahlen beschrieben. Die Anzahl der "M"s auf der linken Hälfte, die Anzahl der Leerzeichen in der Mitte, und die "M"s auf der rechten Seite. Zum Beispiel kann die die Zeile "MMMM__MMMM" durch (M=4, Leerzeichen=2, M=4) und die Zeile "MMMMMMMMMM" durch (M=5, Leerzeichen=0, M=5) beschreiben. Da unser Diamant symmetrisch ist, brauchen wir sogar nur zwei Zahlen. Es gibt genauso viele "M"s auf der linken Seite wie auf der rechten.

Am Anfang (nullte Zeile) gibt es 10 "M"s (links und rechts) und 0 Leerzeichen. Danach sinkt die Anzahl der "M"s pro Zeile um 1 und die Anzahl der Leerzeichen nimmt pro Zeile zu. Ab der Zeile 10 dreht sich das ganze aber um.

Nun setzt man das ganze einfach in Code um. Variablen für die aktuelle Zeile, die aktuelle Anzahl von "M"s und für die aktuelle Anzahl von Leerzeichen. Die while-Schleife geht alle Zeilen ab, gibt jeweils die "M"s und Leerzeichen aus, und aktualisiert die Zeilennummer und die Anzahlen.

public static void main(String[] args) {
    int zeile = 0;
    int anzahl_M = 10;
    int anzahl_leerzeichen = 0;
    
    while (zeile < 20)
    {
        // Gibt eine Zeile aus (Ms, Leerzeichen, Ms, Zeilenumbruch)
        print_multiple_chars('M', anzahl_M);
        print_multiple_chars(' ', anzahl_leerzeichen);
        print_multiple_chars('M', anzahl_M);
        System.out.println();

        if (zeile < 9) { // Anzahlen erhöhen oder erniedrigen
            anzahl_M--;
            anzahl_leerzeichen += 2;
        } else if (zeile > 9) {
            anzahl_M++;
            anzahl_leerzeichen -= 2;
        }
        zeile++;
    }
}

Mathematische (kurze) Methode

Man kann das ganze auch deutlich Abkürzen, wenn man ein wenig Mathematik ins Spiel bringt.

Stellen wir uns dazu erst einen Kreis vor. Man kann überprüfen, ob das ein Punkt im Inneren eines Kreises liegt, indem man die Distanz zum Kreismittelpunkt überprüft. Ist die Distanz kleiner oder gleich dem Radius, liegt der Punkt im Inneren, ansonsten Außen. (Maturastoff) Für die Distanzberechnung nimmt man dazu die Euklidische Norm (Wurzel von den quadrierten Achsenabständen)

Man kann den selben Trick auch für andere Normen durchführen. Wie ihr in Mathematik 1 (hoffentlich) schon gelernt habt, gibt es auch die Manhattan. Verwendet man diese Norm für die Abstandberechnung, bekommt man ein schiefes Quadrat.

test

Es genügt daher, einfach jedes Pixel in jeder Zeile durchzugehen, die Manhattan-Distanz zum Zentrum (9.5/9.5) auszurechnen, und überprüfen ob diese größer oder kleiner wie der Radius (=9) ist. 5 kurze Java-Zeilen genügen:

public static void main(String[] args) {
    for (int row = 0; row < 20; row++) {
        for (int col = 0; col < 20; col++)
            System.out.print(Math.abs(row - 9.5) + Math.abs(col - 9.5) < 10 ? ' ' : 'M');
        System.out.println();
    }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment