Код Морзе до стандартного виходу


13

Це питання передбачає прийняття введення в коді Морзе як. (період) та - (символ мінус), з пробілами для розділення введення. Ваше завдання - перетворити код на стандартний вихід. Ви можете припустити, що єдиний вхід містить символьні символи, знайдені в алфавіті Міжнародного коду Морзе, знайденому тут: http://en.wikipedia.org/wiki/Morse_code#Letters.2C_numbers.2C_пунктуація .

У всіх висновках слід використовувати малі літери. Подвійний пробіл слід інтерпретувати як простір слова.

Зразок введення:

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

Вихід:

example. sos

Найкоротший код після двох тижнів виграє.


Ви кажете, що тільки "символи символів" це символи та символи?
Sinkingpoint

@Quirliom Усі "символи" у цьому посиланні є символами. Все, що ви можете вкласти в рядку - це характер (ну, в основному). Однак ця частина питання, по суті, говорить про те, що кожен морс буде справедливим.
Джастін

@Quirliom Так, кожен персонаж Морзе, наприклад .- для 'а' та. для 'e' є дійсним. Жодних символів Морзе не потрібно обробляти.

Що про простір літер та простір слів? Один простір для першого і два (або більше) для останніх?
Пол Р

Slighly (ООН) , пов'язані з : stackoverflow.com/questions/1352587/code-golf-morse-code
javatarz

Відповіді:


8

Mathematica 62

Mathematica дозволяє нам обманювати

f=ToLowerCase@StringDrop[WolframAlpha[". .- "<>#,"Result"],2]&

f@"."
f@". -..- .- -- .--. .-.. . .-.-.-"
f@".... .- ...- .  -.-- --- ..-  -- --- --- . -..  - --- -.. .- -.-- ..--.."

е

приклад.

Ви сьогодні мусяли?

Перші два символи .і .-необхідні, щоб правильно інтерпретувати невеликі коди.


При цьому відсутня конверсія в малі регістри.
Пітер Тейлор

@PeterTaylor Його можна легко змінити на f=ToLowerCase@StringDrop[WolframAlpha[". .- "<>#,"Result"],2]&малі регістри .
ybeltukov

Чи для використання програми Wolfram Alpha api не потрібен ідентифікатор програми? Якщо так, чи не слід це додавати до числа символів? Проте дуже розумне рішення.
Бьорн Ліндквіст

@ BjörnLindqvist Просто оцініть саме цю команду в Mathematica , вона добре розвивається .
ybeltukov

23

Драт, я сподівався потрапити сюди до прибуття GolfScripters :-(

Anyhoo ...

C: 228 символів:

char n,t,m[9],*c=" etianmsurwdkgohvf l pjbxcyzq  54 3   2& +    16=/   ( 7   8 90    $       ?_    \"  .    @   '  -        ;! )     ,    :";
main(){while(scanf("%s",m)>0){for(t=m[6]=n=0;m[n];n++)t+=t+1+(m[n]&1);putchar(c[t]);}}

Я думав, що додам пояснення, як це працює.

Вхідні дані аналізуються відповідно до даних дерева в *c, які можна розширити наступним чином (використовуючи ·для представлення вакантного вузла):

                     dot <-- (start) --> dash
                e                               t
        i               a               n               m
    s       u       r       w       d       k       g       o
  h   v   f   ·   l   ·   p   j   b   x   c   y   z   q   ·   ·
 5 4 · 3 · · · 2 & · + · · · · 1 6 = / · · · ( · 7 · · · 8 · 9 0
····$·······?_····"··.····@···'··-········;!·)·····,····:·······

Починаючи з верхівки дерева, рухайтеся вниз, рухаючись ліворуч за крапкою і праворуч за тире. Потім виведіть будь-який символ, у якому ви трапляєтесь, коли рядок введення закінчується (тобто, коли зустрічається символ пробілу). Так, наприклад, три крапки і тире приведуть вас до програми vчерез e, iі s. Замість того, щоб чітко перевіряти крапки (ASCII \x2e) і тире (ASCII \x2d), нам потрібно лише перевірити останній біт ( m[n]&1), який дорівнює 0 .і 1 для -.

Шість рядків достатньо для кодування всього, крім того $, що має 7 крапок / тире:, ...-..-але оскільки вхідні дані гарантовано є дійсними, це можна легко виправити, обрізавши вхід на 6 символів ( m[6]=0) та інтерпретуючи ...-..як $натомість. Ми також можемо відрізати останні 7 байт з даних дерева, оскільки всі вони порожні і не потрібні, якщо введені дані є дійсними.


1
Хороший трюк, щоб відкинути останній символ 6-символьних кодів і скоротити таблицю пошуку.
Пітер Тейлор

2
Я голосую не стільки за чіткість дискусії, скільки за якість алгоритму. Хороша робота.
Майкл Стерн

Подивіться, чи можна було б обрізати кілька символів, обробляючи символ за символом, а не читати цілий рядок в c. Можливо, ви могли б використати модуль і зсув, щоб спробувати збити більш високі значення разом; це те, що я роблю в своєму рішенні. У будь-якому випадку, приємної роботи!
FireFly

8

GolfScript ( 116 113 97 символів)

Сюди входять недруковані символи, які використовуються в таблиці пошуку, тому я даю це як вихід xxd:

0000000: 6e2d 2720 272f 7b60 7b5c 6261 7365 2035
0000010: 3925 2210 a9cd 238d 57aa 8c17 d25c d31b
0000020: 432d 783e 277a 3823 e146 e833 6423 23ac
0000030: e72a 39d5 021c 4e33 3b30 3138 dc51 2044
0000040: 3aa7 d001 df4b 2032 333f 36ae 51c3 223d
0000050: 7d2b 5b35 2d34 5d2f 2b32 3333 257d 256e
0000060: 2b

Це декодує програму, еквівалентну

n-' '/{`{\base 59%"\x10\xA9\xCD#\x8DW\xAA\x8C\x17\xD2\\\xD3\eC-x>'z8#\xE1F\xE83d##\xAC\xE7*9\xD5\x02\x1CN3;018\xDCQ D:\xA7\xD0\x01\xDFK 23?6\xAEQ\xC3"=}+[5-4]/+233%}%n+

що по суті є

n-' '/{`{\base 59%"MAGIC STRING"=}+[5-4]/+233%}%n+

Для цього використовується (не мінімальний) ідеальний хеш на основі основної ідеї оптимального алгоритму для створення мінімально досконалих хеш-функцій; Чех, Гавас і Маєвський; 1992 рік . Їх основна ідея полягає в тому, що ви використовуєте дві хеш - функції, f1і f2, разом з таблицею перекодування g, і досконалий хеш (g[f1(str)] + g[f2(str)]) % m(де mце число рядків , які ми хочемо виділити); розумний шматочок - це спосіб, який вони будують g. Розглянемо всі значення f1(str)та f2(str)рядки, що strцікавлять, як вузли у непрямому графіку та додати край між f1(str)іf2(str)для кожного рядка Вони вимагають не лише того, щоб кожне ребро було виразним, але і щоб графік був ациклічним; тоді просто DFS призначає ваги вузлам (тобто заповнювати таблицю пошуку g) таким чином, щоб кожен край мав необхідну суму.

Чехія і ін генерації випадкових функцій f1і f2які виражаються з допомогою таблиць пошуку, але це не явно не годиться: я шукав відповідний хеш , використовуючи прості перетворення базових з двома різних підставами від -10 до 9. Я також ослаблених ациклического вимога. Я не хотів призначати рядки значенням від 0 до 54, але відповідним кодам ASCII, тому замість того, щоб брати (g[f1(str)] + g[f2(str)]) % mпотрібні (g[f1(str)] + g[f2(str)]) % Nдля деяких N > 'z'. Але це дозволяє свободі пробувати різні Nта перевіряти, чи дозволяють будь-які з них дійсну таблицю пошуку g, незалежно від того, чи є цикли. На відміну від чеських та інших, мені байдуже, чи є пошук ідеальної хеш-функції O (n ^ 4).

Графік, сформований -4baseта 5basemod, 59є:

Графік, відображений крапкою з незначними налаштуваннями

що досить приємно, окрім найбільшого з'єднаного компонента, який має три цикли довжини 1. Нам потрібно підійти до того, N=233як ми зможемо знайти коефіцієнт, gякий відповідає.


Інші можливі кодування для таблиці пошуку: різницьке кодування не допоможе, оскільки немає структури. Можливо, можливо, використовувати неповторне значення шляхом кодування як перестановки, але або пропуски потрібно обробляти окремо (54 вихідні символи => 30 байт ентропії плюс декодування; пробігам потрібно принаймні 15 байт, якщо закодовано як пряме базове перетворення; можливо, можливо вдосконалити поточну загальну кількість 92 байт) або ми переймаємо 138 елементів (більше 98 байт ентропії плюс розшифровка).
Пітер Тейлор

Оскільки це не-префіксний код, ми не можемо легко спробувати уникнути важкої роботи до реалізації zlib.
Пітер Тейлор

4

C, 169 символів

Я не міг знайти кращу хеш-функцію ..

(Я розмістив немініфікований код, але зараховував його до мінімуму; для мінімізації просто робимо :%s/ //g | %j!в vim, а потім кладеш пробіл у рядковій літералі назад.)

c, v = 1;

main() {
  while (c = getchar(), ~c)
    v = c < 33? putchar(
      "& etianmsurwdkgohvf.l.pjbxcyzq..54.3.;!2).+...,16=/:..(.7.?_8.9o\"...$...@...'..-"[v < 64? (v != 40)*v : v % 51 + 33]
    ), 1 : v * 2 + c % 2;
}

Тестовий запуск

( morse.inце лише весь алфавіт у морзі на окремих рядках):

% clang morse.c && ./a.out </tmp/morse.in
abcdefghijklmnopqrstuvwxyzO123456789.,?'!/()&:;=+-_"$@
% ./a.out <<<'. -..- .- -- .--. .-.. . .-.-.-  ... --- ...'
example. sos

Пояснення

Цей досить простий. c < 33знаходить пробіл / роздільник ( , \n, EOF, ...). c % 2переводить крапку чи крапку. Ідея полягає у створенні унікального числа для кожного символу, просто інтерпретуючи його як двійкове число (після префіксації 1, щоб мати справу зі змінною довжиною) (ця інтерпретація є v*2 + c%2частиною). Потім я отримую 137-char LUT, який я ущільнив шляхом хешування отриманого значення ( v < 64? v : v % 51 + 33, константи, знайдені за допомогою проб і помилок, а також дивлячись на розподіл і намагаюся знайти величезний розрив). На жаль, ця хеш-функція має єдине зіткнення, саме тому мені доводиться проводити особливе 40 → '&'картування.


4

R , 145 байт

Переведено крапку на 2, тире на 1 і інтерпретацію числа в потрійному і прийняття мода 89, який дає унікальне число, яке ми можемо використовувати в хеш-таблиці. Наявність 13 (111 бази-3) означає додавання 1, оскільки ASCII 13 не працює в TIO.

cat(c(letters,0:9,".")[match(strtoi(chartr(".-","12",scan(,"",t=scan(,""))),3)%%89+1,utf8ToInt('DG,)62	5N*EHMAI.%"!4=@'))],sep='')

Спробуйте в Інтернеті!

R , 236 байт (неконкурентоспроможний)

Це не буде конкурентоспроможним, але це дозволяє нам показати щось цікаве в R: збережіть кодове дерево Морзе всередині цитованої мовної структури mта витягніть його з коду крапок і тире, дуже просто використовуючи той факт, який [[може бути застосований рекурсивно до списки. Наприклад, m[[c(2,2,3,2)]]отримує крапку, крапку, тире, крапку або "f".

m=quote(.(e(i(s(h(5,4),v(,3)),u(f,M(,2))),a(r(l,.(.(,.),)),w(p,j(,1)))),t(n(d(b(6),x),k(c,y)),m(g(z(7),q),o(D(8),S(9,0))))))
for(w in scan(,"",t=scan(,"")))
cat(chartr("MDS","-. ","if"(is.symbol(z<-m[[(utf8ToInt(w)==45)+2]]),z,z[[1]])))

Спробуйте в Інтернеті!


1

Powershell, 193 байт

$n=1
-join("$args "|% t*y|%{if($_-32){$n=$n*2+($_-ne'.')}else{("  etianmsurwdkgohvf l pjbxcyzq  54 3   2& +~16=/   ( 7   8 90~~~?~ `"  .~@   '  -~~;! )~ ,~:~~~~$"-replace'~','    ')[$n]
$n=1}})

Менш сценарій тестування для гольфу:

$f = {

$n=1
-join(
    "$args "|% t*y|%{
        if($_-32){
            $n=$n*2+($_-ne'.')
        }else{
            ("  etianmsurwdkgohvf l pjbxcyzq  54 3   2& +~16=/   ( 7   8 90~~~?~ `"  .~@   '  -~~;! )~ ,~:~~~~$"-replace'~','    ')[$n]
            $n=1
        }
    }
)

}

@(
    ,("example. sos",". -..- .- -- .--. .-.. . .-.-.-  ... --- ...")
    ,("0123456789abcdefghijklmnopqrstuvwxyz","----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----. .- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --..")
    ,("hello world", ".... . .-.. .-.. ---  .-- --- .-. .-.. -..")
) | % {
    $expected,$s = $_
    $result = &$f $s
    "$($result-eq$expected): $result"
}

Вихід:

True: example. sos
True: 0123456789abcdefghijklmnopqrstuvwxyz
True: hello world

0

JavaScript (165 байт, лише впроваджуючи чотири площини.)

n=''.replace(/\./g,1).replace(/-/g,0).split(' ')
l='|te|mnai|ogkdwrus|cöqzycxbjpälüfvh'.split('|')
r=''
for(i in n){r+=l[n[i].length][parseInt(n[i],2)]}
alert(r)

Вхід повинен бути призначений n, виконати наступний код, щоб отримати вихід:

n='. -..- .- -- .--. .-.. .'.replace(/\./g,1).replace(/-/g,0).split(' ')
l='|te|mnai|ogkdwrus|cöqzycxbjpälüfvh'.split('|')
r=''
for(i in n) {r+=l[n[i].length][parseInt(n[i],2)]}
alert(r)

Це не тільки є неповним виконанням, але навіть не працює. Fiddle + Chrome видає помилку Cannot read property '42' of undefined, а IdeOne також повідомляє про помилку (хоча без корисного повідомлення).
Пітер Тейлор

Спробуйте виправити це :)
Timtech

@PeterTaylor Зазначається, що він підтримує лише чотири площини, тобто перевищує 4 символи морзових кодів, таким чином він не прийме . -..- .- -- .--. .-.. . .-.-.-введення, оскільки останній код має 6 символів. У прикладі скрипту я його опускаю і переходжу з . -..- .- -- .--. .-.., який попереджає ( example).
ауларон

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.