質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

4回答

3330閲覧

文字と文字の間に区切りがない場合の変換について

YYY_1232

総合スコア5

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2020/05/03 06:43

#問題
モールス信号を受け取り英文にて出力をする
ただし、モールス信号の中身は文字と文字の間に区切りがないものとする。
(一意な変換ができないため出力内容についてはどの単語を出力しても正答とみなす。)

#課題点
モールス信号についてはハッシュでリストを作成し、入力されたモールス信号から単語を取り出すというロジックになると考えます。(下記コード)
しかし、受け取るモールス信号に区切りが存在しないため受け取った後の整形方法が分かりません。
どなたか知恵を拝借したいです。

#コード
array =
{"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": "--.."}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikadzuchi

2020/05/03 11:30

入力はどのような形式で来るのですか?
guest

回答4

0

(一意な変換ができないため出力内容についてはどの単語を出力しても正答とみなす。)

ということなので、難しく考えず、単にマッチしたものを出せば良いかと思います。
極端な話、teだけを出力しても良いと言うことでしょう。

投稿2020/05/03 06:46

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

区切りのないモールス信号で文字を取得するのは難しいと思います。
例えばですが、

zzkg と zzyn のモールス信号を比較すると、

zzkg = --.. --.. -.- --. zzyn = --.. --.. -.-- -.

となりますが、kgとynの部分で区切りが3文字なのか4文字なのかが分からなくなります。
やはり、何かしらの条件が追加で必要になるかと思いますよ。

もし入力するモールス信号がアルファベット1文字文であれば可能だとは思いますが。。。

綺麗なコードではありませんが途中までモールス信号変換のプログラム考えてみました。
1文字文のモールス信号なら変換できると思います。
一応複数文字に対応しようとしたのですがやはり上記の例のように区切りの位置が分からず、
変換結果がおかしくなってしまいます。もし良かったら参考にどうぞ。

array = {"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": "--.."} def check(line, array) moji = "" array_kouho = [] array.values.each do |ary| line.split('').each do |s| moji = moji + s return array.key(ary) if ary == moji end moji = "" end end array = Hash[array.sort_by{ | k, v | v.length }.reverse] input_line = gets.chomp! char_count = 0 output_line = "" until input_line.length == char_count do moji = check(input_line[char_count..-1], array) output_line += moji.to_s char_count = char_count + array[moji].length end puts "モールス信号変換結果は「#{output_line}」です。"

投稿2020/05/04 04:24

gnfreeworks

総合スコア306

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

rubyの話ではなくなりますが。。。
モールスをトンツーと捉えていると習得難しいです。
トン は スタカートのついた四部音符(八部音符と八分休符)
ツー は メゾスタカートのついた二分音符(付点四分音符と八分休符)
文字間は 四分休符
単語間は 二分休符
と捉えるとリズムを取りやすくなります。

つまり、文字間はトンツーの間の1.5倍の休みが入ります。

ここから
プログラムの話。
音のある部分の長さを計測してトンツーの判定をするだけでなく
無音部分の長さも計測して文字間、単語間を判定するようにしましょう
トンを 0、ツーを 1 とすると1Byteでモールスを表せます。
ただそのままだと . .. ... .... ..... の区別がつかないので最後に1をつけてストップbitにする。
という方法でHashでなくArryで処理したことがあります

投稿2020/05/03 14:23

winterboum

総合スコア23347

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

モールス信号には文字間のスペースと単語間のスペースってのがありますが、単語間スペースは考えないってことでしょうか。

まあ、正答とみなしてくれるなら、接続詞を探してそこで区切る、あとはテキトーな文字数で区切る、ぐらいがいいかと思いますが

投稿2020/05/03 07:12

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/05/03 07:16

> 単語間スペースは考えないってことでしょうか。 単語間だけじゃなくて文字間もないと書いてありますよ。
y_waiwai

2020/05/03 07:19

文字間なかったらそもそもモールス符号として認識できないんで、それはナンボナンデモw
winterboum

2020/05/03 14:08

実際にモールスを打つなり聞くなりしていないのではないかな。 Aは.-、Bは-...という一覧だけ見て考えている。
otn

2020/05/04 00:23

いや、文字列処理の練習なので、モールスかどうかはどうでも良いと言うことでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問