fn morse_code(msg: &str) -> String { msg.chars().map(|c| MORSE[c as usize - 32]).collect::<Vec<&str>>().join(" ") } const MORSE: [&str; 91] = [ "/", // "-.-.--", // ! ".-..-.", // " "�", // # "�", // $ "�", // % ".-...", // & ".----.", // ' "-.--.", // ( "-.--.-", // ) "�", // * ".-.-.", // + "--..--", // , "-....-", // - ".-.-.-", // . "-..-.", // / "-----", // 0 ".----", // 1 "..---", // 2 "...--", // 3 "....-", // 4 ".....", // 5 "-....", // 6 "--...", // 7 "---..", // 8 "----.", // 9 "---...", // : "�", // ; "�", // < "-...-", // = "�", // > "..--..", // ? ".--.-.", // @ ".-", // A "-...", // B "-.-.", // C "-..", // D ".", // E "..-.", // F "--.", // G "....", // H "..", // I ".---", // J "-.-", // K ".-..", // L "--", // M "-.", // N "---", // O ".--.", // P "--.-", // Q ".-.", // R "...", // S "-", // T "..-", // U "...-", // V ".--", // W "-..-", // X "-.--", // Y "-..", // Z "-.--.", // [ "�", // \ "-.--.-", // ] "�", // ^ "..--.-", // _ "�", // ` ".-", // a "-...", // b "-.-.", // c "-..", // d ".", // e "..-.", // f "--.", // g "....", // h "..", // i ".---", // j "-.-", // k ".-..", // l "--", // m "-.", // n "---", // o ".--.", // p "--.-", // q ".-.", // r "...", // s "-", // t "..-", // u "...-", // v ".--", // w "-..-", // x "-.--", // y "-..", // z ];
dot='.'dash='-'morse = {'a':[dot,dash],'b':[dash,dot,dot,dot],'c':[dash,dot,dash,dot],'d':[dash,dot,dot],'e':[dot],'f':[dot,dot,dash,dot],'g':[dash,dash,dot],'h':[dot,dot,dot,dot],""'i':[dot,dot],'j':[dot,dash,dash,dash],'k':[dash,dot,dash],'l':[dot,dash,dot,dot],'m':[dash,dash],'n':[dash,dot],'o':[dash,dash,dash],'p':[dot,dash,dash],'q':[dash,dash,dot,dash],""'r':[dot,dash,dot],'s':[dot,dot,dot],'t':[dash],'u':[dot,dot,dash],'v':[dot,dot,dot,dash],'w':[dot,dash,dash],'x':[dash,dot,dot,dash],'y':[dash,dot,dash,dash],'z':[dash,dot,dot],""'0':[dash,dash,dash,dash,dash],'1':[dot,dash,dash,dash,dash],'2':[dot,dot,dash,dash,dash],'3':[dot,dot,dot,dash,dash],'4':[dot,dot,dot,dot,dash],'5':[dot,dot,dot,dot,dot],""'6':[dash,dot,dot,dot,dot],'7':[dash,dash,dot,dot,dot],'8':[dash,dash,dash,dot,dot],'9':[dash,dash,dash,dash,dot]}- fn morse_code(msg: &str) -> String {
- msg.chars().map(|c| MORSE[c as usize - 32]).collect::<Vec<&str>>().join(" ")
- }
def morse_code(msg):code=''for i in msg:if i==' ':code+=' 'else:for j in morse[i.lower()]:code+=jreturn codeprint(morse_code('1122'))- const MORSE: [&str; 91] = [
- "/", //
- "-.-.--", // !
- ".-..-.", // "
- "�", // #
- "�", // $
- "�", // %
- ".-...", // &
- ".----.", // '
- "-.--.", // (
- "-.--.-", // )
- "�", // *
- ".-.-.", // +
- "--..--", // ,
- "-....-", // -
- ".-.-.-", // .
- "-..-.", // /
- "-----", // 0
- ".----", // 1
- "..---", // 2
- "...--", // 3
- "....-", // 4
- ".....", // 5
- "-....", // 6
- "--...", // 7
- "---..", // 8
- "----.", // 9
- "---...", // :
- "�", // ;
- "�", // <
- "-...-", // =
- "�", // >
- "..--..", // ?
- ".--.-.", // @
- ".-", // A
- "-...", // B
- "-.-.", // C
- "-..", // D
- ".", // E
- "..-.", // F
- "--.", // G
- "....", // H
- "..", // I
- ".---", // J
- "-.-", // K
- ".-..", // L
- "--", // M
- "-.", // N
- "---", // O
- ".--.", // P
- "--.-", // Q
- ".-.", // R
- "...", // S
- "-", // T
- "..-", // U
- "...-", // V
- ".--", // W
- "-..-", // X
- "-.--", // Y
- "-..", // Z
- "-.--.", // [
- "�", // \
- "-.--.-", // ]
- "�", // ^
- "..--.-", // _
- "�", // `
- ".-", // a
- "-...", // b
- "-.-.", // c
- "-..", // d
- ".", // e
- "..-.", // f
- "--.", // g
- "....", // h
- "..", // i
- ".---", // j
- "-.-", // k
- ".-..", // l
- "--", // m
- "-.", // n
- "---", // o
- ".--.", // p
- "--.-", // q
- ".-.", // r
- "...", // s
- "-", // t
- "..-", // u
- "...-", // v
- ".--", // w
- "-..-", // x
- "-.--", // y
- "-..", // z
- ];
#[cfg(test)] mod tests { use super::*; #[test] fn test_alphabetic() { assert_eq!(morse_code("sos"), "... --- ..."); assert_eq!(morse_code("hello world"), ".... . .-.. .-.. --- / .-- --- .-. .-.. -.."); assert_eq!(morse_code("you passed!"), "-.-- --- ..- / .--. .- ... ... . -.. -.-.--"); assert_eq!(morse_code("lorem ipsum is simply dummy text of the printing and typesetting industry."), ".-.. --- .-. . -- / .. .--. ... ..- -- / .. ... / ... .. -- .--. .-.. -.-- / -.. ..- -- -- -.-- / - . -..- - / --- ..-. / - .... . / .--. .-. .. -. - .. -. --. / .- -. -.. / - -.-- .--. . ... . - - .. -. --. / .. -. -.. ..- ... - .-. -.-- .-.-.-"); } #[test] fn test_numeric() { assert_eq!(morse_code("0"), "-----"); assert_eq!(morse_code("1+1=2"), ".---- .-.-. .---- -...- ..---"); assert_eq!(morse_code("(1+2)=5?"), "-.--. .---- .-.-. ..--- -.--.- -...- ..... ..--.."); } #[test] fn test_mixed() { assert_eq!(morse_code("seraph776@codewarz.com"), "... . .-. .- .--. .... --... --... -.... .--.-. -.-. --- -.. . .-- .- .-. -.. .-.-.- -.-. --- --"); } }
# TODO: Replace examples and use TDD development by writing your own tests# These are some of the methods available:# test.expect(boolean, [optional] message)# test.assert_equals(actual, expected, [optional] message)# test.assert_not_equals(actual, expected, [optional] message)# You can use Test.describe and Test.it to write BDD style test groupingstest.assert_equals(morse_code('sos'),'...---...')test.assert_equals(morse_code('hello world'),'......-...-..--- .-----.-..-..-..')test.assert_equals(morse_code('you passed'),'-.-----..- .--.-.......-..')test.assert_equals(morse_code('is a good day'),'..... .- --.-------.. -...--.--')- #[cfg(test)]
- mod tests {
- use super::*;
- #[test]
- fn test_alphabetic() {
- assert_eq!(morse_code("sos"), "... --- ...");
- assert_eq!(morse_code("hello world"), ".... . .-.. .-.. --- / .-- --- .-. .-.. -..");
- assert_eq!(morse_code("you passed!"), "-.-- --- ..- / .--. .- ... ... . -.. -.-.--");
- assert_eq!(morse_code("lorem ipsum is simply dummy text of the printing and typesetting industry."), ".-.. --- .-. . -- / .. .--. ... ..- -- / .. ... / ... .. -- .--. .-.. -.-- / -.. ..- -- -- -.-- / - . -..- - / --- ..-. / - .... . / .--. .-. .. -. - .. -. --. / .- -. -.. / - -.-- .--. . ... . - - .. -. --. / .. -. -.. ..- ... - .-. -.-- .-.-.-");
- }
- #[test]
- fn test_numeric() {
- assert_eq!(morse_code("0"), "-----");
- assert_eq!(morse_code("1+1=2"), ".---- .-.-. .---- -...- ..---");
- assert_eq!(morse_code("(1+2)=5?"), "-.--. .---- .-.-. ..--- -.--.- -...- ..... ..--..");
- }
- #[test]
- fn test_mixed() {
- assert_eq!(morse_code("seraph776@codewarz.com"), "... . .-. .- .--. .... --... --... -.... .--.-. -.-. --- -.. . .-- .- .-. -.. .-.-.- -.-. --- --");
- }
- }
fn price(servings: u32, price: u32) -> u32 { let mut cost = servings * price; if servings > 0 { cost += 1 } cost }
def price(servings, price):if servings >0:cost = servings * price- fn price(servings: u32, price: u32) -> u32 {
- let mut cost = servings * price;
- if servings > 0 {
- cost += 1
return costelse:return 0- }
- cost
- }
#[test] fn test_case() { assert_eq!(price(2, 3), 7); assert_eq!(price(4, 5), 21); assert_eq!(price(0, 10), 0); }
import codewars_test as testfrom solution import price@test.describe("Kaju bakery")def _():@test.it("Basic tests")def test_case():test.assert_equals(price(2, 3), 7)test.assert_equals(price(4, 5), 21)test.assert_equals(price(0, 10), 0)test.assert_equals(price(-1, 5), 0)- #[test]
- fn test_case() {
- assert_eq!(price(2, 3), 7);
- assert_eq!(price(4, 5), 21);
- assert_eq!(price(0, 10), 0);
- }
fn reverse_string(word: &str) -> String { word.chars().rev().collect() }
public class ReverseString {public static String reverseString(String word) {String reversedWord = "";for (int i = 0; i < word.length(); i++) {reversedWord = word.charAt(i) + reversedWord;}return reversedWord;}- fn reverse_string(word: &str) -> String {
- word.chars().rev().collect()
- }
#[test] fn test_monkey() { assert_eq!(reverse_string("monkey"),"yeknom"); } #[test] fn test_home() { assert_eq!(reverse_string("home"), "emoh"); } #[test] fn test_pneumonoultramicroscopicsilicovolcanoconiosis() { assert_eq!(reverse_string("pneumonoultramicroscopicsilicovolcanoconiosis"), "sisoinoconaclovociliscipocsorcimartluonomuenp"); }
import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.assertEquals;- #[test]
- fn test_monkey() {
- assert_eq!(reverse_string("monkey"),"yeknom");
- }
- #[test]
- fn test_home() {
- assert_eq!(reverse_string("home"), "emoh");
- }
class ReverseStringTest {@Testpublic void testMonkey() {assertEquals("yeknom", "monkey");}@Testvoid testHome() {assertEquals("emoh", "home");}@Testvoid testPneumonoultramicroscopicsilicovolcanoconiosis() {assertEquals("sisoinoconaclovociliscipocsorcimartluonomuenp", "pneumonoultramicroscopicsilicovolcanoconiosis");}- #[test]
- fn test_pneumonoultramicroscopicsilicovolcanoconiosis() {
- assert_eq!(reverse_string("pneumonoultramicroscopicsilicovolcanoconiosis"), "sisoinoconaclovociliscipocsorcimartluonomuenp");
- }
fn fizzbuzz(n: u32) -> String { if is_prime(n) { "Prime".to_owned() } else if n % 15 == 0 { "FizzBuzz".to_owned() } else if n % 3 == 0 { "Fizz".to_owned() } else if n % 5 == 0 { "Buzz".to_owned() } else { n.to_string() } } // inefficient but this is just a simple demonstration fn is_prime(n: u32) -> bool { n > 1 && (2..n).all(|d| n % d != 0) }
class IsPrimeNumber:"""Returns True if n is a prime number, False otherwise"""def __init__(self, n):self.n = ndef calculate(self):passclass Fizz:"""Returns True if n is divisible by 3, False otherwise"""def __init__(self, n):self.n = ndef calculate(self):passclass Buzz:"""Returns True if n is divisible by 5, False otherwise"""def __init__(self, n):self.n = ndef calculate(self):passclass FizzBuzz:"""Returns True if n is divisible by 3 and 5, False otherwise"""def __init__(self, n):self.n = ndef calculate(self):passclass CodeWarKata776:"""Executes the Fizz, Bizz, FizzBuzz Prime sequence."""def __init__(self, n):self.n = ndef calculate_prime(self):passdef calculate_fizz(self):passdef calculate_buzz(self):passdef calculate_fizzbuzz(self):passdef execute(self):pass- fn fizzbuzz(n: u32) -> String {
- if is_prime(n) {
- "Prime".to_owned()
- } else if n % 15 == 0 {
- "FizzBuzz".to_owned()
- } else if n % 3 == 0 {
- "Fizz".to_owned()
- } else if n % 5 == 0 {
- "Buzz".to_owned()
- } else {
- n.to_string()
- }
- }
- // inefficient but this is just a simple demonstration
- fn is_prime(n: u32) -> bool {
- n > 1 && (2..n).all(|d| n % d != 0)
- }
#[test] fn test_prime() { let prime_numbers = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]; for n in prime_numbers { assert_eq!(fizzbuzz(n), "Prime"); } } #[test] fn test_fizz() { let fizz_numbers = [6, 9, 12, 18, 21, 24, 27, 33, 36, 39, 42, 48, 51, 54, 57, 63, 66, 69, 72, 78, 81, 84, 87, 93, 96, 99]; for n in fizz_numbers { assert_eq!(fizzbuzz(n), "Fizz"); } } #[test] fn test_buzz() { let buzz_numbers = [10, 20, 25, 35, 40, 50, 55, 65, 70, 80, 85, 95, 100]; for n in buzz_numbers { assert_eq!(fizzbuzz(n), "Buzz"); } } #[test] fn test_fizzbuzz() { let fizzbuzz_numbers = [15, 30, 45, 60, 75, 90]; for n in fizzbuzz_numbers { assert_eq!(fizzbuzz(n), "FizzBuzz"); } } #[test] fn test_all() { let sample_list = [ "1", "Prime", "Prime", "4", "Prime", "Fizz", "Prime", "8", "Fizz", "Buzz", "Prime", "Fizz", "Prime", "14", "FizzBuzz", "16", "Prime", "Fizz", "Prime", "Buzz", "Fizz", "22", "Prime", "Fizz", "Buzz", "26", "Fizz", "28", "Prime", "FizzBuzz", "Prime", "32", "Fizz", "34", "Buzz", "Fizz", "Prime", "38", "Fizz", "Buzz", "Prime", "Fizz", "Prime", "44", "FizzBuzz", "46", "Prime", "Fizz", "49", "Buzz", "Fizz", "52", "Prime", "Fizz", "Buzz", "56", "Fizz", "58", "Prime", "FizzBuzz", "Prime", "62", "Fizz", "64", "Buzz", "Fizz", "Prime", "68", "Fizz", "Buzz", "Prime", "Fizz", "Prime", "74", "FizzBuzz", "76", "77", "Fizz", "Prime", "Buzz", "Fizz", "82", "Prime", "Fizz", "Buzz", "86", "Fizz", "88", "Prime", "FizzBuzz", "91", "92", "Fizz", "94", "Buzz", "Fizz", "Prime", "98", "Fizz", "Buzz" ]; for (sample, expected) in (1..=100).zip(sample_list) { assert_eq!(fizzbuzz(sample), expected); } }
import codewars_test as testfrom solution import CodeWarKata776- #[test]
- fn test_prime() {
- let prime_numbers = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97];
- for n in prime_numbers {
- assert_eq!(fizzbuzz(n), "Prime");
- }
- }
@test.describe("Test CodeWarKata776")def test_group():@test.it("test 1: Test calculate_prime()")def test_case():prime_numbers = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]for n in prime_numbers:test.assert_equals(CodeWarKata776(n).calculate_prime(), True)@test.it("test 2: Test calculate_fizz()")def test_case():fizz_numbers = [3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81,84, 87, 87, 90, 93, 96, 99]for n in fizz_numbers:test.assert_equals(CodeWarKata776(n).calculate_fizz(), True)@test.it("test 3: Test calculate_buzz()")def test_case():buzz_numbers = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100]for n in buzz_numbers:test.assert_equals(CodeWarKata776(n).calculate_buzz(), True)- #[test]
- fn test_fizz() {
- let fizz_numbers = [6, 9, 12, 18, 21, 24, 27, 33, 36, 39, 42, 48, 51, 54, 57, 63, 66, 69, 72, 78, 81, 84, 87, 93, 96, 99];
- for n in fizz_numbers {
- assert_eq!(fizzbuzz(n), "Fizz");
- }
- }
- #[test]
- fn test_buzz() {
- let buzz_numbers = [10, 20, 25, 35, 40, 50, 55, 65, 70, 80, 85, 95, 100];
- for n in buzz_numbers {
- assert_eq!(fizzbuzz(n), "Buzz");
- }
- }
@test.it("test 4: Test calculate_fizzbuzz()")def test_case():fizz_buzz_numbers = [15, 30, 45, 60, 75, 90]for n in fizz_buzz_numbers:test.assert_equals(CodeWarKata776(n).calculate_fizzbuzz(), True)- #[test]
- fn test_fizzbuzz() {
- let fizzbuzz_numbers = [15, 30, 45, 60, 75, 90];
- for n in fizzbuzz_numbers {
- assert_eq!(fizzbuzz(n), "FizzBuzz");
- }
- }
- #[test]
- fn test_all() {
- let sample_list = [
- "1", "Prime", "Prime", "4", "Prime", "Fizz", "Prime", "8", "Fizz", "Buzz", "Prime", "Fizz", "Prime", "14", "FizzBuzz",
- "16", "Prime", "Fizz", "Prime", "Buzz", "Fizz", "22", "Prime", "Fizz", "Buzz", "26", "Fizz", "28", "Prime", "FizzBuzz",
- "Prime", "32", "Fizz", "34", "Buzz", "Fizz", "Prime", "38", "Fizz", "Buzz", "Prime", "Fizz", "Prime", "44", "FizzBuzz",
- "46", "Prime", "Fizz", "49", "Buzz", "Fizz", "52", "Prime", "Fizz", "Buzz", "56", "Fizz", "58", "Prime", "FizzBuzz",
- "Prime", "62", "Fizz", "64", "Buzz", "Fizz", "Prime", "68", "Fizz", "Buzz", "Prime", "Fizz", "Prime", "74", "FizzBuzz",
- "76", "77", "Fizz", "Prime", "Buzz", "Fizz", "82", "Prime", "Fizz", "Buzz", "86", "Fizz", "88", "Prime", "FizzBuzz",
- "91", "92", "Fizz", "94", "Buzz", "Fizz", "Prime", "98", "Fizz", "Buzz"
- ];
@test.it("test 5: Test execute()")def test_case():sample_list = [1, 'Prime', 'Prime', 4, 'Prime', 'Fizz', 'Prime', 8, 'Fizz', 'Buzz', 'Prime', 'Fizz', 'Prime', 14, 'FizzBuzz', 16,'Prime', 'Fizz', 'Prime', 'Buzz', 'Fizz', 22, 'Prime', 'Fizz', 'Buzz', 26, 'Fizz', 28, 'Prime', 'FizzBuzz','Prime', 32, 'Fizz', 34, 'Buzz', 'Fizz', 'Prime', 38, 'Fizz', 'Buzz', 'Prime', 'Fizz', 'Prime', 44, 'FizzBuzz', 46,'Prime', 'Fizz', 49, 'Buzz', 'Fizz', 52, 'Prime', 'Fizz', 'Buzz', 56, 'Fizz', 58, 'Prime', 'FizzBuzz', 'Prime', 62,'Fizz', 64, 'Buzz', 'Fizz', 'Prime', 68, 'Fizz', 'Buzz', 'Prime', 'Fizz', 'Prime', 74, 'FizzBuzz', 76, 77, 'Fizz','Prime', 'Buzz', 'Fizz', 82, 'Prime', 'Fizz', 'Buzz', 86, 'Fizz', 88, 'Prime', 'FizzBuzz', 91, 92, 'Fizz', 94,'Buzz', 'Fizz', 'Prime', 98, 'Fizz', 'Buzz']for sample, expectd in zip(range(1,101), sample_list):test.assert_equals(CodeWarKata776(sample).execute(), expectd)- for (sample, expected) in (1..=100).zip(sample_list) {
- assert_eq!(fizzbuzz(sample), expected);
- }
- }
Correction pour agir comme la question originale decrit.
fn closest_to_zero(ints: &[i32]) -> i32 { *ints.iter().min_by_key(|x| (x.abs(), x.is_negative())).unwrap_or(&0) }
- fn closest_to_zero(ints: &[i32]) -> i32 {
*ints.iter().min_by_key(|x| x.abs()).unwrap_or(&0)- *ints.iter().min_by_key(|x| (x.abs(), x.is_negative())).unwrap_or(&0)
- }
#[cfg(test)] mod tests { use super::*; #[test] fn test_simple() { assert_eq!(closest_to_zero(&[7, 5, 9, 1, 4]), 1); } #[test] fn test_negative() { assert_eq!(closest_to_zero(&[7, -4, -3, -12, 5, 9, -2, 4]), -2); } #[test] fn test_same() { assert_eq!(closest_to_zero(&[-5, -5]), -5); } #[test] fn test_empty() { assert_eq!(closest_to_zero(&[]), 0); } #[test] fn test_with_zero() { assert_eq!(closest_to_zero(&[-5, 0, 1, 5]), 0); } #[test] fn test_same_distance() { assert_eq!(closest_to_zero(&[-5, -1, 1, 5]), 1); } }
- #[cfg(test)]
- mod tests {
- use super::*;
- #[test]
- fn test_simple() {
- assert_eq!(closest_to_zero(&[7, 5, 9, 1, 4]), 1);
- }
- #[test]
- fn test_negative() {
- assert_eq!(closest_to_zero(&[7, -4, -3, -12, 5, 9, -2, 4]), -2);
- }
- #[test]
- fn test_same() {
- assert_eq!(closest_to_zero(&[-5, -5]), -5);
- }
- #[test]
- fn test_empty() {
- assert_eq!(closest_to_zero(&[]), 0);
- }
- #[test]
- fn test_with_zero() {
- assert_eq!(closest_to_zero(&[-5, 0, 1, 5]), 0);
- }
- #[test]
- fn test_same_distance() {
assert_eq!(closest_to_zero(&[-5, -1, 1, 5]), -1);- assert_eq!(closest_to_zero(&[-5, -1, 1, 5]), 1);
- }
- }
Two can play at that game 🦀 (admittedly less straightforward since Rust is more explicit around operations and potential errors)
fn reverse_int(n: u128) -> u128 { n.to_string().chars().rev().collect::<String>().parse().unwrap() }
def reverse_int(n):return int(str(n)[::-1])- fn reverse_int(n: u128) -> u128 {
- n.to_string().chars().rev().collect::<String>().parse().unwrap()
- }
#[test] fn tests() { let test_samples = [ (776, 677), (12345, 54321), (3121534312, 2134351213), (726376882009597984841891, 198148489795900288673627), ]; for (s, e) in test_samples { assert_eq!(reverse_int(s), e) } }
import codewars_test as testfrom solution import reverse_int- #[test]
- fn tests() {
- let test_samples = [
- (776, 677),
- (12345, 54321),
- (3121534312, 2134351213),
- (726376882009597984841891, 198148489795900288673627),
- ];
@test.describe("Example")def test_group():@test.it("test case")def test_case():test_samples = ((776,677),(12345,54321),(3121534312,2134351213),(726376882009597984841891,198148489795900288673627),)for s, e in test_samples:test.assert_equals(reverse_int(s), e)- for (s, e) in test_samples {
- assert_eq!(reverse_int(s), e)
- }
- }
const RGB_MAX: f64 = 255.; fn rgb_to_hsv(rgb: (u8, u8, u8)) -> (u16, u8, u8) { let (r, g, b) = rgb; let v = r.max(g).max(b) as f64 / RGB_MAX; if v == 0. { return (0, 0, 0); } let r = r as f64 / v; let g = g as f64 / v; let b = b as f64 / v; let s = 1. - r.min(g).min(b) as f64 / RGB_MAX; if s == 0. { return (0, 0, (v * 100.) as u8); } let hue_offset = |color| 60. * (1. - (1. - color / RGB_MAX) / s); let r = hue_offset(r); let g = hue_offset(g); let b = hue_offset(b); let peak = r.max(g).max(b); let h = if r == peak { // mostly red if g < b { 360. - b } else { 000. + g } } else if g == peak { // mostly green if b < r { 120. - r } else { 120. + b } } else { // mostly blue if r < g { 240. - g } else { 240. + r } }; let h = h.round() as u16; let s = (s * 100.).round() as u8; let v = (v * 100.).round() as u8; let hsv = (h, s, v); hsv }
function rgbToHsv(rgb) {let r = rgb[0], g = rgb[1], b = rgb[2];const v = Math.max(r, g, b) / 255;if (v == 0) return Array.of(0, 0, 0);r /= v;g /= v;b /= v;const s = 1 - Math.min(r, g, b) / 255;if (s == 0) return Array.of(0, 0, v * 100);r = 255 - (255 - r) / s;g = 255 - (255 - g) / s;b = 255 - (255 - b) / s;const peak = Math.max(r, g, b);let h = 0;if (r == peak) h = g < b ? 360 - b * 60 / 255 : g * 60 / 255;else if (g == peak) h = r > b ? 120 - r * 60 / 255 : 120 + b * 60 / 255;else h = r > g ? 240 + r * 60 / 255 : 240 - g * 60 / 255;return Array.of(Math.round(h), Math.round(s * 100), Math.round(v * 100));- const RGB_MAX: f64 = 255.;
- fn rgb_to_hsv(rgb: (u8, u8, u8)) -> (u16, u8, u8) {
- let (r, g, b) = rgb;
- let v = r.max(g).max(b) as f64 / RGB_MAX;
- if v == 0. {
- return (0, 0, 0);
- }
- let r = r as f64 / v;
- let g = g as f64 / v;
- let b = b as f64 / v;
- let s = 1. - r.min(g).min(b) as f64 / RGB_MAX;
- if s == 0. {
- return (0, 0, (v * 100.) as u8);
- }
- let hue_offset = |color| 60. * (1. - (1. - color / RGB_MAX) / s);
- let r = hue_offset(r);
- let g = hue_offset(g);
- let b = hue_offset(b);
- let peak = r.max(g).max(b);
- let h = if r == peak { // mostly red
- if g < b { 360. - b } else { 000. + g }
- } else if g == peak { // mostly green
- if b < r { 120. - r } else { 120. + b }
- } else { // mostly blue
- if r < g { 240. - g } else { 240. + r }
- };
- let h = h.round() as u16;
- let s = (s * 100.).round() as u8;
- let v = (v * 100.).round() as u8;
- let hsv = (h, s, v);
- hsv
- }
#[cfg(test)] mod tests { use super::rgb_to_hsv; #[test] fn rainbow() { assert_eq!(rgb_to_hsv((255, 000, 000)), (000, 100, 100)); // red assert_eq!(rgb_to_hsv((255, 128, 000)), (030, 100, 100)); // orange assert_eq!(rgb_to_hsv((255, 255, 000)), (060, 100, 100)); // yellow assert_eq!(rgb_to_hsv((000, 255, 000)), (120, 100, 100)); // green assert_eq!(rgb_to_hsv((000, 255, 255)), (180, 100, 100)); // cyan assert_eq!(rgb_to_hsv((000, 000, 255)), (240, 100, 100)); // blue assert_eq!(rgb_to_hsv((128, 000, 255)), (270, 100, 100)); // purple assert_eq!(rgb_to_hsv((255, 000, 255)), (300, 100, 100)); // magenta } #[test] fn grey() { assert_eq!(rgb_to_hsv((000, 000, 000)), (0, 0, 000)); // black assert_eq!(rgb_to_hsv((051, 051, 051)), (0, 0, 020)); // off-black assert_eq!(rgb_to_hsv((102, 102, 102)), (0, 0, 040)); // dark grey assert_eq!(rgb_to_hsv((153, 153, 153)), (0, 0, 060)); // light grey assert_eq!(rgb_to_hsv((204, 204, 204)), (0, 0, 080)); // off-white assert_eq!(rgb_to_hsv((255, 255, 255)), (0, 0, 100)); // white } #[test] fn grey_rainbow() { assert_eq!(rgb_to_hsv((204, 102, 102)), (000, 50, 80)); // red assert_eq!(rgb_to_hsv((204, 153, 102)), (030, 50, 80)); // orange assert_eq!(rgb_to_hsv((204, 204, 102)), (060, 50, 80)); // yellow assert_eq!(rgb_to_hsv((102, 204, 102)), (120, 50, 80)); // green assert_eq!(rgb_to_hsv((102, 204, 204)), (180, 50, 80)); // cyan assert_eq!(rgb_to_hsv((102, 102, 204)), (240, 50, 80)); // blue assert_eq!(rgb_to_hsv((153, 102, 204)), (270, 50, 80)); // purple assert_eq!(rgb_to_hsv((204, 102, 204)), (300, 50, 80)); // magenta } }
const assert = require("chai").assert;function arraysEqual(a, b) {assert.strictEqual((a == null), (b == null));assert.strictEqual(a.length, b.length);for (let i = 0; i < a.length; ++i) assert.strictEqual(a[i], b[i]);}describe("Solution", function() {it("Rainbow", function() {arraysEqual(rgbToHsv(Array.of(255, 0, 0)), Array.of(0, 100, 100));arraysEqual(rgbToHsv(Array.of(255, 128, 0)), Array.of(30, 100, 100));arraysEqual(rgbToHsv(Array.of(255, 255, 0)), Array.of(60, 100, 100));arraysEqual(rgbToHsv(Array.of(0, 255, 0)), Array.of(120, 100, 100));arraysEqual(rgbToHsv(Array.of(0, 255, 255)), Array.of(180, 100, 100));arraysEqual(rgbToHsv(Array.of(0, 0, 255)), Array.of(240, 100, 100));arraysEqual(rgbToHsv(Array.of(128, 0, 255)), Array.of(270, 100, 100));});it("Grey", function() {arraysEqual(rgbToHsv(Array.of(0, 0, 0)), Array.of(0, 0, 0));arraysEqual(rgbToHsv(Array.of(51, 51, 51)), Array.of(0, 0, 20));arraysEqual(rgbToHsv(Array.of(102, 102, 102)), Array.of(0, 0, 40));arraysEqual(rgbToHsv(Array.of(153, 153, 153)), Array.of(0, 0, 60));arraysEqual(rgbToHsv(Array.of(204, 204, 204)), Array.of(0, 0, 80));arraysEqual(rgbToHsv(Array.of(255, 255, 255)), Array.of(0, 0, 100));});it("Grey_Rainbow", function() {arraysEqual(rgbToHsv(Array.of(204, 102, 102)), Array.of(0, 50, 80));arraysEqual(rgbToHsv(Array.of(204, 153, 102)), Array.of(30, 50, 80));arraysEqual(rgbToHsv(Array.of(204, 204, 102)), Array.of(60, 50, 80));arraysEqual(rgbToHsv(Array.of(102, 204, 102)), Array.of(120, 50, 80));arraysEqual(rgbToHsv(Array.of(102, 204, 204)), Array.of(180, 50, 80));arraysEqual(rgbToHsv(Array.of(102, 102, 204)), Array.of(240, 50, 80));arraysEqual(rgbToHsv(Array.of(153, 102, 204)), Array.of(270, 50, 80));});});- #[cfg(test)]
- mod tests {
- use super::rgb_to_hsv;
- #[test]
- fn rainbow() {
- assert_eq!(rgb_to_hsv((255, 000, 000)), (000, 100, 100)); // red
- assert_eq!(rgb_to_hsv((255, 128, 000)), (030, 100, 100)); // orange
- assert_eq!(rgb_to_hsv((255, 255, 000)), (060, 100, 100)); // yellow
- assert_eq!(rgb_to_hsv((000, 255, 000)), (120, 100, 100)); // green
- assert_eq!(rgb_to_hsv((000, 255, 255)), (180, 100, 100)); // cyan
- assert_eq!(rgb_to_hsv((000, 000, 255)), (240, 100, 100)); // blue
- assert_eq!(rgb_to_hsv((128, 000, 255)), (270, 100, 100)); // purple
- assert_eq!(rgb_to_hsv((255, 000, 255)), (300, 100, 100)); // magenta
- }
- #[test]
- fn grey() {
- assert_eq!(rgb_to_hsv((000, 000, 000)), (0, 0, 000)); // black
- assert_eq!(rgb_to_hsv((051, 051, 051)), (0, 0, 020)); // off-black
- assert_eq!(rgb_to_hsv((102, 102, 102)), (0, 0, 040)); // dark grey
- assert_eq!(rgb_to_hsv((153, 153, 153)), (0, 0, 060)); // light grey
- assert_eq!(rgb_to_hsv((204, 204, 204)), (0, 0, 080)); // off-white
- assert_eq!(rgb_to_hsv((255, 255, 255)), (0, 0, 100)); // white
- }
- #[test]
- fn grey_rainbow() {
- assert_eq!(rgb_to_hsv((204, 102, 102)), (000, 50, 80)); // red
- assert_eq!(rgb_to_hsv((204, 153, 102)), (030, 50, 80)); // orange
- assert_eq!(rgb_to_hsv((204, 204, 102)), (060, 50, 80)); // yellow
- assert_eq!(rgb_to_hsv((102, 204, 102)), (120, 50, 80)); // green
- assert_eq!(rgb_to_hsv((102, 204, 204)), (180, 50, 80)); // cyan
- assert_eq!(rgb_to_hsv((102, 102, 204)), (240, 50, 80)); // blue
- assert_eq!(rgb_to_hsv((153, 102, 204)), (270, 50, 80)); // purple
- assert_eq!(rgb_to_hsv((204, 102, 204)), (300, 50, 80)); // magenta
- }
- }
Mixing procedural while loops and functional iterator chaining? Why not! Theoretically just as fast, assuming the compiler is smart enough.
use std::iter::repeat; pub fn sort_desc(mut n: u64) -> u64 { let mut digit_counts = [0; 10]; while n > 0 { digit_counts[n as usize % 10] += 1; n /= 10; } digit_counts .into_iter() .enumerate() .rev() .flat_map(|(digit, count)| repeat(digit as u64).take(count)) .fold(0, |result, digit| result * 10 + digit) }
- use std::iter::repeat;
- pub fn sort_desc(mut n: u64) -> u64 {
- let mut digit_counts = [0; 10];
- while n > 0 {
let digit = (n % 10) as usize;digit_counts[digit] += 1;- digit_counts[n as usize % 10] += 1;
- n /= 10;
- }
let mut result = 0;for digit in (0..10).rev() {for _ in 0..digit_counts[digit] {result *= 10;result += digit as u64;}}result- digit_counts
- .into_iter()
- .enumerate()
- .rev()
- .flat_map(|(digit, count)| repeat(digit as u64).take(count))
- .fold(0, |result, digit| result * 10 + digit)
- }
I used a different accumulation strategy. It's probably the same speed.
pub fn sort_desc(mut n: u64) -> u64 { let mut digit_counts = [0; 10]; while n > 0 { let digit = (n % 10) as usize; digit_counts[digit] += 1; n /= 10; } let mut result = 0; for digit in (0..10).rev() { for _ in 0..digit_counts[digit] { result *= 10; result += digit as u64; } } result }
- pub fn sort_desc(mut n: u64) -> u64 {
- let mut digit_counts = [0; 10];
- while n > 0 {
- let digit = (n % 10) as usize;
- digit_counts[digit] += 1;
- n /= 10;
- }
- let mut result = 0;
let mut fac = 1;for digit in 0..10 {- for digit in (0..10).rev() {
- for _ in 0..digit_counts[digit] {
result += (digit as u64) * fac;fac *= 10;- result *= 10;
- result += digit as u64;
- }
- }
- result
- }
use itertools::Itertools; use std::ops::Neg; fn shannon_entropy(s: &str) -> f64 { let symbols: Vec<char> = s.chars().collect(); let len = symbols.len() as f64; symbols .iter() .unique() .map(|x| { let p = symbols.iter().filter(|&n| n == x).count() as f64 / len; p * p.log2() }) .sum::<f64>() .neg() }
import math- use itertools::Itertools;
- use std::ops::Neg;
def shannon_entropy(s):symbols = list(s)unique_symbols = set(s)M = float(len(s))entropy_list = []for x in unique_symbols:n_i = symbols.count(x)P_i = n_i / Mentropy_i = P_i * (math.log(P_i, 2))entropy_list.append(entropy_i)sh_entropy = -(sum(entropy_list))return sh_entropy- fn shannon_entropy(s: &str) -> f64 {
- let symbols: Vec<char> = s.chars().collect();
- let len = symbols.len() as f64;
- symbols
- .iter()
- .unique()
- .map(|x| {
- let p = symbols.iter().filter(|&n| n == x).count() as f64 / len;
- p * p.log2()
- })
- .sum::<f64>()
- .neg()
- }
const EPSILON: f64 = 1e-5; fn test(input: &str, output: f64) { assert!((shannon_entropy(input) - output).abs() < EPSILON); } #[test] fn tests() { test("Lorem ipsum", 3.27761); test("110010111001011100101110010111001011100101", 0.98523); test("0000000", 0.0); }
import codewars_test as testfrom solution import shannon_entropy- const EPSILON: f64 = 1e-5;
@test.describe("Solution tests")def test_group():@test.it("Should correctly calculate Shannon entropy")def _():test.assert_equals(round(shannon_entropy("Lorem ipsum"),5), 3.27761)test.assert_equals(round(shannon_entropy("110010111001011100101110010111001011100101"),5), 0.98523)test.assert_equals(round(shannon_entropy("0000000"),5), 0)- fn test(input: &str, output: f64) {
- assert!((shannon_entropy(input) - output).abs() < EPSILON);
- }
- #[test]
- fn tests() {
- test("Lorem ipsum", 3.27761);
- test("110010111001011100101110010111001011100101", 0.98523);
- test("0000000", 0.0);
- }
fn remove_string(input: &str, n: usize) -> Option<&str> { if n == 0 { return None } input.split('\0').nth(n - 1) }
#include <stdlib.h>#include <string.h>/*Heap allocate the string and return it.*/char* remove_string(const char *input, const int n){if (n <= 0 || input == NULL) return NULL;size_t len = 0;for (size_t i = 0; i < (size_t)n; ++i){input += len;len = strlen(input) + 1;if (len == 1) return NULL;}size_t index = 0;char *res = (char*)malloc(sizeof(char) * (len + 1));for (; *input != '\0'; input++) res[index++] = *input; res[index] = '\0';return res;- fn remove_string(input: &str, n: usize) -> Option<&str> {
- if n == 0 { return None }
- input.split('\0').nth(n - 1)
- }
#[test] fn test() { assert_eq!(remove_string("hello\0world", 1), Some("hello")); assert_eq!(remove_string("well\0done", 2), Some("done")); assert_eq!(remove_string("you\0are\0close", 3), Some("close")); assert_eq!(remove_string("you\0almost\0finished\0the\0kumite", 5), Some("kumite")); assert_eq!(remove_string("not\0the\0last\0string", 3), Some("last")); assert_eq!(remove_string("edge\0case", 0), None); assert_eq!(remove_string("another\0edge\0case", 4), None); }
#include <criterion/criterion.h>#include <stdlib.h>#include <string.h>char* remove_string(const char *input, const int n);Test(remove_string, should_pass_all_the_tests_provided){char* result = remove_string("hello\0world\0", 1);cr_assert_str_eq(result, "hello");free(result);result = remove_string("well\0done\0", 2);cr_assert_str_eq(result, "done");free(result);result = remove_string("you\0are\0close\0", 3);cr_assert_str_eq(result, "close");free(result);result = remove_string("you\0almost\0finished\0the\0kumite\0", 5);cr_assert_str_eq(result, "kumite");free(result);result = remove_string("not\0the\0last\0string\0", 3);cr_assert_str_eq(result, "last");free(result);result = remove_string("edge\0case\0", 0);cr_assert_eq(result, NULL);free(result);result = remove_string("another\0edge\0case\0", 4);cr_assert_eq(result, NULL);free(result);}- #[test]
- fn test() {
- assert_eq!(remove_string("hello\0world", 1), Some("hello"));
- assert_eq!(remove_string("well\0done", 2), Some("done"));
- assert_eq!(remove_string("you\0are\0close", 3), Some("close"));
- assert_eq!(remove_string("you\0almost\0finished\0the\0kumite", 5), Some("kumite"));
- assert_eq!(remove_string("not\0the\0last\0string", 3), Some("last"));
- assert_eq!(remove_string("edge\0case", 0), None);
- assert_eq!(remove_string("another\0edge\0case", 4), None);
- }
fn missing_number(nums: &[u32]) -> u32 { (0..=nums.len() as u32).find(|n| !nums.contains(&n)).unwrap() }
class Solution {public:int missingNumber(vector<int>& nums) {}};- fn missing_number(nums: &[u32]) -> u32 {
- (0..=nums.len() as u32).find(|n| !nums.contains(&n)).unwrap()
- }
#[test] fn test() { assert_eq!(missing_number(&[0, 1, 2, 3, 4, 6, 7, 8, 9]), 5); assert_eq!(missing_number(&[0, 1, 3, 4]), 2); assert_eq!(missing_number(&[1, 2, 3, 4, 5]), 0); assert_eq!(missing_number(&[0, 1, 2, 3, 4]), 5); assert_eq!(missing_number(&[0]), 1); assert_eq!(missing_number(&[1]), 0); }
#include <criterion/criterion.h>// Function to find the missing number in an array of integersint findMissingNumber(int arr[], int n) {// Code to find the missing number- #[test]
- fn test() {
- assert_eq!(missing_number(&[0, 1, 2, 3, 4, 6, 7, 8, 9]), 5);
- assert_eq!(missing_number(&[0, 1, 3, 4]), 2);
- assert_eq!(missing_number(&[1, 2, 3, 4, 5]), 0);
- assert_eq!(missing_number(&[0, 1, 2, 3, 4]), 5);
- assert_eq!(missing_number(&[0]), 1);
- assert_eq!(missing_number(&[1]), 0);
- }
Test(findMissingNumber, should_return_5_for_given_array) {int arr[] = {1, 2, 3, 4, 6, 7, 8, 9, 10};int n = sizeof(arr) / sizeof(arr[0]);cr_assert_eq(findMissingNumber(arr, n), 5);}Test(findMissingNumber, should_return_2_for_given_array) {int arr[] = {1, 3, 4, 5};int n = sizeof(arr) / sizeof(arr[0]);cr_assert_eq(findMissingNumber(arr, n), 2);}
fn split(string: &str, separator: char) -> Vec<&str> { string.split(separator).collect() }
#include <string>#include <sstream>#include <vector>auto split(const std::string& str, char sep) {auto result = std::vector<std::string>{};auto stream = std::stringstream(str);auto buffer = std::string{};while (std::getline(stream, buffer, sep)) result.emplace_back(buffer);return result;- fn split(string: &str, separator: char) -> Vec<&str> {
- string.split(separator).collect()
- }
#[test] fn test() { assert_eq!(split("Hello World", ' '), ["Hello", "World"]); assert_eq!(split("John-brings-his-cat", '-'), ["John", "brings", "his", "cat"]); }
// TODO: Replace examples and use TDD by writing your own testsDescribe(any_group_name_you_want){It(should_do_something){Assert::That(split("Hello World", ' '), Equals(std::vector<std::string>{"Hello", "World"}));Assert::That(split("John-brings-his-cat", '-'), Equals(std::vector<std::string>{"John","brings","his","cat"}));}};- #[test]
- fn test() {
- assert_eq!(split("Hello World", ' '), ["Hello", "World"]);
- assert_eq!(split("John-brings-his-cat", '-'), ["John", "brings", "his", "cat"]);
- }
fn mean(x: &[u64]) -> u64 { x.iter().sum::<u64>() / x.len() as u64 }
#include <iostream>double Mean(double x[], int n){double sum = 0;for(int i = 0; i < n; i++){sum += x[i];}return sum / n;}- fn mean(x: &[u64]) -> u64 {
- x.iter().sum::<u64>() / x.len() as u64
- }
#[test] fn test() { assert_eq!(mean(&[4, 8, 4, 8]), 6); }
// TODO: Replace examples and use TDD by writing your own testsDescribe(any_group_name_you_want){It(should_do_something){int n = 4;double x[] = {4,8,4,8};double mean;mean = Mean(x ,n);Assert::That(6, Equals(mean));}};- #[test]
- fn test() {
- assert_eq!(mean(&[4, 8, 4, 8]), 6);
- }
fn total_fine(speed: i32, signals: &[i32]) -> u32 { signals.iter().map(|&signal| fine(speed, signal)).sum() } fn fine(speed: i32, signal: i32) -> u32 { match speed - signal { ..=9 => 0, 10..=19 => 100, 20..=29 => 250, 30.. => 500 } }
public class Kata {public static int speedLimit(int speed, int[] signals) {int penalty = 0;for (int i = 0; i < signals.length; i++){if (speed > signals[i]){if (speed - signals[i] >= 30){penalty += 500;} else if (speed - signals[i] >= 20 && speed - signals[i] < 30){penalty += 250;} else if (speed - signals[i] >= 10 && speed - signals[i] < 20){penalty += 100;}}}return penalty;- fn total_fine(speed: i32, signals: &[i32]) -> u32 {
- signals.iter().map(|&signal| fine(speed, signal)).sum()
- }
- fn fine(speed: i32, signal: i32) -> u32 {
- match speed - signal {
- ..=9 => 0,
- 10..=19 => 100,
- 20..=29 => 250,
- 30.. => 500
- }
- }
#[cfg(test)] mod tests { use super::*; #[test] fn test_add() { assert_eq!(total_fine(70, &[]), 0); assert_eq!(total_fine(60, &[80, 70, 60]), 0); assert_eq!(total_fine(0, &[15, 25, 35, 46]), 0); assert_eq!(total_fine(100, &[110, 100, 80]), 250); assert_eq!(total_fine(130, &[140, 130, 100]), 500); } }
import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.assertEquals;- #[cfg(test)]
- mod tests {
- use super::*;
// TODO: Replace examples and use TDD by writing your own testsclass SolutionTest {@Testvoid testSomething() {// assertEquals("expected", "actual");- #[test]
- fn test_add() {
- assert_eq!(total_fine(70, &[]), 0);
- assert_eq!(total_fine(60, &[80, 70, 60]), 0);
- assert_eq!(total_fine(0, &[15, 25, 35, 46]), 0);
- assert_eq!(total_fine(100, &[110, 100, 80]), 250);
- assert_eq!(total_fine(130, &[140, 130, 100]), 500);
- }
- }