From ddfd5c473df61339d4a16bfaa1d7f51503bb5c7b Mon Sep 17 00:00:00 2001 From: KKlochko Date: Fri, 3 Nov 2023 20:33:23 +0200 Subject: [PATCH] Add the default frequency factory. --- .../cli/actions/cracking.clj | 3 ++- .../symbols/frequencies.clj | 13 +++++++++++++ .../symbols/frequencies_test.clj | 10 ++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/cipher_analytical_machine/cli/actions/cracking.clj b/src/cipher_analytical_machine/cli/actions/cracking.clj index 5e68aa1..db4a8ab 100644 --- a/src/cipher_analytical_machine/cli/actions/cracking.clj +++ b/src/cipher_analytical_machine/cli/actions/cracking.clj @@ -9,7 +9,8 @@ (let [analyzer (:analyzer options) message (:message options) symbols (:symbols options) - frequencies symbol-frequencies/english-letter-frequencies] + frequencies (-> (get options :language "en") + (symbol-frequencies/default-frequency-factory))] (cond (= analyzer "Chi^2") (caesar-analyzers/get-plaintext message symbols frequencies) diff --git a/src/cipher_analytical_machine/symbols/frequencies.clj b/src/cipher_analytical_machine/symbols/frequencies.clj index dad6368..ab8d94a 100644 --- a/src/cipher_analytical_machine/symbols/frequencies.clj +++ b/src/cipher_analytical_machine/symbols/frequencies.clj @@ -77,3 +77,16 @@ \ 0.138 }) +(defn default-frequency-factory + "Returns a default map of letter frequencies for a language" + [language-code] + (cond + (= language-code "en") + english-letter-frequencies + + (= language-code "uk") + ukrainian-letter-frequencies + + :else + english-letter-frequencies)) + diff --git a/test/cipher_analytical_machine/symbols/frequencies_test.clj b/test/cipher_analytical_machine/symbols/frequencies_test.clj index 1db5bd0..6f6e098 100644 --- a/test/cipher_analytical_machine/symbols/frequencies_test.clj +++ b/test/cipher_analytical_machine/symbols/frequencies_test.clj @@ -9,3 +9,13 @@ (is (= "etaoinsrhldcumfpgwybvkxjqz" (map-to-string symbol-map)))))) +(deftest default-frequency-factory-test + (testing "Factory supports languages: English (en), Ukrainian (uk). If language code is unidentified, then it must have the 'en'." + (are [language-code expected-map-size] + (->> (default-frequency-factory language-code) + count + (= expected-map-size)) + "en" 26 + "uk" 34 + "Maybe a code" 26))) +