Skoči na vsebino

P1 2021/22 - 05 naloga Morse - resitev Aljaz S.

# -*- coding: utf-8 -*-
"""
https://ucilnica.fri.uni-lj.si/mod/assign/view.php?id=46388

Morsejeva abeceda omogoča pošiljanje besedila s pomočjo različnih dolžin piskov, svetlobnih signalov ali,
morda tudi z dimnimi signali. Črko V, na primer, sporočimo s tremi kratkimi in enim dolgim signalom, kar
bi lahko zapisali tako "- - - ---"; dolgi signal je namreč približno trikrat daljši od kratkega. Med
posameznimi signali je presledek. Da ločimo črke med sabo, naredimo med posameznimi črkami trikrat daljši
presledek. Da ločimo dve besedi, naredimo še daljši premor, recimo šest presledkov. Tole bi lahko bil primer
sporočila:

- - - ---   - - -   --- --- --- - ---      - - --- -   - --- -   - -      - - ---   - --- - -

Takšnega zapisa v resnici ne uporabljamo; običajno bi kratki znak opisali s piko in daljšega s črtico.
Črko V bi torejopisali z "...-". Presledkov znotraj črke ne pišemo. Pač pa bomo med dvema črkama naredili
en presledek, med dvema besedama pa po tri. Gornji signal bi torej zapisali tako:

...- ... ---.-   ..-. .-. ..   ..- .-..

Prva črka gornjega zapisa je, vemo, V. Naprej gre tako:
VSŠ FRI UL

V tem zapisu seveda ni presledkov med črkami, pač pa imamo en presledek med besedami.

Obvezni del

Napiši naslednje funkcije.

v_zaporedje(signal) prejme signal v prvi obliki in vrne zaporedje v drugi obliki.

vrni_znak(zaporedje, abeceda, morse) prejme niz z nekim zaporedjem v drugi obliki, na primer, "...-", niz, ki
vsebuje vse črke abecede, na primer "ABCČDEFGHIJKLMNOPRSŠTUVZŽ" in seznam z Morsejevo abecedo: n-ti element
seznama predstavlja zapis n-te črke abecede. Funkcija mora vrniti znak, ki ga predstavlja zaporedje - v gornjem
primeru "V".

v_besedo(zaporedje, abeceda, morse) prejme posamično besedo v drugi obliki in vrne besedo, zapisano z običajnimi
črkami. Če funkcijo pokličemo z "...- ... ---.-" (in ustrezno definiranama abecedama), vrne niz "VSŠ".

Funkcija prejme le eno besedo, brez trojnih presledkov.

v_znake(zaporedje, abeceda, morse) prejme niz z zaporedjem v drugi obliki, vendar lahko vsebuje več besed. Če
dobi kot argument celotno vrstico
...- ... ---.-   ..-. .-. ..   ..- .-..
vrne celotno tretjo, "VSŠ FRI UL".

preberi(signal, abeceda, morse) prejme signal, kot ga opisuje prva vrstica in vrne besedilo, kot je v tretji.


Dodatna naloga

Tole je težje samo zato, ker se morate zorganizirati sami: pišite si poljubne dodatne funkcije, ki vam utegnejo
pomagati.

Napiši funkcijo zapisi(besedilo, abeceda, morse), ki prejme besedilo in vrne signal. Se pravi, dobi niz, kot ga
imamo v tretji vrstici, in vrne takšnega, kot je v prvi.
"""
import re

def v_zaporedje(signal):
    final = ""
    for (s_three, s_one, three, one) in re.findall(re.compile(r'([ ]{6})|([ ]{3})|(---)|(-)'), signal):
        if (one != ""): final += "."
        if (three != ""): final += "-"
        if (s_one != ""): final += " "
        if (s_three != ""): final += "   "

    return final

def vrni_znak(zaporedje, abeceda, morse):
    return abeceda[morse.index(zaporedje)]

def v_besedo(zaporedje, abeceda, morse):
    final = ""
    for c in zaporedje.split(" "):
        final += vrni_znak(c, abeceda, morse)
    
    return final

def v_znake(zaporedje, abeceda, morse):
    final = []
    for b in zaporedje.split("   "):
        final.append(v_besedo(b, abeceda, morse))
    
    return " ".join(final)

def preberi(signal, abeceda, morse):
    return v_znake(v_zaporedje(signal), abeceda, morse)

def zapisi(besedilo, abeceda, morse):
    besede = []
    for beseda in besedilo.split(" "):
        chari = []
        for char in beseda:
            signals = []
            for sig in morse[abeceda.index(char)]:
                signals.append("-" if sig == "." else "---")

            chari.append(" ".join(signals))
        besede.append("   ".join(chari))
    return "      ".join(besede)

import unittest
import random

from morse import *

class Test(unittest.TestCase):
    eng = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    #           A      B       C      D      E     F      G        H      I
    eng_mor = ['.-', '-...', '-.-.', '--.', '.', '..-.', '--.', '....', '..',
               #             J      K       L     M     N      O      P       Q       R
               '.---', '-.-', '.-..', '--', '-.', '---', '.--.', '--.-', '.-.',
               #             S    T     U      V       W       X       Y      Z
               '...', '-', '..-', '...-', '.--', '-..-', '-.--', '--..']

    slo = "ABCČDEFGHIJKLMNOPRSŠTUVZŽ"
    #           A      B       C       Č       D      E     F      G        H
    slo_mor = ['.-', '-...', '-.-.', '-.--.', '--.', '.', '..-.', '--.', '....',
               #  I     J      K       L     M     N      O      P        R
               '..', '.---', '-.-', '.-..', '--', '-.', '---', '.--.',  '.-.',
               #  S     Š       T     U      V      Z       Ž
               '...', '---.-', '-', '..-', '...-', '--..', '--..-']


class TestObvezna(Test):
    def test_01_v_zaporedje(self):
        self.assertEqual(
            "..-. .-. ..   ..- .-..",
            v_zaporedje("- - --- -   - --- -   - -      - - ---   - --- - -"))

        self.assertEqual(
            "...- ... ---.-   ..-. .-. ..   ..- .-..",
            v_zaporedje("- - - ---   - - -   --- --- --- - ---      - - --- -   - --- -   - -      - - ---   - --- - -"))

    def test_02_vrni_znak(self):
        self.assertEqual("A", vrni_znak(".-", self.eng, self.eng_mor))
        self.assertEqual("Y", vrni_znak("-.--", self.eng, self.eng_mor))
        self.assertEqual("Č", vrni_znak("-.--.", self.slo, self.slo_mor))

        n = random.choice(self.eng)
        self.assertEqual(n, vrni_znak(".-", [n], [".-"]))

    def test_03_v_besedo(self):
        self.assertEqual("VSŠ",  v_besedo("...- ... ---.-", self.slo, self.slo_mor))
        self.assertEqual("FRI",  v_besedo("..-. .-. ..", self.slo, self.slo_mor))
        self.assertEqual("UL",  v_besedo("..- .-..", self.slo, self.slo_mor))

    def test_04_v_znake(self):
        self.assertEqual(
            "VSŠ FRI UL",
            v_znake("...- ... ---.-   ..-. .-. ..   ..- .-..", self.slo, self.slo_mor))

    def test_05_preberi(self):
        self.assertEqual(
            "VSŠ FRI UL",
            preberi("- - - ---   - - -   --- --- --- - ---      - - --- -   - --- -   - -      - - ---   - --- - -", self.slo, self.slo_mor))


class TestDodatna(Test):
    def test_zapisi(self):
        self.assertEqual(
            "- - - ---   - - -   --- --- --- - ---      - - --- -   - --- -   - -      - - ---   - --- - -",
            zapisi("VSŠ FRI UL", self.slo, self.slo_mor))


if __name__ == "__main__":
    unittest.main()

Zadnja posodobitev: May 7, 2022