整数と発音可能な単語の間のマッピング


10

目的

このアイデアは、32ビット整数を最大9文字の発音可能な単語との間でマッピングするために必要なコードを提供することです。たとえば、シリアル番号を覚えやすくしたり、フォームに入力したりするのに役立ちます。

整数を対応する単語に変換する方法と、単語を対応する整数に変換する方法の両方が必要です。

ルール

整数と単語の間には1対1のマッピングが必要であり、32ビット整数のセット全体(つまり、0〜4294967295の整数)はマップ可能である必要があります。もちろん、すべての単語が意味を持つわけではありませんが、整数にマッピングされない単語を入力すると、動作が特定されない場合があります。

どの「発音可能な」単語のセットが意味を持ち、マッピングがどのように行われるかを正確に自由に決定できますが、単語は少なくとも次の規則に従う必要があります。

  • 文字として使用できるのは、基本的な26文字(A ... Z)のみです。アクセント、大文字小文字などは、可能な組み合わせを拡張するために使用すべきではありません。
  • 単語あたり最大9文字。
  • 2つの子音(BCDFGHJKLMNPQRSTVWXZ-20の可能性)を隣同士に配置しないでください(それらは母音で囲まれている必要があります)。
  • 2つの母音(AEIOUY-6の可能性)を隣同士に配置しないでください(子音で囲む必要があります)。

注:すべての単語をCVCVCVCVCC子音およびV母音として)構成する最も単純なスキームでは、4147200000の組み合わせが得られ、32ビット整数には4294967296の可能な値があるため、十分ではありません。短い単語を許可するか、組み合わせも許可することによって、組み合わせの数を増やす必要がありVCVCVCVCVます。

他の標準ルールが適用され、標準の抜け穴は禁止されています。

入力/出力

送信ごとに、2つのコードを提供する必要があります。

  • 引数/入力として整数を取り、対応する単語を返す/出力するもの
  • 引数/入力として単語を取り、対応する整数を返す/出力するもの

または、両方の操作を処理する単一のコードを送信することもできます。

  • 入力として整数を指定すると、対応する単語を出力します
  • 文字列を入力として与えると、対応する整数を出力します

当選条件

これはで、バイト数が最も少ない(両方のコードを合計した場合、分離されたコードを選択するソリューションの場合)の方が勝ちます。


スペースや時間の制約はありますか?メモリの32GB以内に収める必要がありますか?
John Dvorak

@JanDvorakさて、「標準」コンピューターでプログラムをテストできるはずです。しかし、アルゴリズムは単純である必要があります。このような大量のメモリを必要とすることをどのように考えていますか?
薄暗いSEへの信頼を失った

数式に一致するすべての9文字の単語を生成し、セットにインデックスを付けるか、バイナリ検索を実行するだけで済みます。
John Dvorak

@JanDvorak私はそれについて考えていなかったことを認めなければなりません。母音/子音の制約を満たすようにいくつかの調整を加えて、基本的に26進数の変換を行うソリューションについてもっと考えていました。しかし、あなたが心に留めていた「残忍な」方法がコードゴルフの効率を上げることができるのはどういうわけか疑わしい。とにかく、これを明確にする必要がある場合は、4 GBを超えるメモリを割り当てることができないとしましょう。
薄暗いSEへの信頼を失った

いくつかの事前に決定された値(0、1、10、2 ** 32-1など)に対してコードを実行し、結果を回答に含めるように回答者に要求することができます。
John Dvorak

回答:


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(文字列入力)で問題が発生し始めます。


6か月後...私はあなたが最も短いので、あなたにアクセプトポイントを与えます(そして、私がコメントで行った説明を満たさないrturnbullの答えを受け入れることはできません)。
薄暗いSEへの信頼を失った

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バイト

1つの関数でのエンコードとデコード。

この関数は、ブルートフォースメソッドを使用してすべての可能な値を作成し、文字列が入力されたときにインデックスを返し、整数入力が与えられたときに文字列を返します。結果として、それは非常に遅く、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 2017

反対投票者は改善を提案するコメントを残すことができますか?ありがとう。
rturnbull 2017

1
質問のコメントの中で、薄暗い明確化は、あなたは....メモリの4GB以上使用できないこと
ソクラテスのフェニックス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.