---Logga in så försvinner jag!---

Meddelande

Vi planerar att uppdatera Pluggakuten. Förslag och idéer kring detta mottas tacksamt här.

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.

Programmeringskluring: Hur många uttryck bildar talet 2012?

Ozzle
Nådde nästan 100000

Offline

Från: Stockholm
Registrerad: 2009-03-18
Inlägg: 100
Webbsida

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" smile 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. tongue 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)

 
Ozzle
Nådde nästan 100000

Offline

Från: Stockholm
Registrerad: 2009-03-18
Inlägg: 100
Webbsida

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" smile 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. tongue 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. tongue

 


Sidfot

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson

Copyright © 2006-2007 - Thomas Karlsson
 |  Denna sida använder cookies |  Kontakta oss |  Feedback |