j2 docs
This commit is contained in:
40
j2-Baulwuerfe/README.md
Normal file
40
j2-Baulwuerfe/README.md
Normal file
@ -0,0 +1,40 @@
|
||||
# Verwendung
|
||||
|
||||
Als Argument nimmt das Programm beliebig viele Dateipfade mit Maulwurfkarten an.<br>
|
||||
z. B. `./j2 beispieldaten/karte0.txt beispieldaten/karte1.txt`<br>
|
||||
Als Ausgabe erhält man:
|
||||
```
|
||||
beispieldaten/karte0.txt: 3
|
||||
beispieldaten/karte1.txt: 37
|
||||
```
|
||||
|
||||
# Funktionsweise
|
||||
|
||||
Mein Programm verwendet eine for-Schleife, die über Zeilen iteriert.<br>
|
||||
` for(char *i = textRest; (uintptr_t)i <= (uintptr_t)textRest + ((height - 4) * (width + 1)); i += width + 1) {`<br>
|
||||
Für das Iterieren über die einzelen Zeichen verwende ich wieder eine for-Schleife.<br>
|
||||
` for(char *j = i; (uintptr_t)j < (uintptr_t)i + width - 1; ++j) {`<br>
|
||||
Um zu überprüfen, ob die vierer Zeilen eines Baulwurfhügel existieren habe ich eine Funktion geschrieben.
|
||||
```
|
||||
bool checkRow(char *row) {
|
||||
for(uint8_t i = 0; i < 4; ++i) {
|
||||
if(row[i * (width + 1)] == keinBaulwurfhuegel) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
```
|
||||
Diese Funktion wird zweimal aufgerufen.<br>
|
||||
`checkRow(j) && checkRow(j + 2)`<br>
|
||||
Außerdem wird überprüft, ob in der Mitte oben und unten Maulwurfshügel vorhanden sind.<br>
|
||||
`j[1] == baulwurfhuegel && j[1 + 3 * (width + 1)] == baulwurfhuegel && j[1 + 2 * (width +1)] == keinBaulwurfhuegel && j[1 + (width + 1)] == keinBaulwurfhuegel;`<br>
|
||||
Wenn die Maulwurfshügelfomration vorhanden ist, dann wird ein Counter um eins erhöht.
|
||||
Nachdem die for-Schleifen fertig gelaufen sind wird die Anzahl der Baulwurfhügel ausgegeben.
|
||||
|
||||
# Beispiel
|
||||
|
||||
Als Beispiel schauen wir uns mal `karte0.txt` an.
|
||||
An der ersten Position oben links wird gleich ein Baulwurfshügel erkannt und gezählt.
|
||||
Danach wird Zeichen für Zeichen und Zeile für Zeile auf Baulwurfshügel überprüft.
|
||||
Es wird erst wieder in Zeile 2, Zeichen 12 ein Baulwurfshügel gezählt sowie in Zeile 3, Zeichen 14.
|
||||
Schließlich wird das Ergebnis ausgegeben.<br>
|
||||
`beispieldaten/karte0.txt: 3`
|
||||
BIN
j2-Baulwuerfe/j2
BIN
j2-Baulwuerfe/j2
Binary file not shown.
@ -5,17 +5,18 @@
|
||||
#include <stdint.h>
|
||||
#include <acl/file.h>
|
||||
|
||||
enum baulwurfhuegel{baulwurfhuegel = 'X', keinBaulwurfhuegel = ' '};
|
||||
enum baulwurfhuegel{baulwurfhuegel = 'X', keinBaulwurfhuegel = ' '}; // enums um die Lesbarkeit zu verbessern.
|
||||
|
||||
int width, height;
|
||||
|
||||
void pointerCheck(void *pointer) {
|
||||
void pointerCheck(void *pointer) {// Funktion um auf NULL Pointer zu checken und den Fehler auszugeben.
|
||||
if(pointer == NULL) {
|
||||
perror("Error: ");
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
// Funktion die überprüft ob relativ zur angegebenen Position eine Spalte mit 4 Maulwurfhügel ist.
|
||||
bool checkRow(char *row) {
|
||||
for(uint8_t i = 0; i < 4; ++i) {
|
||||
if(row[i * (width + 1)] == keinBaulwurfhuegel) return false;
|
||||
@ -24,25 +25,29 @@ bool checkRow(char *row) {
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
if(argc != 2) printf("file argument required");
|
||||
bool sucess;
|
||||
FILE *fp = fopen(argv[1], "rb");
|
||||
char *input = acl_ReadTextFile(fp, &sucess);
|
||||
fclose(fp);
|
||||
pointerCheck(input);
|
||||
char *heightText;
|
||||
char *textRest;
|
||||
width = strtol(input, &heightText, 10);
|
||||
++heightText; // height points does not point to \n anymore
|
||||
height = strtol(heightText, &textRest, 10);
|
||||
++textRest;
|
||||
printf("height: %d width: %d\n", height, width);
|
||||
unsigned baulwurfhuegelCounter = 0;
|
||||
for(char *i = textRest; (uintptr_t)i <= (uintptr_t)textRest + ((height - 4) * (width + 1)); i += width + 1) {
|
||||
for(char *j = i; (uintptr_t)j < (uintptr_t)i + width - 1; ++j) {
|
||||
baulwurfhuegelCounter += checkRow(j) && checkRow(j + 2) && j[1] == baulwurfhuegel && j[1 + 3 * (width + 1)];
|
||||
}
|
||||
if(argc == 1) { // das Programm wird beendet wenn die Anzahl der Argumente falsch ist.
|
||||
printf("file argument required");
|
||||
exit(-1);
|
||||
}
|
||||
for(int filePath = 1; filePath < argc; ++filePath) {
|
||||
bool sucess;
|
||||
FILE *fp = fopen(argv[filePath], "rb"); // Datei wird im binären Modus geöffent, um die Geschwindigkeit zu verbessern.
|
||||
char *input = acl_ReadTextFile(fp, &sucess);
|
||||
fclose(fp);
|
||||
pointerCheck(input);
|
||||
char *heightText;
|
||||
char *textRest;
|
||||
width = strtol(input, &heightText, 10);
|
||||
++heightText; // Das nächste Zeichen nach der Breite ist \n. Danach das Zeichen ist erst die Höhe.
|
||||
height = strtol(heightText, &textRest, 10); // Der Rest der Textdatei ist die Karte mit den Maulwurfhügeln.
|
||||
++textRest; // wieder damit der Pointer auf \n zeigt
|
||||
unsigned baulwurfhuegelCounter = 0;
|
||||
for(char *i = textRest; (uintptr_t)i <= (uintptr_t)textRest + ((height - 4) * (width + 1)); i += width + 1) { // iteriert über die Zeilen der Karte.
|
||||
for(char *j = i; (uintptr_t)j < (uintptr_t)i + width - 1; ++j) { // iteriert immer ein Schritt nach rechts.
|
||||
baulwurfhuegelCounter += checkRow(j) && checkRow(j + 2) /* überprüft ob sich die beiden 4er Zeilen der Baulwurfhügelformation stimmen */ && j[1] == baulwurfhuegel && j[1 + 3 * (width + 1)] == baulwurfhuegel /* überprüft die Maulwurfhügel oben und unten in der Mitte da sind */ && j[1 + 2 * (width +1)] == keinBaulwurfhuegel && j[1 + (width + 1)] == keinBaulwurfhuegel; // überprüft ob in der Mitte keine Maulwurfhügel sind
|
||||
}
|
||||
}
|
||||
free(input);
|
||||
printf("%s: %u\n", argv[filePath], baulwurfhuegelCounter); // gibt den Dateipfad und die Anzahl der Baulwürfe aus
|
||||
}
|
||||
free(input);
|
||||
printf("Baulwurfhuegel: %u", baulwurfhuegelCounter);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user