Du har förmodligen en gång konfronterats med en vän som påstod sig kunna läsa dina tankar och gjorde följande trick: Tänk på ett tal mellan 1 och 10, multiplicera det med 9, summera siffrorna i resultatet (t.ex. 23 -> 2 + 3 = 5) och subtrahera 5 från summan. Vid det här laget kan du ha kommit fram till värdet 4. Hur vet jag det? Genom att använda samma trick som din vän. Låt mig visa dig med hjälp av Clojure. Först ska vi skriva en funktion som summerar siffrorna i ett tal:
Värdet omvandlas till en sträng, map-funktionen omvandlar varje siffertecken till en lista med heltal och funktionen apply summerar listan med heltal och returnerar summan till anroparen av funktionen sum-digits. Vi kommer att använda denna funktion för att komponera beräkningarna i tricket:
Funktionen pussel utför beräkningarna i den sekvens som din vän har bett dig att göra. Först multiplicerar den talet vi trodde med 9, sedan summerar den siffrorna i resultatet och slutligen subtraherar den summan med 5. Därefter ska vi skriva en annan funktion för att avslöja tricket:
Funktionen range producerar en sekvens av tal som börjar från 1 till 10 där 11 inte ingår (1 2 3 4 5 6 7 8 8 9 10). Funktionen map tillämpar funktionen pussel på varje nummer i listan och producerar en annan lista med resultaten. Utför nu funktionen unveil för att se resultatet:
Oh, titta! För intervallet 1 till 10 blir resultatet alltid 4. Med andra ord, ett mönster. Mönster är mycket närvarande i multiplikationer och när man tar bort alla dessa har man primtal, vilket Mark Haddon påpekar i sin bok “The Curious Incident of the Dog in the Night-Time”. Daniel Tammet exemplifierar några mönster i sin bok “Thinking in Numbers”: How Maths Illuminates Our Lives”. När vi multiplicerar ett jämnt tal med 5 får vi alltid tal som slutar på noll (t.ex. 12 x 5 = 60) och när vi gör det med udda tal får vi alltid tal som slutar på 5. När det gäller 9 får vi alltid 9 varje gång vi multiplicerar 9 med ett tal mellan 1 och 10 och summerar dess siffror.
I sekvensen kommer subtraktion av 5 från 9 bara att avleda uppmärksamheten från multiplikationsmönstret och till och med förbättra tricket. Till exempel: Föreställ dig att varje bokstav i alfabetet har en motsvarande siffra (A – 1, B – 2, C – 3, …). Ta nu resultatet (4) och få fram dess respektive bokstav; tänk på ett land som börjar med denna bokstav; ta den fjärde bokstaven i detta land och tänk på ett djur som börjar med denna bokstav. Det finns en stor sannolikhet för att ditt slutliga svar blir “Danmark” och “apa”. Innan du tror att jag läser dina tankar, låt mig förklara vad som just hände.
För det första finns det inte många länder som börjar med “D”, den fjärde bokstaven i alfabetet. Bland Danmark, Djibouti, Dominica och Dominikanska republiken kommer du lätt att komma ihåg Danmark. Den fjärde bokstaven i Danmark är “M” och inget djur som börjar på “M” är mer känt än apan, som man genast kommer att tänka på.
Jag har roligt när jag programmerar i Clojure, inte bara för att Clojure är roligt att lära sig och lära ut, utan för att programmering inte alltid handlar om allvarliga saker. Att kunna programmera bara tillräckligt med kod för att få saker att hända stimulerar till tänkande, problemlösning och kreativitet framför struktur, mönster, konventioner och stilar. Kodning ska vara avkopplande, inte stressande. Njut av det!