Standart çıkışa mors kodu


13

Bu soru Mors kodu olarak girdi almayı içerir. (nokta) ve - (eksi simgesi) ile girdiyi ayırın. Göreviniz kodu standart çıktıya dönüştürmektir. Tek girdinin, burada bulunan Uluslararası Mors Kodu alfabesinde bulunan karakter sembollerini içerdiğini varsayabilirsiniz: http://en.wikipedia.org/wiki/Morse_code#Letters.2C_numbers.2C_punctuation .

Tüm çıktılarda küçük harfler kullanılmalıdır. Çifte boşluk bir kelime uzayı olarak yorumlanmalıdır.

Örnek giriş:

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

Çıktı:

example. sos

İki hafta sonra en kısa kod kazanır.


Sadece 'karakter sembolleri' diyorsunuz, bu karakterler ve semboller mi?
Sinkingpoint

@Quirliom Bu bağlantıdaki tüm "semboller" karakterler. Bir Dizgiye koyabileceğiniz her şey bir karakterdir (temelde). Ancak, sorunun bu kısmı temel olarak her mors parçasının geçerli olacağını söylüyor.
Justin

@Quirliom Evet, .se 'a' ve gibi her Morse 'karakteri'. 'e' için geçerlidir. Morse olmayan karakterlerin işlenmesi gerekmez.

Harf alanı ve kelime alanı ne olacak? Birincisi için bir alan ve ikincisi için iki (veya daha fazla)?
Paul R

Yanıtlar:


8

Mathematica 62

Mathematica aldatmamıza izin veriyor

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

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

e

misal.

bugün alay ettin mi

İlk iki sembol .ve .-küçük kodları doğru yorumlamak için gereklidir.


Bu, küçük harfe dönüştürme işlemini kaçırıyor.
Peter Taylor

@PeterTaylor Küçük f=ToLowerCase@StringDrop[WolframAlpha[". .- "<>#,"Result"],2]&harf için kolayca değiştirilebilir .
ybeltukov

Wolfram Alpha api kullanmak için bir uygulama kimliği gerekmez mi? Eğer öyleyse, bu karakter sayısına eklenmemeli midir? Yine de çok akıllı bir çözüm.
Björn Lindqvist

@ BjörnLindqvist Mathematica'daki bu komutu tam olarak değerlendirin , gayet iyi çalışıyor.
ybeltukov

23

Drat, GolfScripters gelmeden buraya gelmeyi umuyordum :-(

Her neyse ...

C: 228 karakter:

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]);}}

Bunun nasıl çalıştığına dair bir açıklama ekleyeceğimi düşündüm.

Giriş verileri, *caşağıdaki gibi genişletilebilen ( ·boş bir düğümü temsil etmek için kullanılarak) ağaç verilerine göre ayrıştırılır :

                     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
····$·······?_····"··.····@···'··-········;!·)·····,····:·······

Ağacın tepesinden başlayarak, bir nokta için sola ve bir çizgi için sağa hareket ederken aşağı doğru çalışın. Ardından, giriş dizesi sona erdiğinde (yani bir boşluk karakteri ile karşılaşıldığında) hangi karakter olursa olsun çıktısını alın. Yani, örneğin, üç nokta ve çizgi götürecektir vyoluyla e, ive s. Noktaları (ASCII \x2e) ve tireleri (ASCII \x2d) açıkça kontrol etmek yerine, yalnızca m[n]&10 .ve 1 için son biti ( ) kontrol etmemiz gerekir -.

7 satır $/ tire içeren hariç her şeyi kodlamak için altı satır yeterlidir : ...-..-ancak giriş verilerinin geçerli olacağı garanti edildiğinden, giriş 6 karakterde ( m[6]=0) kesilerek ...-..ve $bunun yerine yorumlanarak kolayca düzeltilebilir . Ayrıca, son 7 baytı ağaç verilerinden kesebiliriz, çünkü hepsi boştur ve giriş geçerliyse gerekli değildir.


1
6 karakterli kodların son karakterini atmak ve arama tablosunu kısaltmak için güzel bir numara.
Peter Taylor

2
Tartışmanın netliği için algoritmanın kalitesi kadar oy kullanıyorum. İyi iş.
Michael Stern

Tüm dizeyi okumak yerine karakter karakter işleyerek birkaç karakteri tıraş edip edemeyeceğinizi görün c. Belki de yüksek değerleri birlikte ezmeye çalışmak için modulo ve bir ofset kullanabilirsiniz; benim çözümümde bunu yapıyorum. Her neyse, iyi iş çıkardın!
FireFly

8

GolfScript ( 116 113 97 karakter)

Bu, arama tablosunda kullanılan yazdırılamayan karakterleri içerir, bu yüzden xxd çıktısı olarak veriyorum:

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

Bu, eşdeğer bir programın kodunu çözer

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+

esasen

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

Bu, asgari mükemmel hash fonksiyonları üretmek için en uygun algoritmanın ana fikrine dayanan (minimal olmayan) bir hash kullanır ; Çek, Havas ve Majewski; 1992 . Temel fikirleri iki hash fonksiyonu kullanmanız f1ve f2bir arama tablosu ile birlikte gmükemmel hash (g[f1(str)] + g[f2(str)]) % m( mayırt etmek istediğimiz dizelerin sayısı nerede ); zekice bit, inşa ettikleri yol g. Tüm değerleri f1(str)ve ilgilenilen f2(str)dizeleri stryönlendirilmemiş bir grafikte düğüm olarak düşünün f1(str)ve ilef2(str)her dize için. Sadece her bir kenarın ayrı olmasını değil, grafiğin asiklik olmasını gerektirirler; o zaman düğümlere ağırlık atamak (yani arama tablosunu doldurmak g) her kenarın gerekli toplamı alacağı şekilde bir DFS'dir.

Çek ve arkadaşları rasgele fonksiyonlar üretir f1ve f2bunlar arama tabloları aracılığıyla ifade edilir, ancak bu açıkça iyi değildir: -10'dan 9'a kadar iki farklı tabana sahip basit temel dönüşümleri kullanarak uygun bir karma aradım. Ben 0'dan 54'e değerlere dizeleri atamak istediğiniz yoktu, ama gelen ASCII kodları, bu yüzden ziyade alarak (g[f1(str)] + g[f2(str)]) % mistediğim (g[f1(str)] + g[f2(str)]) % Nbazıları için N > 'z'. Ancak bu, özgürlüğü çeşitli denemeye Nve gdöngü olup olmadığına bakılmaksızın, herhangi birinin geçerli bir arama tablosuna izin verip vermediğini görmenizi sağlar . Çek ve arkadaşlarının aksine Mükemmel hash fonksiyonunun araştırmasının O (n ^ 4) olup olmadığı umurumda değil.

-4baseVe 5basemod tarafından oluşturulan grafik 59:

Bazı küçük ayarlamalar ile nokta tarafından oluşturulan grafik

hangi üç döngü uzunluğu 1 olan en büyük bağlı bileşen dışında oldukça güzel. Biz tutarlı olan N=233bir bulamadan önce kadar gitmek zorunda g.


Arama tablosu için diğer olası kodlamalar: fark kodlaması yardımcı olmaz, çünkü yapı yoktur. Bir permütasyon olarak kodlayarak değerlerin tekrarlanmamasından yararlanmak mümkün olabilir, ancak boşlukların ayrı ayrı ele alınması gerekir (54 çıkış karakteri => 30 bayt entropi artı kod çözme; çalıştırmalar kodlanmışsa en az 15 bayta ihtiyaç duyar düz bir temel dönüşüm olarak kullanılabilir; yalnızca mevcut 92 bayt üzerinde iyileştirme yapmak mümkün olabilir) veya 138 öğeye izin veriyoruz (98 bayttan fazla entropi artı kod çözme).
Peter Taylor

Önek olmayan bir kod olduğundan, zor işi bir zlib uygulamasına avuç içine atmayı deneyemeyiz.
Peter Taylor

4

C, 169 karakter

Daha iyi bir karma işlevi bulamadım.

(En küçük kodu gönderdim ancak küçültülmüş saydım; küçültmek için sadece vim'de yapın :%s/ //g | %j!, sonra alanı dize değişmezine geri koyun.)

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;
}

Test sürüşü

( morse.insadece ayrı alfabelerde morse alfabesinin tamamıdır):

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

açıklama

Bu oldukça basittir. c < 33Bir boşluk / ayırıcı karakteri bulur ( , \n, EOF, ...). c % 2bir noktayı veya tireyi bir bite çevirir. Fikir, her karakter için sadece bir ikili sayı olarak yorumlayarak (değişken uzunlukla başa çıkmak için 1 ile ön ek yaptıktan sonra) benzersiz bir sayı oluşturmaktır (bu yorum v*2 + c%2kısımdır). Daha sonra elde edilen değeri hash ederek ( v < 64? v : v % 51 + 33, deneme yanılma yoluyla bulunan sabitler ve dağılıma bakarak ve büyük bir boşluk bulmaya çalışarak) sıkıştırdığım 137 karakterlik bir LUT elde ederim . Ne yazık ki bu hash işlevinin tek bir çarpışması var, bu yüzden 40 → '&'eşlemeyi özel olarak ele almam gerekiyor .


4

R , 145 bayt

Bir noktayı 2'ye, bir çizgiyi 1'e çevirip sayıyı üçlü olarak yorumlama ve karma tabloda kullanabileceğimiz benzersiz bir sayı veren mod 89'u alma. 13'ün (111 baz-3) varlığı 1 eklenmesi anlamına gelir çünkü ASCII 13 TIO'da çalışmaz.

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

Çevrimiçi deneyin!

R , 236 bayt (rakip olmayan)

Bu edilir değil rekabetçi olacak, ama bize Ar şey ilginç göstermek olanak tanır: bir alıntı dil yapısı içindeki Mors alfabesi ağacı saklamak mve çok sade bir şekilde gerçeği kullanarak noktalar ve çizgiler kodu çağırın [[için yinelemeli uygulanabilir listeleri. Örneğin m[[c(2,2,3,2)]]nokta, nokta, tire, nokta veya "f" yi alır.

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]])))

Çevrimiçi deneyin!


1

Powershell, 193 bayt

$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}})

Daha Az Golf Test Testi:

$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"
}

Çıktı:

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

0

JavaScript (165 bayt, yalnızca dört düzlem uyguluyor.)

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)

Giriş atandı n, çıktı almak için aşağıdaki kodu yürütü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)

Bu sadece eksik bir uygulama değil, aynı zamanda işe yaramıyor. Fiddle + Chrome hata veriyor Cannot read property '42' of undefinedve IdeOne da bir hata bildiriyor (yararlı bir mesaj olmasa da).
Peter Taylor


@PeterTaylor Sadece 4 düzlemi desteklediği, yani 4 karakter uzunluğunda mors kodlarını desteklediği, bu nedenle . -..- .- -- .--. .-.. . .-.-.-son kod 6 karakter uzunluğunda olduğu için giriş olarak kabul edilmeyeceği belirtildi . Örnek komut dosyasında atladım ve . -..- .- -- .--. .-..hangi uyarı ( example) ile devam ediyorum .
aularon

İşte ikinci blok kodu ile bir keman: jsfiddle.net/aularon/AHY4e/1
aularon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.