ย่ออาร์เรย์


26

เป้าหมาย:

กำหนดอาร์เรย์ของสตริงสร้างเวอร์ชันย่อของแต่ละสตริง

รายละเอียด:

สำหรับความท้าทายนี้ตัวย่อคืออักขระ N ตัวแรกของสตริง สำหรับสตริงabc: a, abและabcทั้งหมดเป็นตัวย่อที่ถูกต้องในขณะที่bcและacไม่ใช่

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

ตัวอย่าง:

การป้อนข้อมูล: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]

เราทำงานผ่านสายที่เริ่มต้นด้วยสายแรก

  • วันจันทร์เป็นเพียงสตริงรายการด้วยดังนั้นย่อที่สั้นที่สุดคือMM

  • วันอังคารเริ่มต้นด้วยTแต่วันพฤหัสบดีก็เช่นกัน TUวิธีการนี้ที่เราพยายามสตริง เนื่องจากไม่มีสายอื่น ๆ TUที่เริ่มต้นด้วยการที่เราจะใช้

  • วันพุธW, วันพฤหัสบดีและวันศุกร์คือThF

ตัวอย่างเพิ่มเติม:

Input: "one,two,three,four,five,six,seven"
Output: "o,tw,th,fo,fi,si,se"

Input: "red,orange,yellow,green,blue,purple"
Output: "r,o,y,g,b,p"

Input: "a,ab,abc"
Output: Not valid! No abbreviation for `a` that doesn't apply to the other items.

หมายเหตุ:

  • คุณสร้างอินพุตและเอาต์พุตด้วยวิธีที่สมเหตุสมผล

  • คุณสามารถสันนิษฐานได้ว่าอินพุตนั้นจะเป็นอาร์เรย์ของสตริงที่ถูกต้องเสมอ

  • คุณสามารถสันนิษฐานได้ว่าจะมีทางออกเสมอเหมือนในกรณีทดสอบครั้งสุดท้าย

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

  • นี่คือรหัสกอล์ฟดังนั้นไบต์ที่น้อยที่สุดจึงชนะ!


เกี่ยวข้อง: 1 , 2 , 3
Sp3000

5
สำเนาซ้ำที่เป็นไปได้ของGolf Down ชื่อผู้ใช้
PPCG

2
ฉันไม่คิดว่ามันเป็นสิ่งที่ซ้ำกัน (แม้ว่าพวกเขาจะค่อนข้างคล้ายกันทั้งหมด) อันที่จริงฉันคิดว่านี่อาจเป็นความท้าทายที่ดีที่สุดในบรรดาสี่คน ส่วนอื่น ๆ ทั้งหมดนั้นมีตัวแปรที่ทำให้พวกมันซับซ้อนโดยไม่จำเป็น

2
กรณีนี้สำคัญหรือไม่ โดยเฉพาะอย่างยิ่งตัวอย่างวันทำงานของคุณใช้ทุนUสำหรับวันอังคาร แต่เป็นตัวพิมพ์เล็กhสำหรับวันพฤหัสบดี
Brian J

1
@Mego อย่าแก้ไขโพสต์ของฉันเว้นแต่ผู้ดำเนินรายการจะทำเครื่องหมายว่าไม่ใช่รายการซ้ำกัน
Julian Lachniet

คำตอบ:


10

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

!ms`^(.+?)(?!.+^\1)(?<!^\1.+)

อินพุตและเอาต์พุตเป็นรายการของสตริงที่คั่นด้วยตัวป้อนบรรทัด

ลองออนไลน์! (ชุดทดสอบที่มีการคั่นด้วยเครื่องหมายจุลภาคเพื่อความสะดวก)

คำอธิบาย

สิ่งนี้จะตรงกับคำนำหน้าทั้งหมดด้วย regex เดียวและพิมพ์ ( !) mและsเป็นตัวดัดแปลง regex ตามปกติเพื่อให้การ^จับคู่เริ่มต้นและการ.จับคู่ linefeeds ตรงกัน

^(.+?)      # Match the shortest possible prefix of a line and capture
            # it in group 1.
(?!.+^\1)   # Make sure that this prefix does not show up in a line after
            # the current one.
(?<!^\1.+)  # Make sure that this prefix does not show up in a line before
            # the current one.

10

Python 2 , 87 86 ไบต์

lambda a:[b[:min(i for i in range(len(b))if sum(s[:i]==b[:i]for s in a)<2)]for b in a]

ลองออนไลน์!


lambda a:[[b[:i]for i in range(len(b))if sum(s[:i]==b[:i]for s in a)<2][0]for b in a]for 85 bytes
Curtis Bechtel

แทนที่len(b)ด้วยการ4**8บันทึกอีก 2 ไบต์สมมติว่าสตริงจะต้องไม่เกิน 65536 ตัวอักษร
Curtis Bechtel

8

JavaScript (ES6), 81 78 74 70 ไบต์

รับอินพุตเป็นอาร์เรย์ของสตริง

a=>a.map(s=>[...s].reduce((y,c)=>a.some(x=>x!=s&!x.indexOf(y))?y+c:y))

จัดรูปแบบและแสดงความคิดเห็น

a =>                          // given an array of strings 'a'
  a.map(s =>                  // for each string 's' in 'a':
    [...s].reduce((y, c) =>   //   starting with 'y' = first character of 's',
                              //   for each subsequent character 'c' of 's':
      a.some(x =>             //     if we find a string 'x' in 'a' such that:
        x != s &              //       - 'x' is different from 's'
        !x.indexOf(y)         //       - and 'y' appears at the beginning of 'x'
      ) ?                     //     then:
        y + c                 //       append 'c' to 'y'
      :                       //     else:
        y                     //       keep 'y' unchanged
    )                         //   end of reduce(): returns the correct prefix
  )                           // end of map()

กรณีทดสอบ


1
70 เช่นกัน แต่อื่น ๆ อย่างแน่นอน: codegolf.stackexchange.com/a/113270/32091
Qwertiy

+1 reduceสำหรับ
Neil

6

เยลลี่ขนาด 14 ไบต์

;\w@þ=1Si1⁸ḣð€

ลองออนไลน์!

มันทำงานอย่างไร

;\w@þ=1Si1⁸ḣð€  Monadic link. Argument: A (string array)

            ð   Collect all links to the left into a chain (arity unknown) and
                begin a dyadic chain.
             €  Map the previous chain over A. The current chain is dyadic and the
                mapped one inherits its arity. Thus, the right will be A for all
                invocations, while the left argument will iterate over A.
                For each string s in A, the following happens.
;\                Cumulative reduce by concatenation; yield all prefixes of s.
  w@þ             Window index swapped table; for each string t in A and each
                  prefix p of s, find the index of the substring t in p.
                  The first index is 1; 0 means not found.
     =1           Compare the indices with 1, returning 1 iff t begins with p.
       S          Sum the Booleans across columns, counting the number of strings
                  in A that begin with a given prefix.
        i1        Find the first index of 1, the shortest prefix that is unique
                  across all strings in A.
          ⁸       Head; truncate s to the computed length.

6

Haskell , 48 ไบต์

[_]#x=""
a#(c:y)=c:[z|d:z<-a,c==d]#y
f=map=<<(#)

ลองออนไลน์!

  • fเป็นหน้าที่หลักที่เกิดรายการและกลับString ความหมายของมันคือทางลัดสำหรับเอกStringf a=map (a#) a
  • a#x ดูที่สตริง xและรายการaและพยายามที่จะหาสิ่งที่คำนำหน้าสั้นที่สุดของที่เป็นเอกลักษณ์ในx aหากaมีองค์ประกอบเดียวให้ใช้สตริงว่าง หากaยังไม่ได้เป็นองค์ประกอบเดียวให้ตัดอักขระตัวแรกของxกรองและสับองค์ประกอบที่aขึ้นต้นด้วยอักขระตัวเดียวกัน


3

เยลลี่ , 14 12 ไบต์

ḣ€JṙLḶ$ḟ/€Ḣ€

ลองออนไลน์!

มันทำงานอย่างไร

ḣ€JṙLḶ$ḟ/€Ḣ€  Main link. Argument: A (string array)

  J           Yield the 1-based indices of A, i.e., [1, ..., len(A)].
ḣ€            Head each; for each string s in A, take the first 1, ..., and len(A) 
              characters. This builds the 2D array of prefixes of all strings in A.
    LḶ$       Length-unlength; yield [0, ..., len(A)-1].
   ṙ          Rotate the 2D array 0, ..., and len(A)-1 units to the left.
       ḟ/€    Reduce filterfalse each; for each rotation, remove all prefixes from
              the first set that also occur in later sets.
          Ḣ€  Head each; for each rotation, keep only the shortest unique prefix.

แค่สงสัยว่าทำไมคุณมี 2 คำตอบที่นี่? ฉันชอบพวกเขาทั้งคู่ แต่ฉันแค่สงสัยว่าทำไมคุณถึงมีสองคำตอบของเยลลี่ :)
HyperNeutrino

ถ้าฉันมีวิธีการแข่งขันที่คล้ายกันสองวิธี แต่วิธีที่ต่างกันพอฉันมักจะโพสต์ไว้ในคำตอบที่แยกต่างหาก
Dennis

จุดดี. ใช่ฉันแค่สงสัย :) นั่นเป็นความคิดที่ดี; ฉันมักจะไม่มีวิธีการมากกว่าหนึ่งวิธี: P
HyperNeutrino

2

C ++ 11 (MinGW), 198 ไบต์

#import<list>
#import<iostream>
f(std::list<std::string>l){int i,m;for(auto s:l){for(i=0,m=1;++i<s.length();)for(auto t:l)if(t!=s&&t.substr(0,i)==s.substr(0,i))m=i+1;std::cout<<s.substr(0,m)<<" ";}}

โทรด้วย:

int main()
{
    f({"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"});
}

การเพิ่มvoidตัวระบุก่อนหน้าที่ควรทำให้คอมไพเลอร์อื่น ๆ ด้วยเช่นกันดังนั้นการเพิ่มความยาว 5 ไบต์


มันควรจะเป็นvoid f..., มันไม่ทำงานเป็นอย่างอื่น ... ฟังก์ชั่นเท่าที่ฉันรู้จำเป็นต้องใช้ตัวระบุชนิดใน C ++
Mr. Xcoder

นอกจากนั้นวิธีการที่โดดเด่น! การเล่นกอล์ฟใน C / C ++ สามารถทำให้เจ็บปวดได้
Mr. Xcoder

@ Mr.Xcoder มันจะคอมไพล์ในคอมไพเลอร์ MinGW ที่ฉันใช้อยู่ ดังนั้นจึงเป็นทั้งส่วนขยายคอมไพเลอร์หรือพฤติกรรมที่ไม่ได้กำหนด
Steadybox

ฉันคิดว่ามันเกี่ยวกับการรวบรวมคอมไพเลอร์ใน GCC มันไม่ทำงาน ...
นาย Xcoder

1
ตราบใดที่มีสภาพแวดล้อมที่รหัสทำงานได้ก็ใช้ได้
undergroundmonorail

2

Javascript ES6, 70 ตัวอักษร

s=>(s+'#'+s).replace(/(\w+?)(\w*)(?=(\W(?!\1(?!\2))\w+)+$)|#.+/g,"$1")

f=s=>(s+'#'+s).replace(/(\w+?)(\w*)(?=(\W(?!\1(?!\2))\w+)+$)|#.+/g,"$1")

console.log(f("one,two,three,four,five,six,seven")==="o,tw,th,fo,fi,si,se")
console.log(f("red,orange,yellow,green,blue,purple")==="r,o,y,g,b,p")
console.log(f("one,two,three,four,five,six,seven".split`,`)==="o,tw,th,fo,fi,si,se")
console.log(f("red,orange,yellow,green,blue,purple".split`,`)==="r,o,y,g,b,p")


2

PHP, 131 120 119 118 ไบต์

ขอบคุณ @ preg_grepJörgสำหรับ

for(;a&$s=$argv[++$k];$i=+$t=!print"$t
")for(;a&$s[$i]&&1<count(preg_grep("(^".preg_quote($t.=$s[$i++]).")",$argv)););

รับอินพุตจากอาร์กิวเมนต์บรรทัดรับคำสั่ง พิมพ์ผลลัพธ์หนึ่งบรรทัดในแต่ละบรรทัด
ทำงานด้วย-nrหรือลองออนไลน์

  • -อาจล้มเหลวถ้าใส่มีอะไรที่เริ่มต้นด้วย
    15 ไบต์แก้ไข: เปลี่ยนที่สองด้วย$argvarray_slice($argv,1)
  • ให้คำเตือนใน PHP 7.1; แทนที่a&ด้วย""< (+1 ไบต์) เพื่อแก้ไข
  • -12 ไบต์ถ้าใส่ไม่ได้มีตัวอักษร regex พิเศษ:
    แทรก&($t.=$c)ก่อน&&และแทนที่ด้วย". preg_quote($t.=$c)."$t

ทำให้พังถล่ม

for(;a&$s=$argv[++$k];      # loop $s through arguments
    $i=+$t=!                # 3. reset $i and $t to empty
    print"$t\n")            # 2. print abbreviation
    for(;a&($c=$s[$i++])    # 1. loop $c through characters
        &&1<count(              # 3. if count==1, break loop
            preg_grep("(^"      # 2. find matching arguments
                . preg_quote(
                $t.=$c          # 1. append $c to abbreviation
            ).")",$argv)
        );
    );

รุ่นที่ไม่ใช่ regex, 131 130 ไบต์

for($a=$argv;a&$s=$a[++$k];$i=+$t=!print"$t
")for($n=1;$n&&a&$c=$s[$i++];)for($n=$m=1,$t.=$c;a&$u=$a[$m++];)$n-=0===strpos($u,$t);

แทนที่ตัวแรกและตัวสุดท้ายa&ด้วย""<(+2 ไบต์) เพื่อแก้ไขสำหรับ PHP 7.1

ทำให้พังถล่ม

for($a=$argv;a&$s=$a[++$k];     # loop through arguments
    $i=+$t=!print"$t\n")            # 2. print abbreviation, reset $i and $t to empty
    for($n=1;$n&&a&$c=$s[$i++];)    # 1. loop through characters while $n<>0
        for($n=$m=1,                    # reset $n and $m to 1
            $t.=$c;                     # append current character to prefix
            a&$u=$a[$m++];              # loop through arguments:
        )$n-=0===strpos($u,$t);         # -$n = number of matching strings -1

ข้อความที่ไม่น่าสนใจอย่างสมบูรณ์:
strstr($u,$t)==$uและ0===strpos($u,$t)มีความยาวเท่ากันและมีผลลัพธ์เดียวกัน


ใช้อักขระขึ้นบรรทัดใหม่จริง ( 0x0A) แทน\nมันจะบันทึกหนึ่งไบต์;)
Blackhole

@Blackhole ขอบคุณ; ฉันลืมเกี่ยวกับเวลานี้
ติตัส

1

PHP, 127 ไบต์

ทำงานไม่ได้กับอาร์เรย์ที่ไม่ถูกต้อง

<?foreach($a=$_GET as$k=>$v)for($i=0,$c=2,$s="";$c>1;$r[$k]=$s)$c=count(preg_grep("_^".($s.=$v[$i++])._,$a));echo join(",",$r);

PHP, 132 ไบต์

<?foreach($a=$_GET as$v)for($i=0,$s="";a&$v[$i];)if(count(preg_grep("_^".($s.=$v[$i++])._,$a))==1){$r[]=$s;break;}echo join(",",$r);

เวอร์ชั่นออนไลน์

151 Bytes รองรับอักขระพิเศษ

<?foreach($a=$_GET as$v)for($i=0,$s="";a&$v[$i];)if(count(preg_grep("_^".preg_quote($s=substr($v,0,++$i),_)._,$a))==1){$r[]=$s;break;}echo join(",",$r);

PHP, 140 ไบต์

<?foreach($a=$_GET as$k=>$v)for($i=0;a&$v[$i];)if(count(preg_grep("#^".($s=substr($v,0,++$i))."#",$a))==1){$r[]=$s;break;}echo join(",",$r);

สิ่งนี้จะล้มเหลวหากอินพุตมีอักขระพิเศษ regex ฉันมี 113 ไบต์แทน 131 ถ้าไม่ใช่
ติตัส

@Titus ในกรณีนี้ฉันสามารถเพิ่มpreg_quoteMake only 10 Bytes ได้อีก
JörgHülsermann

0นอกจากนี้ยังจะล้มเหลวถ้าใส่มี $i=+$s=""แต่คุณสามารถบันทึกหนึ่งไบต์ด้วย
ติตัส

และคุณสามารถลบcount()-count()เนื้อหาได้: อินพุตรับประกันว่าถูกต้อง (-21 ไบต์) ฉันคิดว่าฉันสามารถแก้ไขและตีกอล์ฟให้ได้ถึง 120 ไบต์ $_GETเป็นความคิดที่ดี!
ติตัส

@Titus ฉันไม่ได้ตระหนักว่าอนุญาตให้ใช้อาร์เรย์ที่ถูกต้องเท่านั้น ใช่มันจะล้มเหลวถ้าสตริงมีศูนย์ แต่สิ่งนี้ได้เกิดความคิด
JörgHülsermann

0

Clojure 118 ไบต์

#(reduce(partial map(fn[a b](or a b)))(for[i(range 1e2)S[(for[c %](take i c))]](for[s S](if(=((frequencies S)s)1)s))))

ทำงานในคำนำหน้าขึ้นไปตามความยาวของนี้แต่นับไบต์เดียวกันสามารถรองรับการขึ้นไป1e2 ลูปความยาวของคำนำหน้าเป็นลำดับของสตริงของความยาว สุดท้ายแทนที่สตริงย่อยเหล่านั้นซึ่งเกิดขึ้นบ่อยครั้งมากกว่าหนึ่งครั้ง การลดจะเก็บค่าที่ไม่ใช่ศูนย์แรกสำหรับแต่ละสตริงที่แย่เกินไปไม่ใช่ฟังก์ชั่นดังนั้นฉันจึงต้องตัดมัน1e9iSifornilor

นี่จะคืนค่ารายการของตัวละครที่ชอบ((\M) (\T \u) (\W) (\T \h) (\F))แต่ฉันคิดว่ามันเป็นที่ยอมรับ Clojure ค่อนข้างละเอียดด้วยสตริงและsubsจะโยนStringIndexOutOfBoundsExceptionไม่เหมือนกันtakeกัน

ตัวอย่างเต็มรูปแบบ:

(def f #(reduce(partial map(fn[a b](or a b)))(for[i(range 1e2)S[(for[c %](take i c))]](for[s S](if(=((frequencies S)s)1)s)))))

(f ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"])
(f (re-seq #"[^,]+" "one,two,three,four,five,six,seven"))
(f (re-seq #"[^,]+" "red,orange,yellow,green,blue,purple"))

0

SQL (รสชาติ PostgreSQL 9.4), 219 ไบต์

ตอนนี้สำหรับคำตอบที่ยาวที่สุด :) ฉันไม่คิดว่านี่จะชนะ Java ได้ ฉันจะพยายามโกนอีกสองสามอัน หวังว่าจะกำจัดหนึ่งในข้อความค้นหาที่ซ้อนกัน แต่ไม่ชอบโอกาสของฉัน
สมมติว่ามีตารางที่มีสตริงที่จะทำงาน เนื่องจากนี่คือ SQL ลำดับของการส่งคืนจึงไม่รับประกันว่าจะเหมือนกับคำสั่งตารางและในกรณีนี้ไม่น่าเป็นไปได้ หากนี่เป็นปัญหาฉันจะลบ

SELECT R FROM(SELECT*,RANK()OVER(PARTITION BY A ORDER BY C,N)Z FROM(SELECT*,SUM(1)OVER(PARTITION BY R)C FROM(SELECT*FROM A JOIN LATERAL(select left(A,n)R,N FROM generate_series(1,length(A))S(n))L ON 1=1)X)Y)Z WHERE Z=1


คำอธิบายซอ SQL

  SELECT *
  FROM A 
    JOIN LATERAL(SELECT LEFT(A,n)R,N 
    FROM generate_series(1,length(A))S(n))L ON 1=1

แบบสอบถามด้านในสุดใช้generate_seriesและLATERALเข้าร่วมเพื่อสร้างแถวสำหรับสตริงที่แบ่งออกเป็นความยาวที่เพิ่มขึ้นดังนั้น 'หนึ่ง' กลายเป็น 'o', 'บน', 'หนึ่ง' จำนวนตัวอักษรในการส่งคืนจะถูกเก็บไว้ยัง

SELECT 
  *,
  SUM(1)OVER(PARTITION BY R)C
FROM ( ... )X

จากนั้นเราจะเพิ่มจำนวนของบันทึกที่มีผลลัพธ์เดียวกัน ตัวอย่างเช่น 'f' จากสี่และห้ามี 2 แต่ 'fo' และ 'fi' แต่ละอันมีอันเดียว OVERคำสั่งใน SQL สามารถมีประสิทธิภาพมาก COUNT(*)จะเป็นวิธีปกติ แต่SUM(1)ให้ผลลัพธ์เดียวกัน

SELECT 
  *,
  RANK()OVER(PARTITION BY A ORDER BY C,N)Z
FROM ( ... )Y

จากนั้นเราจัดอันดับผลลัพธ์สำหรับอินพุตแต่ละรายการโดยอ้างอิงจากการซ้ำซ้อนและอักขระน้อยที่สุด ROW_NUMBERจะทำงานที่นี่เช่นกัน แต่จะนานกว่านี้

SELECT R FROM ( ... )Z WHERE Z=1;

ในที่สุดเราเลือกหมายเลขอันดับต่ำสุดสำหรับแต่ละคำ



0

APL (Dyalog) 27 ไบต์

{⍵↑¨⍨1⍳⍨¨↓+/(↑,⍵)∘.(⊃⍷)⍵}

ลองออนไลน์!

{ ฟังก์ชั่นที่ไม่ระบุชื่อโดยที่⍵แทนอาร์กิวเมนต์ ...

∘.( ตารางฟังก์ชั่นที่มีฟังก์ชั่น

   องค์ประกอบแรกของ

   รายการบูลีน "อาร์กิวเมนต์ซ้ายเริ่มต้นที่นี่ในอาร์กิวเมนต์ที่ถูกต้องหรือไม่"

) ข้อโต้แย้งที่ถูกต้องอยู่ที่ไหน

 เถียง

( และอาร์กิวเมนต์ที่เหลือคือ

   ตารางที่มีแถวประกอบด้วย

  ,/ คำนำหน้าของ

  ¨ แต่ละ

   ข้อโต้แย้ง

+/ รวมข้าม (นับจำนวนอาร์กิวเมนต์ที่เหมาะสมกับส่วนนำหน้านี้)

 แยกตารางออกเป็นรายการของแถว

⍳⍨¨ ในแต่ละอันหาที่ตั้งแห่งแรก

1 หนึ่ง (เช่นคำนำหน้าแรกที่หัวเท่านั้นอาร์กิวเมนต์หนึ่ง)

↑¨⍨ สำหรับสถานที่แต่ละแห่งให้ใช้อักขระจำนวนมากจากองค์ประกอบที่สอดคล้องกันของ

 อาร์กิวเมนต์

} สิ้นสุดฟังก์ชั่นที่ไม่ระบุชื่อ


0

PowerShell, 151 139 ไบต์

$x,$w=@(),$args[0];$w|%{$k=$_;$a='';foreach($l in [char[]]$k){$a+=$l;if($a-notin$x-and!($w|?{$_-ne$k-and$_-like"$a*"})){$x+=$a;break;}}};$x

สนใจถ้ามีวิธีที่ดีกว่าในการทำเช่นนี้ จำเป็นต้องใช้foreach(เหนือ|%) เพื่อให้สามารถทำ a breakในลูปซ้อนได้โดยไม่ต้องติดฉลาก

แก้ไข: 2 สนามกอล์ฟจาก AdmBorkBork


1
ฉันไม่ได้อ่านโค้ดโดยตรง แต่แน่นอนคุณสามารถใช้-notinแทน-not$x.contains($a)และ!($w...แทนที่จะ-not($w...บันทึกจำนวนไบต์ใช่ไหม
AdmBorkBork

0

APL, 26 ไบต์

{⍵↑¨⍨1+⌈/+/¨∘.(∧\=∧≢)⍨↓↑⍵}

คำอธิบาย:

  • ↓↑⍵: วางแต่ละสตริงเพื่อให้ตรงกับความยาวของสตริงที่ยาวที่สุด
  • ∘.(... )⍨: สำหรับแต่ละคู่ของสตริงที่เป็นไปได้ค้นหาคำนำหน้าที่ใช้ร่วมกัน:
    • : ความไม่เท่าเทียมกันของอาเรย์
    • : และ
    • =: ความเท่าเทียมกันของรายการ
    • ∧\: and-scan (เก็บเฉพาะรายการที่ตรงที่สุดเท่านั้น)
  • +/¨: ผลรวมแต่ละเวกเตอร์ในตารางโดยกำหนดความยาวของคำนำหน้าที่ใช้ร่วมกัน
  • ⌈/: ค้นหาค่าสูงสุดในแต่ละคอลัมน์
  • 1+: เพิ่มหนึ่งรายการโดยกำหนดจำนวนอักขระที่ต้องการเพื่อให้แต่ละสตริงไม่ซ้ำกัน
  • ⍵↑¨⍨: จดอักขระหลายตัวจากแต่ละสตริง

ทดสอบ:

      {⍵↑¨⍨1+⌈/+/¨∘.(∧\=∧≢)⍨↓↑⍵}'Monday' 'Tuesday' 'Wednesday' 'Thursday' 'Friday'
┌─┬──┬─┬──┬─┐
│M│Tu│W│Th│F│
└─┴──┴─┴──┴─┘
      {⍵↑¨⍨1+⌈/+/¨∘.(∧\=∧≢)⍨↓↑⍵}'one' 'two' 'three' 'four' 'five' 'six' 'seven'
┌─┬──┬──┬──┬──┬──┬──┐
│o│tw│th│fo│fi│si│se│
└─┴──┴──┴──┴──┴──┴──┘
      {⍵↑¨⍨1+⌈/+/¨∘.(∧\=∧≢)⍨↓↑⍵}'red' 'orange' 'yellow' 'green' 'blue' 'purple'
┌─┬─┬─┬─┬─┬─┐
│r│o│y│g│b│p│
└─┴─┴─┴─┴─┴─┘

0

Q, 93 ไบต์

{n:1;{$[any e:(,/)1<{(+/)i like x}each i:z#'x;[z+:1;y:?[e;z#'x;i];.z.s[x;y;z]];y]}[x;n#'x;n]}

แก้ไขแบบเรียกซ้ำใช้สตริงเป็นอินพุตรับองค์ประกอบ n แรกของแต่ละสตริงด้วยการเรียกซ้ำทุกครั้ง หากองค์ประกอบใด ๆ เหล่านั้นไม่ซ้ำกันมันจะแทนที่ด้วยองค์ประกอบแรกที่ +1

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.