103のシリーズです。
これも去年の末に解いてますね。
沢山ある数列の中から、条件に合うやつを探す問題
(ルール1) 部分集合を全部作って、合計した値が同じものが無いかどうかチェック
(ルール2) 小さい方からと大きい方からできるだけ取るが、大きい方を1つ少なくした時に条件に合うかどうかチェック
ルール2の方はこれでいいかどうかちょっと不安だったけど、合ってたからよしとする。
これも去年の末に解いてますね。
沢山ある数列の中から、条件に合うやつを探す問題
(ルール1) 部分集合を全部作って、合計した値が同じものが無いかどうかチェック
(ルール2) 小さい方からと大きい方からできるだけ取るが、大きい方を1つ少なくした時に条件に合うかどうかチェック
ルール2の方はこれでいいかどうかちょっと不安だったけど、合ってたからよしとする。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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 + ,,))) |
0 コメント:
コメントを投稿