Progblemet #1
Har sett en hel del frågor av typen vilket programspråk bör jag lära mig samt en hel del frågor kring hjälp och ibland även frågor på lösningar till programmeringsuppgifter som man fått i skolan.
Tänkte därför testa om det finns något intresse för att köra en serie som är tänkt främst för
programmerare som vill vissa upp sitt favoritspråk
blivande programmera som vill se hur man kan lösa ett givet problem
programmerare som vill se hur man kan lösa ett givet problem i andra språk än det man normalt använder
Om det visar sig att det finns intresse så hade jag tänkt mig att man skapar en ny tråd med ett nytt problem med jämna mellanrum, bör nog vara en eller kanske två veckor mellan varje nytt problem. Kan nog komma på en hel del små problem själv, men hoppas i stället att ni andra kan komma med förslag så det blir en fin mix av olika saker.
För att detta ska fungera i ett sådant här forum så krävs det nog att
själva problemet som ska lösas inte är allt för komplicerat, målet är ju att visa hur ett givet problem kan lösas i olika språk, inte hitta på väldigt komplicerade problem
lösningen på problemet ska också vara beskriven på svenska, målet är som sagt inte lösa problem i sig utan visa hur det kan lösas på lite olika sätt i olika programspråk
lösning bör få plats på maximalt en skärmsida så folk orkar läsa den
För att det ska bli intressant för de som är lite mer nybörjare så bör de som bidrar med kod-exempel svara på frågor om vad en specifik funktion eller specifik språkkonstruktion gör och hur den fungerar.
Det ska inte heller vara något hinder att presentera flera lösningar i samma språk, då det går att programmera väldigt med väldigt olika stil även inom ett specifikt språk. Själv jobbar jag med gamla C, även om vi gått från C89 till det lite mer moderna C99 för något år sedan. Men jag använder mig ändå väldigt mycket av "rena" funktioner som saknar sidoeffekter då jag jobbar mycket med att optimera programvara för system med många CPU-kärnor, i.e. min C kod tenderar vara mer "funktionell" än "vanlig" C-kod.
Så här kommer ett exempel på hur det skulle kunna se ut, har baserat denna veckas problem på problem #14 på http://projecteuler.net/
Det som kommer belysas här är hur man skriver en funktion som har mer än ett returvärde (två i detta fall) samt hur man skriver loopar och en enkel matematisk funktion.
Här är beskrivningen
Följande iterativa serie är definierad för positiva heltal
n → n/2 (om n är jämn)
n → 3n + 1 (om n är udda)
Med funktionen ovan och ett startvärde på 13 får vi följande sekvens:
13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
Denna serie, som startar på 13 och slutar på 1, innehåller 10 st tal.
Vilket startvärde, upp till en miljon, kommer resultera i den längsta
kedjan från startvärde till talet 1?
Noter: det är tillåtet att tal i kedjan är större än en miljon, men
startvärdet får man vara en miljon
Lösningen på detta problem är en s.k. brute-force. Man får helt enkelt testa alla tal från 1 till en miljon och spara längden på den längsta serien och även spara värdet självt.
Svaret är att längsta sekvensen är 525 steg för startvärde 837799
Här är en potentiell lösning i Clojure
(defn nxt [n]
"Returns the number following n in the sequence"
(if (odd? n)
(inc (* 3 n))
(quot n 2)))
(defn seq-len [n len="len"]
"Returns the sequence length produced by the initial value n"
(if (= n 1)
len
(recur (nxt n) (inc len))))
(defn longest-seq [n result="result"]
"Returns a map {:len L :n N} where L is the length of the longest
sequence and N is the initial value"
(if (= n 1)
result
(let [len (seq-len n 1)]
(recur (dec n) (if (> len (result :len))
{:len len :n n}
result)))))
(println (longest-seq 1000000 {:len 0 :n 0}))
Körtid: 5.5s / Core i7 2600 / 64-bitars Ubuntu 12.04
longest-seq ger två returnvärden genom att svara med en map. Nyckelordet "recur" i Clojure är ett rekursivt anrop till den funktion man befinner sig i (lite förenklat, men är korrekt i detta fall).
Edit: Inser att då detta är swec så är det nog många som är intresserad av prestanda. Just detta exempel tar ju lite tid att köra så det kan finnas ett visst intresse av att veta hur snabb en viss lösning är. Man bör nog lista CPU och OS-version, språket framgår ju redan. Har lagt till det på mina lösningar.
Och att köra lösningarna inuti SPOLER-taggen var en riktigt bra idé, så låt oss göra detta.
Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer