整数与发音词之间的映射


10

目的

这个想法是提供将32位整数映射到最大字符数为9的可发音单词之间或从该单词映射来的必要代码。例如,这可以使序列号更容易记住或输入表格。

既需要将整数转换为相应单词的方法又需要将单词转换回相应整数的方法。

规则

整数和单词之间必须存在一对一的映射,并且整个32位整数(或者换句话说,从0到4294967295的任何整数)都必须是可映射的。尽管显然,并非所有单词都有意义,但是输入未映射到整数的单词可能具有未指定的行为。

您可以自由决定确切的“发音”词集是有意义的,以及映射的完成方式,但是词至少必须遵循以下规则:

  • 只能使用基本的26个字母(A ... Z)作为字符。口音,套管等不得用于扩展可能的组合。
  • 每个单词最多9个字符。
  • 两个辅音(BCDFGHJKLMNPQRSTVWXZ-20个可能性)不能彼此相邻放置(它们必须被元音包围)。
  • 两个元音(AEIOUY-6种可能性)不应彼此相邻放置(它们必须被辅音包围)。

注意:最简单的方案是将所有单词构造为CVCVCVCVCC是辅音和V元音),给出4147200000组合,而32位整数有4294967296个可能的值,所以这还不够。您需要通过允许较短的单词或通过允许扩展组合的数量VCVCVCVCV组合。

其他标准规则也适用,并且标准漏洞也被禁止。

输入/输出

对于每次提交,必须提供两段代码:

  • 一个以整数作为参数/输入并返回/打印相应单词的参数
  • 一个以单词作为参数/输入并返回/打印相应整数的函数

另外,您可以选择提交处理这两种操作的单个代码:

  • 当给定整数作为输入时,它将输出相应的单词
  • 当给定一个字符串作为输入时,它将输出相应的整数

获奖条件

这是一个,答案最少的字节(将两个代码段加在一起时,用于选择分离代码段的解决方案)将获胜。


有时间或空间限制吗?我们必须容纳32GB的内存吗?
约翰·德沃夏克

@JanDvorak好吧,我们应该能够在“标准”计算机上测试您的程序。但是该算法应该很简单,您想到了这么大的内存需求呢?
暗淡

我可以生成与您的公式匹配的所有可能的九个字母的单词,然后索引到集合中或进行二进制搜索。
John Dvorak

@JanDvorak我必须承认我没有想到这一点。我更多地考虑的是基本上进行26基转换的解决方案,并进行了一些调整以满足元音/辅音约束。但是我以某种方式怀疑您所想到的“野蛮”方式会提高代码效率。无论如何,如果我真的必须澄清这一点,可以说不允许您分配超过4GB的内存。
昏暗

您可能要求答题者为预定值(0、1、10、2 ** 32-1等)运行其代码,然后返回并将其包含在答案中。
约翰·德沃夏克

Answers:


1

JavaScript(ES6),205个字节

p=>(a='bcdfghjklmnpqrstvwxzaeiouy',1/p)?[...Array(9)].map(_=>r=a[p%(n=26-n)+(p=p/n|0,n<7)*20]+r,n=p>(p%=4e9)?20:6,r='')&&r:[...p].map(c=>r=r*(n=26-n)+a.search(c)%20,n=a.search(p[r=0])<20?6:20)&&r+(n<7)*4e9

CVCVCVCVC和VCVCVCVCV之间的截止点是4e9,因此从5244160000(数字输入)或zesuwurib(字符串输入)开始出错。


六个月后...由于您最短(我无法接受rturnbull的回答,这不符合我在评论中所作的澄清),我向您授予接受点。
暗淡

2

PHP,353字节

编码+解码

is_numeric($argn)包含布尔值。如果输入是整数,则为true。

$c=array_diff(range(A,Z),$v=[A,E,I,O,U,Y]);sort($c);if(is_numeric($a=$argn)){$r=($a)%26<6?$v[$a%26]:$c[$a%26-6];$a=$a/26^0;while($a){$z=count($t=in_array($r[0],$v)?$c:$v);$r=$t[$n=$a%$z].$r;$a=$a/$z^0;}echo$r;}else{for($p=1;$i++<strlen($a);){$u=($b=in_array($a[-$i],$c))?$c:$v;$s+=array_flip($u)[$a[-$i]]*$p+($b&$i<2?6:0);$p*=$i>1?count($u):26;}echo$s;}

PHP,190字节(编码)+ 195字节(解码)= 385字节

编码方式

$c=array_diff(range(A,Z),$v=[A,E,I,O,U,Y]);sort($c);$r=($a=$argn)%26<6?$v[$a%26]:$c[$a%26-6];$a=$a/26^0;while($a){$z=count($t=in_array($r[0],$v)?$c:$v);$r=$t[$n=$a%$z].$r;$a=$a/$z^0;}echo$r;

5391360000 = 26 * 120 **有4种组合

不使用E_NOTICE的在线版本编码

展开式

$c=array_diff(range(A,Z),$v=[A,E,I,O,U,Y]);
sort($c); # End of Prepare the two array
$r=($a=$argn)%26<6?$v[$a%26]:$c[$a%26-6]; #base 26 decision input mod 26 <6 end with vowel
$a=$a/26^0; #integer division input with 26
while($a){
    $z=count($t=in_array($r[0],$v)?$c:$v); # use vowel if last entry is consonant and viceversa
    $r=$t[$n=$a%$z].$r; # base 6 or base 20 decision
    $a=$a/$z^0; # divide through base
}echo$r; # Output result

输入=>输出

4294967296 => TYPYQACOV 
333 => DAT 
1 => E 
7 => C 
4294967276 => UTOPOQAMI

如果您始终需要9字节的结果,请替换while($a)while(strlen($r)<9) + 10字节

解码

$c=array_diff(range(A,Z),$v=[A,E,I,O,U,Y]);sort($c);for($p=1;$i++<strlen($a=$argn);){$u=($b=in_array($a[-$i],$c))?$c:$v;$s+=array_flip($u)[$a[-$i]]*$p+($b&$i<2?6:0);$p*=$i>1?count($u):26;}echo$s;

展开式

$c=array_diff(range("A","Z"),$v=["A","E","I","O","U","Y"]);
sort($c); # End of Prepare the two array
for($p=1;$i++<strlen($a=$argn);){ 
    $u=($b=in_array($a[-$i],$c))?$c:$v; # find use array for $a[-$i]
    $s+=array_flip($u)[$a[-$i]]*$p+($b&$i<2?6:0); # sum value
    $p*=$i>1?count($u):26; # raise multiple for next item
}echo$s;

输入=>输出

ABABABABE => 1
E => 1
UTOPOQAMI => 4294967276
BABABADAT => 333
DAT => 333
TYPYQACOV => 4294967296

不使用E_NOTICE的在线版本解码

附加检查

如果我们需要检查字符串是否有效。

$x.=$b?:0;在解码循环+ 10个字节的端部

替换echo$s;echo!preg_match('#([01])\1$#',$x)?$s:_;+ 32字节


1

R,165字节

一种功能的编码和解码。

此函数使用蛮力创建所有可能的值,然后在给定字符串输入时简单地返回索引,而在给定整数输入时简单地返回索引。结果,它非常慢,并且使用16GB +的内存!

function(x){i=c(1,5,9,15,21,25)
d=apply(expand.grid(c<-letters[-i],v<-letters[i],c,v,c,v,c,v,c(c,"")),1,paste,collapse="")
`if`(mode(x)=="numeric",d[x],which(d==x))}

4,354,560,000个值是可能的。这涵盖了形式为CVCVCVCV(C)的所有字符串,最后一个C是可选的。


@ mbomb007千兆字节,很抱歉打错了。该函数根据参数是字符串还是整数来进行编码和解码。我更新了帖子以澄清这一点。
rturnbull

下降投票者能否发表评论以提出改进建议?谢谢。
rturnbull

1
在这个问题的意见,昏暗的澄清,你不能使用超过4GB的内存....
苏格拉底凤凰
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.