একটি মেনুর জন্য কীবোর্ড শর্টকাট তৈরি করুন


10

মেনু শর্টকাটস

প্রথাগতভাবে, ব্যবহারকারী মেনু যেমন কীবোর্ড শর্টকাট, দ্বারা প্রবেশযোগ্য Alt + (a letter)যখন সমস্ত textboxes (unfocused হয়, অথবা এমনকি কেবল চিঠি আঘাত জিমেইল শৈলী)।

তোমার কাজ

একটি ইনপুট হিসাবে মেনু এন্ট্রি দেওয়া, আপনার কাজ প্রতিটি মেনু এন্ট্রি একটি সঠিক শর্টকাট চিঠি প্রদান।

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

আপনি হয় একটি প্যারামিটার ব্যবহার করতে পারেন এবং একটি মান ফেরত দিতে পারেন, বা STDIN ব্যবহার করতে পারেন এবং আপনার ফলাফলগুলি STDOUT এ আউটপুট করতে পারেন। আপনাকে বৈশ্বিক / স্কোপ ভেরিয়েবলটি ইতিমধ্যে ইনপুট দিয়ে পপুলেট ধরেছে তা অনুমোদিত নয়

সঠিক অক্ষর নির্ধারণের জন্য অ্যালগরিদম

  • মূলত এটি শব্দের প্রথম উপলব্ধ অক্ষর। অনুমান এবং নীচে উদাহরণ দেখুন।
  • সমস্ত প্রবেশপত্রের চিঠিগুলি উপলভ্য না হলে শর্টকাটটি হবে (a letter) + (a number)। প্রবেশ থেকে আপনি কোন চিঠিটি নির্বাচন করেন তা স্বেচ্ছাসেবী। সংখ্যাটি 0 থেকে শুরু হওয়া উচিত এবং 1 দ্বারা বাড়ানো উচিত - যেমন সমস্ত শর্টকাট অনন্য। নীচে তৃতীয় উদাহরণ দেখুন।

অনুমিতি

  • ইনপুটটি একটি সেট হবে, অর্থাত্ কোনও পুনরাবৃত্তি নয়, প্রতিটি প্রবেশ অনন্য।
  • ইনপুটটির দৈর্ঘ্য কোনও অ-নেতিবাচক পূর্ণসংখ্যার (আপনার ভাষার MAX_INT অবধি) হতে পারে।
  • কেস সংবেদনশীলতা: ইনপুট কেস-সংবেদনশীল, (তবে কেস উপেক্ষা করার সময় এটি অনন্য থাকবে)। ফলাফলগুলিতে তাদের আসল কেসিং সহ মূল এন্ট্রিগুলি থাকা উচিত। তবে আউটপুট শর্টকাট অক্ষরগুলি কেস-সংবেদনশীল নয়।
  • সমস্ত ইনপুট শব্দ সংখ্যা দিয়ে শেষ হবে না।
  • কোনও "দুষ্ট ইনপুট" পরীক্ষা করা হবে না। "এভিল ইনপুট" এমনটি যে আপনাকে কোনও নির্দিষ্ট চিঠির কাউন্টারকে 10 বারের বেশি বাড়িয়ে দিতে হয়।

উদাহরণ

নীচের উদাহরণগুলি JSON এ রয়েছে, তবে আপনি আপনার ভাষাটি একটি অ্যারে এবং অভিধানের জন্য সমতুল্য ব্যবহার করতে পারেন, বা - আপনি এসটিডি আই / ও ব্যবহার করছেন - আপনার ইনপুট এবং আউটপুটটির জন্য কোনও পাঠযোগ্য বিন্যাস (যেমন সিএসভি, এমনকি স্পেস- পৃথক মান)।

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'}

জয়ের শর্ত

সংক্ষিপ্ততম কোড জিতেছে। শুধুমাত্র এএসসিআইআই অনুমোদিত।


"এ" ইতিমধ্যে প্রথম এন্ট্রি দ্বারা নেওয়া হয়েছে। সুতরাং "এএ" এর জন্য যেহেতু এর দুটি অক্ষর ইতিমধ্যে নেওয়া হয়েছে, এটি a0 পায়। বি0-বি 2 সমান।
ম্যাটাকুলার

আপনার সংখ্যা শেষ হয়ে গেলে কী হবে?
nderscore

@ আন্ডারস্কোর এটি কি প্রয়োজনীয়?
seequ

করা উচিত ['ab', 'a']দিতে {a:'ab', a0:'a'}বা {b:'ab', a:'a'}?
অ্যাডাম

@ অ্যাডম উভয়ই গ্রহণযোগ্য। পূর্ববর্তীটি কার্যকর করা সহজ হবে যেহেতু আপনি আদেশযুক্ত উপায়ে ইনপুট অ্যারেটি স্ক্যান করেন তবে কোনও কারণে যদি আপনি পরবর্তীটি পছন্দ করেন - তবে এটির জন্য যান।
জ্যাকব

উত্তর:


4

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

আপনার সেখানে একটি বক্তব্য রয়েছে (যদিও এটি সম্ভব হতে পারে) এমন একটি বাস্তবায়ন দেওয়া হয়েছে যা কীস্ট্রোকের শেষ না হওয়া পর্যন্ত অপেক্ষা করে (200 মিমি বা তাই)। যাইহোক, আমি অনুমানগুলিতে যোগ করব এমন কোনও খারাপ ইনপুট পরীক্ষা করা হবে না।
জ্যাকব

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

পিএইচপি> = 5.4 - 149 টি অক্ষর

পিএইচপি'র মান অনুসারে (স্নিগারদের এখানে sertোকান) অনুসারে ইনপুটটি বৈধ জেএসওন এর' পরিবর্তে এটি ব্যবহার করে না ", তাই আমি কিছুটা বোকা হয়েছি এবং আমি ইনপুটটিকে আসল পরিবর্তনশীল ঘোষণা হিসাবে ব্যবহার করছি:

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

পিএইচপি জাম্প ঘোষণার আছে? তাই ... 90 এর।
22-21

2
আপনাকে জেএসএন-তে লেগে থাকতে হবে না, আমি কেবল জেএসএন-তে উদাহরণ সরবরাহ করেছি, তবে, প্রশ্নে বর্ণিত হিসাবে, আপনি আউটপুটের জন্য কোনও পাঠযোগ্য বিন্যাস চয়ন করতে পারেন বা অভিধানের জন্য আপনার ভাষার সমতুল্য ব্যবহার করতে পারেন। ( json_encodeঅনুরোধটি সরিয়ে আপনি 13 টি অক্ষর সংরক্ষণ করতে পারেন )।
জ্যাকব

echoঅ্যারে নিয়ে কাজ করে না; তবে print_r($c);এটি করবে, 9 বাইট সংরক্ষণ করবে।
তিতাস

তবে এই ঘটনা সংবেদনশীল নয়। str_split(strtoupper($w))এবং ucfirst($w[0])এটি সমাধান করতে পারে (+21); বা $s=strtoupper($w);(+18)
টাইটাস

1

পাওয়ারশেল , 91 83 বাইট

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

এটি অনলাইন চেষ্টা করুন!

সঠিক শর্টকাট না পাওয়া গেলে এটি একটি ব্যতিক্রম ছুঁড়ে দেয় rows

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

পিএইচপি, 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 বাইটের জন্য আরগভিতে কাজ করা :

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

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