मेनू के लिए कीबोर्ड शॉर्टकट बनाएं


10

मेनू शॉर्टकट

परंपरागत रूप से, उपयोगकर्ता मेनू कीबोर्ड शॉर्टकट द्वारा सुलभ होते हैं, जैसे कि Alt + (a letter), या यहां तक ​​कि पत्र को मारने पर भी जब सभी टेक्स्टबॉक्स अनफोकस्ड होते हैं ( जीमेल शैली)।

आपका कार्य

इनपुट के रूप में मेनू प्रविष्टियों को देखते हुए, आपका कार्य प्रत्येक मेनू प्रविष्टि को एक उचित शॉर्टकट पत्र प्रदान करना है।

एक फ़ंक्शन या एक प्रोग्राम लिखें जो शब्दों के एक सेट को स्वीकार करता है - मेनू प्रविष्टियों (तार की एक सरणी के रूप में, या आपकी भाषा के समतुल्य), और एक शब्दकोश, या एक हैशमैप, एक अक्षर से एक मेनू प्रविष्टि तक देता है।

आप या तो एक पैरामीटर का उपयोग कर सकते हैं और एक मान लौटा सकते हैं, या STDIN का उपयोग कर सकते हैं और अपने परिणामों को STDOUT में आउटपुट कर सकते हैं। आपको वैश्विक / स्कोप वैरिएबल मानने की अनुमति नहीं है जो पहले से ही इनपुट से आबाद है।

उचित पत्र निर्धारित करने के लिए एल्गोरिथ्म

  • मूल रूप से यह शब्द का पहला उपलब्ध पत्र है। नीचे मान्यताओं और उदाहरण देखें।
  • यदि सभी प्रवेश पत्र उपलब्ध नहीं हैं, तो शॉर्टकट होगा (a letter) + (a number)। प्रविष्टि से आप जो पत्र चुनते हैं वह मनमाना है। संख्या 0 से शुरू होनी चाहिए और 1 से बढ़ाई जानी चाहिए - जैसे कि सभी शॉर्टकट अद्वितीय हैं। नीचे तीसरा उदाहरण देखें।

मान्यताओं

  • इनपुट एक सेट होगा, यानी कोई पुनरावृत्ति नहीं, प्रत्येक प्रविष्टि अद्वितीय है।
  • इनपुट की लंबाई किसी भी गैर-नकारात्मक पूर्णांक (आपकी भाषा के MAX_INT तक) हो सकती है।
  • केस सेंसिटिविटी: इनपुट केस-सेंसिटिव है, (लेकिन केस को नजरअंदाज करते समय यूनिक रहेगा)। परिणामों में उनकी मूल आवरण वाली मूल प्रविष्टियाँ होनी चाहिए। हालाँकि, आउटपुट शॉर्टकट अक्षर केस-संवेदी नहीं होते हैं।
  • सभी इनपुट शब्द संख्याओं के साथ समाप्त नहीं होंगे।
  • कोई "दुष्ट इनपुट" परीक्षण नहीं किया जाएगा। "ईविल इनपुट" ऐसा है कि आपको 10 से अधिक बार एक निश्चित पत्र के काउंटर को बढ़ाना होगा।

उदाहरण

नीचे दिए गए उदाहरण JSON में हैं, लेकिन आप अपनी भाषा को एक सरणी और एक शब्दकोश के लिए बराबर उपयोग कर सकते हैं, या - यदि आप STD I / O का उपयोग कर रहे हैं - तो आपके इनपुट और आउटपुट के लिए कोई पठनीय प्रारूप (जैसे csv, या यहां तक ​​कि अंतरिक्ष) अलग मूल्य)।

1।

Input:  ['File', 'Edit', 'View', 'Help']
Output: {f:'File', e:'Edit', v:'View', h:'Help'}

2।

Input:  ['Foo', 'Bar', 'FooBar', 'FooBars']
Output: {f:'Foo', b:'Bar', o:'FooBar', a:'FooBars'}

3।

Input:  ['a', 'b', 'aa', 'bb', 'bbq', 'bbb', 'ba']
Output: {a:'a', b:'b', a0:'aa', b0:'bb', q:'bbq', b1:'bbb', b2:'ba'}

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

सबसे छोटा कोड जीतता है। केवल ASCII की अनुमति है।


"ए" पहले से ही पहली प्रविष्टि द्वारा लिया गया है। तो "आ" के लिए क्योंकि इसके दोनों अक्षर पहले से ही उठाए गए हैं, इसे a0 मिलता है। B0-b2 के साथ भी।
मैटेलिक

जब आप संख्याओं से बाहर निकलते हैं तो क्या होता है?
18

@nderscore क्या यह वास्तव में आवश्यक है?
19

चाहिए ['ab', 'a']देना {a:'ab', a0:'a'}या {b:'ab', a:'a'}?
शाम

@ Adám दोनों स्वीकार्य हैं। जब आप इनपुट आर्डर को क्रमबद्ध तरीके से स्कैन करते हैं, तो पूर्व को लागू करना आसान होगा, लेकिन अगर किसी कारण से आप बाद वाले को पसंद करते हैं - तो इसके लिए जाएं।
जैकब

जवाबों:


4

जावास्क्रिप्ट ( ईएस 6 ) 106 105 100

यह फ़ंक्शन एक सरणी के रूप में इनपुट लेता है और एक जावास्क्रिप्ट ऑब्जेक्ट को आउटपुट करता है।

f=i=>i.map(a=>{for(b of c=a.toLowerCase(d=0)+d+123456789)d<!o[e=b>=0?c[0]+b:b]&&(o[d=e]=a)},o={})&&o

परिणाम:

f(['File', 'Edit', 'View', 'Help']);
// {"f":"File","e":"Edit","v":"View","h":"Help"}

f(['Foo', 'Bar', 'FooBar', 'FooBars']);
// {"f":"Foo","b":"Bar","o":"FooBar","a":"FooBars"}

f(['a', 'b', 'aa', 'bb', 'bbq', 'bbb', 'ba']);
// {"a":"a","b":"b","a0":"aa","b0":"bb","q":"bbq","b1":"bbb","b2":"ba"}

अघोषित / टिप्पणी:

f=i=>{
  o={};                                        // initialize an object for output
  i.map(a=>                                    // loop through all values in input
    for(b of c=a.toLowerCase(d=0)+d+123456789) // loop through all characters of the string with 0123456789 appended to the end
                                               // and initialize d as 0 to be used as a flag 
      e=b>=0?c[0]+b:b                          // if b is a number, set e to the first character + the number, otherwise b
      if(d<!o[e])                              // if the flag hasn't been triggered and o doesn't have a property e
        o[d=e]=a                               // then store the value at e and trigger the d flag
  )
  return o                                     // return the output object
}

ये सुन्दर है। यह दुष्ट इनपुट के लिए विफल हो सकता है ['a', 'aa', 'aaa', 'aaaa', 'aaaaa', 'aaaaaa', 'aaaaaaa', 'aaaaaaaa', 'aaaaaaaaa', 'aaaaaaaaaa', 'aaaaaaaaaaa', 'aaaaaaaaaaaa'], लेकिन मुझे लगता है कि हम ऐसे किनारे के मामलों को अनदेखा कर सकते हैं, क्या हम नहीं कर सकते?
याकूब

@ जैकब और जब हम हिट करते हैं तो क्या होता है 11? आप कीबोर्ड शॉर्टकट में एक कुंजी को दो बार दबा नहीं सकते हैं: P
nderscore

आपके पास एक बिंदु है (हालांकि यह संभव हो सकता है, एक कार्यान्वयन दिया गया है जो किस्ट्रोक्स (200ms या तो) के अंत तक इंतजार करता है)। किसी भी तरह, मुझे लगता है कि इस तरह के किसी भी बुरे इनपुट का परीक्षण नहीं किया जाएगा।
याकूब

2

पायथन 2.x - 176 170 157 114 बाइट्स

बहुत ही सरल दृष्टिकोण, लेकिन किसी को खेल को किक करना पड़ता है।

r={}
for i in input():a=list(i.upper());r[([c for c in a+[a[0]+`x`for x in range(10)]if c not in r])[0]]=i
print r

Edit 1: Reversed the checking operation and made it set the result only once.
Edit 2: Removed branching.
Edit 3: Removed unnecessary dictionary. (thanks to the added assumption)

उदाहरण:

Input:  ['File', 'Edit', 'View', 'Help']
Output: {'H': 'Help', 'V': 'View', 'E': 'Edit', 'F': 'File'}

Input:  ['Foo', 'Bar', 'FooBar', 'FooBars']
Output: {'A': 'FooBars', 'B': 'Bar', 'O': 'FooBar', 'F': 'Foo'}

Input:  ['a', 'b', 'aa', 'bb', 'bbq', 'bbb', 'ba']
Output: {'A': 'a', 'B': 'b', 'Q': 'bbq', 'A0': 'aa', 'B0': 'bb', 'B1': 'bbb', 'B2': 'ba'}

मुझे लगता है कि केवल आवश्यक स्पष्टीकरण असम्बद्ध कोड है। (यह वास्तव में मूल संस्करण है)

items = input() # ['File', 'Edit', 'View', 'Help']
chars = map(chr,range(65,91))
numbers = {}.fromkeys(chars,0)
result = {}
for item in items:
    try:
        key = [c for c in item.upper() if c in chars][0] # causes an exception when no items match
        result[key] = item
        chars.remove(key)
    except:
        key = item[0].upper()
        result[key+`numbers[key]`] = item
        numbers[key] += 1
print result

मुझे @ जेकॉब को विनम्र धन्यवाद कहना होगा। इनपुट प्रारूप सिर्फ महान है।
seequ

2

जावास्क्रिप्ट (ECMAScript 6) - 107 वर्ण

f=a=>(o={},p={},[o[[c for(c of l=w.toLowerCase())if(!o[c])][0]||(k=l[0])+(p[k]=p[k]+1|0)]=w for(w of a)],o)

स्पष्टीकरण:

f=a=>(
  o={},                              // The dictionary to output
  p={},                              // Stores record of numbers appended after duplicate
                                     // menu keys
  [                                  // Use array comprehension for each word w of input a
   (unmatchedCharacters
     =[c                             // Use array comprehension for each character c of
      for(c of l=w.toLowerCase())    //   the lower case of word w but only get
      if(!o[c])                      //   those characters which are not already a key in o.
     ],
    key=unmatchedCharacters[0]       // Take the first of those characters
     ||                              // Or if all characters are already in o
     (k=l[0])                        // Take the first character of the lower-case word
     +(p[k]=p[k]+1|0),               //   concatenated with the increment of the digit stored
                                     //   in p (or zero). 
   o[key]=w)                         // Set o to map from this key to the word
   for(w of a)
  ],
  o)                                 // return o

टेस्ट:

f(['File', 'Edit', 'View', 'Help']);
{f: "File", e: "Edit", v: "View", h: "Help"}

f(['Foo', 'Bar', 'FooBar', 'FooBars']);
{f: "Foo", b: "Bar", o: "FooBar", a: "FooBars"}

f(['a', 'b', 'aa', 'bb', 'bbq', 'bbb', 'ba']);
{a: "a", b: "b", a0: "aa", b0: "bb", q: "bbq", b1: "bbb", b2: "ba"}

1

PHP> = 5.4 - 149 अक्षर

PHP के मानकों के अनुसार (यहाँ स्नाइगर्स डालें) , इनपुट मान्य नहीं है JSON के रूप में यह 'इसके बजाय का उपयोग करता है ", इसलिए मैं थोड़ा चूजी हो गया हूं और मैं एक वास्तविक चर घोषणा के रूप में इनपुट का उपयोग कर रहा हूं:

<?
$i = ['a', 'b', 'aa', 'bb', 'bbq', 'bbb', 'ba'];
$c=[];foreach($i as$w){foreach(str_split($w) as$j)if(!$c[$j]){$x=$j;goto f;}$n=0;do{$x=$w[0].$n++;}while($c[$x]);f:$c[$x]=$w;}echo json_encode($c);

उदाहरणों का उपयोग करना:

Input:  ['File', 'Edit', 'View', 'Help']
Output: {"F":"File","E":"Edit","V":"View","H":"Help"}

Input:  ['Foo', 'Bar', 'FooBar', 'FooBars']
Output: {"F":"Foo","B":"Bar","o":"FooBar","a":"FooBars"}

Input:  ['a', 'b', 'aa', 'bb', 'bbq', 'bbb', 'ba']
Output: {"a":"a","b":"b","a0":"aa","b0":"bb","q":"bbq","b1":"bbb","b2":"ba"}

अन-गोल्फकृत यह बहुत ही मूल है:

<?
$i = ['a', 'b', 'aa', 'bb', 'bbq', 'bbb', 'ba'];
$c = [];
foreach($i as $w)
{
    foreach(str_split($w) as $j)
        if(!$c[$j])
        {
            $x = $j;
            goto f;
        }
    $n = 0;
    do
    {
        $x = $w[0] . $n++;
    }
    while($c[$x]);
    f: $c[$x] = $w;
}
echo json_encode($c);

PHP में कूद घोषणाएँ हैं? ऐसा है ... 90 का।
देखिए

2
आपको JSON से चिपकना नहीं है, मैंने केवल JSON में उदाहरण प्रदान किए हैं, लेकिन, जैसा कि प्रश्न में कहा गया है, आप आउटपुट के लिए कोई पठनीय प्रारूप चुन सकते हैं या अपनी भाषा को किसी शब्दकोश के लिए उपयोग कर सकते हैं। (आप json_encodeमंगलाचरण को हटाकर 13 वर्णों को बचा सकते हैं )।
जैकब

echoसरणियों के साथ काम नहीं करता है; लेकिन print_r($c);यह 9 बाइट की बचत होगी।
टाइटस

लेकिन यह असंवेदनशील मामला नहीं है। str_split(strtoupper($w))और ucfirst($w[0])(+) को हल कर सकते हैं; या $s=strtoupper($w);(+18)
टाइटस

1

पॉवरशेल , 91 83 बाइट्स

$r=@{}
$args|%{$r[($_|% *wer|% t*y|%{$c=$_;,''+0..9|%{$c+$_}|?{!$r.$_}})[0]]=$_}
$r

इसे ऑनलाइन आज़माएं!

यह एक अपवाद फेंकता है अगर एक उचित शॉर्टकट नहीं मिला।

unrolled:

$result=@{}
$args|%{
    $shortcuts = $_|% toLower|% toCharArray|%{
        $c=$_
        ,''+0..9|%{$c+$_}|?{!$result.$_}    # output shortcuts are not exist in the result
    }
    $properShortcut = $shortcuts[0]         # throws an exception if a proper shortcut not found
    $result[$properShortcut]=$_
}
$result

0

PHP, 153 बाइट्स

for($c=[];$w=trim(fgets(STDIN));$c[reset(array_diff(str_split($s),array_keys($c)))?:$y]=$w){$s=strtoupper($w);for($n=0;$c[$y=$s[0].$n++];);}print_r($c);

साथ चलाने php-r '<code>' <<EOF+ Enter + <word1>+ Enter + <word2>+ Enter + ... + EOF+ Enter

155 बाइट्स के लिए argv पर काम करना :

$c=[];foreach($argv as$i=>$w)if($i){$s=strtoupper($w);for($n=0;$c[$y=$s[0].$n++];);$c[reset(array_diff(str_split($s),array_keys($c)))?:$y]=$w;}print_r($c);

साथ दौड़ो php -r '<code>' <word1> <word2> ...

(-13 एक परिभाषित वैश्विक के साथ बाइट्स: foreach($i as$w)बजाय foreach($argv as$i=>$w)if($i))

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.