تلگراف در زمان خودش انقلابی توی ارتباطات ایجاد کرد. مردم به راحتی میتونستند از فواصل خیلی دور برای هم پیام ارسال کنند. احتمالا توی فیلم ها دیدید که یه ادمی پشت یک دستگاه کوچک نشسته و یک دکمه رو فشار میده و یه صدای بیب بیب هم به گوش میرسه. این بیب بیب ها در واقع کد مورس هستند.
کد مورس از دش(-) و نقطه(.) تشکیل شده. چیزی شبیه به این:
morse code: .... . .-.. .-.. --- .-- --- .-. .-. . -..
که ترجمه اون میشه hello world
دیروز برای تمرین جاوا اسکریپت توی codewars میگشتم که یه مسئله جالب پیدا کردم که سه مرحله از اسون به سخت داشت. چیزی که الان میخونید قسمت یک این مسئله است که امیدوارم خوشتون بیاد.
کاری که قرار بکنیم اینه که یک کد مورس رو تحویل بگیریم و اون رو ترجمه کنیم. به نظر اسون میاد ولی من به عنوان یک مبتدی چند ساعتی درگیرش بودم.
میدونم ازاین چیز ها تو اینترنت ریخته. جالبی این مسءله به چند قسمتی بودن اونه که هر بار سخت تر میشه. پس اگه راحت از پس این بر اومدید جوگیر نشید چون تو قسمت بعدی ذخایر فسفر مغذتون رو مورد هدف قرار دادم.
بریم سراغ اصل ماجرا
یک تابع اسم decodeMorse مورد داریم که یک متن حاوی کد مورس رو میگیره و ترجمه اون کد رو باید تحویل بدیم.
قیل از هرچیزی به ترجمه تک تک کد های مورس نیاز داریم:
const MORSE_CODE = { "-----": "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", "/": " ", "-·-·--": "!", ".-.-.-": ".", "--··--": ",", "...---...": "SOS", "-.-.--": "!", "": " "};
خب گفتیم که یه متد داریم که یه string حاوی کد مورس میگیره و ترجمه رو برمیگردونه. ولی قبل از دیدش میخوام یکم در مورد متد هایی که استفاده کردم توضیح بدم که اگر مبتدی هستید درک بهتری داشته باشید.
متد split: این متد با استفاده از پارامتری که میگیره یک string رو به یک array تبدیل میکنه. پارامتر مثل یک حایل عمل میکنه و هرجا اون کاراکتر دیده شد string رو قطع میکنه. مثلا اگر بخواهیم کلمات hello world رو از هم جدا کنیم:
"hello world".split(" "); --> ["hello", "world"]
هرجا یک اسپیس (" ") وجود داشت از همونجا string رو جدا میکنه.
متد map : وقتی بخوایم رو تک تک اعضای یک ارایه یه کار انجام بدیم از map استفاده میکنیم. این متد یه تابع به عنوان ورودی میگیره و روی تک تک اعضای ارایه این تابع رو اجرا میکنه و در نهایت یک ارایه جدید تحویل میده که حاصل اجرای اون تابع روی اعضای ارایه اصلیه.
var numbers = [4, 9, 16, 25]; var x = numbers.map(Math.sqrt) document.getElementById("demo") = x;
مثلا اینجا با استفاده از Math.sqrt همه اعضا numbers رو به توان رو رسوندیم و اون رو توی ارایه جدید x ذخیره کردیم.
متد trim: این متد اسپیس های اضافه اول و اخر string رو از بین میبره
" hello word ".trim(); --> "hello world"
متد join: این متد اعضای یک ارایه رو به هم میچسبونه و بینشون پارامتری که میگیره رو قرار میده
[‘h‘,‘e‘,‘l‘,‘l‘,’o’].join(""); --> "hello"
و اما اصل کار
decodeMorse = function(morseCode){ function decodeMorseLetter(letter) { return MORSE_CODE[letter]; } function decodeMorseWord(word) { return word.split(' ').map(decodeMorseLetter).join(''); } return morseCode.trim().split(' ').map(decodeMorseWord).join(' '); }
توضیح:
درون تابع decodeMorse سه تابع تعریف کردیم:
۱- decodeMorseLetter: کد مورس مربوط به یک حرف رو میگیره و خود حرف رو برمیگردونه
۲- decodeMorseWord:کد موردمربوط به یک کلمه رو میگیره و تک تک کاراکتر هاش روبا متد decodeMorseLetter ترجمه میکنه و در نهایت با متد join اون هارو به هم چسبونه.
اول اسپیس های اضافی کد مورس رو با trim برمیداریم. بعد با split کلمه هارو از هم جدا میکنیم(هر جا سه تا اسپیس پشت در هم بود) و متد رو روی همه کلمه ها اجرا میکنیم و در نهایت ترجمه که در واقع یک ارایه هست رو با متد join به هم میچسبونیم و اون رو تحویل میدیم .
مثال:
decodeMorse('.... . -.-- .--- ..- -.. .') //should return "HEY JUDE"
این تازه دستگرمی بود. مرحله بعد یکم سخت تر میشه. با تلگراف که نمیشه دش و نقطه فرستاد. باید این کار رو از طریق برق انجام بدیم. در نتیجه در واقعیت یک مشت صفر و یک داریم . باید این صفر و یک هارو به کد مورس تبدیل کنیم و بعد اونو ترجمه کنیم.