মোর্স ডিকোড গল্ফ


24

আমি স্পেসের ক্রমবর্ধমান ঘৃণা নিয়ে সজাগ হয়ে পড়েছি এবং এই উত্তরটি আমাকে সাদা স্পেসের এই কুখ্যাত অপসারণ থেকে মোর্স কোড নিরাপদ কিনা তা নিশ্চিত করতে অনুপ্রাণিত করেছে।

সুতরাং, আপনার কাজটি এমন একটি প্রোগ্রাম তৈরি করা হবে যা মুছে ফেলা সমস্ত জায়গাগুলির সাথে সফলভাবে মোর্স কোডটি অনুবাদ করতে পারে।

মোর্স কোড

নিয়মাবলী:

  1. ইনপুটটি কেবলমাত্র ড্যাশ এবং বিন্দু (ASCII 2D এবং 2E) সমন্বিত একটি স্ট্রিং হবে। অন্য কোনও অক্ষরযুক্ত ইনপুটটির জন্য আউটপুট অপরিজ্ঞাত is ইনপুট (স্টিডিন, টেক্সট ফাইল, প্রম্পট ব্যবহারকারী, যাই হোক না কেন) পাওয়ার জন্য আপনার পছন্দের ভাষার পক্ষে সুবিধাজনক কোনও পদ্ধতি ব্যবহার করতে দ্বিধা বোধ করবেন না। আপনি ধরে নিতে পারেন যে মোর্স কোড ইনপুটটিতে কেবলমাত্র AZ অক্ষর থাকে এবং মিলের সংখ্যা বা বিরামচিহ্নের প্রয়োজন হয় না।

  2. আউটপুটটিতে এই অভিধানের ফাইলটিতে থাকা শব্দের অন্তর্ভুক্ত হওয়া উচিত (আবারও অভিধানের ফাইলটি অ্যাক্সেসের জন্য কোনও সুবিধাজনক পদ্ধতি ব্যবহার করতে নির্দ্বিধায়)। সমস্ত বৈধ ডিকোডিংগুলি স্টডআউটে আউটপুট হওয়া উচিত এবং ইনপুটটিতে সমস্ত বিন্দু এবং ড্যাশগুলি অবশ্যই ব্যবহার করা উচিত। আউটপুটে প্রতিটি মিলিত শব্দ একটি স্পেস দ্বারা পৃথক করা উচিত, এবং প্রতিটি সম্ভাব্য ডিকোডিং একটি নতুন লাইন দ্বারা পৃথক করা উচিত। আপনি সুবিধাজনক হিসাবে আপার কেস, লোয়ার কেস বা মিক্সড কেস আউটপুট ব্যবহার করতে পারেন।

  3. উপরে উল্লিখিত হিসাবে স্ট্যান্ডার্ড লুফোলগুলির উপর সমস্ত বিধিনিষেধ একটি ব্যতিক্রমের সাথে প্রযোজ্য, আপনি যদি সত্যিই চান তবে আপনি ইন্টারনেট সংযোগের মাধ্যমে প্রয়োজনীয় 2 তে অভিধানের ফাইলটি অ্যাক্সেস করতে পারেন। ইউআরএল সংক্ষিপ্তকরণ গ্রহণযোগ্য, আমি বিশ্বাস করি যে goo.gl/46I35Z সম্ভবত সংক্ষিপ্ততম।

  4. এটি কোড গল্ফ, সংক্ষিপ্ততম কোড জয়।

দ্রষ্টব্য: পাস্তেবিনে অভিধান ফাইল পোস্ট করা সমস্ত লাইন শেষের উইন্ডোজ স্টাইল 0 এ 0 ই অনুক্রমগুলিতে পরিবর্তন করেছে। আপনার প্রোগ্রামটি কেবল 0 এ, 0 ই বা 0 এ 0 ই এর সাথে লাইন শেষ ধরে নিতে পারে।

পরীক্ষার কেস:

ইনপুট:

......-...-.. ---। ----- ...-..- ..

আউটপুট অবশ্যই থাকতে হবে:

ওহে বিশ্ব

ইনপুট:

...-। ----- .... ----- ... - .. - ... --- .. - ...-.... ... - ...-.. ---- ... -। ----....-।।

আউটপুট অবশ্যই থাকতে হবে:

প্রোগ্রামিং ধাঁধা এবং কোড গল্ফ

ইনপুট:

-..... - ...-...-.. -।। ....---- --- .... ---- ..-.- --.. --- -। .... --- ...-...-......-... --- ... --- ..-- ---।

আউটপুট অবশ্যই থাকতে হবে:

দ্রুত ব্রাউন শিয়াল অলস কুকুরটির উপরে ঝাঁপিয়ে পড়ে


3
আপনি AN (.- -.)এবং কিভাবে মধ্যে বলতে পারেন EG (. --.)?

2
@ সিগ - আউটপুটটির পরে বৈধ ডিকোডিং উভয়ই অন্তর্ভুক্ত করা দরকার।
কমিন্টার্ন

1
@ ডেনিস - আহ্ ... আমি বাজি ধরব যে পাস্তবিন বা আমার ব্রাউজার উভয়েই এটি করেছে। আমার উত্স ফাইলটিতে সেগুলি নেই। আপনি লাইন ডিলিমিটারটিকে উপযুক্ত একটি সিস্টেমে পরিবর্তন করতে পারেন, অন্য কোনও পরিবর্তন নেই। আমি যখন আমার ফোনে নেই তখন আমি প্রশ্নটিতে সম্পাদনা করব।
Comintern

2
@ ফালকো এটি সঠিক আচরণ। নোট করুন যে সমস্যাটি বলেছে যে আপনার আউটপুটে অবশ্যই "হ্যালো ওয়ার্ল্ড" অন্তর্ভুক্ত থাকতে হবে , এটি কেবল এর মধ্যেই সীমাবদ্ধ নয়। এটি সমস্ত বৈধ ডিকোডিংস মুদ্রণ করা উচিত।
হাবস

2
(প্রায় কাব্যিক, সত্যই)
32

উত্তর:


5

রুবি, 210

(1..(g=gets).size).map{|x|puts IO.read(?d).split.repeated_permutation(x).select{|p|p.join.gsub(/./,Hash[(?a..?z).zip"(;=/%513':07*)29@-+&,4.<>?".bytes.map{|b|('%b'%(b-35))[1,7].tr'01','.-'}])==g}.map{|r|r*' '}}

যদি "ওভার-গল্ফিং" এর মতো অনুশীলন উপস্থিত থাকে তবে আমার সন্দেহ হয় আমি এবার প্রায় অংশ নিয়েছি। এই সমাধানটি দৈর্ঘ্য 1 থেকে ইনপুটটির দৈর্ঘ্য পর্যন্ত, অভিধানের সমস্ত শব্দের পুনরাবৃত্ত ক্রমানুষের অ্যারে তৈরি করে gene অভিধানের ফাইলটিতে "এ" হ'ল সংক্ষিপ্ত শব্দ এবং এর কোডটি দুটি অক্ষর দীর্ঘ, এটি ইনপুটটির অর্ধেক অবধি দৈর্ঘ্যের ক্রমবর্ধমান উত্পন্ন করার পক্ষে যথেষ্ট হবে তবে /2এই ডোমেনটিতে ভার্বোসটির সমতুল্য যোগ করা, তাই আমি বিরত ছিলাম।

একবার বিন্যাস অ্যারের উত্পন্ন করা হয়েছে ( বিশেষ দ্রষ্টব্য : এটা দৈর্ঘ্য 45404 হল 104 pangrammatic উদাহরণ ইনপুট ক্ষেত্রে), প্রতিটি বিন্যাস অ্যারের ঘনিভূত হয়, এবং এটির বর্ণমালা বরং সুবিধাজনক মাধ্যমে তাদের সাঙ্কেতিক লিখন সমতুল সঙ্গে প্রতিস্থাপিত হয় (Regexp, Hash)এর বৈকল্পিক #gsubপদ্ধতি; এই স্ট্রিংটি ইনপুটটির সমান হলে আমরা একটি বৈধ ডিকোডিং পেয়েছি।

"ডি" নামের একটি ফাইল থেকে অভিধানটি (বেশ কয়েকবার) পড়ে এবং ইনপুটটিতে অবশ্যই একটি নতুন লাইন থাকা উচিত নয়।

উদাহরণ রান (এমন একটি অভিধানের সাথে যা মহাবিশ্বের উত্তাপের মৃত্যুর আগে প্রোগ্রামটিকে লড়াইয়ের সুযোগ দেবে):

$ cat d
puzzles
and
code
dummy
golf
programming
$ echo -n .--..-.-----..-..-----..-.--..--...---..--...-.......--.-..-.-.----...--.---.-....-. | ruby morse.rb
programming puzzles and code golf
^C

5

হাস্কেল, 296 টি অক্ষর

  • অভিধান ফাইল: অবশ্যই "d" নামের একটি পাঠ্য ফাইল থাকতে হবে
  • ইনপুট: স্টিডিন, এর পেছনে নতুন লাইন থাকতে পারে তবে কোনও অভ্যন্তরীণ সাদা জায়গা নেই ace
main=do f<-readFile"d";getLine>>=mapM(putStrLn.unwords).(words f&)
i!""=[i]
(i:j)!(p:q)|i==p=j!q
_!_=[]
_&""=[[]]
d&i=do
w<-d
j<-i!(w>>=((replicate 97"X"++words".- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --..")!!).fromEnum)
n<-d&j
[w:n]

উপাদানগুলির ব্যাখ্যা:

  • mainঅভিধান পড়ে, স্টিডিন পড়ে, চালায় &এবং এর আউটপুট ফর্ম্যাট করে& যথাযথ সাদা ।
  • (replicate 97"X"++words".- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --..")!!)(সংজ্ঞায়নের অভ্যন্তরের একটি অভিব্যক্তি &) একটি তালিকা যার সূচকগুলি অক্ষর কোড (97 এর কোড'a' ) এবং মানগুলি মোর্সের ক্রমসমূহ।
  • !(ইনফিক্স অপারেটর হিসাবে পরিচিত একটি ফাংশন) একটি উপসর্গের সাথে একটি স্ট্রিংয়ের সাথে মেলে; উপসর্গটি উপস্থিত থাকলে এটি অবশিষ্টাংশকে এক-উপাদান তালিকায় (তালিকার মোনাডে সাফল্য) প্রদান করে, অন্যথায় খালি তালিকা (তালিকার মোনাডে ব্যর্থতা)
  • &"নিরপেক্ষবাদী" প্রয়োগের জন্য তালিকা মোনাড ব্যবহার করে; এটা

    1. d(একটি অভিধান শব্দ) একটি এন্ট্রি বেছে নেয় ,
    2. ইনপুট স্ট্রিংয়ের বিপরীতে সেই !শব্দের ( w>>=((…)!!).fromEnumযা সমান concatMap (((…)!!) . fromEnum) w) এর মোর্স ফর্মটি মেলে ব্যবহার করে i,
    3. d&jস্ট্রিংয়ের বাকি অংশগুলির সাথে মেলে নিজেকে কল করে ( )
    4. w:nতালিকার মোনাডে শব্দের তালিকা হিসাবে সম্ভাব্য ফলাফলটি প্রদান করে [w:n](যা সংক্ষিপ্ত, কংক্রিট সমতুল্য return (w:n))।

    নোট করুন যে লাইন 6 এর পরের প্রতিটি লাইন 6 লাইনে doশুরু হওয়া প্রকাশের অংশ ; এটি একক লাইনে সেমিকোলন ব্যবহার করার মতো হুবহু একই সংখ্যক অক্ষর গ্রহণ করে তবে এটি আরও পঠনযোগ্য, যদিও আপনি কেবল প্রোগ্রামে একবার এটি করতে পারেন।

এই প্রোগ্রামটি অত্যন্ত ধীর। এটি প্রতিটি প্যাটার্ন ম্যাচে পুনর্নির্মাণের পরিবর্তে মূলগুলির পাশের মোর্সযুক্ত শব্দগুলি একটি তালিকায় সংরক্ষণ করে দ্রুত (এবং কিছুটা দীর্ঘ) সহজেই তৈরি করা যায়। পরবর্তী কাজটি হ'ল মরস চিহ্নগুলির দ্বারা চিহ্নিত একটি বাইনারি গাছে শব্দগুলি সংরক্ষণ করা হবে (একটি 2-অ্যারি ট্রাই ) যাতে অপ্রয়োজনীয় শাখাগুলি চেষ্টা করা এড়াতে পারে।

অপসারণের যার ফলে - এটি সামান্য খাটো করেছেন যেতে পারে যদি অভিধান ফাইলটি যেমন অব্যবহৃত চিহ্ন না থাকে হয়নি "" replicate 97"X"++করছেন পক্ষে .(-97+)সামনে !!


অভিশাপ পুত্র, যে চালাক। আপনাকে +1
আলেকজান্ডার ক্র্যাগস

1
আপনি কি জানেন যে (+(-97))এটি আবার লিখতে পারে (-97+)?
গর্বিত হাসেলেলার

আপনার এইচ এর তৃতীয় সংজ্ঞাটি অপসারণ করা উচিত এবং এর পরিবর্তে |0<1=[]দ্বিতীয় সংজ্ঞাটি যুক্ত করা উচিত
গর্বিত হাসেলেলার

2
interact12 টি অক্ষর ব্যবহার করুন এবং জিতে নিন। interact$unlines.map unwords.(words f&)
gxtaillon

1
আপনি প্রতিস্থাপন করতে সক্ষম হওয়া উচিত concatMapসঙ্গে>>=
গর্বিত haskeller

3

পাইথন - 363 345

কোড:

D,P='-.';U,N='-.-','.-.'
def s(b,i):
 if i=='':print b
 for w in open('d').read().split():
  C=''.join([dict(zip('abcdefghijklmnopqrstuvwxyz-\'23',[P+D,D+3*P,U+P,'-..',P,D+N,'--.',4*P,2*P,P+3*D,U,N+P,2*D,D+P,D*3,'.--.',D+U,N,P*3,D,'..-',3*P+D,'.--','-..-',U+D,'--..']+['']*4))[c]for c in w]);L=len(C)
  if i[:L]==C:s(b+' '+w,i[L:])
s('',input())

ব্যাখ্যা:

অভিধানটি অবশ্যই "d" নামে একটি সরল পাঠ্য ফাইল হিসাবে সংরক্ষণ করতে হবে।

D, P, Uএবং Nজলহস্তী লুকআপ টেবিলের একটি সংক্ষিপ্ত সংজ্ঞা জন্য শুধু কিছু সাহায্যকারী ভেরিয়েবল।

s(i)পূর্বে অনুবাদকৃত বার্তার অংশ pএবং অবশিষ্ট কোড অংশের প্রতিটি বৈধ অনুবাদকে মুদ্রণ করে এমন একটি পুনরাবৃত্তি ফাংশন i: iখালি থাকলে, আমরা কোডটির শেষ প্রান্তে পৌঁছে যাই একটি bসম্পূর্ণ অনুবাদ থাকে, সুতরাং আমরা কেবল printএটিই করি। অন্যথায় আমরা wঅভিধানের প্রতিটি শব্দ যাচাই করি d, এটিকে মোর্স কোডে অনুবাদ করি এবং Cবাকী কোডটি যদি iশুরু হয় C, আমরা wঅনুবাদটি শুরুতে শব্দটি যুক্ত করি bএবং sবাকী অংশগুলিতে পুনরাবৃত্তভাবে ফাংশনটি কল করি ।

দক্ষতার উপর নোট:

এটি বেশ ধীরে ধীরে তবে গল্ফযুক্ত সংস্করণ। বিশেষত অভিধানটি লোড করা dict(zip(...))এবং প্রতিটি পুনরাবৃত্তিতে (আরও ভেরিয়েবল এড়ানোর জন্য) মুরস লুক টেবিল ( ) তৈরি করতে অনেক খরচ হয়। এবং ডিকশনারি ফাইলে সমস্ত শব্দ একবারে আগেই অনুবাদ করা এবং চাহিদা অনুসারে প্রতিটি পুনরাবৃত্তিতে অনুবাদ করা আরও দক্ষ হবে। এই ধারণাগুলি আরও 40 টি অক্ষর সহ উল্লেখযোগ্য গতি- সহ নিম্নোক্ত সংস্করণে নিয়ে যায়:

d=open('d').read().split()
D,P='-.';U,N='-.-','.-.'
M=dict(zip('abcdefghijklmnopqrstuvwxyz-\'23',[P+D,D+3*P,U+P,'-..',P,D+N,'--.',4*P,2*P,P+3*D,U,N+P,2*D,D+P,D*3,'.--.',D+U,N,P*3,D,'..-',3*P+D,'.--','-..-',U+D,'--..']+['']*4))
T=[''.join([M[c]for c in w])for w in d]
def s(b,i):
 if i=='':print b
 for j,w in enumerate(d):
  C=T[j];L=len(C)
  if i[:L]==C:s(b+' '+w,i[L:])
s('',input())

আপনি প্রতিস্থাপন 2 অক্ষর সংরক্ষণ করতে পারবেন .startswith(C)সঙ্গে [:len(C)]==C
গ্রেগ হিউগিল 21

ওহ ধন্যবাদ! এটি বেশ অদ্ভুত হয়ে উঠছে, যেহেতু প্রতিটি পুনরাবৃত্তিতে পুরো অভিধানটি লোড করা অক্ষর সংরক্ষণ করে - এবং আরও একবার অ্যালগরিদমকে ধীর করে দেয়।
ফালকো

@ গ্রেগ হিউগিল: হ্যাঁ, আমি এটিই মূলত করেছি। আমি উভয় সংস্করণ সম্বোধন করার জন্য আমার উত্তরটি সম্পাদনা করেছি।
ফালকো

1
আপনি শব্দটির দৈর্ঘ্যে অবতীর্ণ করে অভিধানটি বাছাই করে আরও বেশি আকর্ষণীয় ফলাফল (দীর্ঘতর শব্দ) তৈরি করতে পারেন। d=sorted(open('d').read().split(),key=len,reverse=1)অথবা, আপনার অভিধানটিকে সেভাবে প্রাক-বাছাই করে তা বাহ্যিকভাবে করুন।
গ্রেগ হিউগিল 21

হেক, আপনি যদি অভিধানের ফাইলটি পুনরায় ফর্ম্যাট করতে পারেন তবে এটিকে প্রাক্কলিত পাইথন অভিধান হিসাবে ফর্ম্যাট করুন এবং M=eval(open('d').read()):)
গ্রেগ হিউগিল

3

পার্ল (5.10+), 293 টি অক্ষর

অভিধান ফাইলটি "ডি" হিসাবে সংরক্ষণ করা উচিত (এবং যদি আপনি শব্দের মধ্যে সিআরএস না চান তবে ইউনিক্স ফর্ম্যাটে থাকা উচিত), স্টিডিনে মর্স ইনপুট, কোনও পেছনের নতুন লাইনের (ব্যবহার echo -n) ছাড়াই ।

open D,d;chomp(@w=<D>);@m{a..z}=map{substr(sprintf("%b",-61+ord),1)=~y/01/.-/r}
'BUWI?OKMATJQDCLSZGE@FNHVXY'=~/./g;%w=map{$_,qr#^\Q@{[s/./$m{$&}/reg]}#}@w;
@a=[$i=<>];while(@a){say join$",@{$$_[1]}for grep!$$_[0],@a;
@a=map{$x=$_;map{$$x[0]=~$w{$_}?[substr($$x[0],$+[0]),[@{$$x[1]},$_]]:()}@w}@a}

(কেবল বিন্যাসের জন্য লাইনব্রেক)।

অবহেলিত কোড:

# Read the word list
open my $dictionary, '<', 'd';
chomp(my @words = <$dictionary>);

# Define morse characters
my %morse;
@morse{'a' .. 'z'} = map {
  $n = ord($_) - 61;
  $bits = sprintf "%b", $n;
  $bits =~ tr/01/.-/;
  substr $bits, 1;
} split //, 'BUWI?OKMATJQDCLSZGE@FNHVXY';

# Make a hash of words to regexes that match their morse representation
my %morse_words = map {
  my $morse_word = s/./$morse{$_}/reg;
  ($_ => qr/^\Q$morse_word/)
} @words;

# Read the input
my $input = <>;

# Initialize the state
my @candidates = ({ remaining => $input, words => [] });

while (@candidates) {
  # Print matches
  for my $solution (grep { $_->{remaining} eq '' } @candidates) {
    say join " ", @{ $solution->{words} }; 
  } 
  # Generate new solutions
  @candidates = map {
    my $candidate = $_;
    map {
      $candidate->{remaining} =~ $morse_words{$_}
        ? {
          remaining => substr( $candidate->{remaining}, $+[0] ),
          words => [ @{ $candidate->{words} }, $_ ],
        }
        : ()
    } @words
  } @candidates;
}

কার্যপ্রণালী:

"" পরিবর্তন করে মোর্স কোডের প্রতীক সংরক্ষণ করা হয়। এবং "-" বাইনারি সংখ্যাকে 0 এবং 1 তে রূপান্তর করে, "1" প্রিপেন্ড করে (যাতে নেতৃস্থানীয় বিন্দুগুলি গাব্বল হয় না), বাইনারি সংখ্যাকে দশমিক হিসাবে রূপান্তর করে এবং তারপরে অক্ষরের এনকোডিং করে 61 টিরও বেশি মান (যা আমার সমস্তকে পেয়ে যায়) মুদ্রণযোগ্য অক্ষর এবং ব্যাকস্ল্যাশিংয়ের দরকার নেই এমন কিছু)।

আমি এটিকে এক ধরণের বিভাজন সমস্যা হিসাবে ভেবেছিলাম এবং এর ভিত্তিতে একটি সমাধান তৈরি করেছি। অভিধানের প্রতিটি শব্দের জন্য, এটি একটি রেজেক্স অবজেক্ট তৈরি করে যা একটি স্ট্রিংয়ের শুরুতে সেই শব্দটির স্পেসলেস মোর্সের উপস্থাপনাটির সাথে মিলবে (এবং ক্যাপচার করবে)। তারপরে এটি এমন একটি রাজ্য তৈরি করে প্রস্থের প্রথম সন্ধান শুরু করে যা কোনও শব্দের সাথে মেলে না এবং পুরো ইনপুটটিকে "বাকী ইনপুট" হিসাবে রয়েছে। তারপরে বাক্য ইনপুটটির শুরুতে মিলে যায় এমন শব্দের সন্ধান করে এবং নতুন রাজ্য তৈরি করে যা শব্দটি ম্যাচের শব্দের সাথে যুক্ত করে এবং বাকী ইনপুট থেকে শোকটি সরিয়ে দেয় এটি প্রতিটি রাজ্যের প্রসারিত করে। যে সমস্ত রাজ্যের বাকী ইনপুট নেই তারা সফল এবং তাদের শব্দের তালিকা মুদ্রিত আছে। যে राज्यগুলি কোনও শব্দের সাথে মেলে না (সফল শব্দগুলি সহ) কোনও শিশু রাষ্ট্র তৈরি করে না।

নোট করুন যে অদ্বিতীয় সংস্করণে রাজ্যগুলি পাঠযোগ্যতার জন্য হ্যাশগুলি রয়েছে; গল্ফযুক্ত সংস্করণে তারা অ্যারে হয় (সংক্ষিপ্ত কোড এবং কম মেমরির জন্য); স্লটটি [0]বাকী ইনপুট এবং স্লটটি [1]মিলে যাওয়া শব্দ।

ভাষ্য

এটি অধার্মিক ধীর। আমি ভাবছি এমন কোনও সমাধান আছে কি না। আমি মারপা (একটি একক ইনপুট স্ট্রিংয়ের জন্য একাধিক পার্স দেওয়ার ক্ষমতা সহ একটি আর্লি পার্সার) ব্যবহার করে একটি তৈরির চেষ্টা করেছি তবে কেবল ব্যাকরণটি তৈরি করে স্মৃতি হারিয়েছে। আমি যদি বিএনএফ ইনপুটটির পরিবর্তে নিম্ন-স্তরের এপিআই ব্যবহার করি ...


যদি আমি কেভিন রেডের মতো একই প্রয়োজনীয়তা যুক্ত করি (ইনপুটটিতে কোনও নতুন লাইন নেই) আমি মুছে ফেলাতে 7 অক্ষর সংরক্ষণ করতে পারি chomp()। আমি কি?
হাবস

"সুবিধাজনক কোনও পদ্ধতি ব্যবহার করতে নির্দ্বিধায়"
কমিন্টার্ন

সঙ্গে 2 বাইট শেভ ord পরিবর্তে ord$_। 1 বাইট join$"পরিবর্তে শেভ করুনjoin" "
জায়েদ

2

হাস্কেল - 418

এই ডিকোয়িং সমস্যাটি দক্ষতার সাথে ডায়নামিক প্রোগ্রামিংয়ের মাধ্যমে সমাধান করা যেতে পারে। আমি জানি এটি একটি কোডগল্ফ, তবে আমি দ্রুত কোড পছন্দ করি।

আমরা ইনপুট স্ট্রিং আছে বলুন s, তাহলে আমরা একটি অ্যারের গড়ে তুলতে dp, dp[i]সাবস্ট্রিং এর সকল বৈধ পাঠোদ্ধারতা ফলাফল তালিকা s[:i]wঅভিধানের প্রতিটি শব্দের জন্য প্রথমে আমরা এটির এনকোডিং করছি mw, তারপরে আমরা যদি এর dp[i]থেকে কিছু অংশ গণনা করতে পারি । বিল্ডিংয়ের জটিলতা হ'ল । অবশেষে, শেষ উপাদানটি হ'ল আমাদের যা প্রয়োজন।dp[i - length(mw)]s[i - length(mw):i] == mwdpO({count of words} {length of s} {max word length})dp[length(s)]

আসলে, আমাদের প্রত্যেকটির উপাদান হিসাবে পুরো ডিকোডিং সংরক্ষণ করার দরকার নেই dp[i]। আমাদের যা দরকার তা হ'ল শেষ ডিকোডড শব্দ। এটি বাস্তবায়নকে আরও দ্রুত করে তোলে। আমার আই 3 ল্যাপটপের "হ্যালো ওয়ার্ল্ড" কেস শেষ করতে এটি 2 সেকেন্ডেরও কম সময় ব্যয় করেছে। প্রশ্নটিতে পোস্ট করা অন্যান্য মামলার ক্ষেত্রে, আউটপুট দেওয়ার মতো অনেকগুলি হওয়ায় প্রোগ্রামটি যথাযথভাবে শেষ হবে না।

গতিশীল প্রোগ্রামিং কৌশলটি ব্যবহার করে আমরা বৈধ ডিকোডিংয়ের সংখ্যা গণনা করতে পারি । আপনি কোডটি এখানে খুঁজে পেতে পারেন । ফলাফল:

input: ......-...-..---.-----.-..-..-..
count: 403856

input: .--..-.-----..-..-----..-.--..--...---..--...-.......--.-..-.-.----...--.---.-....-.
count: 2889424682038128

input: -.....--.-..-..-.-.-.--....-.---.---...-.----..-.---..---.--....---...-..-.-......-...---..-.---..-----.
count: 4986181473975221635

Ungolfed

import Control.Monad

morseTable :: [(Char, String)]
morseTable = zip ['a'..'z'] $ words ".- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.."

wordToMorse :: String -> Maybe String
wordToMorse xs = return . concat =<< mapM (`lookup` morseTable) xs

slice :: (Int, Int) -> [a] -> [a]
slice (start, end) = take (end - start) . drop start

decode :: String -> String -> IO ()
decode dict s = trace (length s) [] where
  dict' = [(w, maybe "x" id . wordToMorse $ w) | w <- lines dict]
  dp = flip map [0..length s] $ \i -> [(j, w) |
        (w, mw) <- dict', let j = i - length mw, j >= 0 && mw == slice (j, i) s]

  trace :: Int -> [String] -> IO ()
  trace 0 prefix = putStrLn . unwords $ prefix
  trace i prefix = sequence_ [trace j (w:prefix) | (j, w) <- dp !! i]

main :: IO ()
main = do
  ws <- readFile "wordlist.txt"
  decode ws =<< getLine

Golfed

import Control.Monad
l=length
t=zip['a'..]$words".- -... -.-. -.. . ..-. --. .... .. .--- -.- .-.. -- -. --- .--. --.- .-. ... - ..- ...- .-- -..- -.-- --.."
h s=return.concat=<<mapM(`lookup`t)s
f d s=g(l s)[]where g 0 p=putStrLn.unwords$p;g i p=sequence_[g j(w:p)|(j,w)<-map(\i->[(j,w)|(w,m)<-[(w,maybe"x"id.h$w)|w<-lines d],let j=i-l m,j>=0&&m==(take(i-j).drop j$s)])[0..l s]!!i]
main=do d<-readFile"d";f d=<<getLine

একটি যুক্তিসঙ্গত দক্ষ সমাধান দেখে খুশি। এখন আমাকে এটি বুঝতে হবে :)
hobbs

2

পিএইচপি, 234 226 বাইট

function f($s,$r=""){$s?:print"$r
";foreach(file(d)as$w){for($i=+$m="";$p=@strpos(__etianmsurwdkgohvf_l_pjbxcyzq,$w[$i++]);)$m.=strtr(substr(decbin($p),1),10,"-.");0!==strpos($s,$m)?:g(substr($s,strlen($m)),$r.trim($w)." ");}}

রিকার্সিভ ফাংশন, নামের একটি ফাইল থেকে অভিধান নেয় d
অভিধানে একটি অক্ষরবিহীন প্রতিটি শব্দের জন্য ব্যর্থ।

আপনি যদি define ("d","<filename>");ফাংশনটি কল করার আগে কোনও ফাইলের নাম ব্যবহার করতে পারেন ।

দ্রুত সম্পাদনের জন্য 2 বা 3 বাইট যুক্ত করুন: আগে এবং আগে
সরান $s?:print"$r\n";, সন্নিবেশ করান$s!=$m?0!==:print$r.$w;}}

ভাঙ্গন

function f($s,$r="")
{
    $s?:print"$r\n";            // if input is empty, print result
    foreach(file(d)as$w)        // loop through words
    {
        // translate to morse:
        for($i=+$m="";              // init morse to empty string, $i to 0
                                        // loop while character is in the string
            $p=@strpos(__etianmsurwdkgohvf_l_pjbxcyzq,$w[$i++])
        ;)
            $m.=                        // 4. append to word morse code
                strtr(
                    substr(
                        decbin($p)      // 1: convert position to base 2
                    ,1)                 // 2: substr: remove leading `1`
                ,10,"-.")               // 3. strtr: dot for 0, dash for 1
            ;
        0!==strpos($s,$m)           // if $s starts with $m
            ?:f(                        // recurse
                substr($s,strlen($m)),  // with rest of $s as input
                $r.trim($w)." "         // and $r + word + space as result
            )
        ;
    }
}

1

গ্রোভি 377 337

r=[:];t={x='',p=''->r[s[0]]=p+x;s=s.substring(1);if(p.size()<3){t('.',p+x);t('-',p+x)}};s='-eishvuf-arl-wpjtndbxkcymgzqo--';t()
m=('d'as File).readLines().groupBy{it.collect{r.get(it,0)}.join()}
f={it,h=[]->it.size().times{i->k=it[0..i]
if(k in m){m[k].each{j->f(it.substring(i+1),h+[j])}}}
if(it.empty){println h.join(' ')}}
f(args[0])

নোট

ডিক অবশ্যই নামের একটি ফাইল হতে হবে d। মোর্স স্ট্রিং কমান্ড লাইন দ্বারা পাস করা হয়। উদাহরণ:

% groovy morse.groovy ......-...-..---.-----.-..-..-.. | grep 'hello world'
hello world

"মোর্স কোড সংক্ষেপণ" এর জন্য আমি একটি বাইনারি গাছ ব্যবহার করছি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.