(Pred prenosom sem pozabil posodobit bazo, zato je tale nedavni post tu še enkrat. Če ga je že kdo prebral, ni v njem razen konca nič novega.)
Na ircu mi je Pyro povedal za tole uganko. Obljubil sem, da jo bom rešil v bashu, razen če se izkaže za preveč intenzivno (recimo da bi bil odgovor par biljard plus drobiž).
Izkaže se, da temu sploh ni tako in je rešitev že devetindevedeseta kombinacija:
# e v math.h je prekratek, zato poberimo prvih par
# tisoč decimalk z interneta in počistimo oblikovanje
e=$(wget -O - http://www-groups.dcs.st-and.ac.uk/~history/HistTopics/e_10000.html 2>/dev/null | sed -n \'/2.718/,/905198/ { s,2.718,2718,; s,\\s*,,g; p}\' | tr -d \'\\n\')
i=0
# potujoče okno desetih števk
while true; do
num=${e:$i:10}
if [[ ${#num} != 10 ]]; then
echo reached end of known e digits
echo $i
break
fi
# v coreutils je program factor, ki za podano številko vrne faktorje
# rezultat shranimo v polje in če je njegovih članov preveč,
# vemo da nimamo praštevila (število članov == število faktorjev+1)
nfactors=( $(factor $num) )
if [[ ${#nfactors[@]} == 2 ]]; then
echo $i:$num
break
fi
((i++))
done
Poženemo in preverimo rezultat:
...
99:7427466391
navaden@lynxlynx ~ 128 $ factor 7427466391
7427466391: 7427466391
Naslednji izziv je pi, algoritem pa enak.
...
4:5926535897
navaden@lynxlynx ~ 0 $ factor 5926535897
5926535897: 5926535897
Naslednji izziv je že malo težji, ker se ga s prejšnjim algoritmom reši samo dve tretjini. Je pa očitno zadnja uganka te serije. >:)
Tale problem lepo prikaže, kako se da mnogo stvari narediti neposredno, na hitro, kar v lupini. Celo težje računske probleme, kjer je pa seveda treba zaradi učinkovitosti intenzivne stvari prepustiti namenskim programom (v tem primeru factor). Klasična UNIX filozofija (”Do one thing and do one thing well” + shell glue).