ใช้แท็บเสร็จสมบูรณ์


31

การทำให้แท็บสมบูรณ์เป็นคุณสมบัติที่มีประโยชน์ที่ทำให้คำสั่งที่เขียนบางส่วนเสร็จสมบูรณ์โดยอัตโนมัติ คุณกำลังจะใช้งานมัน

ตัวอย่างเช่นถ้าคำสั่งที่ใช้ได้อยู่['apply','apple','apple pie','eat']แล้วaจะเสร็จสมบูรณ์จะ applเป็นทั้งหมดของคำสั่งที่เริ่มต้นด้วยนอกจากนี้ยังเริ่มต้นด้วยaappl

Input / Output

คุณต้องใส่สตริง A และชุดสตริง B

คุณต้องแสดงคำนำหน้าทั่วไปที่ยาวที่สุดของ B ทั้งหมดที่ขึ้นต้นด้วย A

  • หากไม่มีตัวเลือกใดขึ้นต้นด้วย A ให้ส่งคืน A
  • คุณสามารถสันนิษฐานได้ว่า B นั้นไม่นับไม่ได้และสตริงทั้งหมดนั้นจะไม่ว่างเปล่า
  • คุณไม่สามารถสันนิษฐานได้ว่าตัวเลือกใด ๆ ที่เริ่มต้นด้วย A และคำนำหน้าทั่วไปจะยาวกว่า A
  • คุณสามารถคำนึงถึงขนาดตัวพิมพ์หรือตัวพิมพ์เล็กและตัวพิมพ์เล็ก
  • คุณจะต้องจัดการกับ ASCII ที่พิมพ์ได้
  • บิวด์อินที่อนุญาตงานนี้อย่างชัดเจน

กรณีทดสอบ:

'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 ที่ไม่ใช่ตัวอักษรและสามารถพิมพ์ได้สำหรับลูกหลานหรือไม่
Conor O'Brien

ตัวอย่างเพิ่มเติมที่มีอักขระที่ไม่ใช่ตัวอักษรไม่สามารถทำร้ายได้ ฉันเพิ่งลบคำตอบของฉันเพราะฉันรู้ว่ามันยากจนกับปัจจัยการผลิตที่มีหรือ\​ '
เดนนิส

ไม่แน่ใจว่าจะนำเสนอ'ในตัวอย่างได้อย่างไร ถ้าฉันใช้"สำหรับสตริงแล้วสตริงจะแตกต่างจากตัวอย่างอื่น ๆ
Nathan Merrill

นั่นคือว่าปัญหามีคำตอบของฉัน : P
Dennis

คำตอบ:


10

JavaScript (ES6), 75 ไบต์

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

คำอธิบาย: กรองคำนำหน้าการจับคู่ทั้งหมดจากนั้นเข้าร่วมกับการขึ้นบรรทัดใหม่และจับคู่กับ regex ที่ค้นหาคำนำหน้าทั่วไปที่ยาวที่สุดของทุกบรรทัด หากไม่มีคำนำหน้า regex จะส่งคืนสตริงว่างในกรณีนี้เราเพียงแค่ส่งคืนสตริงดั้งเดิม


คุณสามารถแทนที่e.startsWith(s)ด้วยe.match("^"+s)การปิดไบต์การ Currying จะประหยัดอีก
Shaun H

@ShaunH ฉันไม่สามารถใช้matchกับ ASCII ที่พิมพ์ได้เอง
Neil

โอ้ถูกต้อง regex และตัวควบคุม คุณยังสามารถ (s,a)=>ไปที่s=>a=>
Shaun H

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

Pyth, 14 13 ไบต์

ขอบคุณ @isaacg สำหรับ -1 ไบต์

.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

PowerShell 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และวางสตริงบนไพพ์ไลน์ผ่านการห่อหุ้ม parens เหล่านั้นจะถูกกรองผ่าน|?{...}(คนWhere-Objectประโยค) เพื่อตรวจสอบว่า.countของ$cเป็น-eqUAL ไป.countของสิ่งที่อยู่ใน$cที่มี-likesubstring (เช่น substring ตรงกับทุกอย่างใน $ c) เนื่องจากเรากำลังสร้างสตริงย่อยของเราเพื่อให้สั้นที่สุดถึงยาวที่สุดเราจึงต้องใช้[-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

Python 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()

โปรแกรมเต็มรูปแบบ; ใช้สตริงและรายการจาก stdin ตรงตามที่ระบุในตัวอย่างยกเว้นอินพุตจะต้องอยู่ในบรรทัดที่แยกต่างหาก

ตรวจสอบกรณีทดสอบทั้งหมด


ทำไมl.pop()แทนl[-1]?
Cyoce

@Cyoce เพราะlโดยปกติแล้วจะsetอยู่ที่จุดนั้นซึ่งไม่อนุญาตให้มีการจัดทำดัชนี (ไม่มีการเรียงลำดับ) (โชคดีที่ทั้งชุดและรายชื่อรองรับpop())
DLosc

3

Perl, 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

Perl, 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

Haskell, 67 ไบต์

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

ฟังก์ชั่นเสริม ?ค้นหาคำนำหน้าทั่วไปที่ยาวที่สุดของสองสตริงโดยการเรียกอักขระตัวแรกซ้ำ ๆ ตราบใดที่มันเหมือนกันสำหรับทั้งสองสตริงและสตริงไม่ว่างเปล่า

หน้าที่หลัก%แรกช่วยให้เพียงสตริงในรายการที่เริ่มต้นด้วยการให้คนที่sตรวจสอบโดยทั่วไปคำนำหน้ายาวที่สุดกับการเป็นs sเพื่อจัดการกับไม่มีการแข่งขันที่ถูกต้องจะเพิ่มไปยังผลที่ว่างเปล่าผ่านs จากนั้นก็พบว่าคำนำหน้าทั่วไปที่ยาวที่สุดของเหล่านั้นโดยการพับฟังก์ชั่นแบบไบนารีmax?


2

Python 2, 75 ไบต์

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

ขอขอบคุณ @xnor ที่แนะนำตัวในตัวซึ่งใช้โดย @BetaDecay ในคำตอบนี้

เพื่อวัตถุประสงค์ในการให้คะแนนÿสามารถแทนที่ด้วย DEL ไบต์ ทดสอบบนIdeone


1

D, 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จากนั้นคำนวณองค์ประกอบเริ่มต้นทั่วไปที่ใหญ่ที่สุดขององค์ประกอบที่เหลืออยู่

พารามิเตอร์ templated ช่วยให้เราทำซ้ำสองครั้งstringและหนึ่งในautoนั้น การใช้ข้อยกเว้นในทางที่ผิดช่วยให้เราหลีกเลี่ยงตัวแปรชั่วคราวและเงื่อนไขที่อาจจำเป็นต้องจัดการกับกรณีที่ไม่มีองค์ประกอบqเริ่มต้นpเริ่มต้นด้วย


1

Python 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

เพื่อวัตถุประสงค์ในการให้คะแนนÿสามารถแทนที่ด้วย DEL ไบต์ ทดสอบบนIdeone

ขอบคุณ @xnor สำหรับการบันทึก 5 ไบต์!


ด้วยการos.path.commonprefix เป็นเบต้าสลายพบคุณสามารถมีมันจะทำงานให้คุณ
xnor

ว้าวที่ช่วยประหยัดมากของไบต์ คุณแน่ใจหรือว่าไม่ต้องการโพสต์ด้วยตัวเอง?
เดนนิส

ฉันไม่รู้สึกว่าถูกโพสต์ด้วยตัวเองเพราะมันเป็นความคิดของ Beta Decay แต่เพียงผู้เดียวรวมกับคำตอบของคุณ
xnor

สำหรับวิธีการแก้ปัญหาของคุณจะดูสั้นลงเล็กน้อยเพื่อวนซ้ำfor c in ...โดยตรงและยุติด้วยข้อผิดพลาดหลังจากพิมพ์เช่นif len(set(c))>1:print r or s;_โดยตรงและยุติด้วยข้อผิดพลาดหลังจากที่พิมพ์เช่น
xnor

ฉันคิดว่ามันจะล้มเหลวถ้าxเป็นอาร์เรย์เดี่ยว
เดนนิส

1

PHP, 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;

ฉันสามารถบันทึกได้อีก 3 ไบต์โดยการกำหนดตัวแปรด้วยpreg_grepและ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

PHP, 156 ไบต์

ด้วยความช่วยเหลือจาก Titus

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

PHP, 199 ไบต์

32 ไบต์บันทึกโดย Titus ด้วย array_unique

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

ฉันรู้ว่า Regex Solution ของ Titus สั้นลงจนกระทั่ง Titus ช่วยฉันปรับปรุงวิธีการของฉัน บางทีวิธีที่ฉันพบน่าสนใจสำหรับคุณ


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เข้าไปใน strlen (-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));และวาง curlys สิ่งนี้ไม่ได้สัมผัสกับเงื่อนไข
ติตัส

1
ในความคิดที่สองคุณไม่ต้องการ$mเลย สิ่งที่คุณต้องการคือสิ่งที่> = ความยาวต่ำสุดของการแทนที่ ใหม่ 5) แทนที่{$r[]=$v;$m=max($m,strlen($v));}ด้วย$r[]=$v;}และ<$mด้วย<strlen($r[0])(-13)
ติตัส

1
ที่ดี! และฉันเพิ่งพบกอล์ฟอีกครั้ง: 9) $r[]=$z=$v;ในวงแรกและ{$s=substr($z,0,$i);foreach($r as$x)if($x[$i]!=$z[$i])break 2;}เป็นครั้งที่สอง (-3)
Titus

1

เรติน่า 60 ไบต์

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

การขึ้นบรรทัดใหม่มีความสำคัญ รับอินพุตเป็นสตริงบนบรรทัดจากนั้นแต่ละคำบนบรรทัดแยกต่างหาก (แต่ไม่มีการขึ้นบรรทัดใหม่!) ทำงานคล้ายกับคำตอบ JavaScript ของฉันโดยการจับคู่คำนำหน้าทั่วไปที่ยาวที่สุดของทุกบรรทัดที่ขึ้นต้นด้วยสตริงในบรรทัดแรก ถ้ามันไม่เจอมันก็แค่ลบคำทั้งหมด


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

05AB1E , 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"

0

Gaiaขนาด 12 ไบต์

e…¦&⊢…Ė⁇_+ₔ)

ลองออนไลน์!

รับอินพุตเป็น B จากนั้น A

e		| eval B as list of strings
 …¦		| take prefixes of each string
   &⊢		| reduce by set intersection
     …		| take list prefixes of each.
      Ė⁇	| Keep only those with A as an element
	_	| flatten
	 +ₔ	| add A to the beginning of the list
	   )	| take the last element
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.