Tam sayı ve belirgin kelime arasında eşleme


10

amaç

Buradaki fikir, 32 bitlik bir tamsayıyı maksimum 9 karakterlik belirgin bir kelimeye / bu kelimeden eşlemek için gerekli kodu sağlamaktır. Bu, örneğin bir seri numarasını hatırlamayı kolaylaştırmak veya bir form yazmak için yararlı olabilir.

Hem bir tamsayıyı karşılık gelen kelimeye çevirme hem de bir kelimeyi karşılık gelen tam sayıya geri çevirme yöntemi gereklidir.

kurallar

Tamsayılar ve sözcükler arasında bire bir eşleme olmalı ve 32 bitlik tamsayıların tamamı (veya başka bir deyişle, 0 ile 4294967295 arasındaki herhangi bir tamsayı) eşlenebilir olmalıdır. Açıkçası, tüm kelimeler anlamlı olmayacak ve bir tam sayı ile eşleşmeyen sözcüklerin girilmesinin belirtilmemiş davranışı olabilir.

Tam olarak hangi "belirgin" kelime kümesinin anlamlı olduğuna ve eşlemenin nasıl yapıldığına karar vermekte özgürsünüz, ancak kelimeler en azından şu kurallara uymalıdır:

  • Karakter olarak yalnızca temel 26 harf (A ... Z) kullanılmalıdır. Aksanlar, kasa vb. Olası kombinasyonları genişletmek için kullanılmamalıdır.
  • Kelime başına maksimum 9 karakter.
  • iki ünsüz (BCDFGHJKLMNPQRSTVWXZ - 20 olasılık) yan yana yerleştirilmemelidir (sesli harflerle çevrilmelidir).
  • iki sesli harf (AEIOUY - 6 olasılık) yan yana yerleştirilmemelidir (ünsüzlerle çevrelenmelidir).

Not: Tüm kelimeleri CVCVCVCVC( Cünsüz ve Vsesli harf olarak) oluşturduğunuz en basit şema 4147200000 kombinasyonları verir ve 32 bit tam sayı 4294967296 olası değerlere sahiptir, bu yüzden yeterli değildir. Daha kısa kelimelere izin vererek veya VCVCVCVCVkombinasyonlara izin vererek kombinasyon sayısını artırmanız gerekir .

Diğer standart kurallar geçerlidir ve standart boşluklar yasaktır.

Girişler / Çıkışlar

Her gönderim için iki kod parçası sağlanmalıdır:

  • Bir tamsayıyı argüman / girdi olarak alan ve karşılık gelen kelimeyi döndüren / basan
  • Bir sözcüğü bağımsız değişken / girdi olarak alan ve karşılık gelen tamsayıyı döndüren / basan

Alternatif olarak, her iki işlemi de gerçekleştiren tek bir kod parçası göndermeyi seçebilirsiniz:

  • Girdi olarak bir tamsayı verildiğinde, karşılık gelen kelimeyi çıkarır
  • Bir dize girdi olarak verildiğinde, karşılık gelen tamsayıyı çıkarır

Kazanma koşulu

Bu bir , en az bayt (her iki kod parçasını toplarken, ayrı kod parçalarını seçen çözümler için) cevabı kazanır.


Yer veya zaman kısıtlaması var mı? 32 GB belleğe sığmalı mıyız?
John Dvorak

@JanDvorak Eh, programınızı "standart" bir bilgisayarda test edebilmeliyiz. Ancak algoritma basit olmalı, bu kadar büyük miktarda bellek gerektiren neye sahipsin?
dim

Formülünüzle eşleşen tüm olası dokuz harfli kelimeleri oluşturabilir ve sonra kümeye dizine ekleyebilir veya ikili bir arama yapabilirim.
John Dvorak

@JanDvorak Bunu düşünmediğimi itiraf etmeliyim. Sesli / ünsüz kısıtlamayı karşılamak için bazı ayarlamalar ile temel-26 dönüşümleri yapan çözümler hakkında daha fazla düşünüyordum. Ama bir şekilde aklınızdaki "acımasız" yol kod-golf verimli olabilir şüpheliyim. Her neyse, bunu gerçekten netleştirmem gerekirse, diyelim ki 4GB'tan fazla bellek ayırmanıza izin verilmiyor.
dim

Yanıtlayanların kodlarını önceden belirlenmiş bazı değerler (0,1,10,2 ** 32-1 ve benzeri) için çalıştırmasını ve ardından geri dönmesini ve sonuçları yanıta eklemesini isteyebilirsiniz.
John Dvorak

Yanıtlar:


1

JavaScript (ES6), 205 bayt

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 ve VCVCVCVCV arasındaki kesme noktası 4e9'dur, bu nedenle 5244160000 (sayısal giriş) veya zesuwurib(dize girişi) yanlış gitmeye başlar .


Altı ay sonra ... Size en kısa olanı kabul ettiğiniz için puanları kabul ediyorum (ve yorumlarda yaptığım açıklamayı karşılamayan rturnbull'un cevabını kabul edemiyorum).
loş

2

PHP, 353 Bayt

Kodlama + Kod Çözme

is_numeric($argn)boolean içerir. Girişin bir tamsayı olduğu doğrudur.

$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 Bayt (Kodlama) + 195 Bayt (Kod Çözme) = 385 Bayt

Kodlama

$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 kombinasyon mevcuttur

E_NOTICE olmadan Çevrimiçi Sürüm Kodlaması

Expanded

$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

Giriş => Çıkış

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

Her zaman 9 Byte sonucuna ihtiyacınız varsa lütfen + 10 Byte while($a)ile değiştirinwhile(strlen($r)<9)

Decoding

$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;

Expanded

$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;

Giriş => Çıkış

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

E_NOTICE olmadan Çevrimiçi Sürüm Kod Çözme

Ek Kontrol

Bir dizenin geçerli olup olmadığını kontrol etmemiz gerekiyorsa.

$x.=$b?:0;Kod çözme döngüsünün sonuna ekleyin + 10 Bayt

+ 32 Bayt echo$s;ile değiştirecho!preg_match('#([01])\1$#',$x)?$s:_;


1

R, 165 bayt

Tek bir fonksiyonda kodlama ve kod çözme.

Bu işlev, olası tüm değerleri oluşturmak ve sonra dize girdisi verildiğinde dizini döndürmek ve tamsayı girdisi verildiğinde dizeyi döndürmek için kaba kuvvet yöntemini kullanır. Sonuç olarak, çok yavaş ve 16GB + bellek kullanıyor!

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 değer mümkündür. Bu, CVCVCVCV (C) formundaki tüm dizeleri kapsar ve son C isteğe bağlıdır.


@ mbomb007 Gigabytes, yazım hatası için özür dilerim. İşlev, bağımsız değişkenin bir dize veya bir tam sayı olmasına bağlı olarak hem kodlama hem de kod çözme yapar. Bunu açıklığa kavuşturmak için yayını güncelledim.
rturnbull

Downvoter iyileştirme önermek için bir yorum bırakabilir mi? Teşekkürler.
rturnbull

1
Sorunun yorumlarında, dim 4 gb'den fazla bellek kullanamayacağınızı açıklıyor ....
Sokratik Phoenix
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.