Regulärer Ausdruck für Hexadezimaldarstellung

Sei H(n) die Hexadezimaldarstellung n element der natürlichen Zahlen. In dieser Darstellung sind keine führenden Nullen enthalten ( mit Ausnahme der Zahl Null selbst, die aus genau einer Null besteht). Sei N_4 = { n element N | n ist durch 4 teilbar}.

Geben Sie einen regulären Ausdruck an, der genau H(n) für alle n element N_4 beschreibt.

Leider keine Idee…

habe jetzt ((1|2|3|4|5|6|7|8|9|A|B|C|D|E|F)*(0|4|8|C))|0 ist das korrekt?

Ohne jetzt auf die Schnelle die Korrektheit überprüfen zu können: Du kannst es auch einfacher schreiben:

^(([1-9]|[A-F])*(0|4|8|C))|0$

Mit ^ und $ begrenzt du das Regex darüber hinaus auf den kompletten String, nicht nur auf Teile

Disclaimer: Antwort ist nicht korrekt, da z.B. A0C nicht matchen würde, obwohl es korrekt ist. Sie Antwort weiter unten von cmrudolph

ok danke^^ aber muss auch die Korrektheit wissen^^ meiner Meinung nach ist eine zahl durch 4 teilbar, wenn die beiden letzten Ziffern binär 00 sind das entspricht hex der 0 oder der 4 oder der 8 oder dem C

Das sollte so passen: ^[1-9a-fA-F]*[048cC] $

1 „Gefällt mir“

Setze Schlafpuder ein (sorry, für den OT :smile: ) und teste es:

    public static void main(String[] args) {
        int i = new Random().nextInt();
        i = Math.abs(i); // etwas aufpassen
        System.out.println("i = " + i);
        String s = Integer.toHexString(i);
        System.out.println("s = " + s);
        if (s.matches("^[0-9a-f]*[048c]$")) {
            System.out.println("/ 4 teilbar");
            if (i % 4 == 0) {
                System.out.println("/ 4 teilbar");
            } else {
                System.out.println("nicht / 4 teilbar");
            }
        } else {
            System.out.println("nicht / 4 teilbar");
            if (i % 4 == 0) {
                System.out.println("/ 4 teilbar");
            } else {
                System.out.println("nicht / 4 teilbar");
            }
        }
    }

Es sollte 2mal dieselbe Ausgabe erscheinen,

i = 186878904
s = b238bb8
/ 4 teilbar
/ 4 teilbar

Dein Regex ist falsch…

Wen meinst du denn jetzt damit? @cmrudolph oder @CyborgBeta ? Geht es um die 1 ? Ich versteh die Aufgabenstellung nicht ganz. Ich hab den RegEx an das Ergebnis von .toHexString() angepasst. * bedeutet doch beliebig oft oder gar nicht.

Bin ich jetzt durcheinander?


Edit: Testet man den Rand, macht es keine Probs:

i = 0
s = 0
/ 4 teilbar
/ 4 teilbar
i = 1
s = 1
nicht / 4 teilbar
nicht / 4 teilbar
i = 2
s = 2
nicht / 4 teilbar
nicht / 4 teilbar
i = 3
s = 3
nicht / 4 teilbar
nicht / 4 teilbar
i = 4
s = 4
/ 4 teilbar
/ 4 teilbar
i = 5
s = 5
nicht / 4 teilbar
nicht / 4 teilbar
i = 6
s = 6
nicht / 4 teilbar
nicht / 4 teilbar
i = 7
s = 7
nicht / 4 teilbar
nicht / 4 teilbar
i = 8
s = 8
/ 4 teilbar
/ 4 teilbar
i = 9
s = 9
nicht / 4 teilbar
nicht / 4 teilbar
i = 10
s = a
nicht / 4 teilbar
nicht / 4 teilbar
i = 11
s = b
nicht / 4 teilbar
nicht / 4 teilbar
i = 12
s = c
/ 4 teilbar
/ 4 teilbar

Ich meinte dich, sorry.

“Ich habe die Aufgabenstellung nicht verstanden” stellt natürlich die Frage, warum du trotzdem postest. Das Regex ist nicht korrekt, da führende Nullen explizit in der Aufgabenstellung ausgeschlossen waren.

Teste es doch, bevor du behauptest, alles sei falsch:

        for (int i = 0; i <= 1_000_000; i++) {
            i = Math.abs(i); // etwas aufpassen
//            System.out.println("i = " + i);
            String s = Integer.toHexString(i);
//            System.out.println("s = " + s);
            if (s.matches("^[0-9a-f]*[048c]$")) {
                if (i % 4 != 0) {
                    System.out.println("falsch");
                }
            } else {
                if (i % 4 == 0) {
                    System.out.println("falsch");
                }
            }
        }

Aufgabenstellung nicht verstanden: Weil du mich verunsichert hast…
Führende 0en kommen gar nicht vor.

[0-9a-f]* matcht nur, wenn [048c] genau 1mal matcht - also wenn zum Schluss 0, 4, 8 oder c steht. Das entspricht schon der Aufgabenstellung.


Edit: * darf auch zögerlich (da ^ und $…), aber nicht sehr gierig sein.

passt nicht zu deinem Regex, welches z.B. auch „044“ akzeptiert, mehr wollte ich eigentlich nicht sagen. Ich habe nicht behauptet dass alles falsch ist, aber das Regex (welches der Kern der Aufgabenstellung war) deckt nicht die Aufgabenstellung ab.

„sind keine führenden Nullen enthalten“ - bisaflor

Das bedeutet IMHO nicht, dass ein RegEx, der auch bei führenden 0en matcht, falsch sei. Denn sonst müsste dort stehen, „er“ darf nicht bei führenden 0en matchen, IMHO.


IMHO sind alle bisher genannten RegExes nicht falsch! Können wir es dabei belassen?


Ich wollte auch nur ein Beispiel bringen, wie er das selber einfach testen könnte.

Meine Antwort passte noch nicht ganz.
^([1-9a-fA-F][0-9a-fA-F]*)?[048cC]$

3 „Gefällt mir“

Das steht dort auch, denn es heißt:

Die Betonung liegt hier auf genau. Das bedeutet, dass jede andere Zeichenkette nicht gematcht werden soll. Ansonsten wäre die einfachste richtige Antwort ja .*.

Meine Antwort ist nicht falsch, wenn sie sowohl für mit führenden 0en durch 4 teilbar als auch für ohne führende 0en durch 4 teilbar matcht, und die Aufgabestellung lediglich ausschließt, d. es führende 0en gibt.

Trotzdem, ich bin mir nicht ganz sicher, ob die Aufgabestellung überhaupt richtig ist. Deswegen les ich das auch nicht ganz.

Anstatt mir, der sich die Mühe macht, das auch mal zu testen, vorzuwerfen, alles sei falsch, schreibt ihr selber was Falsches.

Und dann auch noch ‘wild’ irgendwelche Likes verteilen (die wohl gegen meine Person seien)… no comment.

Genau, Cyborg. Ich habe cmrudolphs einzige korrekte Antwort nur geliked, um dir zu schaden.

Meine Antwort habe ich durch Edit übrigens als nicht korrekt markiert, wenn es dich beruhigt.

    public static void main(String[] args) {
        for (int i = 0; i <= 1_000_000; i++) {
            i = Math.abs(i); // etwas aufpassen
//            System.out.println("i = " + i);
            String s = Integer.toHexString(i);
            for (int j = s.length() / 2; j < s.length(); j++) {
                int k = new Random().nextInt(s.length());
                s = s.substring(0, k) + Character.toUpperCase(s.charAt(k)) + s.substring(k + 1);
            }
//            System.out.println("s = " + s);
            if (s.matches("^([^0][\\d\\w]*)?[048cC]$")) {
                if (i % 4 != 0) {
                    System.out.println("falsch");
                }
            } else {
                if (i % 4 == 0) {
                    System.out.println("falsch");
                }
            }
        }
    }

Zu extrahieren ist: "^([^0][\\d\\w]*)?[048cC]$".

Orientiert hab ich mich an der Lsg. von @cmrudolph . Er sei geliked (<- Eindeutschung dieser Art schwierig…) an dieser Stelle. :wink:

Bitte lasst uns den Kleinkrieg beenden/beilegen. :blush:

Das ist auch nicht ganz korrekt: mit \w akzeptierst du jeden Buchstaben, du würdest demnach damit auch ZZAYYAC matchen.

Aber nicht führende 0en. :wink:

In der Aufgabe steht gar nicht genau, welche Zeichen gematcht werden sollen.