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字节