T9 जैसी कार्यक्षमता को लागू करें


10

आपकी चुनौती आज एक t9 जैसी कार्यक्षमता को लागू करना है।

आप एक फ़ंक्शन लागू करेंगे जिसमें केवल 2 पैरामीटर होंगे।
आपको एक स्ट्रिंग में 1 फ़ोन नंबर और शब्दों की एक सूची के साथ एक पाठ फ़ाइल की सामग्री प्राप्त होगी (एक विशिष्ट न्यूलाइन शैली नहीं मानें)।
आप कार्यक्षमता का परीक्षण करने के लिए लिंक https://raw.githubusercontent.com/eneko/data-repository/master/data/words.txt का उपयोग कर सकते हैं , या उपयोग कर सकते हैं /usr/share/dict/words( शब्दों की सूची के साथ एक पाठ फ़ाइल की जाँच करें [बंद] अधिक जानकारी)।

आप मान सकते हैं कि आपको हमेशा कम से कम 2 नंबर प्राप्त होंगे।

संख्या को देखते हुए, आप शब्दों की एक सूची से पढ़ेंगे और उन शब्दों को मैप करने वाले अक्षरों से शुरू होने वाले शब्दों को वापस कर देंगे। इसका मतलब है कि इनपुट केवल संख्या 2 से 9 तक होना चाहिए
। यदि आप अवैध इनपुट प्राप्त करते हैं तो आप जो चाहें कर सकते हैं।

यदि कोई मिलान नहीं मिला है, तो आप एक खाली सूची, null/ nilया वापस कर सकते हैं 0

याद रखें कि सेलफोन कुंजियों को उनके समतुल्य वर्णों में मैप किया जाता है:

  • 0 और 1 अमान्य हैं
  • 2 मैच [एबीसी]
  • 3 मिलान [पराजित]
  • 4 मैच [घी]
  • 5 मैच [jkl]
  • 6 मैच [mno]
  • 7 मैच [pqrs]
  • 8 मैच [tuv]
  • और 9 मैच [wxyz]

उदाहरण:

f('52726')
//returns ["Japan","japan","Japanee","Japanese","Japanesque"...,"larbowlines"]

f('552')
//returns ["Kjeldahl","kjeldahlization","kjeldahlize"...,"Lleu","Llew"]

f('1234')
//makes demons fly out your nose or divide by 0

f('9999')
//returns ["Zyzzogeton"]

f('999999')
//returns [] or null/nil or 0

अपना फ़ंक्शन चलाने के बाद, आप इसे अपनी इच्छानुसार किसी भी तरीके से प्रिंट कर सकते हैं।

नियम:

  • मानक कमियां INVALID हैं
  • आपको कुछ वापस करना होगा, भले ही यह null/ nil
    जावास्क्रिप्ट हो undefinedअगर आप कुछ नहीं लौटाएंगे, तो यह नियम।
  • आप दूसरे के उत्तरों का उपयोग या पुन: कार्यान्वयन नहीं कर सकते या मेरे कार्यान्वयन की प्रतिलिपि नहीं बना सकते।
  • आप जावास्क्रिप्ट के लिए मान सकते हैं, कि ब्राउज़र पहले से ही खुला होगा और ऑटोमैटिक एलिमेंट को innerText/ textContent2 पैरामीटर के रूप में पास किया जाएगा।
  • संकलित भाषाओं के लिए, आप संकलक को विशेष तर्क नहीं दे सकते
  • आप कंपाइलर तर्कों पर फ़ाइल का नाम प्राप्त कर सकते हैं
  • चर, मैक्रोज़, वैश्विक चर, स्थिरांक, गैर-मानक कक्षाएं और फ़ंक्शन के अंदर सभी प्रकार के अन्य मानों को अमान्य माना जाएगा।
  • जावास्क्रिप्ट में, बिना कीवर्ड के चर varआपके कोड को अमान्य कर देते हैं
  • आपके फंक्शन का नाम होगा f
  • आप अपने कार्य पर केवल और केवल 2 तर्क दे सकते हैं
  • अपने कोड को चलाने के लिए 500 सेकंड से कम रखने की कोशिश करें।
  • आपको व्हाट्सएप के बारे में चिंता करने की जरूरत नहीं है
  • आपको केवल ASCII प्रिंट करने योग्य वर्णों का उपयोग करना चाहिए ।
    अपवाद ऐसी भाषाएं हैं जो केवल गैर-मुद्रण योग्य वर्णों का उपयोग करती हैं (एपीएल और व्हाट्सएप 2 उदाहरण हैं)।

स्कोरिंग:

  • सबसे कम संख्या में बाइट्स जीतते हैं
  • आपके उत्तर में अमान्य ASCII प्रिंट करने योग्य वर्ण होने के बाद , उत्तर को UTF-32
    में एन्कोड किया जाएगा क्योंकि एन्कोडिंग का अपवाद आपके उत्तर को वर्णों द्वारा गिना जाएगा ।
  • केवल फ़ंक्शन बॉडी मायने रखता है, इसके बाहर आप जो कुछ भी करते हैं उसे गिनें नहीं
  • -30% का बोनस यदि आप पड़ोस या सबसे सामान्य शब्दों के आधार पर एक भविष्यवाणी प्रणाली बनाते हैं
  • आकार में -20% का बोनस यदि आप प्रत्येक अक्षर के लिए पहले नंबर के अनुरूप पहले 5 मैच लौटाते हैं (उदाहरण: 245 में 5 शब्द 'ए' से शुरू होते हैं, 5 'बी' से शुरू होते हैं और 5 'सी' से शुरू होते हैं। )।

यहाँ जावास्क्रिप्ट का उपयोग करते हुए एक कार्यान्वयन का एक उदाहरण है:

function f(phone, words)
{
    var keypad=['','','abc','def','ghi','jkl','mno','pqrs','tuv','wxyz'];
    var regex='';

    for(var i=0,l=phone.length;i<l;i++)
    {
        regex+='['+keypad[phone[i]]+']';
    }

    var regexp=new RegExp('\\s('+regex+'[a-z]*)\\s','gi');

    return words.match(regexp);
}

इसे चलाने के लिए, सूची लिंक खोलें और उदाहरण के लिए चलाएँ:

f('9999',document.getElementsByTagName('pre')[0].innerText);
//returns [" Zyzzogeton "]

इस उदाहरण का परीक्षण किया गया था और विंडोज 7 होम संस्करण 64 बिट्स पर ओपेरा 12.17 64 बिट्स के तहत काम करता है।


कार्यक्रम के लिए दूसरा तर्क एक फ़ाइल नाम है जिसमें शब्द या शब्दों की सूची है?
ऑप्टिमाइज़र

@ मार्टिनबटनर UTF-8 अनुचित नहीं है (यह अभी भी ASCII वर्णों को 1 बाइट के रूप में गिना जाता है), लेकिन मैंने नियम बदल दिया।
इस्माइल मिगुएल

@Optimizer 2 तर्क शब्दों की एक सूची है। यदि आप चाहते हैं तो आप फ़ाइल नाम को किसी कंपाइलर तर्क पर पास कर सकते हैं और फ़ाइल को पढ़ सकते हैं। लेकिन केवल एक चीज जो फ़ंक्शन बॉडी है।
इस्माइल मिगुएल

@ मार्टिनबटनर ASCII के रूप में गिनती करके, इसे बाइट्स के रूप में गिना जा रहा है। आप मुझे यह कहना चाहते हैं कि APL कोड में 1 बाइट होगा जिसमें 8 बिट्स का आकार होगा?
इस्माइल मिगुएल

2
-1 अनुचित प्रतिबंधों के लिए
AJMansfield

जवाबों:


3

सीजेएम, 28 बाइट्स

q~{el{'h-_9/-D+3/}%s1$#!},p;

के रूप में इनपुट लेता है "<number>" [<list of words>]

उदाहरण:

"52726" ["Japan" "japan" "Japanee" "Japanese" "Japanesque" "larbowlines" "ablution" "ablutionary" "abluvion" "ably" "abmho" "Abnaki" "abnegate"]

आउटपुट:

["Japan" "japan" "Japanee" "Japanese" "Japanesque" "larbowlines"]

अभी के लिए किसी बोनस के लिए नहीं जा रहा है।

यहां कोड ऑनलाइन आज़माएं लेकिन वास्तविक समय मापन के लिए, इसे जावा कंपाइलर पर चलाएं

ध्यान दें कि CJam जैसी रिक्त सूचियों का प्रतिनिधित्व करता है ""

कच्चे वर्डलिस्ट को सीजेएम सूची में बदलने के लिए इनपुट के रूप में शब्द सूची के साथ निम्नलिखित कोड का उपयोग करें:

qN/p

"आपको स्ट्रिंग में 1 फोन नंबर और शब्दों की एक सूची के साथ एक टेक्स्ट फ़ाइल की सामग्री प्राप्त होगी" -> क्या आप एक अलग ब्लॉक पर, एक उपयोगी सूची में फ़ाइल को पढ़ने के लिए आवश्यक कोड लागू कर सकते हैं?
इस्माइल मिगुएल

@IsmaelMiguel का मतलब है कि आप इस कोड का हिस्सा नहीं हैं, लेकिन सूची को सही प्रारूप में बदलने के लिए सिर्फ एक सहायक कोड है?
ऑप्टिमाइज़र

बिल्कुल सही। आपका कोड यह साबित करने के लिए पर्याप्त नहीं है कि वह दिए गए उदाहरणों के रूप में शब्दों की सूची का उपयोग कर सकता है। लेकिन मैं वैसे भी upvott, मैं सिर्फ उस सहायक कोड चाहता था।
इस्माइल मिगुएल

क्या आप इसे उत्तर में जोड़ सकते हैं? संपादन के रूप में, एक अलग भाग में
इस्माइल मिगुएल

बिल्कुल सही। यह है जिसके बारे में मैं बात कर रहा हूँ! देखते हैं कि क्या आप इसे आगे भी अनुकूलित कर सकते हैं
इस्माइल मिगुएल

2

जावा: 395

यह प्रत्येक संख्या के लिए अनुमत अक्षरों के आधार पर एक रेगेक्स पैटर्न बनाता है, और फिर किसी भी निम्नलिखित वर्णों को मिलाने के लिए अंत में * tacks *।

यहाँ गोल्फ संस्करण है:

static ArrayList<String> f(String n,ArrayList<String> d){String[] k={"","","([A-Ca-c])","([D-Fd-f])","([G-Ig-i])","([J-Lj-l])","([M-Om-o])","([P-Sp-s])","([T-Vt-v])","([W-Zw-z])"};String r="";for(int i=0;i<n.length();++i)r+=k[n.charAt(i)-'0'];r += ".*";Pattern p=Pattern.compile(r);ArrayList<String> a=new ArrayList<String>();for(String w:dictionary)if(p.matcher(w).matches())a.add(w);return a;}

और यहाँ पठन-क्षमता के लिए ungolfed संस्करण है

public static ArrayList<String> f(String phoneNumber, ArrayList<String> dictionary) {

    String[] KEY_VALUES = {"", "", "([A-Ca-c])", "([D-Fd-f])", "([G-Ig-i])",
                                            "([J-Lj-l])", "([M-Om-o])", "([P-Sp-s])",
                                            "([T-Vt-v])", "([W-Zw-z])"};

    String regex = "";
    for (int i = 0; i < phoneNumber.length(); ++i) {
        regex += KEY_VALUES[phoneNumber.charAt(i) - '0'];
    }
    regex += ".*";
    Pattern p = Pattern.compile(regex);
    ArrayList<String> answers = new ArrayList<String>();
    for (String word : dictionary) {
        if (p.matcher(word).matches()) {
            answers.add(word);
        }
    }
    return answers;
}

आपका कोड नियम संख्या 7 के खिलाफ जाता है: "चर, मैक्रोज़, वैश्विक चर, स्थिरांक, गैर-मानक कक्षाएं और फ़ंक्शन के अंदर सभी प्रकार के अन्य मानों को अमान्य माना जाएगा।" और यह थोथा नियम संख्या 3 के खिलाफ जाता है: "आप दूसरे के उत्तरों का उपयोग या फिर से लागू नहीं कर सकते या मेरे कार्यान्वयन की प्रतिलिपि नहीं बना सकते हैं।", लेकिन आपके कोड पर यह थोड़े बहस योग्य है। और यह नियम 9 के खिलाफ भी जाता है: "आपका फ़ंक्शन नाम दिया जाएगा f"।
इस्माइल मिगुएल

@IsmaelMiguel ऊप्स। नियम 7 को फ़ंक्शन के अंदर स्थिर स्थानांतरित करके आसानी से तय किया जा सकता है। मैं इसे केवल बेहतर प्रोग्रामिंग शैली के लिए फ़ंक्शन के बाहर खींच रहा था। नियम 9 भी एक आसान तय है। मैंने स्वीकार किया कि मैंने आपका उत्तर नहीं पढ़ा है, इसलिए मैंने जानबूझकर इसे कॉपी करने की कोशिश नहीं की। मैं अपने जवाब को हटा सकता हूं यदि आपको लगता है कि यह प्रतियोगिता के लिए बहुत करीब है।
ब्रायन जे

आपका उत्तर ठीक है। आपके पास अपने कोड पर एक बग है। अंतिम निरंतर ( ([W-Zw-z)]) पर यह होना चाहिए ([W-Zw-z])। और कोड-गोल्फ पर आपको प्रोग्रामिंग शैलियों और अच्छे अभ्यासों के बारे में चिंता करने की ज़रूरत नहीं है: आपके कोड को बस आवश्यक मापदंडों को पूरा करने की बात करनी चाहिए। यदि आप मेरे उत्तर की जाँच करते हैं, तो आप इस पंक्ति को देखेंगे $s=[2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz];:। यह PHP में एक भयानक 'अपराध' है। मूल रूप से मैं PHP को गैर-मौजूदा स्थिरांक को तार में बदलने के लिए मजबूर कर रहा हूं। यह पूरी तरह से स्वीकार्य है। आप यह भी देखेंगे कि मैं $tइस तरह से उपयोग करने से पहले चर को किसी सरणी में सेट नहीं कर रहा हूँ
इसमाएल मिगुएल

@IsmaelMiguel regex त्रुटि पर अच्छी पकड़। इस पर ध्यान दिलाने के लिए धन्यवाद। मैं वास्तव में इसे कल गोल्फ करने की कोशिश करूँगा; शायद इस साइट पर कुछ जावा उदाहरण मिलें।
ब्रायन जे

मैं एक जावा प्रोग्रामर नहीं हूं, लेकिन मैं आपको कुछ चीजें बताता हूं। कुछ टिप्स पाने के लिए आप codegolf.stackexchange.com/questions/6671/… की जाँच कर सकते हैं । सामान्य युक्तियों में बेकार व्हाट्सएप (newlines, रिक्त स्थान, टैब), एक-अक्षर-लंबे चर नाम शामिल करना और वे सभी शामिल हैं जो आप कोड आकार को यथासंभव कम कर सकते हैं।
इस्माइल मिगुएल

1

C # .NET 4.5 235

यह काम करना चाहिए:

IEnumerable<string>F(string n,string d){IEnumerable<string>w=d.Split(null).ToList();string[]a={"","","abc","def","ghi", "jkl","mno","pqrs","tuv","wxyz"};foreach(var i in n){w=w.Where(x=>x.IndexOfAny(a[i-'0'].ToArray())>0);}return w;}

PPCG में आपका स्वागत है। आपका कोड काम करेगा, लेकिन आपको अभी भी इसे बहुत कम करना होगा। सभी बेकार व्हाट्सएप (स्पेस, टैब, न्यूलाइन्स) को हटाकर मैं आपके कोड को 167 बाइट्स तक कम करने में कामयाब रहा। यह कोड बहुत अधिक घटाया जा सकता है, मुझे इस पर यकीन है। मैं आपको और भी अधिक कोड को छोटा करने के लिए codegolf.stackexchange.com/questions/173/… पढ़ने की सलाह देता हूं । आपकी थोड़ी सी मदद करने के लिए, शब्द सूची एक स्ट्रिंग है जिसे नई सुर्खियों से अलग किया गया है, और आपको लगता है कि इसमें पहले से ही इसका उपयोग करना संभव foreachहै। यदि आप इसे पहले से ही होने की उम्मीद करते हैं IEnumerable, तो बाहर प्रयुक्त कोड
Ismael Miguel

@IsmaelMiguel TY मैं इसे देखूंगा। सूची एक IEnumerable हैं जो मैंने पोस्ट किया है उसके बाहर कोई कोड नहीं है।
18

यदि आप फ़ंक्शन के विनिर्देश को देखते हैं, तो आप देखेंगे कि 2 पैरामीटर भी एक स्ट्रिंग है। (उद्धरण: "आपको एक स्ट्रिंग में 1 फोन नंबर और शब्दों की एक सूची के साथ एक पाठ फ़ाइल की सामग्री प्राप्त होगी (एक विशिष्ट न्यूलाइन शैली नहीं मानें)।") और आपके पास आपके संस्करण पर 1 बेकार व्हाट्सएप है a
इस्माइल मिगुएल

मैंने आपके प्रश्न पर सुधारों पर ध्यान दिया है, और मैंने आपको एक उत्थान दिया है। लेकिन आप अभी भी अपने aसंस्करण पर एक बाइट बचा सकते हैं । लेकिन मैं वास्तव में ध्यान देने योग्य सुधार देखता हूं! अच्छा काम करते रहें।
इस्माइल मिगुएल

1

पायथन 2 (155 बाइट्स)

उपयुक्त प्रतिस्थापन ( string-> bytes, bस्ट्रिंग्स पर उपसर्ग, आदि) के साथ पायथन 3 में भी काम करना चाहिए ।

मुझे यकीन नहीं था कि maketransफ़ंक्शन के बाहर कॉल होने को "उचित" माना जाता है; यदि नहीं, तो फ़ंक्शन 134 बाइट्स के साथ अंदर चला गया।

संपादित करें: एक बेवकूफ से एक बाइट गिरा दिया।

तैयार के साथ maketrans, 67 बाइट्स:

from string import maketrans
t=maketrans('abcdefghijklmnopqrstuvwxyz','22233344455566677778889999')

def f(n,w):
    return[x for x in w.split()if x.lower().translate(t).startswith(n)]

maketransशरीर के साथ , 134 बाइट्स:

from string import maketrans

def f(n,w):
    return[x for x in w.split()if x.lower().translate(maketrans('abcdefghijklmnopqrstuvwxyz','22233344455566677778889999')).startswith(n)]

साथ importऔर maketransशरीर में, 155 बाइट्स:

def f(n,w):
    return[x for x in w.split()if x.lower().translate(__import__('string').maketrans('abcdefghijklmnopqrstuvwxyz','22233344455566677778889999')).startswith(n)]

टेस्ट कॉल:

print f('9999',open('words.txt','rt').read())

maketransसमारोह शरीर का हिस्सा है। आपको इसे स्थानांतरित करना चाहिए। मुझे नहीं पता कि क्या यह संभव है, लेकिन आप सीधे उपयोग करने का प्रयास कर सकते हैं import। मुझे लगता है कि मैंने इसे कहीं देखा ... लेकिन आपका कोड वास्तव में अच्छा है!
इस्माइल मिगुएल

क्या आप आयात को स्थानांतरित करने और शरीर में कॉल करने का मतलब है ? हां, मुझे लगता है कि यह भी किया जा सकता है।
criptych मोनिका

मैं सोच रहा था t=(from stirng import maketrans)([...])। मुझे कोई पता नहीं है अगर यह भी संभव है। लेकिन शायद आप उपयोग कर सकते हैं from string import as x t=x([...])जो मुझे यकीन नहीं है अगर यह भी संभव है: /
इस्माइल मिगुएल

सही संस्करण अंतिम है। लेकिन जैसा कि उत्तर है, मेरी राय में स्वीकार्य है। के लिए +1 __import__('string').maketran
इस्माइल मिगुएल

ठीक है धन्यवाद। मैंने अमान्य उत्तर हटा दिए हैं।
criptych मोनिका

0

PHP 5.4+ (171 186-20% = 148.8 बाइट्स):

खैर, यह एक बहुत बड़ा जवाब है, लेकिन अच्छी तरह से।

मुझे उम्मीद है कि यह और लोगों को जवाब देने के लिए लाता है।

यह फ़ंक्शन पढ़ी जा रही कच्ची सामग्री की अपेक्षा करता है ।

यहाँ कोड है:

function f($_,$a){$s=[2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz];$a=preg_split('@\r\n|\r|\n@',$a);for($i=0;$c=$_[$i];++$i)foreach($a as$k=>$v)if(!strpos(1..$s[$c],$v[$i])||$t[$v[0]]++>4)unset($a[$k]);return$a;}

यह सत्यापित करने से काम करता है कि पत्र अनुमत पत्रों की सूची में है।

उदाहरण: इनपुट 36यह जाँचने के लिए होगा 1abcकि 1defक्या शब्द का पहला अक्षर है और दूसरा अक्षर है।

मैं संलग्न 1करता हूं कि यह जाँच नहीं करता है कि पत्र पहली स्थिति में है (जो वापस आ जाएगा 0और वह मूल्यांकन करेगा false)। if(!strpos(1..$s[$c],$v[$i]))या if(!strpos($c.$s[$c],$v[$i]))समान प्रभाव होगा, लेकिन 1 अधिक भ्रमित करता है और मुझे यह पसंद है।

ऐसा करने में असफल होने पर शब्द हटा दिया जाएगा।

कोई शब्द नहीं बचा है, यह एक खाली सरणी देता है।

इस ऑनलाइन परीक्षण के लिए, http://writecodeonline.com/php/ पर जाएं और लाइन के लिए एक शब्द के साथ एक सरल चर बनाएं।

एक परीक्षण योग्य उदाहरण:

function f($_,$a)
{
    $s=array(2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz);
    $a=preg_split('@\r\n|\r|\n@',$a);

    for($i=0;$c=$_[$i];++$i)
        foreach($a as$k=>$v)
            if(!strpos(1..$s[$c],$v[$i]) || $t[$v[0]]++>4)
                unset($a[$k]);
    return$a;
}

$lines=<<<WORDS
one
two
three
four
five
six
seven
eight
nine
ten
WORDS;

var_dump(f('36',$lines));

यह आउटपुट चाहिए:

array(1) {
    [3]=>
      string(4) "four"
}

पुराने php संस्करणों पर काम करने के लिए, इसके $s=[2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz];द्वारा प्रतिस्थापित करें$s=array(2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz);


20% बोनस के लिए:

मेरे द्वारा जोड़े गए कोड को कम करने के लिए ||$t[$v[0]]++>4, जो यह जांचता है कि पहले अक्षर का कितनी बार उपयोग किया गया था।

Php में, $tपरिभाषित करने की आवश्यकता नहीं है, 37.2 बाइट्स का एक बड़ा हिस्सा कम करने में मदद करता है ।

इस प्रभाव को देखने के लिए, 2 तर्क के रूप में निम्न चर का उपयोग करें:

$lines=<<<WORDS
one
two
three
four
five
six
seven
eight
nine
ten
twelve
time
tutor
test
truth
WORDS;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.