Skip to content

Commit

Permalink
Добавлен русский и английский язык
Browse files Browse the repository at this point in the history
  • Loading branch information
kalenchukov committed Jul 31, 2022
1 parent eb12d2b commit 2cbcb3b
Show file tree
Hide file tree
Showing 13 changed files with 607 additions and 8 deletions.
60 changes: 53 additions & 7 deletions README.MD
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,60 @@

### Поддерживаемые языки
* Русский
* Английский (соответствует рекомендации МСЭ-R M.1677-1)

### Заголовок
### Кодирование
```java
Codable morseCode = new MorseCode(new RussianScheme());
morseCode.encode("Эх, чужд кайф, сплющь объём вши, грызя цент.");
// Результат выполнения: ..-.. .... --..-- ---. ..- ...- -.. -.- .- .--- ..-. --..-- ... .--. .-.. ..-- --.- -..- --- -... .--.-. . -- .-- ---- .. --..-- --. .-. -.-- --.. .-.- -.-. . -. - .-.-.-
```

/*
Результат выполнения:
{
}
*/
### Декодирование
```java
Codable morseCode = new MorseCode(new RussianScheme());
morseCode.decode("..-.. .... --..-- ---. ..- ...- -.. -.- .- .--- ..-. --..-- ... .--. .-.. ..-- --.- -..- --- -... .--.-. . -- .-- ---- .. --..-- --. .-. -.-- --.. .-.- -.-. . -. - .-.-.-");
// Результат выполнения: ЭХ, ЧУЖД КАЙФ, СПЛЮЩЬ ОБЪЕМ ВШИ, ГРЫЗЯ ЦЕНТ.
```

### Схема сопоставления для чисел
Схема сопоставления поддерживаются по умолчанию и идентична для всех языков.

Соответствует рекомендации МСЭ-R M.1677-1.

| Символ | Сигнал |
|:------:|:------:|
| 0 | ----- |
| 1 | .---- |
| 2 | ..--- |
| 3 | ...-- |
| 4 | ....- |
| 5 | ..... |
| 6 | -.... |
| 7 | --... |
| 8 | ---.. |
| 9 | ----. |

### Схема сопоставления для спецсимволов
Схема сопоставления поддерживаются по умолчанию и идентична для всех языков.

Соответствует рекомендации МСЭ-R M.1677-1.

| Символ | Сигнал |
|:------:|:-------:|
| . | .-.-.- |
| , | --..-- |
| : | ---... |
| ? | ..--.. |
| ' | .----. |
| - | -....- |
| / | -..-. |
| ; | -.-.-. |
| ( | -.--. |
| ) | -.--.- |
| \" | .-..-. |
| = | -...- |
| + | .-.-. |
| & | .-... |
| _ | ..--.- |
| $ | ...-..- |
33 changes: 33 additions & 0 deletions src/main/java/dev/kalenchukov/morsecode/Codable.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/*
* Copyright © 2022 Алексей Каленчуков
* GitHub: https://github.com/kalenchukov
* E-mail: mailto:[email protected]
*/

package dev.kalenchukov.morsecode;

import org.jetbrains.annotations.NotNull;

/**
* Интерфейс для реализации класса кодировщика / декодировщика азбуки Морзе.
*/
public interface Codable
{
/**
* Кодирует символы в сигналы.
*
* @param text Текст.
* @return Закодированный текст.
*/
@NotNull
String encode(@NotNull String text);

/**
* Декодирует сигналы в символы.
*
* @param code Код.
* @return Декодированный текст.
*/
@NotNull
String decode(@NotNull String code);
}
146 changes: 145 additions & 1 deletion src/main/java/dev/kalenchukov/morsecode/MorseCode.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,151 @@

package dev.kalenchukov.morsecode;

public class MorseCode
import dev.kalenchukov.morsecode.schemes.Schematic;
import dev.kalenchukov.morsecode.schemes.additions.GraphScheme;
import dev.kalenchukov.morsecode.schemes.additions.NumberScheme;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
* Класс кодирования / декодирования азбуки Морзе.
*/
public class MorseCode implements Codable
{
/**
* Схема сопоставления символов с сигналами.
*/
@NotNull
private final Map<@NotNull String, @NotNull List<@NotNull String>> scheme = new LinkedHashMap<>();

/**
* Конструктор для {@code MorseCode}.
*
* @param scheme Схема сопоставления.
*/
public MorseCode(@NotNull final Schematic scheme)
{
this.addScheme(scheme);
this.addScheme(new GraphScheme());
this.addScheme(new NumberScheme());
}

/**
* @see Codable#encode(String)
*/
@NotNull
@Override
public String encode(@NotNull final String text)
{
Objects.requireNonNull(text);

boolean endWord = false;

StringBuilder encodeText = new StringBuilder();

for (String symbol : text.split(""))
{
String signal = this.getSignalBySymbol(symbol);

if (endWord) {
encodeText.append(" ");
endWord = false;
}
if (signal != null) {
encodeText.append(signal).append(" ");
}

if (symbol.equals(" ")) {
endWord = true;
}
}

return encodeText.toString().trim();
}

/**
* @see Codable#decode(String)
*/
@NotNull
@Override
public String decode(@NotNull final String code)
{
Objects.requireNonNull(code);

StringBuilder decodeCode = new StringBuilder();

for (String signal : code.split(" "))
{
String sing = this.getSymbolBySignal(signal);

if (sing != null) {
decodeCode.append(sing);
} else if (signal.equals("")) {
decodeCode.append(" ");
}
}

return decodeCode.toString().replaceAll("\s+", " ");
}

/**
* Возвращает символ соответствующий сигналу в схеме сопоставления.
*
* @param signal Сигнал.
* @return Символ или {@code null} если для данного сигнала нет символа в схеме сопоставления.
*/
@Nullable
private String getSymbolBySignal(@NotNull final String signal)
{
Objects.requireNonNull(signal);

for (Map.Entry<String, List<String>> contrast : this.scheme.entrySet())
{
if (contrast.getValue().contains(signal)) {
return contrast.getKey();
}
}

return null;
}

/**
* Возвращает сигнал соответствующий символу в схеме сопоставления.
*
* @param symbol Символ.
* @return Сигнал или {@code null} если для данного символа нет сигнала в схеме сопоставления.
*/
@Nullable
private String getSignalBySymbol(@NotNull final String symbol)
{
Objects.requireNonNull(symbol);

for (Map.Entry<String, List<String>> contrast : this.scheme.entrySet())
{
if (contrast.getKey().contains(symbol.toLowerCase()) ||
contrast.getKey().contains(symbol.toUpperCase()))
{
return (!contrast.getValue().isEmpty()) ? contrast.getValue().get(0) : null;
}
}

return null;
}

/**
* Добавляет схему сопоставления.
*
* @param scheme Схема сопоставления.
*/
private void addScheme(@NotNull final Schematic scheme)
{
Objects.requireNonNull(scheme);

this.scheme.putAll(scheme.getScheme());
}
}
7 changes: 7 additions & 0 deletions src/main/java/dev/kalenchukov/morsecode/package-info.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/*
* Copyright © 2022 Алексей Каленчуков
* GitHub: https://github.com/kalenchukov
* E-mail: mailto:[email protected]
*/

package dev.kalenchukov.morsecode;
69 changes: 69 additions & 0 deletions src/main/java/dev/kalenchukov/morsecode/schemes/EnglishScheme.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
/*
* Copyright © 2022 Алексей Каленчуков
* GitHub: https://github.com/kalenchukov
* E-mail: mailto:[email protected]
*/

package dev.kalenchukov.morsecode.schemes;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Unmodifiable;

import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
* Класс схемы сопоставления букв английского алфавита и сигналов.<br>
* Схема соответствует рекомендации МСЭ-R M.1677-1.
*/
public class EnglishScheme implements Schematic
{
/**
* Схема сопоставления символов с сигналами.
*/
@NotNull
private static final Map<@NotNull String, @NotNull List<@NotNull String>> SCHEME = new LinkedHashMap<>();

static
{
SCHEME.put("A", List.of(".-"));
SCHEME.put("B", List.of("-..."));
SCHEME.put("C", List.of("-.-."));
SCHEME.put("D", List.of("-.."));
SCHEME.put("E", List.of(".", "..-.."));
SCHEME.put("F", List.of("..-."));
SCHEME.put("G", List.of("--."));
SCHEME.put("H", List.of("...."));
SCHEME.put("I", List.of(".."));
SCHEME.put("J", List.of(".---"));
SCHEME.put("K", List.of("-.-"));
SCHEME.put("L", List.of(".-.."));
SCHEME.put("M", List.of("--"));
SCHEME.put("N", List.of("-."));
SCHEME.put("O", List.of("---"));
SCHEME.put("P", List.of(".--."));
SCHEME.put("Q", List.of("--.-"));
SCHEME.put("R", List.of(".-."));
SCHEME.put("S", List.of("..."));
SCHEME.put("T", List.of("-"));
SCHEME.put("U", List.of("..-"));
SCHEME.put("V", List.of("...-"));
SCHEME.put("W", List.of(".--"));
SCHEME.put("X", List.of("-..-"));
SCHEME.put("Y", List.of("-.--"));
SCHEME.put("Z", List.of("--.."));
}

/**
* @see Schematic#getScheme()
*/
@Unmodifiable
@NotNull
@Override
public Map<@NotNull String, @NotNull List<@NotNull String>> getScheme()
{
return Collections.unmodifiableMap(EnglishScheme.SCHEME);
}
}
Loading

0 comments on commit 2cbcb3b

Please sign in to comment.