पूर्णांक और उच्चारण शब्द के बीच मानचित्रण


10

उद्देश्य

विचार यह है कि कोड को 32-बिट पूर्णांक को मैप करने के लिए आवश्यक है / अधिकतम 9 वर्णों के उच्चारण शब्द से। यह उपयोगी हो सकता है, उदाहरण के लिए, क्रम संख्या को याद रखने में आसान बनाने के लिए या एक रूप में टाइप करना।

किसी पूर्णांक को संबंधित शब्द में अनुवादित करने के लिए और संबंधित शब्द को संबंधित पूर्णांक में अनुवाद करने के लिए दोनों तरीकों की आवश्यकता होती है।

नियम

पूर्णांकों और शब्दों के बीच एक-से-एक मैपिंग होनी चाहिए, और 32-बिट पूर्णांक (या, किसी अन्य तरीके से, 0 से 4294967295 पर किसी भी पूर्णांक) को मैप करने योग्य होना चाहिए। हालांकि, जाहिर है, सभी शब्द सार्थक नहीं होंगे, और एक पूर्णांक के लिए मैप न करने वाले शब्द अनिर्दिष्ट व्यवहार हो सकते हैं।

आप यह तय करने के लिए स्वतंत्र हैं कि "सर्वनाम" शब्दों का कौन सा सेट सार्थक है, और मैपिंग कैसे की जाती है, लेकिन शब्दों को कम से कम इन नियमों का पालन करना चाहिए:

  • केवल मूल 26 अक्षरों (A ... Z) का उपयोग वर्णों के रूप में किया जाना चाहिए। उच्चारण, आवरण, आदि ... का उपयोग संभव संयोजनों का विस्तार करने के लिए नहीं किया जाना चाहिए।
  • 9 वर्ण प्रति शब्द अधिकतम।
  • दो व्यंजन (BCDFGHJKLMNPQRSTVWXZ - 20 व्यवसायियों) को एक दूसरे के बगल में नहीं रखा जाना चाहिए (उन्हें स्वरों से घिरा होना चाहिए)।
  • दो स्वर (AEIOUY - 6 संभावनाएं) एक दूसरे के बगल में नहीं रखे जाने चाहिए (उन्हें व्यंजन से घिरा होना चाहिए)।

नोट: सबसे सरल योजना जहां आपके पास सभी शब्दों का निर्माण होता है CVCVCVCVC( Cएक व्यंजन और Vस्वर के रूप में) 4147200000 संयोजन देता है, और 32 बिट पूर्णांक में 4294967296 संभावित मान हैं, इसलिए यह पर्याप्त नहीं है। आपको संयोजनों की संख्या का विस्तार करने की आवश्यकता है, या तो छोटे शब्दों की अनुमति देकर, या VCVCVCVCVसंयोजन की अनुमति देकर ।

अन्य मानक नियम लागू होते हैं, और मानक खामियों को मना किया जाता है।

निवेश निर्गम

प्रत्येक सबमिशन के लिए, कोड के दो टुकड़े उपलब्ध कराने होंगे:

  • एक जो पूर्णांक को तर्क / इनपुट के रूप में लेता है और संबंधित शब्द को रिटर्न / प्रिंट करता है
  • एक शब्द जो तर्क / इनपुट के रूप में लेता है और संबंधित पूर्णांक को रिटर्न / प्रिंट करता है

वैकल्पिक रूप से, आप एक ही कोड सबमिट करना चुन सकते हैं जो दोनों ऑपरेशंस को हैंडल करता है:

  • जब एक इनपुट के रूप में पूर्णांक दिया जाता है, तो यह संबंधित शब्द को आउटपुट करता है
  • जब एक स्ट्रिंग को इनपुट के रूप में दिया जाता है, तो यह संबंधित पूर्णांक को आउटपुट करता है

जीतने की स्थिति

यह एक , जिसका उत्तर सबसे कम बाइट्स (जब कोड के दोनों टुकड़ों को जोड़ते हैं, कोड के अलग-अलग टुकड़ों के लिए चुनने वाले समाधानों के लिए) जीतता है।


क्या कोई जगह या समय की कमी है? क्या हमें 32GB मेमोरी में फिट होना है?
जॉन ड्वोरक

@JDDvorak खैर, हमें आपके प्रोग्राम को "मानक" कंप्यूटर पर परीक्षण करने में सक्षम होना चाहिए। लेकिन एल्गोरिथ्म सरल होना चाहिए, आपके पास क्या ध्यान में है कि इस तरह की भारी मात्रा में स्मृति की आवश्यकता है?
मंद

मैं केवल सभी संभव नौ-अक्षर शब्द उत्पन्न कर सकता हूं जो आपके सूत्र से मेल खाते हैं और फिर सेट में अनुक्रमण करते हैं या एक द्विआधारी खोज करते हैं।
जॉन ड्वोरक

@JDDvorak मुझे मानना ​​चाहिए कि मैंने ऐसा नहीं सोचा था। मैं उन समाधानों के बारे में अधिक सोच रहा था जो मूल रूप से आधार -26 रूपांतरण कर रहे थे, कुछ समायोजन के साथ स्वर / व्यंजन संयोजक को संतुष्ट करने के लिए। लेकिन मुझे किसी भी तरह से "क्रूर" तरीके से संदेह है कि आपके पास कोड-गोल्फ कुशल हो सकता है। वैसे भी, अगर मुझे वास्तव में यह स्पष्ट करना चाहिए, मान लें कि आपको 4GB से अधिक मेमोरी आवंटित करने की अनुमति नहीं है।
मंद

आपको उत्तरदाताओं को कुछ पूर्व निर्धारित मानों के लिए अपना कोड चलाने की आवश्यकता हो सकती है (0,1,10,2 ** 32-1 और इस तरह) और फिर वापस और उत्तर में परिणामों को शामिल करने के लिए।
जॉन ड्वोरक

जवाबों:


1

जावास्क्रिप्ट (ईएस 6), 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)बूलियन होता है। यह सच है अगर इनपुट एक पूर्णांक है।

$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 बाइट की आवश्यकता होती है, तो कृपया 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 बाइट्स

एक फ़ंक्शन में एन्कोडिंग और डिकोडिंग।

यह फ़ंक्शन सभी संभावित मानों को बनाने की ब्रूट-फोर्स विधि का उपयोग करता है और फिर इंडेक्स को तब लौटाता है जब इसे स्ट्रिंग इनपुट दिया जाता है और जब पूर्णांक इनपुट दिया जाता है तो स्ट्रिंग वापस आ जाती है। परिणामस्वरूप, यह बहुत धीमा है और 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 मूल्य संभव हैं। इसमें अंतिम C वैकल्पिक होने के साथ CVCVCVCV (C) फॉर्म के सभी तार शामिल हैं।


@ mbomb007 गीगाबाइट्स, टाइपो के लिए खेद है। फ़ंक्शन एन्कोडिंग और डिकोडिंग दोनों करता है जो इस बात पर निर्भर करता है कि तर्क एक स्ट्रिंग या पूर्णांक है। मैंने पोस्ट को स्पष्ट करने के लिए अपडेट किया है।
rturnbull

क्या सुधार करने के लिए नीचेवाला टिप्पणी छोड़ सकता है? धन्यवाद।
rturnbull

1
प्रश्न की टिप्पणियों में, मंद स्पष्ट करता है कि आप 4 जीबी से अधिक मेमोरी का उपयोग नहीं कर सकते हैं ....
सुकराती फीनिक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.