ট্যাব সমাপ্তি প্রয়োগ করুন


31

ট্যাব সমাপ্তি একটি দরকারী বৈশিষ্ট্য যা আংশিক লিখিত আদেশগুলি স্বয়ংক্রিয়ভাবে পূর্ণ করে। আপনি এটি বাস্তবায়ন করতে যাচ্ছেন।

উদাহরণস্বরূপ, যদি উপলভ্য কমান্ডগুলি থাকে ['apply','apple','apple pie','eat']তবে aতার সাথে সম্পূর্ণ হবে appl, যেমন সমস্ত কমান্ড শুরু হয় সেগুলি aদিয়েও শুরু হয় appl

ইনপুট আউটপুট

আপনাকে একটি স্ট্রিং, এ এবং স্ট্রিংয়ের একটি সেট ইনপুট করতে হবে, বি।

আপনাকে খ এর সাথে শুরু হওয়া সমস্ত বিয়ের দীর্ঘতম উপসর্গ আউটপুট করতে হবে A.

  • অপশনগুলির কোনওটি যদি এ দিয়ে শুরু না হয় তবে ফিরে আসুন
  • আপনি ধরে নিতে পারেন যে বি নিরবচ্ছিন্ন, এবং সমস্ত স্ট্রিং অযৌক্তিক
  • আপনি ধরে নিতে পারবেন না যে কোনও বিকল্পের সাথে এ শুরু হয়, বা সাধারণ উপসর্গটি এ এর ​​চেয়ে দীর্ঘ হবে
  • আপনি কেস সংবেদনশীল বা ক্ষেত্রে সংবেদনশীল হতে পারেন।
  • আপনার কেবল প্রিন্টযোগ্য এএসসিআইআই হ্যান্ডেল করতে হবে
  • স্পষ্টভাবে এই কাজটি করে এমন বিল্ট-ইনগুলি অনুমোদিত

পরীক্ষার কেস:

'a'       ['apply','apple','apple pie','eat'] => 'appl'
'a'       ['apple pie']                       => 'apple pie'
'apple'   ['eat','dine']                      => 'apple'
'program' ['programa','programb']             => 'program'
'*%a('    ['*%a()-T>','*%a()-T<','@Da^n&']    => '*%a()-T'
'a'       ['abs','absolute','answer']         => 'a'
'a'       ['a','abs']                         => 'a'
'one to'  ['one to one','one to many']        => 'one to '

শেষ পরীক্ষার ক্ষেত্রে পিছনের স্থানটি নোট করুন

এটি একটি , সুতরাং আপনার উত্তরগুলি যত তাড়াতাড়ি সংক্ষিপ্ত করুন!



উত্তর-বর্ণমালা, মুদ্রণযোগ্য ASCII অক্ষরের উত্তরসূরিদের জন্য আপনি কি উদাহরণ যুক্ত করতে পারেন?
কনর ও'ব্রায়েন

বর্ণমালাবিহীন অক্ষরের সাথে আরও উদাহরণগুলি আঘাত করতে পারে না। আমি কেবল আমার উত্তরটি মুছে ফেলেছি কারণ আমি বুঝতে পারি যে এটি \​বা ইনপুট যুক্ত ইনপুটগুলি ভেঙে গেছে '
ডেনিস

কীভাবে 'উদাহরণে উপস্থাপন করবেন তা নিশ্চিত নন । আমি যদি "স্ট্রিংয়ের জন্য ব্যবহার করি তবে স্ট্রিংগুলি অন্যান্য উদাহরণগুলির চেয়ে আলাদা।
নাথান মেরিল

এটা ঠিক সমস্যা আমার উত্তর ছিল। : পি
ডেনিস

উত্তর:


10

জাভাস্ক্রিপ্ট (ES6), 75 বাইট

(s,a)=>/^(.*).*(\n\1.*)*$/.exec(a.filter(e=>e.startsWith(s)).join`
`)[1]||s

ব্যাখ্যা: সমস্ত মিলে যাওয়া উপসাগরগুলিতে ফিল্টারগুলি, তারপরে নতুন লাইনের সাথে মিলিত হয় এবং একটি রেজেক্সের সাথে মিল থাকে যা সমস্ত লাইনের দীর্ঘতম উপসর্গ খুঁজে পায়। যদি কোনও উপসর্গ না থাকে তবে রেজেক্স একটি খালি স্ট্রিং ফিরিয়ে দেয় সেই ক্ষেত্রে আমরা কেবল আসল স্ট্রিংটি ফিরে পাই।


আপনি একটি বাইট অফের e.startsWith(s)সাথে প্রতিস্থাপন করতে পারেন e.match("^"+s)কারিরিং আরেকটি সংরক্ষণ করবে
শন এইচ

@ শনহাহ্ আমি matchনির্বিচারে মুদ্রণযোগ্য এএসসিআইআই ব্যবহার করতে পারি না ।
নিল

ওহ ডান রেজেক্স এবং নিয়ন্ত্রণের অক্ষর। আপনি যদি এখনও তরকারি করতে (s,a)=>করতেs=>a=>
শন এইচ

7

জেলি , 14 12 বাইট

ḣJ$€ċÐff\ṪṪȯ

এটি অনলাইন চেষ্টা করুন! বা সমস্ত পরীক্ষার কেস যাচাই করুন

কিভাবে এটা কাজ করে

ḣJ$€ċÐff\ṪṪȯ  Main link. Left argument: B. Right argument: A

  $€          Convert the two links to the left into a monadic chain and apply it
              to each string s in B.
 J              Generate the indices of s, i.e., [1, ..., len(s)].
ḣ               Head; for each index i, take the first i characters of s.
              This generates the prefixes of all strings in B.
     Ðf       Filter; keep prefixes for which the link to the left returns 1.
   ċ            Count the number of times A appears in the prefixes of that string.
       f\     Do a cumulative (i.e., keeping all intermediate values) reduce by
              filter, keeping only common prefixes. f/ is a more obvious choice,
              but it errors on an empty array, i.e., when A isn't a prefix of any
              string in B.
         Ṫ    Tail; take the last prefix array (if any) or return 0.
          Ṫ   Tail; take the last common prefix (if any) or return 0.
           ȯ  Logical OR (flat); replace 0 with A, leave strings untouched.

6

পাইথ, 14 13 বাইট

-২ বাইটের জন্য @ আইসএইচজি ধন্যবাদ

.xe@F/#z._MQz

একটি প্রোগ্রাম যা STDIN এ স্ট্রিংগুলির তালিকা এবং তারপরে স্ট্রিংটি নেয় এবং ফলাফলটি মুদ্রণ করে।

সমস্ত পরীক্ষার কেস যাচাই করুন

কিভাবে এটা কাজ করে

.xe@F/#z._MQz  Program. Inputs: Q, z
        ._MQ   Map prefixes over Q
     /#z       Filter that by count(z)>0, removing the prefixes corresponding to elements
               in Q that do not start with z
   @F          Fold intersection over that. This yields all the common prefixes
  e            Yield the last element of that, giving the longest common prefix, since the
               prefixes are already sorted by length
.x             But if that throws an exception since no elements of Q start with z:
            z  Yield z instead
               Implicitly print

1
f}zT=>/#z
isaacg

5

পাওয়ারশেল v3 +, 112 বাইট

param($a,$b)if($c=@($b-like"$a*")){([char[]]$c[0]|%{($i+="$_")}|?{($c-like"$_*").count-eq$c.count})[-1]}else{$a}

স্ট্রিং $aএবং স্ট্রিংগুলির একটি অ্যারে হিসাবে ইনপুট নেয় $b। ব্যবহার -likeঅপারেটর থেকে যারা উপাদান উঠিয়ে ফেলা $bযে (কেস-অবশ) দিয়ে শুরু হয় $aস্পষ্টভাবে একটি অ্যারের হিসাবে যারা নিক্ষেপ @(...)(যেহেতু ফলাফলের স্কেলের, যা কেস ইন্ডেক্স পরে ব্যর্থ হয় যেমন এক ম্যাচ হতে পারে), এবং মধ্যে যে অ্যারের দোকান $c

যে ifধারাটি গঠন । যদি কিছু না থাকে $c(অর্থাত্ কিছুই দিয়ে শুরু হয় না $a, তাই অ্যারেটি খালি থাকে), তবে আউটপুটটি $aদিয়ে else। অন্যথায় ...

আমরা প্রতিটি উপাদানটির মাধ্যমে অ্যারে এবং লুপ $cহিসাবে প্রথম উপাদানটি charফেলেছি, আগেরটির সাথে স্ট্রিং-কনটেনেটেটিং এবং এনপ্যাপুলেটিং পেরেসের $iমাধ্যমে পাইপলাইনে স্ট্রিংগুলি রেখেছি। ঐ মাধ্যমে ফিল্টার করা হয় |?{...}( Where-Objectতা যাচাই করতে দফা) .countএর $cহয় -eqকরতে ual .countজিনিস $cযে -likeসাবস্ট্রিং (অর্থাত, সাবস্ট্রিং সবকিছু $ গ মেলে)। যেহেতু আমরা আমাদের সাবস্ট্রিংগুলি সবচেয়ে দীর্ঘ থেকে দীর্ঘতমভাবে ক্রমান্বয়ে তৈরি করছি তাই আমাদের [-1]ফলস্বরূপ স্ট্রিংগুলির শেষ প্রয়োজন ।

পরীক্ষার মামলা

PS C:\Tools\Scripts\golfing> $tests=@('a',@('apply','apple','apple pie','eat')),@('a',@('apple pie')),@('apple',@('eat','dine')),@('program',@('programa','programb')),@('one to',@('one to one','one to many')),@('*%a(',@('*%a()-T>', '*%a()-T<', '@Da^n&'))

PS C:\Tools\Scripts\golfing> $tests|%{""+$_[0]+" ("+($_[1]-join',')+") -> "+(.\implement-tab-completion.ps1 $_[0] $_[1])}
a (apply,apple,apple pie,eat) -> appl
a (apple pie) -> apple pie
apple (eat,dine) -> apple
program (programa,programb) -> program
one to (one to one,one to many) -> one to 
*%a( (*%a()-T>,*%a()-T<,@Da^n&) -> *%a()-T

4

পাইথন 2, 122 বাইট

s=input();l=[x for x in input()if x[:len(s)]==s]or[s];i=len(l[0])
while len(l)>1:i-=1;l=set(x[:i]for x in l)
print l.pop()

পুরো প্রোগ্রাম; উদাহরণগুলিতে যেমন স্ট্যান্ডিন থেকে স্ট্রিং এবং তালিকার তালিকা গ্রহণ করে তবে ইনপুটগুলি পৃথক লাইনে থাকতে হবে।

সমস্ত পরীক্ষার কেস যাচাই করুন


এর l.pop()বদলে কেন l[-1]?
সাইয়েস

@ কোয়েস কারণ lসাধারণত setসেই মুহুর্তে একটি, যা সূচকে বিনা অনুমতি দেয় ( আনর্ডারড হওয়ার কারণে )। (ভাগ্যক্রমে, উভয় সেট এবং তালিকাই সমর্থন সমর্থন করে pop()
D

3

পার্ল, 54 বাইট

জন্য +2 -Xp(একত্রিত হতে পারে -e) এবং +3 এর জন্য -i(একত্রিত করা যায় না) অন্তর্ভুক্ত

STDIN এবং -iবিকল্পের পরে শব্দটির উপর অভিধান দিন :

perl -ia -Xpe '/^\Q$^I\E.*?(?{$F[$a{$&}++]=$&})^/}{$_=pop@F||$^I'
apply
apple
apple pie
eat
^D

কেবল কোড:

/^\Q$^I\E.*?(?{$F[$a{$&}++]=$&})^/}{$_=pop@F||$^I

3

পার্ল, 61 বাইট

জন্য +2 অন্তর্ভুক্ত -0p

STDIN এ অভিধানের শব্দগুলির পরে প্রথম শব্দটি চালান:

tabcompletion.pl
a
apply
apple
apple pie
eat
^D

tabcompletion.pl:

#!/usr/bin/perl -0p
/^(.+)
((?!\1).*
)*(\1.*).*
((?!\1).*
|\3.*
)*$|
/;$_=$3||$`

2

পাইথন 2, 112 বাইট

lambda n,h:[a.pop()for a in[{s[:-i]for s in h if s.find(n)==0}for i in range(-len(`h`),0)]+[{n}]if len(a)==1][0]

2

হাস্কেল, 67 বাইট

(a:b)?(c:d)|a==c=a:(b?d)
_?_=""
s%l=foldr1(?)$max[s][x|x<-l,x?s==s]

সহায়ক ফাংশনটি ?দুটি স্ট্রিংয়ের দীর্ঘতম সাধারণ উপসর্গটি খুঁজে পায় যতক্ষণ না উভয় স্ট্রিংয়ের জন্য একই অক্ষর থাকে এবং স্ট্রিংগুলি খালি নয় rec

প্রধান ফাংশন %প্রথম তালিকা যে এক দেওয়া দিয়ে শুরু একমাত্র স্ট্রিং রাখে s, সঙ্গে দীর্ঘতম সাধারণ উপসর্গ দ্বারা চেক sহচ্ছে s। কোনও বৈধ প্রতিযোগিতা নেই হ্যান্ডেল করতে, এটি sমাধ্যমে একটি খালি ফলাফল যুক্ত করে max। তারপরে, এটি বাইনারি ফাংশনটি ভাঁজ করে এটিগুলির মধ্যে দীর্ঘতম সাধারণ উপসর্গটি সন্ধান করে ?


2

পাইথন 2, 75 বাইট

import os
lambda s,x:os.path.commonprefix([t for t in x if s<=t<s+'ÿ'])or s

এই উত্তরটিতে মূলত @ বেটাডেকে দ্বারা ব্যবহৃত অন্তর্নির্মিত পরামর্শ দেওয়ার জন্য @ এক্সনরকে ধন্যবাদ জানাই ।

স্কোর করার উদ্দেশ্যে, ÿএকটি ডেল বাইট দিয়ে প্রতিস্থাপন করা যেতে পারে। আইডিয়নে এটি পরীক্ষা করুন ।


1

ডি, 88 বাইট

S f(S)(S p,S[]q){try p=q.filter!(a=>a.startsWith(p)).fold!commonPrefix;catch{}return p;}

ব্যবহার:

assert(f("a", ["apply","apple","apple pie","eat"]) ==  "appl");

কোডটি সহজভাবে সমস্ত উপাদানগুলি সরিয়ে দেয় qযা এর সাথে শুরু হয় না p, তারপরে অবশিষ্ট উপাদানগুলির বৃহত্তম সাধারণ প্রাথমিক অনুচ্ছেদটি গণনা করে।

তাত্পর্যযুক্ত পরামিতিগুলি আমাদের দুটি stringএবং এর একটি পুনরাবৃত্তি সংরক্ষণ করে auto। ব্যতিক্রম অপব্যবহার আমাদের অস্থায়ী পরিবর্তনশীল এবং শর্তসাপেক্ষ এড়াতে দেয় যা অন্যথায় মামলা পরিচালনা করার জন্য প্রয়োজনীয় হবে যেখানে কোনও উপাদানই qশুরু হয় না p


1

পাইথন 2, 107 102 বাইট

s,x=input();r='';q=1
for c in zip(*[t for t in x if s<=t<s+'ÿ']):q/=len(set(c));r+=c[0]*q
print r or s

স্কোর করার উদ্দেশ্যে, ÿএকটি ডেল বাইট দিয়ে প্রতিস্থাপন করা যেতে পারে। আইডিয়নে এটি পরীক্ষা করুন ।

@ এক্সনরকে 5 টি বাইট সংরক্ষণ করার জন্য ধন্যবাদ!


সঙ্গে os.path.commonprefix যেমন বিটা ক্ষয় পাওয়া , আপনি এটি আপনার জন্য কাজ করতে পারে।
xnor

বাহ, এটি অনেকগুলি বাইট সঞ্চয় করে । আপনি কি নিশ্চিত যে আপনি নিজেরাই পোস্ট করতে চান না?
ডেনিস

এটি নিজের পোস্ট করা ঠিক অনুভব করব না কারণ এটি সম্পূর্ণরূপে বিটা ডেকের ধারণাটি আপনার উত্তরের সাথে একত্রিত।
xnor

আপনার সমাধানের জন্য, এটি for c in ...সরাসরি পুনরাবৃত্তি করা এবং পছন্দ মতো মুদ্রণের পরে ত্রুটি সহ বন্ধ করতে কিছুটা সংক্ষিপ্ত বলে মনে হচ্ছে if len(set(c))>1:print r or s;_
xnor

আমি মনে করি যে এক্স ব্যর্থ হবে যদি একটি সিঙ্গলটন অ্যারে।
ডেনিস

1

পিএইচপি, 167 160 157 152 বাইট

<?for($r=preg_grep("$^".preg_quote($s=$_GET[s])."$",$a=$_GET[a]);$r[0]>$s&&preg_grep("$^".preg_quote($t=$s.$r[0][strlen($s)])."$",$a)==$r;)$s=$t;echo$s;

আমি preg_grepএবং এর সাথে ভেরিয়েবল বরাদ্দ করে আরও 3 বাইট সঞ্চয় করতে পারি preg_quote

ভাঙ্গন

for(
    // find items in $a that start with $s
    $r=preg_grep("$^".preg_quote($s=$_GET[s])."$",$a=$_GET[a]);
    // while the first match is longer than $s
    $r[0]>$s
    // and appending the next character of the first match
    &&preg_grep("$^".preg_quote($t=$s.$r[0][strlen($s)])."$",$a)
    // does not change the matches
    ==$r
;)
    // keep appending
    $s=$t;
return$s;

1

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

তিতাস থেকে অনেক সাহায্যের সাথে আপনাকে ধন্যবাদ

<?foreach($_GET[t]as$v)if(strstr($v,$s=$_GET[s])==$v)$r[]=$z=$v;for(;$i++<strlen($z);){$s=substr($z,0,$i);foreach($r as$x)if($x[$i]!=$z[$i])break 2;}echo$s;

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

32 বাইট অ্যারে_উনিকের সাহায্যে তিতাসের দ্বারা সংরক্ষণ করে

<?foreach($_GET[t]as$v)if(strstr($v,$s=$_GET[s])==$v)$r[]=$v;for(;$i++<strlen($r[0]);$a=[]){foreach($r as$x)$a[]=substr($x,0,$i);if(count($r)==count($a)&count(array_unique($a))<2)$s=$a[0];}echo$s;

আমি জানি যে তিতাসের দ্বারা রেজেজ সলিউশনটি আমার পথ উন্নত করতে সহায়তা না করা পর্যন্ত সংক্ষিপ্ত ছিল। আমি যেভাবে খুঁজে পেয়েছি তা আপনার জন্য আকর্ষণীয়


1
1) প্রতিস্থাপন $zসঙ্গে $sফিক্স apple, [eat,dine]কেস। 2) $l=অপ্রচলিত; আপনি সেই পরিবর্তনশীলটি ব্যবহার করবেন না। (-2) 3) এর $i++<$mচেয়ে কম হয় ++$i<=$m। (-1) 4) এর substr($x,0,$i);চেয়ে কম হয় str_split($x,$i)[0]। (-3) 5) আপনি $r[]=$vস্ট্রেনের ভিতরে রাখতে পারেন । (-5)
টাইটাস

1
6) এর <2চেয়ে কম ==1। (-1) 7) আপনি ব্যবহার করতে পারে strstrপ্রথম লুপ: strstr($v,$s)==$v। (-3)
টাইটাস

1
আমাকে এটি পুনঃপ্রকাশ করতে দিন: 5) আপনি কোঁকড়াগুলি একত্রিত $r[]=$v;$m=max($m,strlen($v));করতে $m=max($m,strlen($r[]=$v));এবং ফেলে দিতে পারেন। এটি শর্তটিকে স্পর্শ করে না।
তিতাস

1
দ্বিতীয় চিন্তায়, আপনার একেবারেই দরকার নেই $m। আপনার কেবলমাত্র এমন কিছু যা প্রয়োজন = প্রতিস্থাপনের সর্বনিম্ন দৈর্ঘ্য। নতুন 5) (-13) এর {$r[]=$v;$m=max($m,strlen($v));}সাথে $r[]=$v;}এবং এর <$mসাথে প্রতিস্থাপন করুন<strlen($r[0])
টাইটাস

1
গ্রেট! এবং আমি সবেমাত্র অন্য গল্ফটি পেয়েছি: 9) $r[]=$z=$v;প্রথম লুপটিতে এবং {$s=substr($z,0,$i);foreach($r as$x)if($x[$i]!=$z[$i])break 2;}দ্বিতীয়টির জন্য (-3)
টাইটাস

1

রেটিনা, 60 বাইট

^(.*)(\n(?!\1).*)*(\n(\1.*)).*(\n((?!\1)|\4).*)*$
$4
s`\n.*

পেছনের নতুন লাইনটি তাৎপর্যপূর্ণ। একটি লাইনে স্ট্রিং হিসাবে ইনপুট নেয় এবং তারপরে প্রতিটি শব্দের একটি পৃথক লাইনে (তবে কোনও পূর্ববর্তী নিউলাইন নয়!)। প্রথম লাইনের স্ট্রিংয়ের সাথে শুরু হওয়া সমস্ত লাইনের দীর্ঘতম উপসর্গের সাথে মিল রেখে আমার জাভাস্ক্রিপ্ট উত্তরের অনুরূপভাবে কাজ করে। যদি এটি একটি না পায় তবে এটি কেবল সমস্ত শব্দ মুছে দেয়।


0

স্কালা, 119 বাইট

def f(s:String,a:Seq[Char]*)=a filter(_ startsWith s)reduceOption(_ zip _ takeWhile(t=>t._1==t._2)map(_._1))getOrElse s

Ungolfed:

def tabComplete(input: String, options: Seq[Char]*) = {
  options.
  filter((x: String) => x.startsWith(input)).
  reduceOption((x: Seq[Char], y: Seq[Char]) =>
    x.zip(y).
    takeWhile((t: (Char, Char)) => t._1 == t._2).
    map((t: (Char, Char)) => t._1)
  ).getOrElse(input)
}

ব্যাখ্যা:

def g(s:String,a:Seq[Char]*)= //define a method g with a string and a vararg array of strings as parameter
  a filter(_ startsWith s)    //filter the options to contains only elements starting with the input
  reduceOption(               //if the filtered array is nonempty, reduce it: 
    _ zip _                     //zip two elements together
    takeWhile(t=>t._1==t._2)    //take the tuples while they contain the same char
    map(_._1)                   //take the first element from each tuple
  )getOrElse s                //else return the input


0

05 এ বি 1 ই , 14 বাইট

ʒIÅ?}€ηøʒË}‚˜θ

এটি অনলাইনে চেষ্টা করুন বা সমস্ত পরীক্ষার কেস যাচাই করুন

ব্যাখ্যা:

ʒ   }           # Filter the (implicit) input-list
 IÅ?            #  Does it start with the (second) input-string
                #   i.e. ["codex","bla","codegolf"] and "c" → ["codex","codegolf"]
     €η         # Then take the prefixes of every remaining string
                #  → [["c","co","cod","code","codex"],
                #     ["c","co","cod","code","codeg","codego","codegol","codegolf"]]
       ø        # Zip/transpose; swapping rows/columns
                #  → [["c","c"],["co","co"],["cod","cod"],["code","code"],["codex","codeg"]]
        ʒ }     # Filter:
         Ë      #  Only keep sublists which only contain the same substrings
                #   → [["c","c"],["co","co"],["cod","cod"],["code","code"]]
               # Pair it with the (second implicit) input
                #  → ["c",["c","c"],["co","co"],["cod","cod"],["code","code"]]
                # (workaround if nothing in the input-list starts with the input-string)
            ˜   # Flatten this list
                #  → ["c","c","c","co","co","cod","cod","code","code"]
             θ  # And only leave the last item (which is output implicitly as result)
                #  → "code"

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