首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于声调持续时间的莫尔斯码翻译

基于声调持续时间的莫尔斯码翻译
EN

Code Golf用户
提问于 2017-11-16 11:47:35
回答 7查看 3.6K关注 0票数 35

目标

莫尔斯码通常表示为声音。给定一个表示声音是打开还是关闭的位流,将该流转换为字母、数字和空格。

规范

  • 根据重复开/关位的长度对位流进行分析。
    • 1 ON位是一个点。
    • 3位数是破折号。
    • 1 OFF位分隔点和破折号
    • 3 OFF位分隔字符
    • 7位分隔词(空格)

  • 输入可以是字符串或数组。输入中只允许您选择的两个唯一字符/值。(例如,0/1,真/假,逗号/空格)
  • 输出返回字符串或打印到标准输出。

示例

代码语言:javascript
复制
Input:    101010100010001011101010001011101010001110111011100000001011101110001110111011100010111010001011101010001110101
Analysis: \--H--/   E   \---L---/   \---L---/   \----O----/\-- --/\---W---/   \----O----/   \--R--/   \---L---/   \--D--/
Output:   HELLO WORLD

假设

  • 流总是以ON位开始和结束。
  • 没有前导或尾随空格。
  • 输入总是有效的。
  • 支持所有字母(不区分大小写)和数字.

测试用例

代码语言:javascript
复制
101010100010001011101010001011101010001110111011100000001011101110001110111011100010111010001011101010001110101
HELLO WORLD

10100000001011100011101110000000101110000000101011101000101000101010001010101
I AM A FISH

1010111011101110001110111011101110111000101110111011101110001110111010101
2017

101010001110111011100010101
SOS

评分

这是暗号高尔夫。下周这个时候,最低字节数的代码获胜了。

EN

回答 7

Code Golf用户

发布于 2017-11-16 15:54:49

红宝石,123个字节

代码语言:javascript
复制
->s{s.split(/0000?/).map{|r|r[0]?"YE9_0IZTO_BHKU58V_GR_SFA__1_4NP_60X_____C__D_ML7WQ3__2__J"[r.to_i(2)%253%132%74]:" "}*""}

在网上试试!

按字符限制拆分输入字符串。使用3或4个OFF位,以便将空格转换为空字符串。取每个字符的基值2,并在连续3次分割的基础上使用模将一个合理的范围(小于60个可能的值)。

票数 5
EN

Code Golf用户

发布于 2017-11-16 17:58:53

Visual Basic .NET (.NET Core),252个字节

-由于@递归,有7个字节

代码语言:javascript
复制
Function A(i)
For Each w In i.Split({"0000000"},0)
For Each l In w.Split({"000"},0)
Dim c=0
For Each p In l.Split("0")
c=c*2+1+p.Length\2
Next
A &="!ETIANMSURWDKGOHVF!L!PJBXCYZQ!!54!3!!!2!!!!!!!16!!!!!!!7!!!8!90"(c)
Next
A+=" "
Next
End Function

一个函数,它接受1s和0s的字符串,并返回一个字符串。(实际上,只有0用于OFF是一个困难的要求。任何不是OFF的东西都被假定为ON)。

字符串文本是作为数组形式的二进制堆设置的Morse代码。VB.NET允许将字符串作为字符数组进行索引。\是整数除法,取1的左子堆或111的右子堆。

当堆点中没有值时,我使用!作为空白。只需适当地去掉指数即可。

VB.NET允许您通过为函数名(在本例中为A)分配一个值来返回。我只是迭代地做字符串连接(&)来构建输出字符串。我第一次需要使用&是因为使用+会留下一个前导空字符,但任何其他时候我都可以使用+,它的行为与字符串的&相同。

在网上试试!

票数 3
EN

Code Golf用户

发布于 2017-11-18 12:04:19

Python 2,127个字节

代码语言:javascript
复制
lambda s:''.join("IVMB  T  K 9LZF 1HWO3 GUS4 8 7A  E QR 26   NJX    Y0P 5D  C"[(int('0'+l)^2162146)%59]for l in s.split('000'))

在网上试试!

在TFeld的解决方案的基础上,通过删除替换和在基10中工作,而代价是一个按位的xor和一个更长的引用字符串。

票数 3
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/148285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档