Foren » 39. Bundeswettbewerb Informatik

[39.1 A1 Wörter aufräumen] Unicode handling

  • 19. Oktober 2020 20:31:41 CEST

    Soll das Programm in der Lage sein, Lückentexte mit merkwürdigen Unicode Graphemes zu lösen?

    Hier ein Beispiel.

    Ohne zusätzliche Pakete ist es in Rust kaum möglich die Länge eines Wortes zu bestimmen, welches diese Zeichen enthält, denn das hier passiert wenn man das versucht.

    Das gleiche passiert auch bei einigen Emojis, wodurch Lückentexte mit diesen nicht lösbar wären.

    Da keine der Beispieldateien solche Zeichen enthielt, bin ich mir nicht sicher, ob das Programm diese lösen können sollte.


    Dieser Beitrag wurde am 19. Oktober 2020 20:50:58 CEST von nicht mehr angemeldetes Mitglied bearbeitet
    • 66 Beiträge
    19. Oktober 2020 21:50:17 CEST

    Bei der Aufgabe geht es sicher nicht um verschiedene Zeichen, sondern eher darum, den Lücken Wörter zuzuordnen. Das Problem mit komischen Zeichen lässt sich notfalls umgehen, indem man Sonderzeichen durch z. B. deren HTML-Codes ersetzt und im Programm Ausnahmeregeln für solche Codes einfügt. Aber wenn in den Beispieldateien keine Sonderzeichen vorkommen, wird das wohl auch nicht nötig sein.

  • 19. Oktober 2020 22:01:52 CEST
    Jonathan Busch said:

    Bei der Aufgabe geht es sicher nicht um verschiedene Zeichen, sondern eher darum, den Lücken Wörter zuzuordnen. Das Problem mit komischen Zeichen lässt sich notfalls umgehen, indem man Sonderzeichen durch z. B. deren HTML-Codes ersetzt und im Programm Ausnahmeregeln für solche Codes einfügt. Aber wenn in den Beispieldateien keine Sonderzeichen vorkommen, wird das wohl auch nicht nötig sein.

     

    Mir ging es hauptsächlich einfach darum, ob das Programm Texte wie das verlinkte Beispiel lösen sollen könnte.

    Wie HTML-Codes bei diesem Problem helfen sollen ist mir aber nicht wirklich klar, das klingt nämlich viel komplizierter als eine der vorher erwähnten zusätzlichen Bibliotheken, wie z.B. unicode-segmentation zu benutzen.

    Das Problem liegt nämlich darin, dass die Lücken, falls eines der Wörter so ein Sonderzeichen enthält, mindestens ein Zeichen zu kurz erscheinen (siehe verlinktes Rust Beispiel), wodurch der Lückentext unlösbar wird.


    Dieser Beitrag wurde am 19. Oktober 2020 22:04:12 CEST von nicht mehr angemeldetes Mitglied bearbeitet
    • 66 Beiträge
    22. Oktober 2020 15:50:25 CEST

    Sonderzeichen müsste man schon in der Eingabedatei ersetzen, damit diese mit UTF-8 oder ASCII lesbar wird:

    ____l s___ _e____. sind gesund & #x00c4pfel

    Im Programm zählt man dann auch Vorkommen der Zeichenkombination "& #x". Damit kann man dann die Länge des Wortes mit Sonderzeichen ausrechnen. Wenn man z. B. immer eine 4-stellige hexadezimale Zahl als Code verwendet, ist der Ausnahmecode immer 7 Zeichen lang. Bei jedem "& #x"-Vorkommen stehen also 7 Zeichen für ein Sonderzeichen.

    PS: Leerzeichen zwischen "&" und "#x" nicht beachten; ohne sie würden die Zeichenketten nämlich als HTML-Codes erkannt und ersetzt.


    Dieser Beitrag wurde am 22. Oktober 2020 23:21:13 CEST von Jonathan Busch bearbeitet
  • 22. Oktober 2020 21:01:07 CEST
    Jonathan Busch said:

    Sonderzeichen müsste man schon in der Eingabedatei ersetzen, damit diese mit UTF-8 oder ASCII lesbar wird:

    <pre>____l s___ _e____. sind gesund Ä</pre>

    Im Programm zählt man dann auch Vorkommen der Zeichenkombination "". Damit kann man dann die Länge des Wortes mit Sonderzeichen ausrechnen. Wenn man z. B. immer eine 4-stellige hexadezimale Zahl als Code verwendet, ist der Ausnahmecode immer 7 Zeichen lang. Bei jedem ""-Vorkommen stehen also 7 Zeichen für ein Sonderzeichen.

    Danke für den Vorschlag, aber inwiefern ist das weniger kompliziert als eine zusätzliche Bibliothek?

    • 66 Beiträge
    22. Oktober 2020 23:20:53 CEST

    Das ist garantiert nicht weniger kompliziert als eine zusätzliche Bibliothek, aber es ist eine programmiersprachenunabhängige Lösung.

    • 92 Beiträge
    23. Oktober 2020 12:00:02 CEST
    Lukas Panhirsch said:

    Soll das Programm in der Lage sein, Lückentexte mit merkwürdigen Unicode Graphemes zu lösen?

    Diese Frage kann man ganz pauschal mit „nein“ beantworten.

    Dein Programm sollte auf jeden Fall in der Lage sein, die Beispieldaten zu bearbeiten. Außerdem sollte dein Programm mit allen Zeichen in der deutschen Schriftsprache umgehen können (Umlaute, kleines „ß“).

    Du kannst davon ausgehen, dass die Eingabedaten UTF-8-kodiert sind, und dass alle Zeichen darin in ihrer "normalen" Kodierung vorkommen.


    Darüber hinaus steht es dir natürlich frei, trotzdem eine Behandlung von Grapheme-Clustern zum implementieren. Du kannst dafür auch Bibliotheken verwenden (siehe auch „Dürfen Programmbibliotheken verwendet werden?“ in https://bwinf.de/bundeswettbewerb/haeufige-fragen/). Das kann interessant und lehrreich sein, gibt aber keine zusätzlichen Punkte (die gibt es in der ersten Runde generell nicht).

  • 23. Oktober 2020 14:41:54 CEST
    Robert Czechowski said:
    Lukas Panhirsch said:

    Soll das Programm in der Lage sein, Lückentexte mit merkwürdigen Unicode Graphemes zu lösen?

    Diese Frage kann man ganz pauschal mit „nein“ beantworten.

    Dein Programm sollte auf jeden Fall in der Lage sein, die Beispieldaten zu bearbeiten. Außerdem sollte dein Programm mit allen Zeichen in der deutschen Schriftsprache umgehen können (Umlaute, kleines „ß“).

    Du kannst davon ausgehen, dass die Eingabedaten UTF-8-kodiert sind, und dass alle Zeichen darin in ihrer "normalen" Kodierung vorkommen.


    Darüber hinaus steht es dir natürlich frei, trotzdem eine Behandlung von Grapheme-Clustern zum implementieren. Du kannst dafür auch Bibliotheken verwenden (siehe auch „Dürfen Programmbibliotheken verwendet werden?“ in https://bwinf.de/bundeswettbewerb/haeufige-fragen/). Das kann interessant und lehrreich sein, gibt aber keine zusätzlichen Punkte (die gibt es in der ersten Runde generell nicht).

    Vielen Dank für die ausführliche Antwort, ich lass es dann wohl so wie es im Moment ist.