[C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

AW: [C] Hochzahlen ohne math.h und pow berechnen ...

@DarkMo Nein, da du so die Informationen nicht mehr entpacken kannst. Deswegen ist RLE auch nicht für alle Arten von Daten geeignet, da die Daten nach der Kompression sogar größer werden können. Sehr gut geht das z. B. bei Schwarz/Weiß-Bildern (RLE wird beim Faxen verwendet)
 
AW: [C] Hochzahlen ohne math.h und pow berechnen ...

asöööö, jetz versteh ich erst den größeren sinn dahinter ^^ das soll ne komprimierung werden? ineffizient bei laufend wechselnden "werten" (aus abc würde 1a1b1c -> datenverdopplung), umsoeffizienter, je mehr vorkommen eines wertes aufeinander folgt (aus aaaaaa wird 6a -> ein drittel der datenmenge). jetz richtig verstanden?
 
AW: [C] Hochzahlen ohne math.h und pow berechnen ...

asöööö, jetz versteh ich erst den größeren sinn dahinter ^^ das soll ne komprimierung werden? ineffizient bei laufend wechselnden "werten" (aus abc würde 1a1b1c -> datenverdopplung), umsoeffizienter, je mehr vorkommen eines wertes aufeinander folgt (aus aaaaaa wird 6a -> ein drittel der datenmenge). jetz richtig verstanden?
ja genau! :)
 
AW: [C] Hochzahlen ohne math.h und pow berechnen ...

2) Bei Schleifen die Zählvariable besser immer im Schleifenkopf initialisieren, das verhindert ungewollte Fehler.
Code:
for ([B]i = 0[/B]; i < len; ++i) // Bei C++ bzw. ab C99 geht auch for (int i = 0; i < len; ++i)
Den Datentyp auch in der Schleife anzugeben, mache ich normalerweise nur in Java/C++. Das will ich mir für C lieber nicht angewöhnen, aber Variablen in der Schleife (neu) zu initialisieren, ist wohl nicht verkehrt.
3) Erklärung der Schleife
[...]
4) Mein Code liefert übrigens bereits die komplette RLE für den String (das printf), nicht nur für die ersten vier Buchstaben. Daher dürfte der Rückgabewert in deinem geposteten Code auch nicht unbedingt das erwartete Ergebnis enthalten (also bei dir gibt der 8 für die D's aus weil das der letzte Wert ist).
Ok, jetzt komme ich mit, was du machst.

Nur eines ist mir noch immer nicht klar: Die äußere for-Schleife prüft ihre Bedingungen BEVOR sie in der nächsten Zeile das count=1 sieht. Dabei stoßt die for-Schleife auf i+=count und hat aber noch keinen Wert für count, weil du es ja auch vor der Schleife nur deklariert, aber nicht definiert hast. Wieso meldet der Compiler hier trotzdem keinen Fehler? Wenn ich für den Schleifenstartwert nur i (statt bspw. i=0) hinschreibe und i zuvor aber nie definiere, geht ja auch nichts und ich bekomme einen Compilerfehler ...

^^ Ich hoffe, du weißt was ich meine.
5) Length = Anzahl Elemente, Text ist in str[0] bis str[length-1] enthalten. Wenn du mit i <= length arbeitest, liest du noch das Nullzeichen mit ein. Bei nicht-nullterminierten Strings schmiert dir dann das Programm mit nem Fehler ab (Speicherschutzverletzung oder ähnliches)
Also inkludiert length die Nullterminierung doch. War dann ein Verständnisfehler meinerseits.
bei aabccca müsste der dann doch sowas wie

2a
1b
3c
1a

ausgeben oder? sollte er aber nich geschickterweise

3a
1b
3c

ausgeben? ^^ oder is das nich ganz so relevant hierbei?
Laut Angabe soll vor Buchstaben, die keinen identischen Nachfolger haben, also nur 1 Mal vorkommen, keine "1" als Zahl ausgegeben werden, sondern nur der Buchstabe selbst. Sinn der Lauflängencodierung ist es ja, das Ganze möglichst weit zu komprimieren und zum Beispiel für 1B bräuchtest du 2 Zeichen, was länger wäre, als nur ein Zeichen für B.
weil bei deiner anderen Variante (die zwar kürzer ist) die Lokalisationen verloren gehen. Dat hatten wir vor Ewigkeiten auch einmal ^^
Richtig. Das Ganze muss ja auch wieder decodiert werden können und zwar so, dass der Originalstring wieder zum Vorschein kommt. Wenn ich alle identischen Buchstaben zusammenfasse, werde ich deren Position kaum noch ermitteln können.

[Edit]
@ DarkMo
Ah, hast es also eh schon verstanden. War noch am Schreiben, während du gepostet hast. ;)
 
AW: [C] Hochzahlen ohne math.h und pow berechnen ...

Das Inkrement wird erst am Ende der Schleife durchgeführt:

Code:
for (int i = 0;                  i < len;                  ++i)
        zu beginn        vor jedem Durchlauf       nach jedem Durchlauf
Außerdem habe ich count ja vor der Schleife deklariert ("int count;"), daher meckert der Compiler da nicht. Und da der Wert erst nach dem Durchlauf gelesen wird, hat der dann auch einen Wert.

Die Length-Funktion liefert die Textlänge ohne Nullzeichen, das ist schon richtig. Du beginnst nur nicht bei 1 mit dem Index sondern 0, daher hast du len Elemente von 0 bis len-1.
Code:
"A B C D E \0" => Länge = 5
 0 1 2 3 4  5   => Index
Bei reinen Texten kann man natürlich die 1 bei einmaligen Vorkommen weglassen. Allgemein geht das aber nicht. Wenn du den gesamten Byteraum bspw. codierst, weißt du nicht, ob das jetzt die Anzahl oder das eigentliche Datum ist. Daher hat man da diese "1A1B2D"-Geschichte. Es gibt da aber Abwandlungen von, z. B. bei JPEG. Da wird nur die 0 codiert, andere Werte nicht (0 tauchst allerdings sehr häufig auf)
 
AW: [C] Hochzahlen ohne math.h und pow berechnen ...

^^ Ok, danke für die Erklärung! Mir ging's nur darum, wo count definiert wird und warum. Dass du es (schon vor der Schleife) deklariert hast, habe ich eh gesehen. :)

Der Code sieht (nach ein paar Erweiterungen) ATM so aus:
Code:
#include <stdio.h>

double checkLength(char *s) {
    int length=0;

    while (*(s+length) != '\0') {
        length++;
    }

    return length;
}

double encode_runlength(char *s) {
    int i=0, j=0, k=0, encodedLength=0, count=0, stringLength=checkLength(s);
    double ratio=0.0;

    for (i; i<stringLength; i+=count) {
        count=1;
        for (j=i+1; j<stringLength; j++) {
            if (*(s+i) == *(s+j)) {
                count++;
            } else {
                break;
            }
        }
        k=printf("%c%d", *(s+i), count);
        encodedLength+=k;
    }
    printf(" (%d Zeichen)", encodedLength);

    [COLOR=royalblue]ratio=[B]checkLength(s)[/B]/encodedLength;
    return ratio;
}

double decode_runlength(char *s) {

}

/*int main(int argc, char *argv[]) {*/
int main(void) {
    int i=0;

    /* 
    char *s = argv[1];

    for (i=1; i<=(argc-1); i++) {
        printf("%s (%d Zeichen)\n", argv[i], i);
    } 
    */

    char *s = "AAAABBBCCCCCCCCDEABBBBDDDDDDDD";

    printf("%s (%d Zeichen)\n", s, ((int)checkLength(s)));[COLOR=royalblue]
    printf("\nRatio = %.3lf | Percentage = %d %%\n", encode_runlength(s), (int)(100/encode_runlength(s)));    
    putchar('\n');

    return 0;
}
Und das hier ist die Ausgabe:
ue7_2.JPG

Um die Encodier-Funkion fertigzustellen und damit die erste Hälfte der Gesamtaufgabe zu erledigen, muss jetzt noch folgendes getan werden:
- Die doppelte Ausgabe in der zweiten Zeile (siehe Bild) beseitigen
- Die 1er bei einmalig vorkommenden Buchstaben entfernen (1er sollen nicht ausgegeben werden). Möglich muss es laut Angabe sein.

^^ Bei diesen Punkten bräuchte ich bitte als nächstes Tipps/Hilfe. Das Problem ist jetzt eben, dass die Angabe zwar nicht zwingend verlangt, dass die Ausgabe des Ergebnisses bereits in den jeweiligen Funktionen stattfinden, aber schon stark andeutet, dass sich dies in der main empfehlen würde. Dann wäre alles weitere leichter zu programmieren ...

Und für's Verständnis: Wieso muss ich in der Zeile, wo ratio in der Decodierfunktion berechnet wird (kurz vor dem return), ratio=checkLength(s)/decodedLength sagen? Wieso funktioniert ratio=stringLength/decodedLength nicht?
 
Zuletzt bearbeitet:
AW: [C] Hochzahlen ohne math.h und pow berechnen ...

Du müsstest sowas machen: ratio = stringLength / (double) decodedLength. Du hast halt sonst ne Integerdivision und da kommt Murks raus. Wenn checkLength den "richtigen" Typ int hätte, würde das auch notwendig sein. Aber dsa gibst u schon double raus.

Den Rest muss ich mir morgen mal ansehen schreib grad aufm handy ;-)
 
AW: [C] Hochzahlen ohne math.h und pow berechnen ...

Okay, werde in der Zwischenzeit selber noch ein paar Dinge probieren. Die sinnvollste Lösungen, auch um die Programmierung der zweiten Hälfte der Aufgabenstellung zu vereinfachen, wäre es, die Encodier-Funktion so umzuschreiben, dass dort keine Ausgabe stattfindet, sondern dies erst in der main passiert.

Auf jeden Fall dürfen wir, egal was wir machen, immer nur mit dem string char *s arbeiten. Gedacht wäre es so, dass der komprimierte string ebenfalls in char *s gespeichert wird, dann rein mit *s in die Decodier-Funktion und dort wieder umrechnen in den Originalinhalt ...

[EDIT]
Puh, die Ausgabe der 1er bei nur einmal vorkommenden Buchstaben wäre auch weg. Wieder was geschafft. ;)
Nur leider zählt der jetzt 12 statt 13 Zeichen im encodierten string. Irgendwas wird (noch) nicht mitgezählt ...
Code:
#include <stdio.h>

double checkLength(char *s) {
    int length=0;

    while (*(s+length) != '\0') {
        length++;
    }

    return length;
}

double encode_runlength(char *s) {
    int i=0, j=0, k=0, l=0, encodedLength=0, count=0, stringLength=checkLength(s);
    double ratio=0.0;

    for (i; i<stringLength; i+=count) {
        count=1;
        for (j=i+1; j<stringLength; j++) {
            if (*(s+i) == *(s+j)) {
                count++;
            } else {
                break;
            }
        }
        [COLOR=royalblue][B]if (count==1) {
            l=printf("%c", *(s+i));
        } else {
            k=printf("%c%d", *(s+i), count);
            encodedLength+=(l+k);
        }[/B]    }
    printf(" (%d Zeichen)", encodedLength);

    ratio=stringLength/(double)encodedLength;

    return ratio;
}

double decode_runlength(char *s) {

}

/*int main(int argc, char *argv[]) {*/
int main(void) {
    int i=0;

    /* 
    char *s = argv[1];

    for (i=1; i<=(argc-1); i++) {
        printf("%s (%d Zeichen)\n", argv[i], i);
    } 
    */

    char *s = "AAAABBBCCCCCCCCDEABBBBDDDDDDDD";

    printf("%s (%d Zeichen)\n", s, ((int)checkLength(s)));
    printf("\nRatio = %.3lf | Percentage = %d %%\n", encode_runlength(s), (int)(100/encode_runlength(s)));

    putchar('\n');

    return 0;
}
 
Zuletzt bearbeitet:
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Hallo ich weiss nicht ob es hier her passt.
Ich habe einen text im forum in bf3 gefunden und wollte fragen wie man sowas hinbekommt.

Google gibt mir auch nen error 413

da dieses symbol groß ist und überdeckt habe ich mal platz freigelassen
zwischen den Zeilen steht im the best
LINK von der quelle
Hier mal copy and paste.










'̵̧̛̫͉͖͚͈͎̌ͨͮͦ̾͊̇̏̌ͤ̀̌̏̿̇ͦ̀͟ḿ̤̭͍̻̖͚̤͇͈̲͕͉̯̞͎̫̱͕ͦ͗͒͗̍̎̆ͩ͌́́̕ ̧͇͈̞̎͋̍̎͛̚ͅṮ̢̗͖̗̣͎͙̤̗̭͌̀ͫͦͬͣ̔̿̆ͩͥ͑ͦ́̀͜͡ͅͅḨ̠͓̲̥̪͈̣̱̦͍͚̝̱ͫ͐ͣ̌ͯ̊̕̕E̦͙̯̜̪͇̯̼͖̝̞̜͕̋ͪ̋̇͌̋̃ͪ͗̋̉͑̀ͦ̓ͦ̀ ̶͖̠͈ͤ͆ͭ̿ͯͯ̎̋́ͭ̌͊̓́̓ͣ͜B̸̡͎̤̥͉͉͉͚̰̟̂͊̽͆̌ͥͩ̓̉͐ͪͫͨ͟Eͯ̉́͌ͭ̂̽ͭͫ̿͆ͩ̈́ͨ҉̸̼̰͖͉̦̀͡͠S̵̻̘̭͓̻̥̲̟̫̦͍̦͈̝ͩ͛͂ͯ͌̏ͨ̈́ͥ̍͐̏ͨͣ̍̕ͅT̪̟̰̞̪̽ͤ̓̓ͯ̃͑ͣ̂̂̏́͊ͩ͛ͦ̔ͣ̈͟.̸̨̥̠̬͍̼͈̠̜͇͈͂ͦ͋̒̏͠͝Ḭ̶̟̲̥̽͑͌ͩ́̈ͨ̃ͥ̈̆̆͋̋ͬ͜'̧̢͉̻̭͓ͦͣ̽̿̉̀͟͝ḿ̹̦̯͖̞̥̥̌̓̋́ͬͥ̄͢ͅ ̴̷͔̠̗̲͈̖̟̻͛ͤ̏́̿͒͊̌́͐ͥ̅̚͜͠͝Ṭ̮͔̩̩̱͎̥͒́ͫ̆͊̌͞H͗͋̇̆ͦ̿̓̎ͧ͛ͪ́̚͟͢͏͓̮̤̱̳̹E̶̪̳̰̥̩̪̦͍̮̻̖̱ͧ̄ͨ͌̓̈̇ͣͣ͗ͬͫ̇́͝ ̸̯̰̬̗͍̤̮̤̺̬͖̩̮̪͉̩̆͑̈́̿͒̏̽ͪ͗̇̅̍͒ͧͨͨ̔̾͠͡Bͩ̈̊̑͐̑̒҉̬̪̳̘̱̗̝͎̖͢ͅE̴̡̦̬̙̳̤̟͈̜̹͎̩̺̩͕͕̪̭͕̎̎ͪ̀̑̎ͣ̓͒ͤ̆́ͮͨ͂̓́͘͡Ş̴̠̩̤̞̝͖̞͇̲͉̠̯̜͍̗̎̂ͩ̾ͦͦ͋̎ͮͨͩ̌͆͜T̸̨̨̟͎̙̬̱̖̳̭̾͗̔͊͌̅̋ͬͥ̓̈́̓̒̓̉̍̒ͅ.̸̛̲̫̩̯̖͕̼͖͉̔̿ͩ̄́͢Ị͕̞̲̝̯̩̥̋̄ͬ̄̽̌͋͢͡'̡̉̅͒ͩͣ͗̔͊̋̄͋̏́͏̤̞̬̺̀m̧̧͖̹̙͇̖͉͈͛̐̇̆̍̊̾ͭ̎͂͋̅͑̓̐͒͊̔̕͜͞ ̶̢̢̱̗̲̣̞͕͓̍ͭͥ̿̐ͮͪ͂̈́́͝ͅT̷̆̓̌́ͯ̆ͧͥ̔ͧ̓̆҉̲̭̤͓̮̬̤̻̰͕͈̩̹ͅHͫͭ͗̊ͮ͐̄̍ͪ̾ͫͤͪ͆́҉̵̲̱͔͔̹̮̟̘̝̝̣͖̠̭̖̖̰͟͠Ẽ̢̢͚̤͖̙͓̦̓̈̄ͣ̊͋̈́͊̀͘ ̷̡͉̮̹̰̤͖̺̘̬͍̦͚̳̗̩̮͕̫̂͂̐ͩ̃ͅB̴̛̟͍̯͚̗͍͎͓̰̳̫̣̉̓̒̓̚̕͟͡E͈͇̘̲̳̹̥͓̻̼̠̖̣̲͚̣̋͊ͦ̅͋͒ͬͫ̿ͯ͗͢Ș̡͉̮̤̩̤̬̥̤͚ͮͪ͛̃͑͐̍̄́̚͟͡T͓͎̣̟͇̘̤̯̩ͣ͑̆́̽ͯ́̄̈͘͜͢.̸̵̬̙̳̘̬̲̠̪̬͕̭̣͓̲̤̖̤͕͍̇ͭ̄̅̒̂́I̬̗̺̯͓͍̞͍̦̮̪͙̥̼̺ͣ̍̑̆̈́̈̓͂̍́͢͟'̵̧͇̠̮͕͕ͬ̃͒̀͛̿̒͋̈́̆͟ͅm̶̵̘̞͖͎̫͙̤̬̹͙̗͈̱̗̻̤͕̰̟̽̂ͯ͆ͣ̅̚ ͭ̃̅̎͊͂ͨ͒ͣ̽̂͗҉̸͖̹̱̩̟̰́̕T̵̨̛͙͍͕͔͕̩̦̒͆̈ͤ̍͆̑́͊̉ͫ́ͫ͊̀͝Ḩ̴̠̥̜̉̎̆͒͛ͣ̇͊̔ͯ̀͘Ę̴ͥ͒ͫ̄̀͟҉̝̣̖̜̻̦͍̮̲͓̪̖̜͈̰ͅ ̧̡̉̊̉ͤͤ͒̀̿͑ͬ̓̑̏̚͟͞͏̭̫̙̯̰̘͓̥̰̙͎̤̺͙B̴̰̳̹͓͙̍ͬ̅̈́͜E̵̥̙̳͈̱̝̭̘̞ͫ̒͌ͥ͋̽̒̍̇͐͊̄̏̋̈S͛ͬ̿͑ͩͯͧ̿̄ͯͬ͑̒͐͋͟҉̳̹̙T̴̵̗̫̖̞̼͓͍̦̖̜̲̮͈͊͆̇̃̆͆̿ͩ̚͠.̴̨̧͓̳̫̞̣̟ͧ͋ͬ̾͑͊ͥ̊̑̀͒̉͑͊ͨ̈̂͜͟Į̶̵̺͉̝͇͈̭͔̻̝̣̱̮͓͖̘̺̀ͨͪͧͯͦ̓́̋̓ͦͮ͒̓̌ͭ͊̑'̵̸͈͓̺͎̹͒͗͋̊́m̷̷̯̖̼͔̭̟̳̥̲̙̞̠͚̥̹̎̉ͧͭ̾͊ͨ͌͑͞ ̨̭̞̪̦̰͈̭̣̖͉̦͍̥͛͊ͯT̴̵̥̥̺̗̗͇͉̖ͣͧ̊̅͋̎̾̃͜H̆ͮ̋̍̅̆̄̍̏͑̾ͭ̍̆͌͏̬̦̪̲̳͢Eͣ͊ͪ͊̂ͫ̒̎́̚͝҉̶̥̺̮̙̞̘̣̜͔̜̟̣̝̱̕ ̶͎̹͍̿ͧ̽ͧͣ̎͆͘͢ͅḂ͗̊͐̅ͥ̏̊ͣ̐͏̷̜̫̠͚̬̯̟̗͎̠̭̦̫͖͖̮͟E̤̠̥̻̺̤̤̗͇̔̔ͫͤ̓̃ͤ͢͝S͛̓ͥͩͥ̀͊ͭͫ̋̆ͣ̂͒̌ͮͥ҉̶̸͙̣͙̠̖͈̫̱͙̝̺͍̝͍͜Ţ̛̛͙̹̗̝͍͔̘̱̟̺͕̖̘ͦ͊̽ͣ̈́͆ͭͭ͌̍.̸̧̨̬̻̟̼͛ͥ͗ͦ̉̃̎̾ͦ̀̽ͩ́͝I͇̝̭̮͇͕͓̩̱̯̦͔̼̭̝̤͔̎ͧ̓̍̾̉̓ͧ̊͞͠ͅ'̡̡͙͎̤̬͍̘̙̫͉̙̦̩̬̻͍̣̦̓ͭͯ̅̊͟͞ͅm̨̜̬̯̼̭̪͓̩̹̣̩̮̙̱͓̰̟͓̾ͧ̑̑ͩ̃̓͐̆͛͛ͮ̃ͣ̄̚̚͜͞ ̷͎̜͔͙̠͍̱̩͕͇̱̱͈̰̟̱̦̯ͯ̽͐̅̋̀͐͋ͬ̐̎̀͟T̴̸͕̯̮̺͇̲̬̖̮̺̫̈̔̿ͬ͂ͣ̀͆H̴͖͔̪͍͖͕̤͖̟͈͍͖̬̱̗ͥ̅̒ͤ͐̚͘͟Ě̇̈̉͆ͮ̒̓̓ͪ͛ͮ͋̆̆͏̸͉̝̪͖͈̱͚̫̣͉͖͕͉́͘͢ ̨̛̳͇̱̜̳̰̫̩̙̪̲͓͓̹͌͑̌͂ͤ̍̏ͩ̿ͮ̕͡͝ͅB͚̻̝̦͙͙͍̯͓̿͒̿͆ͮͦͬͯ̉ͬ̍̉ͬ͗̆̓͗̊̕͜ͅͅĘ̶̩̤͚̭̣̥͛̐̆̑͡S̢͚̗̩̦̲̻͎̬͈̞͎̩̿ͬͮͣ̑́ͫ̆͒͡͠ͅTͬ̈́ͤͯ̽̏͆̎̒̈͗͋̋̽̈̑͗̈̀͢҉͇̪̠̘͈͚.̴̶̣̣̘̙͋ͧ͗͋ͦ̂͌ͤ͗͛͌̐͋͢͞Į̴͓̝̺̘̞̣̯̫̭̜͚̣̱̔ͨ̐ͫ̌̊̑͌ͮͬ̒ͭ̚'ͥ̔͌͋ͣͬͧ̽ͧͧ̍ͨ͌͋̃̈͏̡̲̤̻̩͜m̷̧̰͔̗̗͈͉̳͓̖͐̇̌̔͑̔̈̋̅͒ͨ͑͆̐̚͘ ̷̣͙̟͖̦̮̳̹̮͎͖̲̝̪͖͚̻̻͊͒̽ͪ́ͩ̆̾̾ͬ͆̀T̶͖͉̬̟̬̮͙̺̝͓͔͓̦̙̮̼̳̍ͤ͒ͧ͐͋̽̏̕͞ͅH̷͔̩̟̼̝͖̫̤̤̮͈̬̠̰̼͍͎͈̰ͭ͑ͯ̉̄ͮ͊̾ͥͥ͑ͨͤ̚͝͞Ę̊̈͋̒̍͂ͩ̓͂͂̇̽͆̃̇͋͏̨͜͏̬̳͖̟ ̷̨̹̮̱̞̫̝̜̈͊ͦ͌͌͐ͥ̇̋B̡͈̥͖͉̪̽͋͛ͯ̔͗ͩ́Eͬ͌ͪ̐̊ͯ͗̉̇̃ͨ͏͏̵̨̫̠̜̟͚͔ͅS̎ͯ̐͛̀̍͆ͬ̓ͮ͑͂̄̑̋̓̚҉̢͚̱̦̻͇̭̱͇̩̥̻͇̗͈͈̪̫̀͢͠T̶̵̴͈̻͙̼͙̳͚̭̤̩̯̩̹͖̮̰̲͗́͆̂ͤ̌̅͡.̓ͥ̄̔̃́̐ͦͣͬ̅̌̓͏̶̗͇̻̰̞̣̳̲Į̛̱͖̍̓̋͛ͥͬ͑ͥ͐̍̿ͫ͋ͬ̉̀͛̕͜ͅ'ͨ̓͌̾̐̔͛̇͆ͨ̿͌ͬ̾̏͂͡҉̴̗̞̝̖͖̙͡͞ͅm̶͆͐ͫ̊ͥ̾̑ͩ͛̑̓̐͂̋͛̀ͦ̑҉͡͞҉͓͔͕͉̲̯̩ ̨̔ͮ̒̏̔ͣͦ̆ͯ͌̑̄ͮͨ̄̚̚͘̕҉͎̙̼̥͍̠̙̘̼̤̭T͕͎͕͙͔̣͉̠̜̱͖̼̗̲ͮ̔ͩͨ͘͠H̡̧̳̱̞̱̻̝̺̻͉̰͖̣͎̿͒ͣ͑̊̍͂̃́͞E̴̷͍̭̤͍̘̲̝͍̻̞͍͔͈̮̦̲ͬ̄ͬ̅̅ͯ́͝ͅ ̴̨̨͈̺͓̙̰̆ͮͨ̆ͥ̀̎ͬ̀͜B̶̶̩̰͈̮̰͎͍̙̱͈̫̳̘̬͕̜ͩ̓̐́͗̑̋͊ͭ̉͑͟ͅÉ̸̡̛̘̬̭̻̝ͯ̅̀̓͊ͭ̿̓̐ͦ̓ͣ̓͡S̡̭̭͓̭̣͈̲͓̬̞̥̲̠̮͌ͥ͆͛̀ͤ͛ͩ̐ͤ̍͂͛̀̕͟ͅT̨̡̳̰̬̲͕̹̎̐̈͌ͮ͛̒̏ͬ́ͤ͜.̷̎̊ͥͭ͗͝҉̠̗͚̥̦͉̼͍̥̕I̴̷̤̻̟͗̇̉̊͛̏͘͡'̓͐ͪ́͆̇̂̃̋̓҉͈̣̦̻̫̺͕̤̠͕͔̹͍͓̪̞̮͘͢m̸͔̙͇̞̳̗͓͇͓͙̙̹̙̗̓̿ͭ͊ͣ͊͞ ̹̖̣̺ͦ̔̓͒̂̋ͣͩ̅̽̊̎̿̎ͨ̀̚͜Ţ͐̒̈̍̈ͯ̓̓̉̃͏̭̻̹̣̝͖̪͎̭̞̫H̛̩̼̰͕͓̠͚̟̺͍̬̬̣̣̼͖ͤͤͧͤͮͯ̒͝Ẻ̛͛͒ͨ̽̔̄͌͂ͯ̌͗̈ͮ̔̌͂́҉̢̠̺̮͈͙̯ ̸̧̥̦͕͙̄̉̄͆̏͛ͭ̀̓͆ͥͮͦ̌͆̓̂̚̚͘B̶̾̌̅̂̂ͣͣ̃̾͒͊͌̄ͤ͌͆͛̓͌́̕҉҉̙͎̝̘̬̞Ě̯̱̳͇͕̼̣̲̗͗̋ͨ̐ͤͨ̄̆͆̃̊̏̆ͮ̚̕͡͝͡͞S̏̂̍ͭ͌͆ͭͤ̀҉͔͚̭̳̠͇̩̮̭̩͓̲̳̘ͅT̶̳͕̲̹̼ͣ̃̂͑̃̎ͫͤͧ͑͊̒͊͛̈́̔͝.̺̝̠̰̯͓̥͇̠̗̽̇̎͂̇̄ͤ̎ͪ̋ͦ͌̎̇͜͢I̦̮̳̯̹̙̰̺͔͍̙̣͖̩͙ͨ̓ͨ͆̃̃̾͡ͅ'̢̛̭̜͇̭̩͑ͯ͊ͣ̔͒̾ͨ̃͊̓͒̋̑͊͘͟͠m̡̧̮̟͔̺̳̞̼̜̤̲̲̠̜̬͓͙̥̱̆͑̎͗̅ͫ̿͗ͯ̉̈́ͨ̈̈́ͤ̋ ̸͙͔̝̟̝͓̰̹͓̮̌̅̃̂̂͘T̴̨̙͙̩̬̪͓̠̟̝͛̈́͆͐̑͒ͧ̾͆̇ͤ͒̽̒ͤͭ̅͂̀ͅHͮ͂̑͏͉̫̺̙͖̠͉͙̘̩͍̙̘̥͠ͅE̴̢ͭ̊̏ͮ͌̃̇͋́͏̘̪͓̰͉̺̞̭̙͇͓ͅ ̶ͦ̅̏̑ͦ̿͂͒̽͝҉̤͉̟͚̟̫̩͓̫̬͉̖͔̙͔̮̩̼͖B̳̙͇̩̯̩̙̯̘ͤͧͤ̔̍͊̄̉̐̆̀̈̆̓̌̅͗̂̓̀Ȩ̧̢̟̫̰͎̭͍̠͕͙ͧ͊͛̄ͧͯ̋̋̑͟S̸̢̧̺͔͕̲̼̩̪̯̠̩͔̣̬̰ͦ͒̅̊T̵̪͔̱̪͓̰̖̘̞͂̿͌̓̐̍͐̑͊ͤ̚͘.̵̜͇̠̜̞̮̜̏̊ͬͦ̎̍ͧ́̇ͫ̀̎ͧ̏ͣ̎͟Ï͇͕̼̖̳͈̫͓͕̖̲͐̌̑ͨ͂ͥ͑̽ͦͦ͑̍̈ͭ̉́̕͡'̴̵̡̬̙̠͖͖̅̅͗͐̏͋ͤ̏̐̌m̸̶͇̤̘̟͖̰̜̪͔̪̗̰̥͉̱̞̓ͪ̃̓͌͒́̔ͣ̿͆ͩ͌̂̐̊̄ͮͅ ̵̡̨̫̬͔̯̃͛ͣ̐͊̈̕͢Tͥͦ̄͆ͨͭ͋ͣ͒̍͂̚҉̷͘҉̥͇̠̳͈̝̪̝̪̤̥̲̦̹͜H̷̴̏̆̐̈҉̳̗̬̬̜͜͜ͅE̛͈̝̲̯͖̣͎̼̲̽͛ͧ͛̒̔̀̂ͭͧ͂͊̓ͣ́͞ ̭͍̠̖̩̯̞̼͕̺͔̙̻̟ͨ͆̀̆͆̾̅ͧ̀̇̾͊̍ͪ̓ͨ̋̊̓͜Ḇ̵̩̮̥̟͔̻̌̿̍̿̓̀̓̑ͩ̉̾̕̕͜Ȩ̞͚̖͇̭̦̗ͬ̎ͮ̊̆̂͐͒͛ͥͥ̿͗ͩSͨ̑̾̓̓̅̏̄̋͋́̍̎̽͌̓̓̚͜҉̵̯̹̯̻̹̫̦̳̻̫̣͖͉͔̫̦̀͘T̹̣͉̭̠͎̤̥̜̝͕͖̖̃ͫ̽̋ͯ͐͊̇̾ͧͮͬ̽̀̈́̍̽̀͟ͅ.͛͒͒͛̑̊̽͊ͨ͌ͭ̚͏̛͖͚̦̰̦̟̲̻͔̭̣͇̜̻̮͇̀ͅͅĨ̴̧̱̮̤͖̲̝̰̜͔̝̗̳̺̺͎̉ͨ͌̽̈́̎ͧͫ̆̀ͅͅͅ'ͩ̓̆̄ͯ͊̃̐ͩ̒͆̊̚҉͏̗̳̥͉̘͔̺̣̯̣̟̯̝̞͘͟͡ṁ̸̨͇̞̺̖͔̟̺̗̎͂̂ͥ͂ͪ̂͗́̈ͯ ̶̡̺̗̮͎̌̏̀̆̓͂̒̏̉ͫ̍ͬͯͧ̊ͥ̚̚͜͝͝T̵͖̳͉̰̠̪ͨ̏ͫͧͪͧͯͧ͋̉́̕͜Ḧ̴̬̟͙̥̩͚́͋ͩͦ̄̉̓̾͂͌̄͋̾͒͛͐ͮͨ̋ͅĘ̛̛͙̣̖̟͔̘̰̥̋ͤ͆͊͗̾͌̔̇ͣ̅̆ͧ͆̀͞ ̸̷̧̭̹̯̮͍͎̤̖̠̹͔͓ͮͤͣ̒̊̌ͣͮ̐ͭ̐̈́̆̿̅ͥ͢͞B̨̥̰̱̭̜̗̳̘̙̝͓̻͓̫̯̤̫̘̉͋̓ͭ̈̈́̐̈̈ͮͮ́Ę̶̝͓̘̯ͤ̆ͥͯ͛ͮ̃͆̃̃̌̂̿ͫͨͩͥ͡S̵̳̰͓͇̠̰̃̊̿ͫ͘͟͝Ţ̸̴̙̬̥̳̲͕͈̺̰͕ͫ͊ͯ͐̑̑̎ͪͦ̊ͥͬ́͂͗̈ͬͦ͗͟.̵̡̺̹̜͈͙̟̰̹͙̜͇̠̦̣͈̝̔ͨ̓͂̌ͤͪ̀͟͜I̴̱̤͙͎̝͚͗͊̆ͤ͌͛'̣̦̤̩̳̩͈̭̰̓ͥ́̌̉̉̔͐̈́͆͗͐̚͢͞m̶̛̪͖̜̤̙͓̥͓͖̜̞̦̥̑̊̐͋̓̄̉ͩ͐̓ͤ̉ͯͣ͊ͯ̉́ͅ ̨͕̯͖̗̠̮̯̻̤̥̭̲̽́̿ͤ̒̍ͣ̄ͣ̄ͭ̍̐͗̏ͪͫ͠͠ͅT̷̛͙̼͕̖̳͍̼̳̘͍̩̤̩͈͇̣̗̊̾͛̎͋̃̈́ͭ͞H̛̺̳̣̙̩͖̥͈̳̜̯͇̒͑̎̎̑̒ͬ̐̌ͣ͟͡E̼͔̥̪̩̠͙̤̻̻͓ͣͦ̅̂ͤ̿̏ͩ̎̀̕ ̜̱̤̘̳̦͚̘͉̩͕͍̻̓ͪ̇̆̃̓͛̏̀͝B̧̢̗͔͖͙̖͖̰͔̖͍̜̻̦̲̩̻͙̥͒̍͒̇̋͛͋ͩ͑̓ͯ̍̚ͅĒ̴̛̟̘̟̖̠̖̙̗͒ͫ̔̏S̳̱͍͕̀͆̈̎́́̕͘T̡͖̞̱͇͕̦͙̭̤̏̃̄́̀ͯ͂ͭ̑ͥ̓̈́͆̓̾ͦ̚͢ͅ.̵̸̸̛̒͛͂̇̓̿̊ͨ͏̙̬̤̹̩͔̤͖̰̱̝͚̼̮̥͖͚Ȉ̡ͤ͊ͤ̑̆͊ͪ̈̀͏͈̺̩̣͎̗̫̗́'̸̧̢̧̣͚͔̪̱̩͖̣̖̖̙̙̥̤̙̪͚͗̂̾̔̑ͤ͛̇̃̏͂ͮm̢̡͍͍̼͕̝̥ͣ̍ͪ͋͛͊̓̌ͫ̊͂̐͝ ̸͚̭̩̮̽ͤ͋̅̏̽̈́ͮͨͭ̚̚͝Ţ͓̙̭̲͎̠̰̙̯̝͕̋ͮ̔ͥ̿̀̔̾̔̔̓͐̓͋͊ͣ̾͟H̷̛ͤ͗͛ͦ̀͘͏͉͔̝̯E̩̞̩͎̼͇͐ͨͣͮ̒̈́́ͯ̒̂̋̉ͣͭ̂́̔̀̀͠ ̢̡̢͓̲͓̳̰̯̣̳̫̥͍̙̞̲̳̙̲̠͉̇͂̾ͩ̅͗ͨ̐̓́̚Ḇ̧̠̤̙̟̰̱͇͓̳͉̭̘̭̘̤̇̑̃̓̈̔̌̂̀̊̔͊̾ͣ͋̇̆͗̀͞͞Ȩ̶̟̬̥̼̹̟̭͓̟͖͉̮̖̍̇͌͐̀͛̇̐ͬ̇S̴̜̟͉̞̰͉͉̮͓͉̹͕̬̱̿ͩ͛ͯ́̚T̸̨̠̺͚̩̬͒̾̃̋́ͮ͗̓̈́ͧ̊̍ͪͥͭ̈́́͢͢.̵̛͕͔̘̥̣̜̺̗̻̺͈͇͛̉͂̈́ͩͦ̋̃͟͟͡Į̶̷̖͇̭̻͙͐̃ͪ̋͗͂ͥ̈̋'̒͗ͣ̂̾̍ͫ̒̈́̚҉̨̩̙̙̝̬̞̘̫̗̜͙̙ͅͅm̛̯̻̭͙̣̦͇̫̬̭͎̫̯͎̹̆͋̎͌ͪͫ͐̒̓͟͟ͅ ͖͉͇̳̟̖̯͗͂̍̿̾̉̇̅ͥͣ̃ͨ̈́͂͌̐̚̚͞͡ͅͅŢ̞͈̖̼̥̲̥̞̰͗̃ͪ̇̏̀̔ͬ͂͝ͅH̷̨̍͂̌ͨͥ̓҉̵̙͇̰͓̮̭̤ͅȨ̲̙̘̖͓͕̝̟̙̘̺ͨͨ̎̏͗͑̎͢͢͜͠ ̸̨̨̛̭̻͙̘̻̣̼̮̣̳̣̭ͦ̈́ͮͫ̑ͮ͑͑̑͊ͤͭ̒ͨ̀ͅB̴̞͚͚̫̝̟̪̣̯̳̲͖̲̞͐̓ͬͭ̔̉͡E̜̞̲̘̣̺͓̣̘̬̪̱̟̯̗̦̥ͧ̀̇ͪͧ̆̉́̓ͪ͌͘͡ͅS͙̜̠̠͎̺͇̍ͭ͆͒́̑͗ͫ́͜T̛̠̥̺̩͈ͣ̊̉ͫ̽̎̂͌ͧ͑̇̏ͣ̃̄̔ͥ̀̍̀̕͘.̴̛͙̗͙̦͙̤͓͚̒́̈́̃̊͒̈̐̌̉ͥͤ̔ͪͣ̉̉̀͠I̴͙̩̮̺̮̺̘͗̏͛̓̕'̸̸̧̜͚͈̗̭̬̰̯̩͈͂̆ͣ͒̽̀̿ͦͣ̑m̢̛͖͍̹͈̩̥͈̤̼̫̠͖͕̠̄ͦ͂͆͌̌͒͋͆͋́̋̋̍ͭͣ͐̀̕ͅ ͆̽͗͑̇̌ͥ̿ͮ͒̿͞͠͏̫̪̮̥̱̲T̸̢͓͇͉̪̰̝̣̭͚͙͔̿ͮ͋͒̏͛̏̽́̈̓̃̍̂̆ͧͅH̨̨͚̖̟͎̝̯̲̦̞̭̯̪͇ͩ͌́̐͂̐͛̿ͮ͌ͫ̅́͊̅́͠Ě̵̬͇̻̰̜̪͔͕̇̀͋͜͡͞͠ ̛̪̪̙͇͇̺ͬ̿ͪ͑͛̇̏͒͋͒̿͐̈̈́͊͌̇͒̕͟͠Bͫͭͨ͋̎̉ͨ̉̅͒ͮ̿̉͋ͬ̂̚͏̬̣̫̱͚̗̙̣̣̻̣͙́ͅE̡̧̡̧̤̥̳͉̳̬̳̫ͥ̉ͭ̂̊ͪ̄ͦ͑͆̑̅͌̃̇ͩ̀ͅS̛͔͕̮͈͎̰̹͚̙̯̙̹̼ͨ͑͛̒ͤ̚͞͝͝͞T̵̷̠̱͙̮̩͙̰̙͙̬̮͙̘͖̰͇̠̓ͣ̉͛̏̊̿ͤ̔̓ͦ̌͡.ͮ̌ͮ̌́ͨ̽ͪ̇ͦ̓͋̃́̍̒͌̚͟҉̫̹̝̭̩̲͍̟͓̜̠̼̝͖͔̹͖̪̤I̻̜̙͍̰̱̼͈͇̘̯̙͋͆̔̋̈ͣ̇ͨ̍̎́͆ͫͩ͝͡ͅͅ'͑̇͆ͦ̇ͤ̔̓̏ͩͦ͋̈́ͩ̂͜͝҉̱̘̠̠͙̕͡m͕͍̞̼̙͔̳̮̜̥͙̳̑͐̾̀̐ͤ̏̂ͤͮͯ̐ͯ̏͜ͅ ̷̢̘̥̲̻̮̫̝̟ͮ̊͂̅ͫ͐̉̓ͥ̍ͩ̄̈́͂ͮ̑͗ͅṮ̳̜̳̳̝̙̘̱̭̠̖͕̫̓͑͋ͪ͂̓ͯ̌̋̆̕͟͜H̶̪͍̰̖͓̼͔̜̭̳̻̯͚̋͋͒̆̈͊̆ͭ̀͜E̵̻̝͇̠͔̣̭̩̥̭̊̒̿ͫͫ̀͡ ̨̩͈̞͖̳̬͍̯̱̩́̾̇̿ͫ̑ͮͥ͆̈ͮ̊̓͟ͅͅḂ̵̸̷̢̠̥̰̰̤̣̩̯̜͍̙͈̗̠̪̘̫̏ͣ͋̽͗ͮͪ̑ͣͦ͊̀̌ͩͣȄ̸̤̱̮̝̼̰͖̗̲̘̰̹͔̰̂ͥͨ͑͛̽̾̾̉͂̒́́̀͜ͅͅS̵̴̤̦̬̲͈̰͉̫͈͍̟̞̻̘̳̻̒̽̍̑̇̑̓̚͞ͅT̛͔̺̮͉̙͌͌ͥ̎̃̾̍̔̿̀.̨̅ͧ̒̅ͭ̅̈̈́͂ͯ̎̈́̇ͣ̚҉̴̧̣͇̦͉̣̥̻̫͚̹ͅI̵̢̽̊͐̐͛̉̍ͧ́͘͏͚͔͚͚͇̗͙͕̱'̨͕͚͕̪͕͕̦̭̺͕̠͔̣̝̲͉̓͆̍̒̔ͦͭ̍̓̓̄̀̐͑̃̌̚͠͡mͭ͊̉ͫ͆̑̏̓̉͌͘͏̪̥̼͙͈͉̜̙̬̙̝͔ͅ ̡ͬ̇ͯ̀̾͆͒ͣ̈́͋̎͗̊̇͛̽̈́͂͏̲̭̖̳̰͎̫̺͕̼̼̤̭̝T̏̊̀̓̈̅̅ͤͩͥ̑ͣͫͤ͌̈́́͠͝҉̢͓̤͓̼̖̜͉̝͇͕ͅH͓̬̟̼̪ͫ̉̇̒̂͂̓ͮͫ͒̑̔̿̈̍́͝E̡̡̡̪̲̹͋ͥͨ̊́͑̒͂̈́͋̋̿ͤ͛ͅ ̴̸̸͖̣̼͍̠͖̘̏̎̃̽̽ͬ͗̊͊̂̇͂̕͜B̸̛̖̫̘̟̺͎̙̹͙͍̐ͭ͌ͤ̉̄ͭ̒͑̐̈͒ͪ̇̒ͩ̔̏̒̀̕͜ͅE̶̷̘̦̼̩̥̰̼ͭ̈́̇ͤ́͊̓̾̆̌̿̈́ͤͣ̀͘͠ͅͅS̛̙̼̦͕̮͉̭͖̙̰̖̜̆ͪͭͪ̄ͬ̆͆̽̉̍͌̀̉͞T̵̨̼̞̝̟͓̭̠̣͓̣̀ͫ͂́͋̽ͬ́ͧ̂͂.̢̧̨̪̹̙̟̱͎͖̣̹̲̤͓͈̼̔ͪ̃͊͌̏̋͋ͦ͞ͅͅI͐̀̋̆̚͏̳̱̪̯͍͕̰̰̬͟'̧̼̠̗̫͔̂̾̊̒̂̽̈͊̆̎͊ͧͥ̉͝m̷̢͔͔̰̭̼̱̙̳̱͐̉̇̀ ̍ͩ̎͆ͨͪ͑̽ͣͦ̍͠͏̻̪͍͙̬̗̱̮̳̜̪̕͢Ţ͚̰̦̯͎̼̩̲̬̪͎̖̟̦̬̪̝̭̂̓̌̔͊̓͒͂̌̄̎ͮ̋̎ͩͩͩ̕͘͝H̵̨̱͓͙͙͙̩͖̖͕̬͇̍̈́ͩ̋̚͘͟͝È̢̡̻͎͎̩̭̭̬̠̜̱̄̉ͥ̀͐́̕͡ͅͅ ̸̷̖͎̗̝̘͔̙̱̲͓͆͒ͭ͌͌̌̊̂́͊̓͆̀̚̕͟͝B̵̢̟̬̩͎̳̻̙̻͎̞̰̲̤̅̅ͯ̚͜E̵̥̘͎̦̙͈̱̝̹̮̣͈̅ͤͫ̾ͤ͊̊̓ͬ͐ͯ̾̐͆̈̃ͪ̕ͅŞ̨̡̭͔̤̪̳̱͇̻͇͕͚̗͉̜̼͈̖̘̾̐̍̓́̉ͣ̏ͨ͂͞T̷̶̛̲͎͎͍͍̻̈́̅̓̇͗ͥͩ̄̇́ͭ̿ͬͬ̅̈́̂̋́͝.̴̨̻͚͕͇̳̙ͤ̈́ͤ̔̄͊̇̃̂̅̅͗ͤ̉ͪ̿̊̀͘͟Ĭ̴̸̛̹̪͇͈̥̜͎̹̝̏ͯ͆͂ͣ̀͆̌̓̉ͮͨ̄ͯ̓ͯ͠͡'̸̟͚̩̺͎͊͂ͫͫ̋̋͆̓̉̅̄̇͐̍͐͌͐̎̀̚ͅͅm̸̡̱͇͎͕͚̣̭͔̥͈ͯ͌̉̕͘ ͊̅ͨ̎̎͗̇̑͗͝͏̞͔͔̫̯̪͔̥̻͈̼̙͉̻͘͢Ť̢̼̰͖̋͒ͪ̓͛̀ͣͯͮ̈́̇́̏͋ͣH̹̭̭͙͖̱̞͓͉͌͛̀ͥ̀͡ͅẸ̴̴͖̣̩͓͚̳̝͎̙͕͈̅̋̔̑̃̇̄͢ ̴͈̲̗̘̬̘̫͚̰͔̭̳͉̫͊́ͩ̌͊̄̂̚͘B̷̫̱̪̯̟̙̔ͤ̉̎̽̑ͮ͗ͤͮͪ̎̂ͮ̄ͤ͢͡E͐ͫ͊ͩ͌͊ͧ͟͢͏͖̬̯̲̜S͊́̓́̌ͯ̃̋̓ͥ͋ͣ̏ͭͤ̀̽͒͡͏̟̜̞̥͝T̴̢̻͖̠̖̬̟͕̝̬͖̪̘̣̠̟͙̈́͛̉̑̆͐͝ͅ.̸̴̖̱̼͚̞̥̠͇͇͌́̅̇̍̏̐̅̂ͮ̈̆́̍͌̚Iͥ̽̉҉̸̴̘̹̞͎̤͓̩͚̬̺͎̲͘'̢̣̭͎̹͓̠͍͙̻̫͙̝̣̦͐ͥ́͆̌̓ͪͪͥ͂̋̾ͭ̿ͯ̐͑̚̕ͅm̬̜͈̩̰̘ͯ̂̐̌̂ͣ̾̾͋ͬ̉̌͛̇ͣ̓ͧ̑͘͢ ̴̷̰͙̺̙̳̙̳̗̖͙̬̼͈͇̜̎̃ͪ̾̃̏̽ͯͭ̊ͪ̈̊́͟͠T̨̨̝̻̮̙͖͔͕̖̱̟̹͍͐̔͋͢ͅH͎̜̗̜̺̲̣̰̄̋ͭͥ̎̔ͧ͂͊̅̌ͭͮ͜͜Eͨ͒ͫ̔҉̴̖̠͙̤̘̥̲̗ͅ ̷̧͓̫͙͈̦̖̟̟̘̯͇͈̉ͪ̒ͪ̍́̏̌ͫ͗ͦ͂͒ͯ̊̆̍B̧͕̦̳͕̖̯͖͍̱͇̹͓̹̥̫ͫ͌ͯ͛̓͂̃̈ͦͦ̆ͤE̶̡ͯ̄̾̒̾ͣͧ̂̔̇̐̊ͥͨ̋̑̌ͦͮ͠͏̯̖̩͎͚͓̹͖̜̖̺̯̗̟̻͝S̸̶̮̮̥͈̲͔̘̦ͮ̎̑̉̂̾̀̚͢͝ͅT̵̘̩̥̣͉̩͚̭̺̮̘̠̳͖̳ͧ̄̔̋͋ͨ̔͂ͣ̊ͮ̍̊ͤͮ̋̽̚͝.




....
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Ich habe da dein ecodedLength in Verdacht. Versuch mal bitte das hier:
Code:
if (count == 1)
{
    k = printf(...);
}
else
{
    k = printf(...);
}

encodedLength += k;
Zum Wegschreiben in den String:
Ich würde es nicht in den Eingabestring schreiben, sondern in einen neuen String. Dazu musst du innerhalb der Funktion dynamisch einen String mittels malloc erzeugen (später mit free wieder freigeben, sonst gibt es Speicherlöcher). Problematisch ist die Länge des Strings, die weißt du vorher nicht. Ich habe jetzt mal gesagt, neue Länge gleich alte Länge, da der kodierte String im schlimmsten Fall gleich dem Eingabestring ist (jeder Buchstabe kommt 1x vor, bspw. ABABABAB => ABABABAB). Das funktioniert nur, da du nicht 1A1B1A... schreibst (dann müsstest du neue Länge = 2x alte Länge sagen). Der neue String ist in der Regel eigentlich zu groß, aber du müsstest sonst erst die tatsächliche Länge bestimmen, den String mit dieser Länge erzeugen und dann noch einmal die eigentliche Kodierung durchführen. Oder halt einen Datentyp bauen, der sich dynamisch vergrößert, was allerdings jetzt dann doch Overkill wäre ;-)

Code:
// Länge des Eingabestrings
int len = getLength(s);

// Speicher für Ausgabestring anlegen (Nullzeichen am Ende nicht vergessen, daher len + 1)
char *enc = (char*) malloc((len + 1) * sizeof(char));
int newlen = 0; // neue Länge

// String mit 0 initialisieren (für memset string.h includen oder halt selber schreiben)
memset(enc, '\0', (len + 1) * sizeof(char));

// ...

// beim Kodieren (in den Ausgabestring schreiben)
if (count == 1)
    k = sprintf((enc + newlen), "%c", s[i]);
else
    k = sprintf((enc + newlen), "%d%c", count, s[i]);

newlen += k;


// Kodierfunktion
// in: Zeiger auf den Eingabestring
// out: Zeiger auf den Zeiger für den Ausgabestring
// return: Länge des kodierten Strings
int rle_encode(const char *in, char **out)
{
    // ... siehe oben ...

    // Ausgabestring setzen
    *out = enc;

    return newlen;
}


// in der main

const char *s = "AAABBBBCCCCCCDDD";
int len;
char *enc;

// String kodieren, Ergebnis steht in enc
len = rle_encode(s, &enc);

// Ausgabe
printf("%d: %s\n", len, enc);

// Speicher freigeben
free(enc);
Sollte so in etwa funktionieren. Du musst evtl. noch ein paar Fehlerfälle abfangen (kein Speicher für malloc frei, NULL-Zeiger, etc.).
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Code:
struct dynStr {
    char *s;
    void add(char *a) {
        char *tmp = malloc(genug speicher für s+a);
        tmp = s und a zusammen;
        this->s = tmp;
        free(tmp);
    }
};
könnt das was sein? jetzt auf die schnelle nur prototypisch/pseudocode aber ich hoffe, man erkennt was ich meine ><
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Code:
struct dynStr {
    char *s;
    void add(char *a) {
        char *tmp = malloc(genug speicher für s+a);
        tmp = s und a zusammen;
        this->s = tmp;
        [B]free(tmp);[/B] // naja, den Speicher brauchst du ja noch ;-) du musst s erst in tmp kopieren und dann s freigeben
    }
};
könnt das was sein? jetzt auf die schnelle nur prototypisch/pseudocode aber ich hoffe, man erkennt was ich meine ><
Ja, genau sowas in der Art meinte ich. Nur funktioniert das so in C nicht, da ein struct in C keine Methoden haben kann (geht nur in C++, da ein struct dort eigentlich ne Klasse mit public-by-default Zugriff ist).
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

ah ok, das das nur bei c++ so is wusst ich garnich ^^
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Hi all!

Sorry für die späte Rückmeldung. Bin gerade im Urlaub und habe nur mein iPad mit. Kann erst an Mi Abend wieder programmieren. Trotzdem schon mal danke für die Lösungsvorschläge. Diese sehen z.T. für mich als C Einsteiger doch etwas kompliziert aus; muss erst schauen, oh ich damit zusammenkomme ... :)

PS: Die Kompression in einem neuen string zu speichern, wäre auch meine Idee gewesen, allerdings verbietet das die Angabe! Es darf im gesamten Beispiel nur mit *s gearbeitet werden. Deswegen muss ich auch meine Lsg. an diese strengen Vorgaben anpassen.
 
Zuletzt bearbeitet:
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

wurde doch auch nur mit char* gearbeitet ^^ nur weil die struktur dynStr heisst liegt da ja kein string dahinter ^^ oder was meintest du jetz genau? im endeffekt brauchst die strcut au ned (wenn das in der form c++ is) und bastelst einfach statt der struct methode ne globale funktion mit der selben aufgabe. hmm, zum bsp combineChars(&s, add) oder so ^^ oder s = combineChars(s, add). möglichkeiten gibts ja :)
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Weiteres Beispiel ...

Am Ende soll das Programm die Häufigkeit einzelner Buchstaben in einem Satz ermitteln und dieser soll der main übergeben werden. Außerdem soll die Anzahl aller Buchstaben gezählt werden. Mit Letzterem hätte ich einmal angefangen:
Code:
#include <stdio.h>

int checkLength(char *s) {
    int length=0;

    while (*(s+length) != '\0') {
        length++;
    }
    return length;
}

void count(char *s) {
    int i=0, counter=0, length=checkLength(s);

    while (i != length) {
        if (i >= 'A' && i <= 'Z') {
            counter=i-65;
        } 
        if (i >= 'a' && i <= 'z') {
            counter=i-97;
        }
        if (counter >= 0 && counter <= 25) {
            counter++;
        }
        i++;
    }

    printf("Character count: %d (100 %%)\n", counter);
}

/*int main(int argc, char *argv[]) {*/
int main(void) {
    /*char *s = argv[1];*/

    /*if (argc > 2) {
        printf("Invalid input!\n");
    }*/

    char *s = "Mal sehen was die Haeufigkeitsanalyse dieses Textes ergibt!? Ich denke, dass 'e' wohl wirklich der haeufigste Buchstabe sein wird!";
    count(s);

    return 0;
}
Wieso kommt der Code allerdings auf 26, statt 106?

PS: Laut Angabe muss das übrigens so gemacht werden, dass man alles so umrechnet, bis man im Bereich von 0 - 25 angelangt ist. So soll das Programm angeblich leichter umzusetzen sein.
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

hmm, bei der count function sieht mir das ebbes schräg aus ^^

du gehst also den "string" zeichen für zeichen durch und versuchst herauszufinden, um welches zeichen es sich gerade handelt. dabei gehts dir nich um groß/klein schreibung, A und a sind das selbe. so, jetz speicherst du den "index" des buchstaben in counter (ascii-wert - ascii-wert von a -> a somit 0 und z = 25) um diesen index dann mit der anzahl zu überschrieben? ^^

also die anzahl der buchstaben im string ist ja dein lenght(s) - die kannste ja schonma ausgeben. da sollte dann die 106 rauskommen (sofern das die länge is). und bei dem rest... ich würde einfach nen int-array mit 27 elementen basteln, alle mit 0 initialisieren und je nach index des buchstaben das entsprechende element incrementieren. am ende dann nochma die ganze liste (äh array) durchgehn und alle buchstaben mit vorkommen >0 auflisten. alles was nich a-z is fällt als "sonderzeichen" ab und wird im letzten element gespeichert. da du die länge kennst, kannst du nun also auch ne prozentangabe ausgeben, zu wieviel prozent ein buchstabe im string vorhanden ist.

edit: leider nur teils grob gebastelt, aber so in etwa stell ichs mir vor
Code:
#include <stdio.h>

int ChrCount[27];

int checkLength(char *s) {
    int length=0;

    while (*(s+length) != '\0') {
        length++;
    }
    return length;
}

int count(char *s) {
    int i=0, chrIndex=0, length=checkLength(s);

    while (i != length) {
        if (s[i] >= 'A' && s[i] <= 'Z') {       // mit s[i] meine ich zugriff auf das zeichen von s an stelle i - hoffe das geht so überhaupt ><
            chrIndex = (int)s[i] - 65;          // joa, un dass soll bedeuten, dass der buchstabe in sein ascii-pendant umgewandelt wird ^^ - scheint sogar zu stimmen
        } else if (s[i] >= 'a' && s[i] <= 'z') {
            chrIndex = (int)s[i] - 97;
        } else {
            chrIndex = (int)s[i];
        }

        if (chrIndex >= 0 && chrIndex <= 25) {
            ChrCount[chrIndex]++;
        } else {
            ChrCount[26]++;
        }

        i++;
    }

    return length;
    //printf("Character count: %d (100 %%)\n", counter);
}

//int main(int argc, char *argv[]) {
int main(void) {
    //char *s = argv[1];

    /*if (argc > 2) {
        printf("Invalid input!\n");
    }*/

    // ChrCount-array initialisieren
    int i;
    for(i = 0; i < 27; i++) {
        ChrCount[i] = 0;
    }

    int lng;
    char *s = "Mal sehen was die Haeufigkeitsanalyse dieses Textes ergibt!? Ich denke, dass 'e' wohl wirklich der haeufigste Buchstabe sein wird!";
    lng = count(s);

    printf("Character count: %d (100 %%)\n", lng);
    float percent;
    for(i = 0; i < 27; i++) {
        if(ChrCount[i] > 0) {
            percent = 100 * ChrCount[i] / lng;
            printf("Character %c: %d times (%5.2f % of text)", i, ChrCount[i], percent);
        }
    }

    return 0;
}
 
Zuletzt bearbeitet:
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

Als erstes will ich mal nur die richtige Anzahl an Buchstaben ausgegeben haben, den Rest überlege ich mir danach ...

Wenn ich einfach length ausgebe, wie du vorgeschlagen hast, dann käme 130 raus, was der Gesamtlänge (inkl. Sonderzeichen) entspricht. Das soll's ja auch nicht sein.
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

hab grad nochwas draneditiert ^^ du willst also also nur die anzahl der a/A-z/Z's haben? also bei "abc.." statt 5 ne 3? da ich in meinem bsp ja die anzahl der sonderzeichen in ChrCount[26] gespeichert hab, könntest du dann also ganz einfach lng-ChrCount[26] machen dafür.
 
AW: [C] Hilfe beim Programmieren und Verständnis-Fragen zu Code-Beispielen ...

du willst also also nur die anzahl der a/A-z/Z's haben?
Ja, für's erste ...

Abgesehen davon, dass man deinen Code gar nicht debuggen kann, hätte ich das auch schon so ausprobiert, nur eben in der Pointer-Variante:
Code:
#include <stdio.h>

int checkLength(char *s) {
    int length=0;

    while (*(s+length) != '\0') {
        length++;
    }
    return length;
}

[COLOR=royalblue]void count(char *s) {
    int i=0, counter=0, length=checkLength(s);
 [COLOR=royalblue]     while (i != length) {
        if ([B]*(s+i)[/B] >= 'A' && [B]*(s+i)[/B] <= 'Z') {
            counter=[B](int)*(s+i)[/B]-65;
        } 
        if ([B]*(s+i)[/B] >= 'a' && [B]*(s+i)[/B] <= 'z') {
            counter=[B](int)*(s+i)[/B]-97;
        }
        if (counter >= 0 && counter <= 25) {
            counter++;
        }
        i++;
    }
 [COLOR=royalblue]     printf("Character count: %d (100 %%)\n", counter);
}
/*int main(int argc, char *argv[]) {*/
int main(void) {
    /*char *s = argv[1];*/

    /*if (argc > 2) {
        printf("Invalid input!\n");
    }*/

    char *s = "Mal sehen was die Haeufigkeitsanalyse dieses Textes ergibt!? Ich denke, dass 'e' wohl wirklich der haeufigste Buchstabe sein wird!";
    count(s);

    return 0;
}
Da kommt der Code dann aber nur auf 5 Buchstaben, statt 106 ... :ugly:
 
Zurück