Reisekoordinater (løsning)
OK. Dette har gått lenge nok, og vi har noen vinnere. Jon Langseth fortalte meg at han lurte på hvorfor jeg hadde postet en Base64-blokk, før han leste posten og skjønte at han allerede var et stykke på vei mot løsningen. Han var ikke den eneste som skjønte at han måtte kjøre blokken gjennom en dekoder. Etter å ha gjort det får man et Ruby-script som inneholder enda en Base64-blokk. Dersom man lagrer resultatet i en fil man kaller “secret” og kjører ruby secret vil noe magisk skje.
Dersom man er som Jon, og ikke har en Ruby-tolker installert, samt ikke ønsker å installere dette, kan man Base64-dekode blokken og se at det er enda et Ruby-script som i hovedsak bare kjører en lang tekststreng gjennom pdflatex, sletter filer vi ikke trenger, og forsøker å åpne PDFen i riktig program. Dersom man fortsatt er som Jon, så kan man lage et Perl-script som Base64-dekoder den “innerste” blokken, stripper vekk Ruby-kode, og kaller pdflatex selv. Se selv ved å rot13-dekode det han postet, for så å Base64-dekode det igjen.
Når du har kommet så langt skal du ha en PDF-fil, som dessverre inneholder noen småfeil (se forrige post). Her følger en rettet utgave:

NB: Feil igjen! E’ = E - sum(…). Gidder ikke fikse det nå.
De første tingene burde være trivielle (så trivielle at jeg opprinnelig hadde en fortegnsfeil der). På linje 4 og 5 lager vi to vektorer. På linje 6 og 7 bruker vi “set builder notation”, eller “list comprehension” som er det programmerere sikkert kjenner det som. På linje 6 lager vi en ny vektor som består av roten av x, for alle x i mengden ns hvor roten av x er mindre enn 10. På linje 7: en ny vektor som består av x/2 for alle x i mengden es som er partall (dette var skrevet på en annen måte i oppgaven, men Kjetil mente det var dårlig matte).
Linje 8 og 9 ser verre ut enn de er. Den N’ er N pluss summen av å gå gjennom elementene i vektoren, og gange dem med 1/101 + elementnummeret. En annen måte å forklare dette på er: N’ er lik N, pluss sifrene i ns’ etterhverandre som desimaltall. Her var det opprinnelig en fortegnsfeil i linje 9, men det er rettet her.
Til slutt: løsningen … og et løsningsforslag eller ti:
Ruby:
answer = 42
E = -(answer + 6)/3
N = answer + E + 2
ns = [16, 121, 1, 169, 9, 106, 36, 111, 49, 194, 9]
es = [5, 10, 3, 1, 10, 7, 8, 9, 11, 16, 13, 7, 6]
nsm = ns.select {|x| Math.sqrt(x) < 10}.map {|x| Math.sqrt(x)}
esm = es.select {|x| x % 2 == 0}.map {|x| x / 2.0}
nm = N; nsm.each_with_index {|x,i| nm += 1.0/(10 ** (i + 1)) * x}
em = E; esm.each_with_index {|x,i| em -= 1.0/(10 ** (i + 1)) * x}
puts "http://maps.google.com/?q=#{nm},#{em}"
from math import sqrt
answer = 42
E = -(answer + 6)/3
N = answer + E + 2
ns = [16, 121, 1, 169, 9, 106, 36, 111, 49, 194, 9]
es = [5, 10, 3, 1, 10, 7, 8, 9, 11, 16, 13, 7, 6]
nsm = [sqrt(x) for x in ns if sqrt(x) < 10]
esm = [x / 2 for x in es if x % 2 == 0]
Nm = N
for i in range(0, len(nsm)):
Nm += 1.0/(10 ** (i + 1)) * nsm[i]
Em = E
for i in range(0, len(esm)):
Em -= 1.0/(10 ** (i + 1)) * esm[i]
print “http://maps.google.com/?q=%s,%s” % (Nm, Em)
Perl: (skrevet av Jon)
use strict;
my $answer = 42;
my $E = -1 * ( $answer / 3 ) - 2;
my $N = $answer + $E + 2;
my @ns = ( 16, 121, 1, 169, 9, 106, 36, 111, 49, 194, 9 );
my @mns;
foreach my $x ( @ns ) {
my $nns = sqrt($x);
push(@mns, $nns) if ( $nns < 10 );
}
my @es = (5, 10, 3, 1, 10, 7, 8, 9, 11, 16, 13, 7, 6 );
my @mes;
foreach my $x ( @es ) {
my $nes = $x / 2;
push(@mes, $nes) if ( ($x % 2) == 0 );
}
my $NN = $N;
for (my $i = 0; $i <= $#mns; $i++ ) {
$NN += 1/(10**($i+1)) * $mns[$i];
}
my $NE = $E;
for (my $i = 0; $i <= $#mes; $i++ ) {
$NE -= 1/( 10 ** ( $i +1 ) ) * $mes[$i];
}
print "http://maps.google.com/maps?q=$NN,$NE\\n";
Java: (litt usikker på hvorfor, men denne gir noe feil på slutten)
import java.util.ArrayList;
public class Losning
{
public static void main(String[] args)
{
int answer = 42;
int E = -(answer + 6)/3;
int N = answer + E + 2;
int ns[] = {16, 121, 1, 169, 9, 106, 36, 111, 49, 194, 9};
int es[] = {5, 10, 3, 1, 10, 7, 8, 9, 11, 16, 13, 7, 6};
ArrayList nsm = new ArrayList();
for (int i : ns)
if (Math.sqrt(i) < 10)
nsm.add(new Float(Math.sqrt(i)).intValue());
ArrayList esm = new ArrayList();
for (int i : es)
if (i % 2 == 0)
esm.add(i / 2);
float Nm = N;
for (int i = 0; i < nsm.size(); i++)
Nm += 1.0/Math.pow(10, i + 1) * nsm.get(i);
float Em = E;
for (int i = 0; i < esm.size(); i++)
Em -= 1.0/Math.pow(10, i + 1) * esm.get(i);
System.out.println("http://maps.google.com/?q=" + Nm + "," + Em);
}
}
Bash(!):
answer=42
E=`expr 0 - \( $answer + 6 \) / 3`
N=`expr $answer + $E + 2`
ns=(16 121 1 169 9 106 36 111 49 194 9)
es=(5 10 3 1 10 7 8 9 11 16 13 7 6)
nsm=()
for x in "${ns[@]}”; do
if [ `echo "sqrt($x)" | bc` -lt 10 ]; then
nsm=( “${nsm[@]}” `echo “sqrt($x)” | bc` )
fi
done
esm=()
for x in “${es[@]}”; do
if [ `echo "$x % 2" | bc` -eq 0 ]; then
esm=( “${esm[@]}” `expr $x / 2` )
fi
done
Nm=$N
Em=$E
for ((i=0;i<${#nsm[@]};i+=1)); do
Nm=`echo "scale=${#nsm[@]}; $Nm + 1.0 / (10^($i+1)) * ${nsm[$i]}" | bc`
done
for ((i=0;i<${#esm[@]};i+=1)); do
Em=`echo "scale=${#esm[@]}; $Em - 1.0 / (10^($i+1)) * ${esm[$i]}" | bc`
done
echo http://maps.google.com/?q=$Nm,$Em
Haskell: (Kjetil)
module Main where
import Text.Printf
answer :: Double
answer = 42
n = answer + e - 2
e = - (answer / 3) - 2
ns = [ 16, 121, 1, 169, 9, 106, 36, 111, 49, 194, 9 ]
es = [ 5, 10, 3, 1, 10, 7, 8, 9, 11, 16, 13, 7, 6 ]
ns’ = [ sqrt x | x <- ns, sqrt x < 10 ]
es’ = [ x / 2 | x <- es, even (floor x)]
rofl :: Fractional a => [a] -> [a]
rofl = map (uncurry func) . zip [1..]
where func i x = x / 10^(i)
n’ = (n+) . sum . rofl $ ns’
e’ = (e-) . sum . rofl $ es’
main = printf “http://maps.google.com/?q=%f,%f\n” n’ e’
November 19th, 2007 at 6:14 pm
Hvorfor ikke noe man bare kan dobbeltklikke på?
November 19th, 2007 at 6:56 pm
Nå oppdatert med noe man kan enkeltklikke på!
November 19th, 2007 at 11:20 pm
Ok, denne løsningen virket mer logisk og sannsynlig enn Kola-halvøya