Meddelande
Om du vill prata med andra användare (inte om uppgiftsfrågor), kan du göra det i chatten.
Att tänka på när man skapar en ny tråd:
- Skriv tydliga rubriker där du om möjligt anger både ämne och nivå för frågan.
Exempel: "[KE A] balansering av formel". Undvik saker som "HJÄLP!!!" och "SNÄLLA!!".
- Visa alltid hur du har försökt. Då är det mycket enklare att hjälpa till.
- Korsposta ej! Det är inte tillåtet att posta samma tråd flera gånger.
- Bumpa inte din tråd mer än en gång per dygn.
Se alla regler här. Om dessa regler ignoreras kommer en varning att delas ut, som kan följas av en avstängning.
Sidor: 1
- Forum
- » Programmering och teknik
- » Programmeringskluring: Hur många uttryck bildar talet 2012?
Programmeringskluring: Hur många uttryck bildar talet 2012?
Programmeringskluring: Hur många uttryck bildar talet 2012?
Talet 2012 kan skrivas på många sätt, bl.a. genom 10*9*8+7+6-5+4*321=2012 och 10+9876/5-4+32-1=2012.
Uppgift: På hur många sätt kan talet 2012 bildas genom uttryck innehållande 10,9,8...1 i den ordningen?
Lycka till!
/Ozzle
Samhäll åk 1
- cancerman
- Medlem

Offline
- Registrerad: 2010-10-23
- Inlägg: 519
Re: Programmeringskluring: Hur många uttryck bildar talet 2012?
3 sätt (tror jag, är inte så säker på min kod :p).
10 + 9 * 87 - 65 + 4 * 321
10 * 9 * 8 + 7 + 6 - 5 + 4 * 321
109 - 8 * 7 + 654 * 3 - 2 - 1
Observera att 10+9876/5-4+32-1 blir 2012.2 (ditt exempel). Du kanske "löste"
det genom att t.ex. generera strängarna sen köra eval i Python? Då blir det ju heltalsdivision. Jag testade nästan samma sak men det blir inte så bra. Clojure å andra sidan har exakt division men inte infixnotation.
Man skulle kunna göra något mellanting där man gör om talen till floats, men floats är onda.
Kod:
(def ops (conj (re-seq #"." "+-*/") ""))
(defn gen-op-list [ops len]
(if (= 1 len) (map vector ops)
(for [op ops lst (gen-op-list ops (dec len))]
(conj lst op))))
(defn compute
([s] (compute [] [] + s))
([terms facs op s]
(if-not (seq s) (apply + (conj terms (op (apply * facs))))
(let [head (first s) sec (second s)
curr-op (if (string? head)
(-> head read-string resolve))]
(condp contains? head
#{"*" "/"} (recur terms (conj facs (curr-op sec))
op (drop 2 s))
#{"-" "+"} (recur (conj terms (op (apply * facs))) []
curr-op (rest s))
(recur terms [head] op (rest s)))))))
(defn make-one [v]
(Integer/parseInt (apply str v)))
(defn concat-numbers
([from] (concat-numbers [] [] from))
([to tmp from]
(let [f (first from)]
(cond
(not (seq from)) (conj to (make-one tmp))
(number? f) (recur to (conj tmp f) (rest from))
:else (recur (conj to (make-one tmp) f) [] (rest from))))))
(def eq2012 (->> (rest (gen-op-list ops 9))
(map #(conj % ""))
(map (partial interleave (range 10 0 -1)))
(map (partial remove #{""}))
(map concat-numbers)
(filter #(= (compute %) 2012))))
(println eq2012)Senast redigerat av cancerman (2012-07-20 21:38)
Re: Programmeringskluring: Hur många uttryck bildar talet 2012?
cancerman skrev:
3 sätt (tror jag, är inte så säker på min kod :p).
10 + 9 * 87 - 65 + 4 * 321
10 * 9 * 8 + 7 + 6 - 5 + 4 * 321
109 - 8 * 7 + 654 * 3 - 2 - 1
Observera att 10+9876/5-4+32-1 blir 2012.2 (ditt exempel). Du kanske "löste"det genom att t.ex. generera strängarna sen köra eval i Python? Då blir det ju heltalsdivision. Jag testade nästan samma sak men det blir inte så bra. Clojure å andra sidan har exakt division men inte infixnotation.
Man skulle kunna göra något mellanting där man gör om talen till floats, men floats är onda.
Japp, 3 är helt rätt svar om man inte använder heltalsdivision.
Bra jobbat! Hur lång tid tog det att köra koden?
Samhäll åk 1
- cancerman
- Medlem

Offline
- Registrerad: 2010-10-23
- Inlägg: 519
Re: Programmeringskluring: Hur många uttryck bildar talet 2012?
10-20 sekunder kanske. Det är ju rätt segt med tanke på att det ju bara är 5^9 fall att testa. Men jag har inte optimerat på nått sätt. ![]()
Sidor: 1
- Forum
- » Programmering och teknik
- » Programmeringskluring: Hur många uttryck bildar talet 2012?
