Waypoint search: 
 
Quiz Cache

Wurzeln

Computereinsatz

by Verlat     Germany > Bayern > Nürnberger Land

N 49° 30.589' E 011° 20.440' (WGS84)

 Convert coordinates
 Size: small
Status: Available
 Hidden on: 07 January 2022
 Published on: 17 January 2024
 Last update: 17 January 2024
 Listing: https://opencaching.de/OC17D6E
Also listed at: geocaching.com 

0 Found
0 Not found
0 Notes
0 Watchers
0 Ignorers
18 Page visits
0 Log pictures
Geokrety history

Large map

   

Dangers
Route
Preparation needed

Description    Deutsch (German)

Um die gesuchten Koordinaten zu erhalten, muss erst ein Rätsel gelöst werden:

Ich habe die Koordinaten in eine 7-stellige Zahl umgewandelt, also z.B. aus 12° 34,567' wird 1234567 und mit einem Algorithmus verschlüsselt. Dazu habe ich die Zahl durch 10'000'000 (Zehnmillionen) dividiert und die Wurzel gezogen. Die 8. bis 14. Nachkommastelle des Ergebnisses ergibt eine neue 7-stellige Zahl, die angegeben ist. Die Frage ist nun, wie könnt Ihr auf die ursprünglichen Koordinaten zurückrechnen?

Die so verschlüsselten Koordinaten lauten: N 3129783, E 5469604

Als Tipp: ich würde ausprobieren, welche Koordinaten zu den angegeben Zahlen passen. D.h. ihr probiert alle möglichen Zahlen, durchlauft jeweils den Algorithmus und schaut euch das Ergebnis an. Das geht mit einer Programmiersprache, z.B. C, oder mit einer Tabellenkalkulation. Soviel sei verraten: der Cache liegt in der Nähe, das grenzt die möglichen Koordinaten also ein.
Anmerkung: Die Angabe "in der Nähe" ist unscharf und sollte nicht zu eng gesehen werden. Gemeint ist in der Nähe verglichen mit der gesamten Erdoberfläche. Also lieber den Bereich der Koordinaten, die ausprobiert werden, etwas größer wählen. Bei automatisierter Berechnung kann man ja leicht ein paar Tausend Koordinaten rechnen lassen.

Wenn jemand nicht so gut mit dem Computer bewandert ist, kann er vielleicht jemanden aus seinem Familien- oder Freundeskreis fragen und ihr löst das Rätsel gemeinsam. Wenn jemand mit dem Computer gut umgehen kann aber wenig nach draußen geht, kann er vielleicht jemanden aus seinem Familien- oder Freundeskreis fragen und ihr geht gemeinsam auf Safari.

Eine kleine Einführung in die Programmiersprache C

Ein Computerprogramm besteht aus einem Text, der in einer bestimmten Sprache geschrieben ist. Dieser Text wird von einem Übersetzungsprogramm (Compiler) in die Steuerbefehle für den Computer umgewandelt.

Auf der Seite https://www.onlinegdb.com/online_c_compiler# kann solch ein Programmtext in der Sprache C eingetippt und direkt ausprobiert werden. Das folgende kleine Beispielprogramm wird im Folgenden erläutert:

#include <stdio.h>
int main()
{
    int summe = 0;
    for(int n = 1; n<=100; ++n)
    {
        summe = summe + n;
    }
    printf("Die Summe ist: %d\n",summe);
    return 0;
}

In der ersten Zeile (#include<stdio.h>) wird eine Bibliothek mit vielen Standardbefehlen eingebunden, z.B. der unten verwendete printf-Befehl kann dadurch verwendet werden. In der zweiten Zeile beginnt das Hauptprogramm, das immer "main" heißen muss.

In der vierten Zeile (int summe = 0;) geht es dann richtig los. Hier wird eine Variable definiert, die Summe heißt, in der eine Ganzzahl abgespeichert werden kann. Die Variable kann mindestens Werte von -32767 bis +32767 annehmen, je nach Computer auch größere Zahlen. Die Variable wird auf 0 gesetzt. Am Ende solcher Befehlszeilen muss immer ein Strichpunkt gesetzt werden.

In der fünften Zeile (for(int n = 1; n<=100; ++n)) wird eine Schleife definiert. Die Zählvariable n wird auf 1 gesetzt und alle Befehle zwischen den geschweiften Klammern {} werden ausgeführt. Danach wird n um Eins erhöht und wieder alle Befehle ausgeführt. Das wird solange wiederholt, bis n = 100 ist. Bei uns steht in dem Block zwischen den geschweiften Kammern nur ein Befehl: Mit summe = summe + n wird auf den Wert, der in summe steht, der Wert in n addiert. Es werden also alle Zahlen von 1 bis 100 addiert.

In der 9. Zeile (printf("Die Summe ist: %d\n",summe);) wird das Ergebnis ausgegeben. Der Befehl prinf hat hier zwei Parameter, die durch ein Komma getrennt sind. Der erste ist "Die Summe ist: %d\n" und enthält den Text, der geschrieben werden soll mit zwei Steuerzeichen: an die Stelle %d wird der Inhalt einer Variablen geschrieben, hier summe, und \n ist ein Zeilenumbruch. Die Variablen, die ausgegeben werden sollen, sind dann die nachfolgenden Argumente (hier nur summe).

In der 10. Zeile (return 0;) ist das Programm auch schon zu Ende.

Kommazahlen

Fließkommazahlen werden mit

double x = 1.5;

angelegt, in diesem Fall wird x der Wert 1.5 zugewiesen. Die Genauigkeit sind ca. 16 Stellen und die Zahl kann Werte von 10-300 bis 10300 annehmen, positiv wie negativ. Da ist also schon einiges drin. Mann muss bei der Mischung von Ganzahlen und Fließkommazahlen aufpassen und ggf. rechtzeitig den Zahlentyp von Hand ändern:

int a = 5, b = 2;
double x = a/b;

In x ist jetzt nicht, wie man vielleicht zunächst erwarten der Wert 2,5, sondern nur 2. Bei der Berechnung 2/5 wird noch mit ganzen Zahlen gearbeitet und daher die Nachkommastellen einfach abgeschnitten. Mit

int a = 5, b = 2;
double x = (double)a/b;

hat x tatsächlich den Wert 2.5, weil a in eine Kommazahl umgewandelt und damit die Division a/b mit Kommazahlen gerechnet wird.

Die Ausgabe von double-Werten muss in der printf-Anweisung mit %lf erfolgen:

printf ("Das Ergebnis lautet %lf\n",x);

Mathematische Funktionen

Mit #include <math.h> steht eine ganze Reihe von mathematischen Funktionen zur Verfügung.

y = sqrt(x);

liefert z.B. die Quadratwurzel. x und y sollten double sein.

Bedingungen

Mit einer if-Abfrage kann gesteuert werden, dass ein Befehl oder ein Block aus Befehlen nur ausgeführt wird, wenn eine bestimmte Bedingung erfüllt ist:

if (x > 0)
{
  y = x;
  printf("positiv\n");
}
else
{
  y = -x;
  printf("negativ\n");
}

Die Befehle zwischen den ersten geschweiften Klammern werden ausgeführt, wenn x = 0 ist, andernfalls derden die Befehle zwischen den zweiten Klammern ausgeführt. Andere Bedingungen sind x == 0 (gleich), x!= 0 (ungleich) x >= 0 (größer oder gleich). Der Else-Block kann auch weggelassen werden.

Text

Ein Text, oder auch string genannt, wird mit

char zeile[100] = "Hallo";

definiert. Die Länge darf höchstens ein Buchstabe weniger sein als in der eckigen Klammer angegeben, hier also 99 Buchstaben, und darauf muss man selbst aufpassen. Mit dem Ausdruck char zeile[100] wurde ein Vektor aus char der Länge 100 definiert und entsprechender Speicher reserviert. An der letzen Stelle muss immer noch Platz für ein verstecktes Ende-Zeichen sein, daher kann man nur 99 sinnvolle Buchstaben speichern. Wenn man mehr hineinschreibt, wird etwas anderes wichtiges überschrieben und gestört.

Eine solche direkte Zuweisung ist nur einmalig bei der Definition möglich, später muss man mit speziellen Funktionen arbeiten, die zuvor mit #include <string.h> eingebunden werden müssen:

strcpy(zeile,"Wie geht es?")

Kopiert den Inhalt des konstanten string "Wie geht es?" in den variablen string zeile.

Strings werden verglichen mit

if (strcmp(zeile,"Wie geht es?") == 0)
{
    printf("Gut\n");
}

Die beiden Befehle strcpy und strcmp gibt es auch in der Variante strncpy und strncmp:

strncpy(zeile,"Wie geht es?",3);

kopiert nur die ersten drei Buchstaben.

strncmp(zeile,"Wie",3);

vergleicht nur die ersten drei Buchstaben.

Ausgegeben werden strings mit

printf("%s",zeile);

Man kann mit sprintf in einen string schreiben:

char name[10] = "Peter";
sprintf(zeile,"Der gesuchte Name ist %s.",name);

Ein string ist eigentlich ein Vektor aus char. char ist ein kleine Zahl, die ein Zeichen über die ASCII-Tabelle kodiert. Man kann Vektoren auch mit allen anderen Zahlentypen bilden, z.B.

int liste[100];

definiert eine Liste mit 100 Ganzzahlen. liste[0] ist die erste, liste[99] die letzte. Jede einzelne kann wie ein int verwendet werden:

liste[0] = 1;

Weiterführende Informationen

Dieser kurze Abriss konnte nur einen kleinen Einblick geben, müsste aber ausreichen, um das obige Rätsel zu läsen. Bei Unklarheit kann man das Verhalten des Programm auch an einem Beispiel ausprobieren. Für weitere Informationen kann ich den Klassiker Kernighan, Ritchie: Programmieren in C. empfehlen. Oder wer gleich in die modernere Erweiterung C++ einsteigen will: Josuttis: Objektorientertes Programmieren in C++. C ist vollständig in C++ enthalten, und die grundlegenden Konzepte sind in beiden Sprachen weitestgehend gleich. Online, gerade auch von Universitäten, gib es auch viele Einführungskurse.

Additional hint   Decrypt

Ibe Beg: Sbytr qrz Jvyqjrpufry, re süueg qvpu gebpxra mhe Qbfr

A|B|C|D|E|F|G|H|I|J|K|L|M
N|O|P|Q|R|S|T|U|V|W|X|Y|Z

Utilities

Search geocaches nearby: all - searchable - same type
Download as file: GPX - LOC - KML - OV2 - OVL - TXT - QR-Code
When downloading this file, you accept our terms of use and Data license.

Log entries for Wurzeln    Found 0x Not found 0x Note 0x