Euler: Problem 105

Posted by YpsilonTAKAI On 2020年3月14日土曜日 0 コメント
103のシリーズです。
これも去年の末に解いてますね。

沢山ある数列の中から、条件に合うやつを探す問題

(ルール1) 部分集合を全部作って、合計した値が同じものが無いかどうかチェック
(ルール2) 小さい方からと大きい方からできるだけ取るが、大きい方を1つ少なくした時に条件に合うかどうかチェック

ルール2の方はこれでいいかどうかちょっと不安だったけど、合ってたからよしとする。

(ns euler.pe_105
(:require [clojure.math.combinatorics :as combo]
[clojure.java.io :as io]))
;; Prablem 105
;; "Elapsed time: 1528.685 msecs"
;; rule 1: S(B) != S(C)
(defn verify-rule-1 [target-set]
(->> (combo/subsets target-set)
(map #(apply + %) ,,)
((juxt #(count %) #(count (set %))) ,,)
(apply = ,,)))
;; rule 2: S(B) > S(C)
(defn verify-rule-2 [target-set]
(let [center-num (quot (+ 1 (count target-set)) 2)
front-half (take center-num target-set)
tail-half-1 (drop (+ center-num (if (even? (count target-set)) 1 0)) target-set)]
(> (apply + front-half)
(apply + tail-half-1))))
(defn get-all-file-contents-as-list [file-name]
(with-open [f (io/reader file-name)]
(into [] (line-seq f))))
(defn csv2numlist [csv-row]
(->> (.split csv-row ",")
(mapv bigint ,,)))
;; (def pe105file "https://projecteuler.net/project/resources/p105_sets.txt"))
(defn pe_105 [inputfile]
(->> (get-all-file-contents-as-list inputfile)
(map csv2numlist ,,)
(map sort ,,)
(filter verify-rule-2 ,,)
(filter verify-rule-1 ,,)
(map #(apply + %) ,,)
(apply + ,,)))
view raw pe_105.clj hosted with ❤ by GitHub

0 コメント:

コメントを投稿