Le Morse, mais pas celui avec des dents

Cette semaine, c'est Jonathan qui vous propose un #KataOfTheWeek : Code Morse international

Briefing du Kata : Le but est de décoder les phrases avec le code Morse international Le caractère (-) pour le bip long taah et (.) pour le court (ti). Chaque série de caractère forme une lettre, les lettres sont séparées par un espace ( ) et les mots par un (/)

Voici l'alphabet:

a .-      h ….    o ---     u ..-      1 .----     6 -…. b -…    i ..      p .--.    v …-     2 ..---     7 --… c -.-.    j .---    q --.-    w .--      3 …--     8 ---.. d -..     k -.-     r .-.     x -..-     4 ….-     9 ----. e .       l .-..    s …     y -.--     5 …..     0 ----- f ..-.    m --      t -       z --.. g --.     n -.

Exemples: …. . .-.. .-.. --- / - .- -.- .. -- .-                      → "hello world" …- .. …- . / .-.. . / -.-. --- -. ..-. .. -. . -- . -. -  → "vive le confinement"

Arriverez vous à re-décoder les exemples ?

Saurez-vous résoudre le problème ?

Bon courage !


Et voici une solution proposée par l'auteur en Java:

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;

public class MorseDecoder {

    private static final String LETTER_SEPARATOR = " ";
    private static final String WORD_SEPARATOR = "/";

    public static final Map<String, String> CODES;

    static {
        CODES = new HashMap<>();
        CODES.put(".-", "a");
        CODES.put("-...", "b");
        CODES.put("-.-.", "c");
        CODES.put("-..", "d");
        CODES.put(".", "e");
        CODES.put("..-.", "f");
        CODES.put("--.", "g");
        CODES.put("....", "h");
        CODES.put("..", "i");
        CODES.put(".---", "j");
        CODES.put("-.-", "k");
        CODES.put(".-..", "l");
        CODES.put("--", "m");
        CODES.put("-.", "n");
        CODES.put("---", "o");
        CODES.put(".--.", "p");
        CODES.put("--.-", "q");
        CODES.put(".-.", "r");
        CODES.put("...", "s");
        CODES.put("-", "t");
        CODES.put("---", "o");
        CODES.put(".--.", "p");
        CODES.put("--.-", "q");
        CODES.put(".-.", "r");
        CODES.put("...", "s");
        CODES.put("-", "t");
        CODES.put("..-", "u");
        CODES.put("...-", "v");
        CODES.put(".--", "w");
        CODES.put("-..-", "x");
        CODES.put("-.--", "y");
        CODES.put("--..", "z");
        CODES.put(".----", "1");
        CODES.put("..---", "2");
        CODES.put("...--", "3");
        CODES.put("....-", "4");
        CODES.put(".....", "5");
        CODES.put("-....", "6");
        CODES.put("--...", "7");
        CODES.put("---..", "8");
        CODES.put("----.", "9");
        CODES.put("-----", "0");
    }

    public static void main(String[] args) {
        System.out.println(decode(".... . .-.. .-.. --- / - .- -.- .. -- .-"));
        System.out.println(decode("...- .. ...- . / .-.. . / -.-. --- -. ..-. .. -. . -- . -. -"));
    }

    public static String decode(String morseCode) {
        return Arrays.stream(morseCode.trim().split(WORD_SEPARATOR))
                .map(MorseDecoder::decodeWord)
                .collect(Collectors.joining(" "));
    }

    private static String decodeWord(String morseWord) {
        return Arrays.stream(morseWord.trim().split(LETTER_SEPARATOR))
                .map(MorseDecoder::decodeChar)
                .collect(Collectors.joining());
    }

    public static String decodeChar(String code) {
        return CODES.get(code);
    }
}

Votre équipe TakiVeille