मानक आउटपुट के लिए मोर्स कोड


13

इस प्रश्न में मोर्स कोड में इनपुट लेना शामिल है। (अवधि) और - (माइनस सिंबल), इनपुट को अलग करने के लिए रिक्त स्थान के साथ। आपका कार्य कोड को मानक आउटपुट में बदलना है। आप मान सकते हैं कि एकमात्र इनपुट में अंतर्राष्ट्रीय मोर्स कोड वर्णमाला में पाए जाने वाले वर्ण चिह्न हैं, जो यहां पाए गए हैं: http://en.wikipedia.org/wiki/Morse_code#Letters.2C_numbers.2C_punctuation

सभी आउटपुट को लोअरकेस अक्षरों का उपयोग करना चाहिए। डबल स्पेस की व्याख्या शब्द स्पेस के रूप में की जानी चाहिए।

नमूना इनपुट:

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

आउटपुट:

example. sos

दो सप्ताह की जीत के बाद सबसे छोटा कोड।


आप केवल symbols चरित्र प्रतीकों ’को कहते हैं, वह चरित्र और प्रतीक हैं?
4

उस लिंक में @Quirliom सभी "प्रतीक" अक्षर हैं। एक स्ट्रिंग में आप जो कुछ भी डाल सकते हैं वह एक चरित्र है (अच्छी तरह से, मूल रूप से)। हालांकि, सवाल का वह हिस्सा मूल रूप से कह रहा है कि मोर्स का हर बिट मान्य होगा।
जस्टिन

@Quirliom हां, प्रत्येक मोर्स 'वर्ण', जैसे- 'a' और के लिए। 'ई' के लिए वैध है। किसी भी गैर-मोर्स पात्रों को संभालने की आवश्यकता नहीं है।

लेटर स्पेस और वर्ड स्पेस के बारे में क्या? पूर्व के लिए एक स्थान और बाद के लिए दो (या अधिक)?
पॉल आर

धीरे-धीरे (संयुक्त राष्ट्र) से संबंधित: stackoverflow.com/questions/1352587/code-golf-morse-code
javatarz

जवाबों:


8

गणितज्ञ 62

गणितज्ञ हमें धोखा देने की अनुमति देता है

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

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

उदाहरण।

क्या तुमने आज मून किया है?

पहले दो प्रतीकों .और .-छोटे कोड को सही ढंग से व्याख्या करने के लिए आवश्यक हैं।


यह निचले मामले में रूपांतरण को याद कर रहा है।
पीटर टेलर

@PeterTaylor इसे f=ToLowerCase@StringDrop[WolframAlpha[". .- "<>#,"Result"],2]&लोअर केस के लिए आसानी से संशोधित किया जा सकता है ।
यबल्टुकोव

वुल्फराम अल्फा एपीआई का उपयोग नहीं करने के लिए एक आवेदन आईडी की आवश्यकता होती है? यदि हां, तो क्या उसे वर्ण गणना में नहीं जोड़ा जाना चाहिए? फिर भी बहुत चालाक समाधान।
ब्योर्न लिंडकविस्ट

@ BjörnLindqvist बस में वास्तव में इस आदेश का मूल्यांकन मेथेमेटिका , यह ठीक कांटे।
ybeltukov

23

Drat, मैं उम्मीद कर रहा था कि इससे पहले कि गोल्फ खिलाड़ी आएँ: --(

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। डॉट्स (एएससीआईआई \x2e) और डैश (एएससीआईआई \x2d) के लिए स्पष्ट रूप से जांच करने के बजाय , हमें केवल अंतिम बिट ( m[n]&1) की जांच करनी होगी , जो कि 0 के लिए .और 1 के लिए है -

छह पंक्तियों को छोड़कर एनकोड सब कुछ के लिए पर्याप्त हैं $, जो 7 डॉट / डैश है: ...-..-, लेकिन जब से इनपुट डेटा मान्य होने के लिए गारंटी है, यह आसानी से (6 अक्षर पर इनपुट छोटा द्वारा निर्धारित किया जा सकता है m[6]=0) और व्याख्या ...-..के रूप में $के बजाय। हम पेड़ के डेटा से आखिरी 7 बाइट्स भी काट सकते हैं, क्योंकि वे सभी खाली हैं और यदि इनपुट वैध है तो इसकी आवश्यकता नहीं है।


1
6-वर्ण कोड के अंतिम वर्ण को छोड़ने और लुकअप तालिका को छोटा करने की अच्छी चाल।
पीटर टेलर

2
मैं एल्गोरिथ्म की गुणवत्ता के लिए चर्चा की स्पष्टता के लिए मतदान कर रहा हूं। अच्छा कार्य।
माइकल स्टर्न

यह देखें कि क्या आप पूरी स्ट्रिंग को पढ़ने के बजाय कैरेक्टर-बाय-कैरेक्टर की प्रोसेसिंग करके कुछ चार्ट को दाढ़ी बना cसकते हैं। शायद आप उच्च मूल्यों को एक साथ करने की कोशिश करने के लिए मोडुलो और एक ऑफसेट का उपयोग कर सकते हैं; मैं अपने समाधान में यही करता हूं। वैसे भी, अच्छा काम!
फायरफली

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)प्रत्येक स्ट्रिंग के लिए। उन्हें न केवल यह आवश्यक है कि प्रत्येक किनारे अलग-अलग हों, बल्कि यह हो कि ग्राफ में चक्रीय हो; तब यह नोड्स (यानी लुकअप टेबल को पॉप्युलेट करने के लिए g) को असाइन करने के लिए एक DFS होता है, जैसे कि प्रत्येक किनारे पर आवश्यक राशि होती है।

चेक एट अल यादृच्छिक कार्यों को उत्पन्न करता है 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, चाहे कोई भी चक्र हो। चेक एट अल के विपरीत, मुझे परवाह नहीं है कि सही हैश फ़ंक्शन की खोज हे (एन ^ 4) है।

-4baseऔर 5baseमॉड द्वारा उत्पन्न ग्राफ 59है:

कुछ छोटी-छोटी बातों के साथ डॉट द्वारा प्रस्तुत किया गया ग्राफ़

जो सबसे बड़े जुड़े घटक के अलावा काफी अच्छा है, जिसमें लंबाई के तीन चक्र हैं। हमें N=233एक gसंगत है जो खोजने से पहले हमें ऊपर जाना होगा ।


लुकअप टेबल के लिए अन्य संभावित एनकोडिंग: अंतर एन्कोडिंग मदद करने के लिए नहीं है, क्योंकि संरचना नहीं है। एक क्रमपरिवर्तन के रूप में एन्कोडिंग द्वारा मूल्यों की गैर-पुनरावृत्ति का दोहन करना संभव हो सकता है, लेकिन या तो अंतराल को अलग से संभाला जाना चाहिए (54 आउटपुट वर्ण => 30 बाइट्स ऑफ एन्ट्रापी, प्लस डिकोडिंग; रन इनकोड होने पर कम से कम 15 बाइट्स की आवश्यकता होती है; एक सीधे आधार रूपांतरण के रूप में, वर्तमान में कुल 92 बाइट्स में सुधार करना संभव हो सकता है) या हम 138 वस्तुओं (एन्ट्रापी के 98 से अधिक बाइट्स, प्लस डिकोडिंग) की अनुमति दे रहे हैं।
पीटर टेलर

चूंकि यह एक गैर-उपसर्ग कोड है, इसलिए हम आसानी से एक zlib कार्यान्वयन के लिए कड़ी मेहनत को हथेली में लाने की कोशिश नहीं कर सकते।
पीटर टेलर

4

सी, 169 चरस

मैं एक बेहतर हैश समारोह नहीं मिल सका ..

(मैंने अघोषित कोड पोस्ट किया, लेकिन इसे मिनिमाइज्ड गिना; मिनीम में बस करने के लिए मिनिमाइज किया :%s/ //g | %j!, फिर स्ट्रिंग शाब्दिक बैक में स्पेस दिया।)

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, ईओएफ, ...) पाता है । c % 2एक डॉट या डैश को थोड़ा सा अनुवाद करता है। विचार प्रत्येक चरित्र के लिए एक द्विआधारी संख्या के रूप में व्याख्या करके एक अद्वितीय संख्या बनाने के लिए है (चर लंबाई से निपटने के लिए इसे 1 के साथ उपसर्ग करने के बाद) (यह व्याख्या v*2 + c%2हिस्सा है)। फिर मुझे एक 137-चार्ट LUT मिलता है, जिसे मैंने परिणामी मूल्य ( v < 64? v : v % 51 + 33, परीक्षण और त्रुटि के माध्यम से पाए गए स्थिरांक और वितरण को देखकर और एक बड़ा अंतर खोजने का प्रयास करके) को हैशिंग द्वारा संकुचित किया है । दुर्भाग्य से इस हैश फंक्शन में एक एकल टक्कर है, यही वजह है कि मुझे 40 → '&'मैपिंग को विशेष रूप से करना पड़ता है ।


4

आर , 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='')

इसे ऑनलाइन आज़माएं!

आर , 236 बाइट्स (गैर-प्रतिस्पर्धात्मक)

यह प्रतिस्पर्धी नहीं होने जा रहा है, लेकिन यह हमें आर में कुछ दिलचस्प दिखाने देता है: मोर्स कोड ट्री को एक उद्धृत भाषा संरचना के अंदर स्टोर करें mऔर इसे डॉट्स और डैश के कोड से पुनः प्राप्त करें बस इस तथ्य का उपयोग करके कि [[पुनरावर्ती रूप से लागू किया जा सकता है। सूचियों। उदाहरण के लिए m[[c(2,2,3,2)]]डॉट, डॉट, डैश, डॉट या "एफ" को पुनः प्राप्त करता है।

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

पॉवरशेल, 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

जावास्क्रिप्ट (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 भी एक त्रुटि की रिपोर्ट करता है (हालांकि एक उपयोगी संदेश के बिना)।
पीटर टेलर

इसे ठीक करने का प्रयास करें :)
टाइमटेक

@PeterTaylor यह कहा गया है कि यह केवल चार विमानों का समर्थन करता है, अर्थात 4 वर्णों के लंबे मोरसे कोड, इस प्रकार इसे . -..- .- -- .--. .-.. . .-.-.-इनपुट के रूप में स्वीकार नहीं किया जाएगा , क्योंकि अंतिम कोड 6 वर्ण लंबा है। उदाहरण स्क्रिप्ट में मैं इसे छोड़ देता हूं और इसके साथ जाता हूं . -..- .- -- .--. .-.., जो अलर्ट ( example)।
22

यहाँ दूसरे ब्लॉक कोड के साथ एक
फिडेल है
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.