Mors kodu çevirmeni


32

Standart girişi Mors koduna dönüştürmek için en kısa programı yazın . Tabloda olmayan karakterler olduğu gibi basılmalıdır.

Uluslararası Mors Kodu


1
Hem büyük hem de küçük harfler kodlanmış mı?
Joey Adams

9
Ayrıca, kelimeler arasındaki boşluklar gibi ayrıntıları netleştirmek için bir örnek giriş ve çıkış sağlayabilir misiniz?
Joey Adams

Morse'da küçük ve büyük harf arasında fark yoktur. Boşluk için gerçek bir sembol yoktur (sadece 3 / 4'lük bir sessizliktir), bu yüzden bir boşluk olarak çevrilmesi gerektiğini düşünüyorum.
Shikiryu,

@Joey: Detaylar size kalmış.
Alexandru

Yığın Taşması sorusuna benzer Kod Golf: Mors kodu .
dmckee

Yanıtlar:


11

Golfscript - 74 karakter

Bu cevap sadece büyük harf ve rakamları destekler. Harfler yeni satırlara, kelimeler ise 2 yeni satırlara ayrılmıştır.

{." ETIANMSURWDKGOHVF L PJBXCYZQ"?)"?/'#! 08<>"@))10%=or 2base(;{!45+}%n}%

analiz

    Her zamanki gibi {}%, dizinin üzerindeki bir harita gibi çalışır
    . char'in bir kopyasını istifin üzerine itin
    "ETIAN ..." bu, büyük harfler için bir arama tablosu
    ? Bir string.find gibi dizgede char dizini döndürür
                  veya bulunmazsa -1 (yani bir rakam)
    ) bu indeksi arttırın, böylece E => 2 T => 3 I => 4 vs.
                  char bir büyük harf veya boşluk değil bu şimdi 0 (Yanlış)
    "? / '#! ..." Bu, hanelerin arandığı bir tablodur. içinde kullanılacak
                  diğer arama tablosuna tersi yönde.
    @ char'dan yaptığımız kopyayı yığının üstüne çek.
    ))% 10, ascii rakamını 2 ekleyerek ve mod 10 alarak bir sayıya dönüştürür.
                  Bu şekilde yapmak önemlidir, çünkü tüm büyük harf
                  Harfler de bu koda çarptı ve bunların düştüğünden emin olmalıyız.
                  0..9 aralığında veya bir sonraki adım başarısız olur.
    = nth karakterini dizeden çekiniz, örneğin "Merhaba" 1 = "e" verir
    ya da büyük harf araması başarısız olursa, 0 sonuç elde ettiğimizi unutmayın,
                  rakam araması kullanılacak
    2base, üs 2'ye dönüştürür, böylece E => [1 0], T => [1 1], I => [1 0 0] vb.
    (; listenin ön tarafını aç ve fırlat, E => [0], T => [1]
    {! 45 +}% her bit'i olumsuzlar ve 45 ekler, bu ascii değerini verir. ve -
    n newline her kelimeyi ayırır. istersen bu 32 olabilir
                  sözcükleri boşluklarla 1 vuruş için ayır

Golfscript - 85 karakter

Buradaki rahat gereksinimler nedeniyle bu SO cevabımdan daha kısa. Giriş, büyük harf / rakam ve noktalama işaretleri olmalı. "

{." ETIANMSURWDKGOHVF!L!PJBXCYZQ"?)"UsL?/'#! 08<>"@".,?"58,48>+?=or
2base(;{!45+}%n}%

Noktalama işareti burada gerekli olmadığından, cevabı daha da kısaltabilirim

SO
Golfscript'ten cevabım - 107 karakter

Giriş sonunda yeni satır desteklenmez, bu nedenle böyle bir şey kullanın.

echo -n Hello, Codegolfers| ../golfscript.rb morse.gs

Harfler özel bir durumdur ve küçük harfe dönüştürülür ve ikili konumlarında sıralanır. Diğer her şey bir çeviri tablosu tarafından yapılır.

' '/{{.32|"!etianmsurwdkgohvf!l!pjbxcyzq"?)"UsL?/'#! 08<>"@".,?0123456789"?=or
2base(;>{'.-'\=}%' '}%}%'/'*

Buradaki kod bloklarınızın sırası, George'un UserScript'i karıştırıyor . Yeniden düzenlemenizi zorlaştırabilir miyim? Ve ben ederim o açıkladı görmek isterler. Örtük ağacı alıyorum, ama gerisi benim için bir gizem.
dmckee

@dmckee, yapıldı. George'un senaryosu
sayımın

Analizi görmek için olumlu oylar gerekiyor ... boo! Analiz, cevaplara değen şeydir!
Nick Larsen

@Hayır, tamam sanırım bulabildiğim kadar kısa, bu yüzden bu analiz üzerinde çalışacağım
gnibbler

20

C # (213 karakter)

Bunun uzun sürmeyeceğinden eminim, ama en azından ilk önce buradaki tekniği kullandım!

class P{static void Main(string[] a){foreach(var t in a[0]){var c="";for(int i=" ETIANMSURWDKGOHVF L PJBXCYZQ  54 3   2       16       7   8 90".IndexOf(t);i>0;i/=2)c="-."[i--%2]+c;System.Console.Write(c+"  ");}}}

Ve okunabilir biçimde:

class P
{
    static void Main(string[] a)
    {   
        foreach(var t in a[0])
        {
            var c="";
            for(int i=" ETIANMSURWDKGOHVF L PJBXCYZQ  54 3   2       16       7   8 90".IndexOf(t);i>0;i/=2)c="-."[i--%2]+c;
            System.Console.Write(c+" ");
        }
    }
}

Kısa bir açıklama için, karakter dizisi, sol çocuğun bir nokta ve sağ çocuğun bir çizgi olduğu bir yığındır. Mektubu oluşturmak için geri dönüp sırayı tersine çevirirsiniz.


2
Şimdiye kadar gördüğüm en iyi fikir bu.
Alexandru

Sonra bağlantılı ipliği okudum ve bunun orijinal olmaktan çok uzak olduğunu fark ettim.
Nick Larsen,

1
İçeri girdiğimde ETIAN..., bunun golf komut dosyasıyla aynı şekilde çalıştığını varsaydım, ancak dizgiyi yorumlamanın farklı bir yolunu buluyorsunuz. Bunun eşdeğer olduğunu düşünüyorum ama indeksi 1 eklenir ve lider 1" örneğin sonuçta basamak için nokta ve çizgi almak için binary karşılığını kullanırF=>18=>0b10010=>..-.
gnibbler

Bu alana ihtiyacınız yokString[] a
Cyoce

9

tr + sed (347)

tr a-z A-Z | sed 's/0/--O/g;s/1/.-O/g;s/2/.J/g;s/3/..W/g;s/4/.V/g;s/5/.H/g;
 s/6/-.H/g;s/7/-B/g;s/8/-Z/g;s/9/--G/g;s/X/-U/g;s/V/.U/g;s/U/.A/g;
 s/Q/-K/g;s/K/-A/g;s/A/.T/g;s/J/.O/g;s/O/-M/g;s/Y/-W/g;s/W/.M/g;
 s/M/-T/g;s/T/- /g;s/H/.S/g;s/B/-S/g;s/S/.I/g;s/L/.D/g;s/Z/-D/g;
 s/D/-I/g;s/I/.E/g;s/C/-R/g;s/F/.R/g;s/R/.N/g;s/P/.G/g;s/G/-N/g;
 s/N/-E/g;s/E/. /g'

1
Borunun etrafındaki boşluk da elimine edilebilir ;-)
Yasir Arsanukaev

1
Evet, bu boşlukları saymıyorum, onları netlik için buraya yazdırıyorum :)
Eelvex

2
Çok fazla kısaltmak için ayraç genişletme kullanabilirsiniz ( /g;s/olur ,- ek yük biraz).
Nabb

@ nabb iyi bir fikir.
Eelvex

1
Tr düşebilir, sed ykomutunu kullanın
Hasturkun

6

Haskell - 314 292 291 karakter

import Data.List
i=intercalate
m=i"       ".map(i" ".map(\c->words".- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.. ----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----."!!(head.findIndices(==c)$['a'..'z']++['0'..'9']))).words

Daha kullanıcı tarafından okunabilir bir form:

tbl :: [String]
tbl = words ".- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.. ----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----."

lookupChar :: Char -> String
lookupChar c = tbl !! (fromJust . elemIndex c $ ['a'..'z'] ++ ['0'..'9'])

encWord :: String -> String
encWord = intercalate " " . map lookupChar

encSent :: String -> String
encSent = intercalate "       " . map encWord . words

Örnek çalışma:

*Main> m "welcome humans"
".-- . .-.. -.-. --- -- .       .... ..- -- .- -. ..."

İki harf arasında tek bir boşluk ve iki sözcük arasında yedi boşluk vardır.


Sadece @dmckee "Code Golf: Morse code" tarafından referans verilen soruyu kontrol ettim ve bir Haskell sürümü bulamadım. Bence 314'ten daha kısa bir süre mümkün olurdu.
Yasir Arsanukaev

fromJust.elemIndex colarak yazılabilir head.findIndices(==c). Bu bir karakter daha, ama daha sonra kurtulabilirsiniz import Data.Maybe, bu yüzden toplam 17 karakter kaydedersiniz. Intercalate'i her çağırdığınızda dizenin önündeki boşluğu kaldırarak iki karakter kaydedebilirsiniz. Ve bir kaç karakter i=intercalatedaha başında yaparak ve iki çağrıyı intercalateile değiştirerek i.
sepp2k

@ sepp2k: Güzel fikir! Teşekkürler. Ben de oynadım intercalateve 6 karakter daha kaydettim! :-)
Yasir Arsanukaev

w=wordsYanılmıyorsam bir karakter kaydeder , aynı zamanda yapabilirsiniz . Ve yerine l c=...ve map lyapmanız gerekir map\c->...(zaten zaten bir kapanış paren olduğundan lambda etrafında parens bile gerekmez).
sepp2k

@ sepp2k: Çizgisi l c=...bana 1 karakter kazandırdı, ancak bunu sadece parens olmadan koyamadım map(\c->...). GHC versiyon 6.12.3.
Yasir Arsanukaev

4

dipnot (310) (462) (414)(319) tablo için (46 ) dahil olmak üzere .

Üçlü kodlama içeren birleştirilmiş sayılar ve harfler. 5 üçlü basamak bir bayt sığdır! Bu aptalca fark döngülerini ve özel kasa numaralarını tamamen ortadan kaldırır.

ASCII85 her tablonun 1 / 3'ünü keser. Ve kodun sadeleştirilmesi (nihayet!) 400'ün altına geri döndü!

errordict/undefined{pop( )dup 0 4 3 roll put print{}}put<</*{{[exch/@ cvx]cvx 1
index 1 add}forall pop}def/C{<~#:VD<!AP07"A]ga#R),'7h?+2(./s-9e6~>*}def/#{load
exec}/P{print}0{}1{(.)P}2{(---)P}/S{( )P}48<~o'u/0b'A;]L7n~>* 65 C 97 C/@{5{dup
3 mod # S 3 idiv}repeat # S S S}>>begin{(%stdin)(r)file read not{exit}if #}loop

Örnek çıktı

Luser Dr00g!
. ---. . . . ---. . . . . ---. ---. . . ---. --- --- --- --- --- --- --- --- --- --- --- ---. !

Ungolfed ve yorum yaptı. Bununla çok gurur duyuyorum. Sayıları işe yaratanların zarif olduğunu düşünüyorum . :)

%!
%Morse Code Translator (Simplified)

%if `load` signals /undefined in /#{load exec},
%  pop --load--,
%  print the char,
%  leave dummy object for `exec` to find
errordict/undefined{pop( )dup 0 4 3 roll put print{}}put

<<
%create int->proc pairs
%from initial int and string values
/*{{[exch/@ cvx]cvx 1 index 1 add}forall pop}def

%the alpha map is applied to Upper and Lower case
/C{<~#:VD<!AP07"A]ga#R),'7h?+2(./s-9e6~>*}def
65 C 97 C

%the number map
48<~o'u/0b'A;]L7n~>*

/#{load exec}  %execute a number
/P{print}

0{}       % 0: nop
1{(.)P}   % 1: '.' dit
2{(---)P} % 2: '---' dah
/S{( )P}  % S: space

%execute a morse sequence, from the table
/@{5{dup 3 mod # S 3 idiv}repeat # S S S}
>>begin

%read and execute each char from stdin
{(%stdin)(r)file read not{exit}if #}loop

Tablolar (33) + (13) = (46)

İşte dizelerin tabloyu nasıl kodladıkları. Her bayt, 5 basamaklı bir üçlü sayıyı temsil eder. Ve baytlar ayrıca ASCII85'te kodlanmıştır (hangi postscript otomatik olarak kod çözebilir).

%The Morse Table in Ternary Encoding
% 3  ^4 ^3 ^2 ^1 ^0
%    81 27  9  3  1                 Dec  Hex  dc ->ASCII85
%   ---------------                 ---  ---  ---
% A            2  1            6+1    7    7  7 256*41+256*50+256*14+
% B      1  1  1  2      27+ 9+3+2   41   29  d85%n85/d85%n85/d85%n85/d85%n85/n
% C      1  2  1  2      27+18+3+2   50   32  2 25 53 35 27  chr(x+33)
% D         1  1  2          9+3+2   14    E  #  :  V  D  <
% E               1              1    1    1
% F      1  2  1  1      27+18+3+1   49   31
% G         1  2  2          9+6+2   17   11  0 32 47 15 22
% H      1  1  1  1      27+ 9+3+1   40   28  !  A  P  0  7
% I            1  1            3+1    4    4
% J      2  2  2  1      54+18+6+1   79   4F
% K         2  1  2         18+3+2   23   17  1 32 60 70 64
% L      1  1  2  1      27+ 9+6+1   43   2B  "  A  ]  g  a
% M            2  2            6+2    8    8
% N            1  2            3+2    5    5
% O         2  2  2         18+6+2   26   1A  2 49 8 11 6
% P      1  2  2  1      27+18+6+1   52   34  #  R )  , '
% Q      2  1  2  2      54+ 9+6+2   71   47
% R         1  2  1          9+6+1   16   10
% S         1  1  1          9+3+1   13    D  22 71 30 10 17
% T               2              2    2    2   7  h  ?  +  2
% U         2  1  1         18+3+1   22   16
% V      2  1  1  1      54+ 9+3+1   67   43
% W         2  2  1         18+6+1   25   19  7 13 14 82 12
% X      2  1  1  2      54+ 9+3+2   68   44  (  .  /  s  -
% Y      2  2  1  2      54+18+3+2   77   4D  77 256*44+256*256*
% Z      1  1  2  2      27+ 9+6+2   44   2C  24 68 21 [23 36]
%                                              9  e  6 [ 8  E] (omit final 2)
% 0   2  2  2  2  2  162+54+18+6+2  242   F2
% 1   2  2  2  2  1  162+54+18+6+1  241   F1
% 2   2  2  2  1  1  162+54+18+3+1  238   EE  78 6 84 14 15
% 3   2  2  1  1  1  162+54+ 9+3+1  229   E5   o '  u  /  0
% 4   2  1  1  1  1  162+27+ 9+3+1  202   CA
% 5   1  1  1  1  1   81+27+ 9+3+1  121   79
% 6   1  1  1  1  2   81+27+ 9+3+2  122   7A  65 6 32 26 60
% 7   1  1  1  2  2   81+27+ 9+6+2  125   7D   b '  A  ;  ]
% 8   1  1  2  2  2   81+27+18+6+2  134   86  134 256*161+256*256*
% 9   1  2  2  2  2   81+54+18+6+2  161   A1  43 22 77 [50 40]
%                                              L  7  n [ S  I] (omit final 2)

4

Ruby, 161

d=proc{|x|x>1?d[x/2]+".-"[x&1]:' '}
$><<$<.gets.bytes.map{|i|
e=i>64?"-@B4*:68,?5</.7>E20+193ACD"[(i&95)-65]:i>47?"gWOKIHX`df"[i-48]:nil
e ?d[e.ord-40]:i.chr}*''

Her basamağı tek bir karakterde kodlar, 1, tire, 0 nokta, öncü 1 ile işaretleyici bit (artı yazdırılabilir tutmak için bir ofset). Giriş karakterlerini arama indeksleri olarak kullanmak için ASCII matematiğini kullanır.


4

VB.NET, 233 bayt

Module Module1
 Sub Main(a$())
   For Each c In a(0)
     Dim i = "ETIANMSURWDKGOHVF L PJBXCYZQ  54 3   2       16       7   8 90".IndexOf(c)
     If c <> " " And i >= 0 Then
       Console.Write("{0} ", Morse(i))
     Else
       Console.Write(c)
     End If
   Next
End Sub

Function Morse(i) As String
  Dim b = Math.Log(i) / Math.Log(2)
  Return (From m In MorseSeq(If(Double.IsInfinity(b), 0, b)) Order By m.Length)(i)
End Function

Function MorseSeq(i) As IEnumerable(Of String)
  Return If(i < 0, {}, From n In ".-" From m In MorseSeq(i - 1).DefaultIfEmpty
                       Select n & m)
End Function
End Module

Bu son işlev kötüdür.

düzenlemek A couple of improvs.

Function Morse(i) As String
  Return (From m In MorseSeq(i) Order By m.Length)(i)
End Function

Function MorseSeq(i) As IEnumerable(Of String)
  Return If(i=0,{".","-"},From n In".-"From m In MorseSeq(i>>1) Select n & m)
End Function

Bunu + 1'lemeye karar verdim çünkü VB.net’in golf oynamak için kullandığını hiç hatırlamıyorum.
mbomb007

3

Lisp ( 532 466 karakter)

(loop(princ(let((c(read-char)))(case c(#\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"--.. ")(#\1".---- ")(#\2"..--- ")(#\3"...-- ")(#\4"....- ")(#\5"..... ")(#\6"-.... ")(#\7"--... ")(#\8"---.. ")(#\9"----. ")(#\0"----- ")(t c)))))

Bu, küçük harfleri kodlar ve mors kodu dizileri takip eden bir boşlukla


3

Java'da 475 karakter.

    import java.io.*;class M{public static void main(String[]b){String s,t="-",m=t+t,o=m+t,z="",e=".",i=e+e,p=t+e,a=e+t,n=i+e,c[]={o+m,a+o,i+o,n+m,n+a,n+i,p+n,m+n,o+i,o+p,z,z,z,z,z,z,z,a,t+n,p+p,t+i,e,i+p,m+e,n+e,i,e+o,p+t,a+i,m,p,o,a+p,m+a,e+p,n,t,i+t,n+t,e+m,p+a,p+m,m+i};BufferedReader r=new BufferedReader(new InputStreamReader(System.in));try{s=r.readLine().toUpperCase();for(int j=48;j<91;j++)s=s.replace(z+(char)j,c[j-48]+" ");System.out.println(s);}catch(Exception x){}}}

Az, AZ ve 0-9'u çevirir.

Düzenle:

Veya 447 karakterde, çeviriden sonra Java'nın bir hata atması sakıncası yoksa.

    import java.io.*;class M{static{String s,t="-",m=t+t,o=m+t,z="",e=".",i=e+e,p=t+e,a=e+t,n=i+e,c[]={o+m,a+o,i+o,n+m,n+a,n+i,p+n,m+n,o+i,o+p,z,z,z,z,z,z,z,a,t+n,p+p,t+i,e,i+p,m+e,n+e,i,e+o,p+t,a+i,m,p,o,a+p,m+a,e+p,n,t,i+t,n+t,e+m,p+a,p+m,m+i};BufferedReader r=new BufferedReader(new InputStreamReader(System.in));try{s=r.readLine().toUpperCase();for(int j=48;j<91;j++)s=s.replace(z+(char)j,c[j-48]+" ");System.out.println(s);}catch(Exception x){}}}

3

Perl6 (238)

my%h="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--..0-----1.----2..---3...--4....-5.....6-....7--...8---..9----.".split(/<wb>/)[1..72];while$*IN.getc ->$c{print %h{$c.uc}||$c}

Okunabilir sürüm

# Split string on word breaks to create a hash
# I get an extra token at the beginning and end for some reason
# [1..72] is a slice without the extra pieces
my %h = "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--..0-----1.----2..---3...--4....-5.....6-....7--...8---..9----."
    .split(/<wb>/)[1..72];

# For each character in STDIN, print either the looked up value, or itself
while $*IN.getc -> $c {
    print %h{$c.uc} || $c;
}

“Başta ve sonunda bir sebepten dolayı fazladan bir belirteç alıyorum”: Perl 6'yı bilmiyorum, ama sanırım boş dize ilk sözcük sınırından önce ve sonuncudan sonra eşleşiyor.
msh210

2

sed, 159 bayt

s/.*/\L&/
s/[02]/&-/g
s/[89]/&./g
:
s/[b-ilnprsz5-9]/&./g
s/[ajkmoqt-y0-4]/&-/g
y/abcdefghijklmnopqrstuvwxyz0123456789/edri umsewnrttmwkai isadkgojuvhhbzoo/
t

Tüm hattın altını çizerek başlıyoruz (çünkü büyük / yküçük harf duyarlı dönüşümler yapamıyoruz); sadece küçük harf girişini işleyeceksek 10 bayt çıkarın. Sonra ön işlemeden rakam 0, 2, 8ve9 nihai sembollerini yayacak şekilde.

Döngü, her giriş karakteri için son sembolü oluşturur, ardından bir sonraki yineleme için her karakteri çevirir. Bu, Vikipedi makalesinde gösterilen ikilikli arama tablosunun yükseltilmesine eşdeğerdir ; Özel tedavi gerektiren basamakların ASCII alfanümeriklerimizde olmayan ebeveynleri olduğu görülebilir.

Döngü, tüm karakterler sonlandırma boşluğuna ulaştığında sona erer ('e' veya 't' sonrasında).

Örneğin, mektup küç seferde dönüştürülür:

  1. k=> k-=>n-
  2. n-=> n.-=>t.-
  3. t.-=> t-.-=>-.-

2

Python 3, 99 Karakterler

lambda a:print(*[str(ord('ӆҼzࢤpࢮ࠿yࡊoࡀѡÔÞÝࢭÓӅһѢ'[ord(c)%32])).translate(' -.'*18)for c in a])

Küçük ve büyük harflerle çalışır.


2

C, 162 160 karakter

char M[256] = "_^\\XP@ACGO       &15)\"4+0$>-2'%/6;*(#,8.9=3", v;
main(c) {
  for (;
         c = getchar(), v = M[c + 208 & 255] - 32, ~c;
         putchar(v-1? c : 32))
    for (; v > 1; v /= 2) putchar(".-"[v & 1]);
}

(Önemli olmayan boşluk çıkarıldı, izleyen yeni satır yok)

char M[256]="_^\\XP@ACGO       &15)\"4+0$>-2'%/6;*(#,8.9=3",v;main(c){for(;c=getchar(),v=M[c+208&255]-32,~c;putchar(v-1?c:32))for(;v>1;v/=2)putchar(".-"[v&1]);}

Mkarakterlerin bit modellerinin mors kodundaki noktalara ve çizgilere karşılık geldiği bir arama tablodur. Karakterler[0-9A-Z] bu tablo kullanılarak mors koduna dönüştürülür (mors kodundan sonra boşluk eklenir), diğer karakterler basitçe değişmeden geçer.

Örnek çalışma:

HELLO WORLD
.... . .-.. .-.. ---  .-- --- .-. .-.. -.. 
hello world
hello world
ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
.- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.. ----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----. 

Bu 162 karakter değil, lütfen golf versiyonunu gönderin.
Cyoce

@ Üzgünüz, bu çok sıkıcı bir mekanik işlem olduğundan önemli olmayan boşlukları soymadım ve PPCG'de oldukça standart bir uygulama olan kaynak kodunu okumayı zorlaştırdı. Sizin için elimden böyle bir boşluk ile bir sürüm eklendi :).
FireFly


1

Perl (489 karakter)

%c=("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"=>"--..",1=>".----",2=>"..---",3=>"...--",4=>"..---",5=>".....",6=>"-....",7=>"--...",8=>"---..",9=>"----.",0=>"-----");while(<>){foreach(split(//)){if(exists($c{$_})){printf"%s ",$c{$_}}else{print"$_"}}}

Böyle bir komut satırı ile yürütülebilir.

$ perl -e '$CODE' < textfile

Düzenleme: Özgün çözümümün çeviriyi geri aldığını belirttiğimiz için teşekkürler @tobyodavies!


1
Bunu 286 karaktere kadar alabilirsiniz:%c=qw(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 --.. 1 .---- 2 ..--- 3 ...-- 4 ..--- 5 ..... 6 -.... 7 --... 8 ---.. 9 ----. 0 -----);while(<>){print($c{$_}||$_)for split//}
msh210 20

1

PHP, 474 karakter

<?$a=strtoupper(fgets(STDIN));$m=array(65=>".-",66=>"-...",67=>"-.-.",68=>"-..",69=>".",70=>"..-.",71=>"--.",72=>"....",73=>"..",74=>".---",75=>"-.-",76=>".-..",77=>"--",78=>"-.",79=>"---",80=>".--.",81=>"--.-",82=>".-.",83=>"...",84=>"-",85=>"..-",86=>"...-",87=>".--",88=>"-..-",89=>"-.--",90=>"--..",49=>".----",50=>"..---",51=>"...--",52=>"..---",53=>".....",54=>"-....",55=>"--...",56=>"---..",57=>"----.",48=>"-----",32=>" ");while($i++<strlen($a))echo$m[ord($a[$i])];

Tüm girişler büyük harf ise, 462 karakterden oluşur:

<?$a=fgets(STDIN);$m=array(65=>".-",66=>"-...",67=>"-.-.",68=>"-..",69=>".",70=>"..-.",71=>"--.",72=>"....",73=>"..",74=>".---",75=>"-.-",76=>".-..",77=>"--",78=>"-.",79=>"---",80=>".--.",81=>"--.-",82=>".-.",83=>"...",84=>"-",85=>"..-",86=>"...-",87=>".--",88=>"-..-",89=>"-.--",90=>"--..",49=>".----",50=>"..---",51=>"...--",52=>"..---",53=>".....",54=>"-....",55=>"--...",56=>"---..",57=>"----.",48=>"-----",32=>" ");while($i++<strlen($a))echo$m[ord($a[$i])];

<?$a=strtoupper(fgets(STDIN));$m=array(65=>12,2111,2121,211,1,1121,221,1111,11,1222,212,1211,22,21,222,1221,2212,121,111,2,112,1112,122,2112,2122,2211)+array(48=>22222,12222,11222,11122,11222,11111,21111,22111,22211,22221)+array(32=>' ');while($a[$i++])echo strtr($m[ord($a[$i])],12,'.-');
Azaltılabilecek

1

05AB1E , 81 bayt ( Yarışmıyor )

Çvy©58‹i®58-•6V%·,Õo•2B5ôsè}®64›i®64-•4…·]ÑUZ“×\ó$9™¹“ÌLÈÎ%´•3B4ôsè}"012"".- "‡})

Çevrimiçi deneyin!

Harf kalıplarını baz-3'e, sayı desenlerini baz-2'ye dönüştürün, noktalara ve kısa çizgilere ulaşmak için sıfır dizinli ascii çevirisi kullanın. Küçük harflerle çalışmaz.


1

Jöle , 50 bayt

“¤⁵©ḤọḌṄ’B‘s5;“ḄẇɗÞI/QẊṂjỵr’Œ?ḃ2¤ṖṖƊ⁺ị⁾.-;
ØBiịÇ)K

Alanla ayrılmış çıktıyı basan bir komut satırı argümanı olarak Python formatlı bir dize kabul eden tam bir program.

Çevrimiçi deneyin!


1

Powershell, 142 bayt

-join($args|% t*y|%{if($_-match'\w'){for($d='ihfbZJKMQY+mazzy+0;?3,>5:.H7<1/9@E42-6B8CG='[$_-48]-42;$d-1){'.-'[$d%2]
$d=$d-shr1}' '}else{$_}})

Daha az golf oynadığı test senaryosu:

$f = {

-join(
    $args|% toCharArray|%{
        if($_-match'\w'){
            for($d='ihfbZJKMQY+mazzy+0;?3,>5:.H7<1/9@E42-6B8CG='[$_-48]-42;$d-1){
                '.-'[$d%2]
                $d=$d-shr1
            }
            ' '
        }else{
            $_
        }
    }
)

}

@(
    ,("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",".- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.. ----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----. ")
    ,("HELLO WORLD", ".... . .-.. .-.. ---  .-- --- .-. .-.. -.. ")
    ,("#$%^&","#$%^&")
) | % {
    $s,$expected = $_
    $result = &$f $s
    "$($result-eq$expected): $result"
}

Çıktı:

True: .- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.. ----- .---- ..--- ...-- ....- ..... -.... --... ---.. ----.
True: .... . .-.. .-.. ---  .-- --- .-. .-.. -..
True: #$%^&

Not: Çıktı sondaki boşlukları içerir.


1
+mazzy+bazı arsız dolgu olduğunu
Veskah

1

APL (NARS), 71 karakter, 142 bayt

{36≥y←⍵⍳⍨⎕A,⎕D:'•-'[0∼⍨⌽(5⍴3)⊤y⊃∊(2⍴256)∘⊤¨⎕AV⍳'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ᥃䴫쩸穼蚠']⋄⍵}

Ölçek:

  q←{36≥y←⍵⍳⍨⎕A,⎕D:'•-'[0∼⍨⌽(5⍴3)⊤y⊃∊(2⍴256)∘⊤¨⎕AV⍳'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ᥃䴫쩸穼蚠']⋄⍵}
  q¨'0123456789'
----- •---- ••--- •••-- ••••- ••••• -•••• --••• ---•• ----• 
  q¨"HELLO WORLD"
•••• • •-•• •-•• ---   •-- --- •-• •-•• -••  

Her harf bir boşluktan ayrılır, her kelime 3 boşluktan ayrılır. Tablo, alfasayısal dize ⎕A,⎕Dve 'ܨ㈍İᄧюᜪࠄᨳ䜏ഁᙂ᥃䴫쩸穼蚠'her biri taban 3'e dönüştürülmüş 8 bitlik karakterlere bölünmüş 16 bitlik karakterler üzerine inşa edilmiştir .


1

05AB1E , 52 bayt

Ažh«•1Ju&àøΘn₆δβαLmSÂZΘ=+BD1
 ÷ΓùwÒмVšh•… .-ÅвJ#ðδJ‡

Çevrimiçi deneyin!

    •1Ju&àøΘn₆δβαLmSÂZΘ=+BD1
    ÷ΓùwÒмVšh•                push compressed number 
              … .-ÅвJ#        convert to custom base " .-"
                      ðδJ     append a space to each morse code
Ažh«                     ‡    transliterate

1

JavaScript (ES6), 184 bayt

Bu sürümlerin her ikisinde de, herhangi bir karakterin arasına boşluk koyacaktır. 0-9 ve az dönüştürücüler (büyük küçük harfe duyarsız) dönüştürülür. Bir boşluk 3'e dönüştürülür.

s=>s.split("").map(e=>isNaN(d=parseInt(e.toLowerCase(),36))?e:`_OGCA@PX\\^\r\n  `.charCodeAt(d).toString(2).substr(1).split("").map(e=>".-"[e]).join("")).join(" ")

Yeni \nsatır karakteriyle ( 0x0a) değiştirin. SE nedeniyle birkaç yazdırılamayan karakter göstermiyor. Düzenleme moduna girmek bunu gösterir.

İşte hex:

73 3d 3e 73 2e 73 70 6c 69 74 28 22 22 29 2e 6d 61 70 28 65 3d 3e 69 73 4e 61 4e 28 64 3d 70 61 72 73 65 49 6e 74 28 65 2e 74 6f 4c 6f 77 65 72 43 61 73 65 28 29 2c 33 36 29 29 3f 65 3a 60 5f 4f 47 43 41 40 50 58 5c 5c 5e 05 18 1a 0c 02 12 0e 10 04 17 5c 72 14 07 06 0f 16 1d 0a 08 03 09 11 0b 19 1b 1c 60 2e 63 68 61 72 43 6f 64 65 41 74 28 64 29 2e 74 6f 53 74 72 69 6e 67 28 32 29 2e 73 75 62 73 74 72 28 31 29 2e 73 70 6c 69 74 28 22 22 29 2e 6d 61 70 28 65 3d 3e 22 2e 2d 22 5b 65 5d 29 2e 6a 6f 69 6e 28 22 22 29 29 2e 6a 6f 69 6e 28 22 20 22 29

Ungolfed

s=>            //declare anonymous function
s.split("")    //split into array of characters
.map(          //for each character
e=>            //declare anonymous function
 isNaN(        //is the character not in range 0-9a-zA-Z
  d=parseInt(e.toLowerCase(),36)
               //take it as base 36(digits are 0-9a-z) and assign to d
 )?e:          //if outside range, return as is
 `_OGCA@PX\\^\r\n  `
               //table of the morse code as binary as code point with leading 1
 .charCodeAt(d)//get the corresponding code
 .toString(2)  //convert to binary, 0=., 1=-, with an extra 1 bit
 .substr(1)    //remove the extra 1 bit
 .split("")    //split into each bit
 .map(         //for each bit
  e=>          //declare anonymous function
  ".-"         //the corresponding symbol for bits
  [e]          //get it
 )
 .join("")     //join the bits
)
.join(" ")     //join the characters with a space between each character

Okunabilir versiyon, 234 bayt

s=>s.split("").map(e=>isNaN(d=parseInt(e.toLowerCase(),36))?e:[95,79,71,67,65,64,80,88,92,94,5,24,26,12,2,18,14,16,4,23,13,20,7,6,15,22,29,10,8,3,9,17,11,25,27,28][d].toString(2).substr(1).split("").map(e=>".-"[e]).join("")).join(" ")

Ungolfed

s=>            //declare anonymous function
s.split("")    //split into array of characters
.map(          //for each character
e=>            //declare anonymous function
 isNaN(        //is the character not in range 0-9a-zA-Z
  d=parseInt(e.toLowerCase(),36)
               //take it as base 36(digits are 0-9a-z) and assign to d
 )?e:          //if outside range, return as is
 [95,79,71,67,65,64,80,88,92,94,
   5,24,26,12, 2,18,14,16, 4,23,
  13,20, 7, 6,15,22,29,10, 8, 3,
   9,17,11,25,27,28]
               //table of the morse code as binary with leading 1
 [d]           //get the corresponding code
 .toString(2)  //convert to binary, 0=., 1=-, with an extra 1 bit
 .substr(1)    //remove the extra 1 bit
 .split("")    //split into each bit
 .map(         //for each bit
  e=>          //declare anonymous function
  ".-"         //the corresponding symbol for bits
  [e]          //get it
 )
 .join("")     //join the bits
)
.join(" ")     //join the characters with a space between each character

0

Python 2, 283 274 Bayt

Bir alfanümerik dizgi oluşturdum, böylece dizedeki yerleşimleri Mors kodu gösterimlerini açıklar. Aslında ben ikili kullanacaktım ama 01aynı olurdu 1. Bu yüzden - = 1ve ile üçlü kullandım . = 2. Böylece karakter bu dizgede cindekslenir 1121, onun Mors kodu gösterimidir --.-.

  • Bayt kaydetmek için boşluk, çizgi ve nokta için değişkenler oluşturdum.
  • Sonra boşlukları azaltmak için bir çift replace ifadesi kullanarak 'kod çözücü' dizesini kodladım.
  • Fonksiyonun bir kısmı bir indeksi üç basamaklı sayılardan oluşan bir diziye dönüştürür.
  • Diğer kısım fonksiyonu bir karakter dizisi alır ve her karakteri Harf koduna dönüştürür, harflerden sonra 3 boşluk ve kelimeler arasında 7 (4 ekstra)
q,d,D=" .-"
s=" TE MN AI.OG KD.WR US-.QZ.YC XB- JP  L. F VH---.09  8..7--  6---.1--  2..3  45".replace(D,d*3).replace(d,q*4)
lambda n:''.join(''.join([0,D,d][i]for i in [s.index(c)//3**i%3 for i in range(5)if s.index(c)//3**i!=0][::-1])+q*3 if c!=q else q*4for c in n.upper())

Test Demeti

print(f("Hi")=="....   ..   ")
print(f("Hello")=="....   .   .-..   .-..   ---   ")
print(f("Hello World")=="....   .   .-..   .-..   ---       .--   ---   .-.   .-..   -..   ")
print(f("To be or not to be")=="-   ---       -...   .       ---   .-.       -.   ---   -       -   ---       -...   .   ")
print(f("3 14 15")=="...--       .----   ....-       .----   .....   ")

Güncelleştirme

  • -9 [16-05-09] Üçlü hesaplama fonksiyonunu ana fonksiyona dahil etti

[NOT: Her zaman beyaz boşluk vardır ancak beyaz boşluk bir duraklamayı temsil eder, bu yüzden tamam misafirim ]


0

PHP, 157 150 157 bayt

for(;$d=ord($c=$argv[1][$i++]);)echo ctype_alnum($c)?strtr(substr(decbin(ord($d>64?".CTRH@ZF\DUGXABEVOJL?K[ISQP"[$d&31]:"]muy{|ld`^"[$c])-48),1),10,".-"):$c;

ilk komut satırı argümanından girdi alır. Harfler arasında duraklama yok. İle koş -nr.

Yıkmak

for(;$d=ord($c=$argv[1][$i++]);)    # loop through input characters
    echo                                # print ...
    ctype_alnum($c)                     # if char is alphanumeric:
    ?   strtr(
        substr(
        decbin(                         
            ord($d>64                   # 1. map char to char-encoded morse
            ?".CTRH@ZF\DUGXABEVOJL?K[ISQP"[$d&31]
            :"]muy{|ld`^"[$c]
            )-60                        # 2. subtract 60 from ordinal value
        )                               # 3. decbin: convert to base 2
        ,1)                             # 4. substr: skip leading `1`
        ,10,".-")                       # 5. strtr: translate binary digits to dash/dot
    :$c;                                # not alphanumeric: no conversion

JavaScript, Python2, C, Ruby ve sed. Mutluyum.

4. adım: küçük harf karakterlerini kullanmadan işlemek için eşlemenin birleştirilmesi strtoupper.

önceki sürümler:

küçük harfler için başarısız; 12 düzeltme için bayt: Değiştir $argv[1]ile strtoupper($argv[1]).

Basit dize çeviri, 254 bayt

<?=strtr($argv[1],["-----",".----","..---","...--","....-",".....","-....","--...","---..","----.",A=>".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]);

dümdüz ileri: tüm dizgiyi bir kerede, mors koduna karakter çevirir
Dosyaya kaydet yürütmek veya değiştirilmesi <?=ile echove çalıştırmak -r.

mors kodlarının ondalık yorumu, 184 bayt (-70)

for(;""<$c=$argv[1][$i++];)echo($m=[32,48,56,60,62,63,47,39,35,33,A=>6,23,21,11,3,29,9,31,7,24,10,27,4,5,8,25,18,13,15,2,14,30,12,22,20,19][$c])?strtr(substr(decbin($m),1),10,".-"):$c;

ilk golf basamağı: önde 1gelen sıfırları korumak için ek bir lider ile ikili kodlanmış mors kodları . Karakterler arasında dolaşır ve bunları birer birer çevirir. İle koş -nr.

karaktere kodlanmış ondalık sayılar, 157 bayt (-27)

for(;""<$c=$argv[1][$i++];)echo ctype_alnum($c)?strtr(substr(decbin(ord("@"<$c?"CTRH@ZF\DUGXABEVOJL?K[ISQP"[ord($c)-65]:"]muy{|ld`^"[$c])-60),1),10,".-"):$c;

ikinci golf: ondalık değere 60 eklenmiş ve karaktere kodlanmıştır.

birleştirilmiş haritalama, 150 bayt (-7)

for(;""<$c=$argv[1][$i++];)echo ctype_alnum($c)?strtr(substr(decbin(ord("]muy{|ld`^8901234CTRH@ZF\DUGXABEVOJL?K[ISQP"[ord($c)-48])-60),1),10,".-"):$c;

Üçüncü golf: Rakam ve harflerin tek bir dizeye eşleştirilmesi.


0

SmileBASIC, 194 190 bayt

INPUT S$WHILE""<S$B=INSTR(" ETIANMSURWDKGOHVFLPJBXCYZQ  54 3   2       16       7   8 90",S$[0])+1IF B THEN S=LOG(B,2)FOR I=0TO S-1?"._"[B-(1<<S)AND S>>I||0];:NEXT?" ";
?SHIFT(S$)*!B;
WEND
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.