পূর্ণসংখ্যা এবং উচ্চারণযোগ্য শব্দের মধ্যে ম্যাপিং


10

উদ্দেশ্য

ধারণাটি হ'ল সর্বাধিক 9 টি অক্ষরের সর্বনামযোগ্য শব্দটির কাছে / থেকে 32-বিট পূর্ণসংখ্যার মানচিত্রের জন্য প্রয়োজনীয় কোড সরবরাহ করা। এটি দরকারী হতে পারে, উদাহরণস্বরূপ, ক্রমিক নম্বরটি মনে রাখা সহজ করা বা কোনও ফর্ম টাইপ করা।

সংশ্লিষ্ট শব্দের সাথে কোনও পূর্ণসংখ্যার অনুবাদ করার জন্য এবং সংশ্লিষ্ট শব্দের কোনও শব্দের পিছনে অনুবাদ করার জন্য উভয় পদ্ধতিই প্রয়োজনীয়।

বিধি

পূর্ণসংখ্যার এবং শব্দের মধ্যে এক থেকে এক ম্যাপিং অবশ্যই থাকতে হবে এবং 32-বিট পূর্ণসংখ্যার পুরো সেট (বা অন্যভাবে বলা যায়, 0 থেকে 4294967295 পর্যন্ত কোনও পূর্ণসংখ্যার) অবশ্যই ম্যাপযোগ্য হবে। যদিও, স্পষ্টতই, সমস্ত শব্দ অর্থবহ হবে না এবং কোনও পূর্ণসংখ্যার মানচিত্র নয় এমন শব্দগুলিকে ইনপুট করার ক্ষেত্রে অনির্দিষ্ট আচরণ থাকতে পারে।

"সর্বনামযোগ্য" শব্দের কোন সেটটি অর্থবহ এবং ঠিক কীভাবে ম্যাপিং হয় তা নির্ধারণ করতে আপনি নির্দ্বিধায়, তবে শব্দগুলিকে অন্তত এই বিধিগুলি মেনে চলতে হবে:

  • কেবলমাত্র 26 টি অক্ষর (A ... Z) অক্ষর হিসাবে ব্যবহার করা উচিত। অ্যাকসেন্টস, কেসিং ইত্যাদি ... সম্ভাব্য সংমিশ্রণগুলি প্রসারিত করতে ব্যবহার করা উচিত নয়।
  • প্রতি শব্দ 9 টি অক্ষর।
  • দুটি ব্যঞ্জনবর্ণ (BCDFGHJKLMNPQRSTVWXZ - 20 সম্ভাব্যতা) একে অপরের পাশে স্থাপন করা উচিত নয় (তাদের অবশ্যই স্বর দ্বারা আবদ্ধ হওয়া উচিত)।
  • দুটি স্বর (AEIOUY - 6 সম্ভাবনা) একে অপরের পাশে স্থাপন করা উচিত নয় (তারা অবশ্যই ব্যঞ্জনাবঞ্চিত দ্বারা আবদ্ধ হওয়া উচিত)।

দ্রষ্টব্য: সরলতম স্কিম যেখানে আপনার সমস্ত শব্দ তৈরি হয়েছে CVCVCVCVC( ব্যঞ্জনাত্মক Cএবং Vস্বরবর্ণ হওয়ায়) 4147200000 সংমিশ্রণ দেয় এবং একটি 32 বিট পূর্ণসংখ্যার 4294967296 সম্ভাব্য মান রয়েছে, সুতরাং এটি যথেষ্ট নয়। আপনাকে সংক্ষিপ্ত আকারগুলি প্রসারিত করতে হবে, হয় সংক্ষিপ্ত শব্দের অনুমতি দিয়ে বা VCVCVCVCVসংমিশ্রণকেও অনুমতি দিয়ে ।

অন্যান্য মানক বিধি প্রযোজ্য, এবং মানক লুফোলগুলি নিষিদ্ধ।

ইনপুট / আউটপুট

প্রতিটি জমা দেওয়ার জন্য, কোডের দুটি টুকরা সরবরাহ করতে হবে:

  • যেটি আর্গুমেন্ট / ইনপুট হিসাবে পূর্ণসংখ্যা নেয় এবং সংশ্লিষ্ট শব্দটি ফেরত / মুদ্রণ করে
  • যেটি একটি শব্দকে আর্গুমেন্ট / ইনপুট হিসাবে গ্রহণ করে এবং সম্পর্কিত পূর্ণসংখ্যা ফেরত / প্রিন্ট করে

বিকল্পভাবে, আপনি কোডের একক টুকরো জমা দিতে বেছে নিতে পারেন যা উভয় ক্রিয়াকলাপ পরিচালনা করে:

  • কোনও ইনপুট হিসাবে কোনও পূর্ণসংখ্যা দেওয়া হলে এটি সংশ্লিষ্ট শব্দটিকে আউটপুট করে
  • কোনও ইনপুট হিসাবে একটি স্ট্রিং দেওয়া হলে, এটি সংখ্যার পূর্ণসংখ্যাকে আউটপুট করে

জয়ের শর্ত

এটি একটি , উত্তরটি যা সর্বনিম্ন বাইট (কোডের উভয় টুকরা যোগ করার সময়, কোডের পৃথক টুকরো টিকাদানের জন্য সমাধানের জন্য) বিজয়ী হয়।


কোন জায়গা বা সময় সীমাবদ্ধতা আছে? আমাদের কি 32GB মেমরির মধ্যে ফিট করতে হবে?
জন ডিভোরাক

@ জানডভোরাক ওয়েল, আমাদের একটি "স্ট্যান্ডার্ড" কম্পিউটারে আপনার প্রোগ্রামটি পরীক্ষা করতে সক্ষম হওয়া উচিত। তবে অ্যালগরিদমটি সহজ হওয়া উচিত, আপনার কী মনে আছে যে এত বড় পরিমাণে স্মৃতি দরকার?
dim

আমি কেবলমাত্র আপনার সম্ভাব্য নয়-অক্ষরের শব্দ উত্পন্ন করতে পারি যা আপনার সূত্রের সাথে মেলে এবং তারপরে সেটটিতে সূচি বা বাইনারি অনুসন্ধান করে।
জন ডিভোরাক

@ জনডভোরাককে অবশ্যই আমি স্বীকার করব যে আমি এটি ভেবে দেখিনি। আমি স্বর / ব্যঞ্জনীয় সীমাবদ্ধতা মেটাতে কিছু সংশোধন করে মূলত বেস -26 রূপান্তরকারী সমাধানগুলি সম্পর্কে আরও ভাবছিলাম। তবে আমি আপনার মনে যে "পাশবিক" উপায়টি মনে করি তা কোড-গল্ফ দক্ষ হতে পারে। যাইহোক, যদি আমি সত্যিই এটি স্পষ্ট করতে চাই তবে ধরা যাক আপনাকে 4GB এর বেশি মেমরি বরাদ্দ করার অনুমতি নেই not
ডিম

আপনার উত্তরদাতাদের কিছু পূর্বনির্ধারিত মানগুলির জন্য তাদের কোড চালানোর প্রয়োজন হতে পারে (0,1,10,2 ** 32-1 এবং এরকম) এবং তারপরে ফিরে এবং উত্তরে ফলাফলগুলি অন্তর্ভুক্ত করার জন্য।
জন ডিভোরাক

উত্তর:


1

জাভাস্ক্রিপ্ট (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

সিভিসিভিসিভিসিভিসি এবং ভিসিভিসিভিসিভিসিভির মধ্যে কাটফয়েন্ট পয়েন্টটি 4e9 হয়, সুতরাং 5244160000 (সংখ্যার ইনপুট) বা zesuwurib(স্ট্রিং ইনপুট) থেকে ভুল হতে শুরু করে ।


ছয় মাস পরে ... আমি আপনাকে গ্রহণযোগ্য পয়েন্টগুলি প্রদান করি, যেহেতু আপনি সবচেয়ে সংক্ষিপ্ত (এবং আমি রটারনবুলের উত্তরটি গ্রহণ করতে পারি না, যা মন্তব্যে আমি যে ব্যাখ্যা দিয়েছি তা সন্তুষ্ট করে না)।
অস্পষ্ট

2

পিএইচপি, 353 বাইট

এনকোডিং + ডিকোডিং

is_numeric($argn)বুলেট থাকে ইনপুটটি পূর্ণসংখ্যা হলে এটি সত্য।

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

পিএইচপি, 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 বাইট ফলাফলের প্রয়োজন হয় তবে দয়া করে + 10 বাইটের while($a)সাথে প্রতিস্থাপন করুনwhile(strlen($r)<9)

গঠনের কথা মাথায় রেখে

$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 বাইটের শেষে যুক্ত করুন

+ 32 বাইট echo$s;দিয়ে প্রতিস্থাপন করুনecho!preg_match('#([01])\1$#',$x)?$s:_;


1

আর, 165 বাইট

একটি ফাংশনে এনকোডিং এবং ডিকোডিং।

এই ফাংশনটি সমস্ত সম্ভাব্য মানগুলি তৈরি করার এবং তারপরে স্ট্রিং ইনপুট দেওয়া হলে সূচকটি ফিরিয়ে দেওয়া এবং পূর্ণসংখ্যার ইনপুট দেওয়া হলে স্ট্রিংটি ফিরিয়ে আনার ব্রুট-ফোর্স পদ্ধতি ব্যবহার করে। ফলস্বরূপ, এটি খুব ধীর এবং 16 গিগাবাইট + মেমরি ব্যবহার করে!

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 মান সম্ভব are এটি সিভিসিভিসিভিসিভি (সি) ফর্মের সমস্ত স্ট্রিংকে কভার করে, শেষ সিটি alচ্ছিক সহ।


@ mbomb007 গিগাবাইট, টাইপোর জন্য দুঃখিত। যুক্তিটি স্ট্রিং বা পূর্ণসংখ্যা কিনা তার উপর নির্ভর করে ফাংশনটি এনকোডিং এবং ডিকোডিং উভয়ই করে। আমি স্পষ্ট করে পোস্টটি আপডেট করেছি।
rturnbull

উন্নত লোকেরা উন্নতির পরামর্শ দেওয়ার জন্য কোনও মন্তব্য রাখতে পারেন? ধন্যবাদ।
rturnbull

1
প্রশ্নের মন্তব্যে, ম্লম পরিষ্কার করে দিয়েছে যে আপনি 4 গিগাবাইটের বেশি মেমরি ব্যবহার করতে পারবেন না ....
সকরাটিক ফিনিক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.