Perl cachingPerl caching

Ich hoffe alle kennen die tolle Freizeitbeschäftigung des Geocachings. Wenn nicht ->.

Jedenfalls habe ich in den letzten Tagen ein besonders schwieriges Rätsel zu lösen gehabt, um den Cache zu finden (GC1K22V). Das Rätsel ist ja theoretisch nicht besonders schwierig, aber die Fragen sind einfach nicht besonders eindeutig zu beantworten. Und keine der von mir errätselten Lösungen brachte das richtige Ergebnis.

I hope you all know the great freetime activity of geocaching. Otherwise ->.

Some days ago I red this interesting virtual cache: GC1K22V (sorry it’s german). The Riddle wasn’t to hard, but all the answers weren’t really clearly to find. Ich habe mir dann daraufhin gedacht, dass es ja eigentlich garnicht so viele sinnvolle Kombinationen der Antworten geben kann, weil sich ja einiges auch ausschließt, weil zB etwas negatives herauskommt. Also habe ich ein Skript geschrieben, in der tollen Sprache Perl. Das Skript probiert einfach alle Möglichkeiten durch, die Sinn machen. Das dabei dann doch verdammt viele Möglichkeiten herauskommen seht ihr hier. Ich würde vorschlagen ihr löscht aus den Listen in Zeile 60 bis 69 einfach alles was nicht in Frage kommt. Das müsst ihr schon selber machen. Ich will euch ja nicht alles auf dem Silbertablett präsentieren. Aber wenn ihr euch zum Beispiel nur bei ein Paar Sachen unsicher seit funktioniert das ziemlich gut. Den Output unten könnt ihr dann als Textdatei auf eurem Rechner speicher. Wenn ihr die in output.gpx umbenennt, könnt ihr sie auf euer GPS ziehen, und mal schauen welche Möglichkeiten in Frage kommen.

Was man noch verbessern könnte:

– Tatsächlich die Lösungen und Fragen in die Datei schreiben, dann merkt man unterwegs was da herausgekommen wär.

– Die Angabe der Entfernung in der Beschreibung mit bedenken (und alle anderes Koordinaten ausschließen).

– Auf andere Caches portieren…

Hier nochmal der Code im ganzen:


#!/usr/bin/perl -w

#****************************************************************************
#*         Special skript for bulding a gpx-file with all possbile 			*
#*       locations for the virtual Geocache http://coord.info/GC1K22V		*
#*		--------------------------------------------------------------		*
#*	  by Christian Henkel - www.henkelchristian.de - ct2034 (gc.com-nick)	*
#****************************************************************************

#use diagnostics;
#use strict;

# defining Subroutine(s) 

# Subroutine making (lat/lon in dec out of lat/lon in deg° min.dec)
sub koord_trans{
	my ($lat_deg, $lat_min, $lon_deg, $lon_min) = @_;
	my @koord = ($lat_deg + $lat_min / 60, $lon_deg + $lon_min / 60);
}

# Subroutine calculating the formula (giving 0 for nonsense);
sub get_koord{
	my ($A, $B, $C, $D, $E, $F, $G, $H, $I, $J ) = @_;
	if (	($D-$C < 0) |
			($G*$J-$D < 0) |
			($J-$I < 0) |
			($A*$E*$H > 9) |
			($D*$J+$I > 9) |
			($J-$E < 0) ) {
		return 0;
	} else {
		#N 48° (A+H)(B+E).(C*E)(D-C)(G*J-D)
		#E 9° (J-I)(A*E*H).(D*J+I)(B+F)(J-E)
		my $lat_min = ($A+$H)*10+($B+$E)+($C*$E)*0.1+($D-$C)*0.01+($G*$J-$D)*0.001;
		my $lon_min = ($J-$I)*10+($A*$E*$H)+($D*$J+$I)*0.1+($B+$F)*0.01+($J-$E)*0.001;
		my @koords = &koord_trans(48, $lat_min, 9, $lon_min);
	}
}

# main

# open file

# open GPX, ">>", "output.gpx";
print
"<?xml version=\"1.0\" encoding=\"utf-8\"?>
<gpx xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" version=\"1.0\" creator=\"henkelchristian\" 
xsi:schemaLocation=\"http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd\" xmlns=\"http://www.topografix.com/GPX/1/0\">
<desc>Moeglichkeiten des Caches GC1K22</desc>
<author>Christian Henkel</author>
<email>post\@henkelchristian.de</email>
<time>2009-07-27T09:18:46.0000000-00:00</time>
<keywords>cache, geocache, henkelchristian</keywords>\n";

# Possible numbers vor the letter:
# (delete some if you are shure of the nonsense)

my @A = ( 1, 2, 3 );
my @B = ( 1, 2, 3 );
my @C = ( 1, 2, 3 );
my @D = ( 1, 2, 3 );
my @E = ( 1, 2, 3 );
my @F = ( 1, 2, 3 );
my @G = ( 1, 2, 3 );
my @H = ( 1, 2, 3 );
my @I = ( 1, 2, 3 );
my @J = ( 1, 2, 3 );

my ($A, $B, $C, $D, $E, $F, $G, $H, $I, $J );

foreach $A (@A) {
foreach $B (@B) {
foreach $C (@C) {
foreach $D (@D) {
foreach $E (@E) {
foreach $F (@F) {
foreach $G (@G) {
foreach $H (@H) {
foreach $I (@I) {
foreach $J (@J) {
if (&get_koord($A, $B, $C, $D, $E, $F, $G, $H, $I, $J )) {
	my @koord = &get_koord($A, $B, $C, $D, $E, $F, $G, $H, $I, $J );
	printf
"<wpt lat=\"%7.4f\" lon=\"%7.5f\">
  <time>2007-12-29T00:00:00.0000000-07:00</time>
  <name>GC1K22V</name>
  <desc>eine Moeglichkeit mit folgenden Werten: A=%d, B=%d, C=%d, D=%d, E=%d, F=%d, G=%d, H=%d, I=%d, J=%d</desc>
  <url>http://coord.info/GC1K22V</url>
  <urlname>GC1K22V</urlname>
  <sym>Geocache</sym>
  <type>Geocache</type>
</wpt>\n", @koord, $A, $B, $C, $D, $E, $F, $G, $H, $I, $J;
}
}}}}}}}}}}

print "</gpx>";

So I decided to write a skript in the great language perl. It easyly tried out all mobination possibilites, and writes out the solution in the gpx-format.  This is the code. As you see in the output windows, there are so much possibilities that the compiler runs in a timeout. So you should delete some unlikely answers to shorten the results list. If you have the list short enought you can copy the the outout to an text-file, and rename it to output.gpx. If you load this file to your gps, or to google earth, you can see all the possible locations.

Potential for improvement:

– Include the distance informatione, to filter out locations which are to far away.

– Include the textual questions and answers to the file.

– Use code for other caches like this.

Here is the code:

#!/usr/bin/perl -w

#****************************************************************************
#*         Special skript for bulding a gpx-file with all possbile 			*
#*       locations for the virtual Geocache http://coord.info/GC1K22V		*
#*		--------------------------------------------------------------		*
#*	  by Christian Henkel - www.henkelchristian.de - ct2034 (gc.com-nick)	*
#****************************************************************************

#use diagnostics;
#use strict;

# defining Subroutine(s) 

# Subroutine making (lat/lon in dec out of lat/lon in deg° min.dec)
sub koord_trans{
	my ($lat_deg, $lat_min, $lon_deg, $lon_min) = @_;
	my @koord = ($lat_deg + $lat_min / 60, $lon_deg + $lon_min / 60);
}

# Subroutine calculating the formula (giving 0 for nonsense);
sub get_koord{
	my ($A, $B, $C, $D, $E, $F, $G, $H, $I, $J ) = @_;
	if (	($D-$C < 0) |
			($G*$J-$D < 0) |
			($J-$I < 0) |
			($A*$E*$H > 9) |
			($D*$J+$I > 9) |
			($J-$E < 0) ) {
		return 0;
	} else {
		#N 48° (A+H)(B+E).(C*E)(D-C)(G*J-D)
		#E 9° (J-I)(A*E*H).(D*J+I)(B+F)(J-E)
		my $lat_min = ($A+$H)*10+($B+$E)+($C*$E)*0.1+($D-$C)*0.01+($G*$J-$D)*0.001;
		my $lon_min = ($J-$I)*10+($A*$E*$H)+($D*$J+$I)*0.1+($B+$F)*0.01+($J-$E)*0.001;
		my @koords = &koord_trans(48, $lat_min, 9, $lon_min);
	}
}

# main

# open file

# open GPX, ">>", "output.gpx";
print
"<?xml version=\"1.0\" encoding=\"utf-8\"?>
<gpx xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" version=\"1.0\" creator=\"henkelchristian\" 
xsi:schemaLocation=\"http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd\" xmlns=\"http://www.topografix.com/GPX/1/0\">
<desc>Moeglichkeiten des Caches GC1K22</desc>
<author>Christian Henkel</author>
<email>post\@henkelchristian.de</email>
<time>2009-07-27T09:18:46.0000000-00:00</time>
<keywords>cache, geocache, henkelchristian</keywords>\n";

# Possible numbers vor the letter:
# (delete some if you are shure of the nonsense)

my @A = ( 1, 2, 3 );
my @B = ( 1, 2, 3 );
my @C = ( 1, 2, 3 );
my @D = ( 1, 2, 3 );
my @E = ( 1, 2, 3 );
my @F = ( 1, 2, 3 );
my @G = ( 1, 2, 3 );
my @H = ( 1, 2, 3 );
my @I = ( 1, 2, 3 );
my @J = ( 1, 2, 3 );

my ($A, $B, $C, $D, $E, $F, $G, $H, $I, $J );

foreach $A (@A) {
foreach $B (@B) {
foreach $C (@C) {
foreach $D (@D) {
foreach $E (@E) {
foreach $F (@F) {
foreach $G (@G) {
foreach $H (@H) {
foreach $I (@I) {
foreach $J (@J) {
if (&get_koord($A, $B, $C, $D, $E, $F, $G, $H, $I, $J )) {
	my @koord = &get_koord($A, $B, $C, $D, $E, $F, $G, $H, $I, $J );
	printf
"<wpt lat=\"%7.4f\" lon=\"%7.5f\">
  <time>2007-12-29T00:00:00.0000000-07:00</time>
  <name>GC1K22V</name>
  <desc>eine Moeglichkeit mit folgenden Werten: A=%d, B=%d, C=%d, D=%d, E=%d, F=%d, G=%d, H=%d, I=%d, J=%d</desc>
  <url>http://coord.info/GC1K22V</url>
  <urlname>GC1K22V</urlname>
  <sym>Geocache</sym>
  <type>Geocache</type>
</wpt>\n", @koord, $A, $B, $C, $D, $E, $F, $G, $H, $I, $J;
}
}}}}}}}}}}

print "</gpx>";
#!/usr/bin/perl -w

#****************************************************************************
#*         Special skript for bulding a gpx-file with all possbile 			*
#*       locations for the virtual Geocache http://coord.info/GC1K22V		*
#*		--------------------------------------------------------------		*
#*	  by Christian Henkel - www.henkelchristian.de - ct2034 (gc.com-nick)	*
#****************************************************************************

#use diagnostics;
#use strict;

# defining Subroutine(s) 

# Subroutine making (lat/lon in dec out of lat/lon in deg° min.dec)
sub koord_trans{
	my ($lat_deg, $lat_min, $lon_deg, $lon_min) = @_;
	my @koord = ($lat_deg + $lat_min / 60, $lon_deg + $lon_min / 60);
}

# Subroutine calculating the formula (giving 0 for nonsense);
sub get_koord{
	my ($A, $B, $C, $D, $E, $F, $G, $H, $I, $J ) = @_;
	if (	($D-$C < 0) |
			($G*$J-$D < 0) |
			($J-$I < 0) |
			($A*$E*$H > 9) |
			($D*$J+$I > 9) |
			($J-$E < 0) ) {
		return 0;
	} else {
		#N 48° (A+H)(B+E).(C*E)(D-C)(G*J-D)
		#E 9° (J-I)(A*E*H).(D*J+I)(B+F)(J-E)
		my $lat_min = ($A+$H)*10+($B+$E)+($C*$E)*0.1+($D-$C)*0.01+($G*$J-$D)*0.001;
		my $lon_min = ($J-$I)*10+($A*$E*$H)+($D*$J+$I)*0.1+($B+$F)*0.01+($J-$E)*0.001;
		my @koords = &koord_trans(48, $lat_min, 9, $lon_min);
	}
}

# main

# open file

# open GPX, ">>", "output.gpx";
print
"<?xml version=\"1.0\" encoding=\"utf-8\"?>
<gpx xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" version=\"1.0\" creator=\"henkelchristian\" 
xsi:schemaLocation=\"http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd\" xmlns=\"http://www.topografix.com/GPX/1/0\">
<desc>Moeglichkeiten des Caches GC1K22</desc>
<author>Christian Henkel</author>
<email>post\@henkelchristian.de</email>
<time>2009-07-27T09:18:46.0000000-00:00</time>
<keywords>cache, geocache, henkelchristian</keywords>\n";

# Possible numbers vor the letter:
# (delete some if you are shure of the nonsense)

my @A = ( 1, 2, 3 );
my @B = ( 1, 2, 3 );
my @C = ( 1, 2, 3 );
my @D = ( 1, 2, 3 );
my @E = ( 1, 2, 3 );
my @F = ( 1, 2, 3 );
my @G = ( 1, 2, 3 );
my @H = ( 1, 2, 3 );
my @I = ( 1, 2, 3 );
my @J = ( 1, 2, 3 );

my ($A, $B, $C, $D, $E, $F, $G, $H, $I, $J );

foreach $A (@A) {
foreach $B (@B) {
foreach $C (@C) {
foreach $D (@D) {
foreach $E (@E) {
foreach $F (@F) {
foreach $G (@G) {
foreach $H (@H) {
foreach $I (@I) {
foreach $J (@J) {
if (&get_koord($A, $B, $C, $D, $E, $F, $G, $H, $I, $J )) {
	my @koord = &get_koord($A, $B, $C, $D, $E, $F, $G, $H, $I, $J );
	printf
"<wpt lat=\"%7.4f\" lon=\"%7.5f\">
  <time>2007-12-29T00:00:00.0000000-07:00</time>
  <name>GC1K22V</name>
  <desc>eine Moeglichkeit mit folgenden Werten: A=%d, B=%d, C=%d, D=%d, E=%d, F=%d, G=%d, H=%d, I=%d, J=%d</desc>
  <url>http://coord.info/GC1K22V</url>
  <urlname>GC1K22V</urlname>
  <sym>Geocache</sym>
  <type>Geocache</type>
</wpt>\n", @koord, $A, $B, $C, $D, $E, $F, $G, $H, $I, $J;
}
}}}}}}}}}}

print "</gpx>";

Schreibe einen Kommentar