Shell Glob


11

Nhiệm vụ này là xuất đường dẫn ngắn nhất tới tệp, sau khi mở rộng toàn cầu.

Vỏ thế giới là gì? Trong hầu hết các shell, bạn có thể sử dụng *ký tự trong một đường dẫn để thể hiện bất kỳ ký tự nào tại vị trí. Ví dụ: Nếu thư mục foochứa tệp bar bazasdfsau đó foo/b*sẽ mở rộng sang foo/bar foo/baz.

Bây giờ, giả sử rằng thư mục hiện tại chứa một tệp được gọi ihavealongnamevà không có gì khác. Nếu tôi muốn tham chiếu tệp này, tôi có thể nhập *, tệp này sẽ chỉ đại diện cho một tệp đó, thay vì nhập tên đầy đủ.

Nếu thư mục cũng chứa một tệp được gọi ialsohavealongname, tôi không thể làm được *, vì nó sẽ khớp với cả hai tệp. Tôi sẽ phải làm, ít nhất , ih*.

Các *mẫu cũng làm việc cho phù hợp với danh bạ trên các tập tin tôi đang tìm kiếm. Nếu chỉ có hai thư mục foobar, nhưng foochỉ chứa một tệp bazbarchứa tệp asdf, tôi có thể khớp foo/bazvới */baz. Hoặc, thậm chí chính xác hơn , */b*. Nếu bartrống, */*sẽ làm việc.

Nhiệm vụ của bạn: Đưa ra một chuỗi các đường dẫn đại diện cho "thư mục hiện tại" và một đường dẫn đích duy nhất, xuất ra chuỗi ngắn nhất có thể sẽ mở rộng thành chỉ đường dẫn đích đó sau khi mở rộng * s.

Đường dẫn đích có thể được lấy dưới dạng chuỗi của chính nó, như là một chỉ mục vào mảng các đường dẫn, như là mục đầu tiên trên mảng các đường dẫn được truyền vào hoặc một số cách thuận tiện khác không phải là mã hóa cứng. Hỏi ý kiến ​​nếu không chắc chắn.

Đường dẫn đích được đảm bảo có mặt trong "thư mục hiện tại".

Bạn có thể giả sử rằng tất cả các đường dẫn chỉ chứa ASCII (và /s) chữ và số . Bạn có thể lấy làm đường dẫn đầu vào được bắt nguồn (bắt đầu bằng /) hoặc tương đối (không bắt đầu bằng /).

Nếu có nhiều khả năng ngắn như nhau, trả lại bất kỳ hoặc tất cả chúng.

Đây là , ít byte thắng nhất!

Các trường hợp thử nghiệm , nhờ Kevin Cruijssen .


4
Vì vậy, chúng ta có thể giả định tên tập tin không chứa khoảng trắng, dòng mới, gạch chéo ngược, *, ?, [ vv? Nó có thể là dễ dàng nhất nếu bạn chỉ nói rằng tên tệp và thư mục là chữ và số
TonMedel

3
Phần I / O đĩa thực tế sẽ nhàm chán trong nhiều ngôn ngữ. ví dụ: trong perl tôi sẽ chỉ lấy tên tệp và thay thế tất cả các thành phần đường dẫn bằng cách *chạy perl globđể có được tất cả các tên tệp có thể có liên quan (ví dụ: foo/bar/baztrở thành */*/*). Sau đó, nó trở thành một thách thức xử lý chuỗi. Và thách thức đó đã đủ khó. Tôi nghĩ rằng thách thức này sẽ sạch hơn vì "đưa ra một danh sách các /đường dẫn tương đối chữ và số, và tìm ra quả cầu ngắn nhất chỉ khớp với đường dẫn mục tiêu hiện có này
TonMedel 22/2/18

1
@KevinCruijssen Chắc chắn, đó là một thử thách thú vị và chủ yếu nên tránh các ngôn ngữ chơi gôn thuần túy. Tôi nghĩ bạn sẽ cần một chương trình thực sự (trừ khi bạn tạo ra tất cả các chuỗi có thể cho đến khi bạn đạt được kết quả ngắn nhất mà nhàm chán và sẽ bùng nổ theo cấp số nhân) hầu như không bắt đầu để bao gồm các trường hợp bạn cần xử lý. Dưới đây là bao phấn trường hợp: sử dụng a*fđể chọn azzftừ azzf, azzg, bzzf. Kéo dài theo ý muốn để a*b*cvv ..
TonMedel

2
@TonHeach Tôi đã bị thuyết phục. Bây giờ bạn lấy một mảng các đường dẫn làm đầu vào.
Pavel

4
@ WeijunZhou Tôi đã thay đổi suy nghĩ về đầu vào. Bây giờ bạn có thể có một loạt các đường dẫn.
Pavel

Câu trả lời:


8

Perl 5 , 136 107 102 byte

Bao gồm +2chon0

Đưa ra danh sách các tập tin trên STDIN. Cái đầu tiên được coi là tệp đích

perl -n0E '@a="";for$a(@a){s%%s/(?=$a
)/;/g;$$_//=push@a,map$_.$a,/./g,"\\w*";/^;/>/
;/&&1/!say$a=~s/\\w//gr%e}'
foo/barber/test
foo/barber/testing
foo/barber/coding
foo/test
foo/bar/test
^D

Chỉ là mã mà không làm cho dòng mới bằng chữ:

@a="";for$a(@a){s%%s/(?=$a\n)/;/g;$$_//=push@a,map$_.$a,/./g,"\\w*";/^;/>/\n;/&&1/!say$a=~s/\\w//gr%e}

Tai nạn cố ý sau khi in giải pháp.

Vẫn còn quá dài (việc sử dụng $a1/0rất khó xử), nhưng đó là một sự khởi đầu và nên có hiệu quả hợp lý.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Chương trình xây dựng các ứng cử viên bằng cách phát triển chúng từ phía sau ra phía trước bắt đầu bằng chuỗi trống. Nó thực hiện điều này một cách đầu tiên chiều rộng, những đống vì vậy đầu tiên có độ dài 0 được thử (chỉ ``), sau đó chiều dài 1 (như t, i, *), chiều dài tới 2 (như fb, i*, *g, **), chiều dài tới 3 và vân vân cho đến khi một địa cầu được tìm thấy chỉ phù hợp với con đường đầu tiên. Đây sẽ là quả cầu ngắn nhất giải quyết vấn đề (những cái khác có cùng độ dài có thể tồn tại).

Các khối lượng chiều dài n+1được tạo ra từ các khối lượng dài nbằng cách thêm vào từng ký tự từ danh sách các đường dẫn và cả *phía trước mỗi quả cầu có độ dài n. Vì vậy, ví dụ như chiều dài 3 glob *i*sẽ góp phần chiều dài 4 globs f*i*, o*i*, o*i*, /*i*, b*i*... s*i*, t*i*và cuối cùng **i*. Lưu ý rằng mọi ký tự trong danh sách các đường dẫn đầu vào đều được thêm vào ngay cả khi nó xuất hiện nhiều lần hoặc không có ý nghĩa gì vì nó dẫn đến một thứ không bao giờ khớp.

Làm điều này một cách ngây thơ sẽ dẫn đến một vụ nổ tổ hợp. Đó là lý do tại sao mọi ứng cử viên toàn cầu đều được đánh giá mức độ hữu ích của nó bằng cách xác định điểm nào trong các đường dẫn có thể phù hợp nếu quả cầu được sử dụng ở cuối toàn cầu. Tôi làm điều này bằng cách chèn một ;tại mỗi nơi có thể khớp. Ví dụ cho toàn cầu t*tôi sẽ nhận được chuỗi:

foo/barber/;tes;t
foo/barber/;tes;ting
foo/barber/coding
foo/;tes;t
foo/bar/;tes;t

Điều này thể hiện "sức mạnh phân biệt" của toàn cầu. Mỗi quả cầu có sức mạnh phân biệt chính xác đều tốt như nhau. Nếu bạn thay thế chúng bằng nhau ở cuối một quả cầu hoàn chỉnh, tất cả chúng sẽ khớp chính xác cùng một đường dẫn. Vì vậy, bạn cũng có thể sử dụng cái ngắn nhất.

Vì vậy, khi xem xét các khối lượng dài, ntrước tiên tôi nhìn vào sức mạnh phân biệt của nó. Nếu nó đã được nhìn thấy trước khi có một quả cầu dài khác nhoặc ngắn hơn đã được xem xét và mở rộng, thì quả cầu này là vô nghĩa và được cắt tỉa. Ví dụ, điều này sẽ loại bỏ các ứng cử viên như **i*vì sức mạnh phân biệt tương tự sẽ được nhìn thấy như *i*. Nó cũng cắt tỉa các ứng cử viên không thể như f*i*vì chuỗi phân biệt sẽ không có;và chỉ là danh sách ban đầu của các đường dẫn. Chỉ toàn cầu đầu tiên không thể được chấp nhận, tất cả những người khác sẽ được coi là có sức mạnh phân biệt như nhau và sẽ được cắt tỉa. Và ngay cả cái đầu tiên sẽ không thực sự được mở rộng vì tất cả các bản mở rộng vẫn không thể và sẽ được cắt tỉa khi chúng được xem xét. Simularly in*sẽ được cắt tỉa bởi i*vv

Những điều trên dẫn đến việc cắt tỉa rất tích cực và do đó chương trình có thể xử lý các trường hợp phức tạp trong một thời gian rất ngắn. Tuy nhiên, một sự kém hiệu quả chính là nó tạo tiền tố cho các ứng cử viên với tất cả các ký tự có thể, không chỉ các ký tự ngay trước một ;phần đường dẫn đích của chuỗi phân biệt. Tất cả các nhân vật được thêm vào không ở phía trước ;sẽ không có vấn đề gì vì chúng dẫn đến một quả cầu không thể được cắt tỉa khi nó được xem xét, nhưng điều đó vẫn khiến các nhân vật ở ngay trước đó ;trong các con đường khác. Vì vậy, cuối cùng, chương trình cũng xây dựng các khối u có thể phù hợp với bất kỳ sự kết hợp nào của các đường dẫn đã cho. Nó không có ý tưởng rằng nó nên tập trung vào con đường đầu tiên.

Bây giờ hãy xem xét một giải pháp cho vấn đề. Trong ví dụ đã cho có thể */*er/t. Điều này đưa ra chuỗi phân biệt sau:

;f;o;o;/barber/test
foo/barber/testing
foo/barber/coding
foo/test
foo/bar/test

Tôi nhận ra một giải pháp bằng cách có một ;vị trí đầu tiên (vì vậy nó phù hợp với đường dẫn đầu tiên) và không có một ;điểm bắt đầu của bất kỳ con đường nào khác (vì vậy những người khác không khớp)

Với thuật toán được giải thích, bây giờ tôi đến chương trình thực tế:

Các ứng cử viên sẽ ở trong mảng @amà tôi lặp lại bằng cách sử dụng biến $acó chứa toàn cầu hiện đang được xem xét. Thay vì *trong toàn cầu, tuy nhiên tôi sẽ sử dụng \w*như vậy $athực sự là một biểu thức chính quy thay vì toàn cầu. Tôi sẽ lạm dụng một sự kỳ lạ của vòng lặp perl for để bạn có thể nối các phần tử vào mảng đang được lặp trong khi vòng lặp đang chạy và các phần tử mới này sẽ được chọn trong vòng lặp. Vì khi tạo ra các khối lượng dài, n+1tất cả các khối lượng dài nđã có trên mảng, @ađây là chiều rộng đầu tiên.

Do -n0tùy chọn (vòng lặp ngầm trên toàn bộ đầu vào), danh sách các đường dẫn nằm trong $_một chuỗi lớn với mỗi đường dẫn được kết thúc bằng một dòng mới

@a="";                    Start everything with the length 0 glob
for$a(@a){    }           Loop over candidates in a breadth first way

Bên trong { }chúng ta có:

s/(?=$a\n)/;/g            Loop over the paths and insert a ; at every
                          position that the suffix glob can match by
                          looking ahead and checking that the regex
                          under consideration can match up to the end of
                          the path we are in. The distinguishing sting is
                          now in `$_`.

Rất tiếc, tôi vừa phá hủy $_và tôi sẽ cần nó cho vòng lặp tiếp theo. Vì vậy, bọc mã làm việc thực tế bên trong

s%%  ...code.. %e

Điều này khớp với chuỗi trống khi bắt đầu $_và cho phép bạn chạy mã để xác định chuỗi được thay thế bằng gì. Nếu tôi chắc chắn rằng mã đó ước tính thành chuỗi trống $_thì cuối cùng sẽ không thay đổi ngay cả khi tôi thay đổi $_trong thời gian đó code.

Quay trở lại ngay sau khi tôi thay thế $_bằng chuỗi phân biệt:

$$_//= expression

Điều này giống như:

$seen{$_} //= expression

//trong perl là 'defined or. Nó giống như một mạch ngắn ortrong đó đối số thứ hai chỉ được đánh giá nếu đối số thứ nhất là undef. Và nó có thể được kết hợp với một bài tập giống như +=trong một số ngôn ngữ khác. Vì vậy, nếu khóa của chúng $_trong hàm băm %seenundef(đó là những gì bạn nhận được khi truy cập một phần tử không tồn tại) thì chỉ thực hiện biểu thức và gán nó làm giá trị cho khóa $_. Vì vậy, nếu tôi chắc chắn expressionkhông trả về undefđiều đó về cơ bản có nghĩa là "đánh giá biểu thức khi và chỉ khi đây là lần đầu tiên chúng ta thấy chuỗi phân biệt cụ thể đó". Và bởi vì $_được đảm bảo có chứa một \nthực tế là an toàn khi lạm dụng hàm băm toàn cầu perl để lưu trữ các chuỗi phân biệt, vì vậy $$_thay vì$seen{$_}

Đối với expressiontôi sử dụng:

push@a,map$_.$a,/./g,"\\w*"

Về cơ bản "Đối với mọi ký tự (ngoại trừ dòng mới) trong chuỗi phân biệt và cũng đưa *nó vào toàn cầu hiện tại và đẩy nó vào mảng các ứng cử viên ảm đạm". Execpt tôi sử dụng \w*cho *để có được một regex hợp lệ (tôi có thể sử dụng ''thay vì ""để thoát khỏi một dấu chéo ngược nhưng sau đó tôi không thể chạy mã của tôi từ dòng lệnh). Lưu ý rằng điều này cũng nhặt ;và thêm chúng vào các ứng cử viên nhưng sau đó kiểm tra chúng để khôi phục $_mà không có ;một lần nữa sẽ là một quả cầu không thể và được cắt tỉa.

/^;/>/\n;/ &&      If the distinguishing string corresponds to a solution

say$a=~s/\\w//gr   Then replace all \w* back to * and print the solution

1/!                Say returns 1 so this becomes a division by 0.
                   The program exits by crashing after solving it

Lưu ý rằng /^;/>/\n;/có một giá trị tương đương với chuỗi trống trong trường hợp chưa tìm thấy giải pháp, do đó, chuỗi này sẽ hoạt động như chuỗi thay thế trống và $_được khôi phục


Tôi gặp lỗi trên TIO nhưng nó hoạt động cục bộ. bạn có biết tại sao như vậy không?
Pavel

1
@Pavel Việc -Ekích hoạt cấp độ ngôn ngữ mới nhất. Bạn cần ít nhất perl 5.10.0để có thể sử dụng say. Vì vậy, đặt use 5.10.0;trong phần tiêu đề và nó sẽ làm việc. Các tùy chọn để đặt cấp độ ngôn ngữ là dù sao miễn phí ngay cả khi bạn cũng không thể sử dụng nó -E. Trên thực tế, tất cả các tùy chọn đều được tính là miễn phí hiện nay (vì vậy tôi thậm chí không phải tính n0) nhưng tôi cho rằng điều đó quá khoan dung đối với perl
TonMedel 23/2/18

2
Thoát với một lỗi là tốt , vì vậy 1/giải pháp của bạn là hợp lệ! Tôi cũng cần phải nhớ điều đó ...
Dom Hastings

7

Java 10, 854 824 796 738 728 703 688 655 652 647 624 byte

import java.util.*;a->f->{var L=new Stack();List<String>s;int i=999,j,k;for(var t:f.split("/")){s=new java.util.concurrent.CopyOnWriteArrayList();s.add(t);for(k=1;k>0;){k=0;for(var x:s)for(j=0;j<x.length();)if(!s.contains(f=x.substring(0,j)+"~"+x.substring(++j))){s.add(f);k=1;}}for(var x:s)s.add(x.replaceAll("~+","\\*"));L.add(s);}p(L,s=new Stack(),0,f="");for(var y:s){k=0;for(var x:a)if(x.matches(y.replace("*",".*"))&x.split("/").length==y.split("/").length)k++;if(k==1&(j=y.length())<i){f=y;i=j;}}return f;};void p(List L,List r,int d,String c){if(d==L.size())r.add(c);else for(var o:(List)L.get(d))p(L,r,d+1,c+"/"+o);}

Thật là một mớ hỗn độn .. Đây chắc chắn không phải là một thách thức dễ dàng trong Java. Chắc chắn có thể bị đánh gôn bởi vài trăm byte, nhưng tôi rất vui vì cuối cùng nó cũng hoạt động. Đã nói với bạn :)
-5 byte nhờ @ceilingcat .
-23 byte chuyển từ Java 8 sang Java 10

Nhập dưới dạng một chuỗi Chuỗi các đường dẫn tệp (với các thư mục là các mục được phân tách và tất cả các mục có chứa một hàng đầu /) và một Chuỗi có đường dẫn tệp đầu vào đến grop.

Giải trình:

Hãy thử trực tuyến. (Các trường hợp thử nghiệm có ialsohavealongname/ ihavealongnameaswellđược giảm một chút về chiều dài và s.add(x.replaceAll("~+","\\*"));đã được thay thế bằng {s.remove(x);s.add(x.replaceAll("~+","\\*"));}để hoạt động trong 5-10 giây trên TIO, thay vì hết thời gian sau 60+ giây.)

import java.util.*;   // Required import for List and Stack

// Method with String-array and String parameters and String return-type
a->f->{
  var L=new Stack();  //  Create a List of Lists
  List<String>s;      //  List of Strings (uninitialized)
  int i=999,j,k;      //  Three integers (`i` starting at 999,
                      //   because 260 is the maximum file-path length in Windows)
  for(var t:f.split("/")){
                      //  Loop over the input file-path split by "/":
    s=new java.util.concurrent.CopyOnWriteArrayList();
                      //  Create a List (which we can modify while iterating it)
    s.add(t);         //  Add the input to this List
    for(k=1;k>0;){    //  Loop as long as there are new items added to the List
      k=0;            //   Reset the newAdded-flag to false
      for(var x:s)    //   And inner loop over the List
        for(j=0;j<t.length();)
                      //    Inner loop `j` in range [0,length-of-item):
          if(!s.contains(f=x.substring(0,j)+"~"+x.substring(++j))){
                      //     Replace the character at index `j` with a '~'
                      //     And if it's a new item:
            s.add(f); //      Add it to the List
            k=1;}}    //      And set the newAdded-flag to true
    for(var x:s)      //  Loop over the List again
      s.add(x.replaceAll("~+","\\*")));
                      //   And replace all 1 or more '~' with a single asterisk
                      //   (NOTE: To reduce bytes it doesn't remove the existing items)
    L.add(s);}        //   Add this List to the List of Lists
  p(L,s=new Stack(),0,"");
                      //  Generate all permutations of the groppings
                      //  (List `s` now contains all groppings of the given file-path)
  for(var y:s){       //  Loop over the groppings in the String-List:
    k=0;              //   Reset integer `k` to 0
    for(var x:a)      //   Inner loop over the input file-paths:
      if(x.matches(y.replace("*",".*"))
                      //    If the current file-path matches the current gropping
         x.split("/").length==y.split("/").length)
                      //    and the amount of slashes are the same:
         k++;         //     Increase integer `k` by 1
    if(k==1           //   If only one of the file-paths matched,
       &(j=y.length())<i){
                      //   and the length is shorter than `i`:
      f=y;            //    Replace the result with this gropping file-path
      i=j;}}          //    And also replace `i` with this shorter `j`
  return f;}          //  Finally return this shortest gropping file-path

// Separated method to generate gropping file-path permutations given a List of Lists
void p(List L,List r,int d,String c){
  if(d==L.size())     //  If we've reached the final depth
    r.add(c);         //   Add the current gropping-file path to the result-List
  else                //  Else:
    for(var o:(List)L.get(d))
                      //   Loop over the List of the current depth:
      p(L,r,d+1,      //    Recursive call with depth+1,
        c+"/"+o);}    //    and current + "/" + item of loop

Giải thích chung:

Ví dụ: Hãy lấy /foo, /foo/bar, /foo/barber, /foo/bar/test, /foo/barber/test, /foo/barber/testing, /foo/barber/coding, /foo/testđường dẫn tệp đã cho và đường dẫn foo/bar/testtệp đầu vào đến grop.

1) Tôi bắt đầu bằng cách tách đầu vào đường dẫn tệp theo /và tạo tất cả các phân vùng tệp của các từ được phân tách này:

foo: [foo, *oo, f*o, fo*, *o, *o*, f*, *]
bar: [bar, *ar, b*r, ba*, *r, *a*, b*, *]
test: [test, *est, t*st, te*t, tes*, *st, *e*t, *es*, t*t, t*s*, te*, *t, *s*, *e*, t*, *]

2) Sau đó tôi tạo ra tất cả các hoán vị với các từ này theo cùng một thứ tự (áp dụng lại /ở giữa và ở phía trước):

[/foo/bar/test, /foo/bar/*est, /foo/bar/t*st, /foo/bar/te*t, /foo/bar/tes*, /foo/bar/*st, /foo/bar/*e*t, /foo/bar/*es*, /foo/bar/t*t, /foo/bar/t*s*, /foo/bar/te*, /foo/bar/*t, /foo/bar/*s*, /foo/bar/*e*, /foo/bar/t*, /foo/bar/*, /foo/*ar/test, /foo/*ar/*est, /foo/*ar/t*st, /foo/*ar/te*t, /foo/*ar/tes*, /foo/*ar/*st, /foo/*ar/*e*t, /foo/*ar/*es*, /foo/*ar/t*t, /foo/*ar/t*s*, /foo/*ar/te*, /foo/*ar/*t, /foo/*ar/*s*, /foo/*ar/*e*, /foo/*ar/t*, /foo/*ar/*, /foo/b*r/test, /foo/b*r/*est, /foo/b*r/t*st, /foo/b*r/te*t, /foo/b*r/tes*, /foo/b*r/*st, /foo/b*r/*e*t, /foo/b*r/*es*, /foo/b*r/t*t, /foo/b*r/t*s*, /foo/b*r/te*, /foo/b*r/*t, /foo/b*r/*s*, /foo/b*r/*e*, /foo/b*r/t*, /foo/b*r/*, /foo/ba*/test, /foo/ba*/*est, /foo/ba*/t*st, /foo/ba*/te*t, /foo/ba*/tes*, /foo/ba*/*st, /foo/ba*/*e*t, /foo/ba*/*es*, /foo/ba*/t*t, /foo/ba*/t*s*, /foo/ba*/te*, /foo/ba*/*t, /foo/ba*/*s*, /foo/ba*/*e*, /foo/ba*/t*, /foo/ba*/*, /foo/*r/test, /foo/*r/*est, /foo/*r/t*st, /foo/*r/te*t, /foo/*r/tes*, /foo/*r/*st, /foo/*r/*e*t, /foo/*r/*es*, /foo/*r/t*t, /foo/*r/t*s*, /foo/*r/te*, /foo/*r/*t, /foo/*r/*s*, /foo/*r/*e*, /foo/*r/t*, /foo/*r/*, /foo/*a*/test, /foo/*a*/*est, /foo/*a*/t*st, /foo/*a*/te*t, /foo/*a*/tes*, /foo/*a*/*st, /foo/*a*/*e*t, /foo/*a*/*es*, /foo/*a*/t*t, /foo/*a*/t*s*, /foo/*a*/te*, /foo/*a*/*t, /foo/*a*/*s*, /foo/*a*/*e*, /foo/*a*/t*, /foo/*a*/*, /foo/b*/test, /foo/b*/*est, /foo/b*/t*st, /foo/b*/te*t, /foo/b*/tes*, /foo/b*/*st, /foo/b*/*e*t, /foo/b*/*es*, /foo/b*/t*t, /foo/b*/t*s*, /foo/b*/te*, /foo/b*/*t, /foo/b*/*s*, /foo/b*/*e*, /foo/b*/t*, /foo/b*/*, /foo/*/test, /foo/*/*est, /foo/*/t*st, /foo/*/te*t, /foo/*/tes*, /foo/*/*st, /foo/*/*e*t, /foo/*/*es*, /foo/*/t*t, /foo/*/t*s*, /foo/*/te*, /foo/*/*t, /foo/*/*s*, /foo/*/*e*, /foo/*/t*, /foo/*/*, /*oo/bar/test, /*oo/bar/*est, /*oo/bar/t*st, /*oo/bar/te*t, /*oo/bar/tes*, /*oo/bar/*st, /*oo/bar/*e*t, /*oo/bar/*es*, /*oo/bar/t*t, /*oo/bar/t*s*, /*oo/bar/te*, /*oo/bar/*t, /*oo/bar/*s*, /*oo/bar/*e*, /*oo/bar/t*, /*oo/bar/*, /*oo/*ar/test, /*oo/*ar/*est, /*oo/*ar/t*st, /*oo/*ar/te*t, /*oo/*ar/tes*, /*oo/*ar/*st, /*oo/*ar/*e*t, /*oo/*ar/*es*, /*oo/*ar/t*t, /*oo/*ar/t*s*, /*oo/*ar/te*, /*oo/*ar/*t, /*oo/*ar/*s*, /*oo/*ar/*e*, /*oo/*ar/t*, /*oo/*ar/*, /*oo/b*r/test, /*oo/b*r/*est, /*oo/b*r/t*st, /*oo/b*r/te*t, /*oo/b*r/tes*, /*oo/b*r/*st, /*oo/b*r/*e*t, /*oo/b*r/*es*, /*oo/b*r/t*t, /*oo/b*r/t*s*, /*oo/b*r/te*, /*oo/b*r/*t, /*oo/b*r/*s*, /*oo/b*r/*e*, /*oo/b*r/t*, /*oo/b*r/*, /*oo/ba*/test, /*oo/ba*/*est, /*oo/ba*/t*st, /*oo/ba*/te*t, /*oo/ba*/tes*, /*oo/ba*/*st, /*oo/ba*/*e*t, /*oo/ba*/*es*, /*oo/ba*/t*t, /*oo/ba*/t*s*, /*oo/ba*/te*, /*oo/ba*/*t, /*oo/ba*/*s*, /*oo/ba*/*e*, /*oo/ba*/t*, /*oo/ba*/*, /*oo/*r/test, /*oo/*r/*est, /*oo/*r/t*st, /*oo/*r/te*t, /*oo/*r/tes*, /*oo/*r/*st, /*oo/*r/*e*t, /*oo/*r/*es*, /*oo/*r/t*t, /*oo/*r/t*s*, /*oo/*r/te*, /*oo/*r/*t, /*oo/*r/*s*, /*oo/*r/*e*, /*oo/*r/t*, /*oo/*r/*, /*oo/*a*/test, /*oo/*a*/*est, /*oo/*a*/t*st, /*oo/*a*/te*t, /*oo/*a*/tes*, /*oo/*a*/*st, /*oo/*a*/*e*t, /*oo/*a*/*es*, /*oo/*a*/t*t, /*oo/*a*/t*s*, /*oo/*a*/te*, /*oo/*a*/*t, /*oo/*a*/*s*, /*oo/*a*/*e*, /*oo/*a*/t*, /*oo/*a*/*, /*oo/b*/test, /*oo/b*/*est, /*oo/b*/t*st, /*oo/b*/te*t, /*oo/b*/tes*, /*oo/b*/*st, /*oo/b*/*e*t, /*oo/b*/*es*, /*oo/b*/t*t, /*oo/b*/t*s*, /*oo/b*/te*, /*oo/b*/*t, /*oo/b*/*s*, /*oo/b*/*e*, /*oo/b*/t*, /*oo/b*/*, /*oo/*/test, /*oo/*/*est, /*oo/*/t*st, /*oo/*/te*t, /*oo/*/tes*, /*oo/*/*st, /*oo/*/*e*t, /*oo/*/*es*, /*oo/*/t*t, /*oo/*/t*s*, /*oo/*/te*, /*oo/*/*t, /*oo/*/*s*, /*oo/*/*e*, /*oo/*/t*, /*oo/*/*, /f*o/bar/test, /f*o/bar/*est, /f*o/bar/t*st, /f*o/bar/te*t, /f*o/bar/tes*, /f*o/bar/*st, /f*o/bar/*e*t, /f*o/bar/*es*, /f*o/bar/t*t, /f*o/bar/t*s*, /f*o/bar/te*, /f*o/bar/*t, /f*o/bar/*s*, /f*o/bar/*e*, /f*o/bar/t*, /f*o/bar/*, /f*o/*ar/test, /f*o/*ar/*est, /f*o/*ar/t*st, /f*o/*ar/te*t, /f*o/*ar/tes*, /f*o/*ar/*st, /f*o/*ar/*e*t, /f*o/*ar/*es*, /f*o/*ar/t*t, /f*o/*ar/t*s*, /f*o/*ar/te*, /f*o/*ar/*t, /f*o/*ar/*s*, /f*o/*ar/*e*, /f*o/*ar/t*, /f*o/*ar/*, /f*o/b*r/test, /f*o/b*r/*est, /f*o/b*r/t*st, /f*o/b*r/te*t, /f*o/b*r/tes*, /f*o/b*r/*st, /f*o/b*r/*e*t, /f*o/b*r/*es*, /f*o/b*r/t*t, /f*o/b*r/t*s*, /f*o/b*r/te*, /f*o/b*r/*t, /f*o/b*r/*s*, /f*o/b*r/*e*, /f*o/b*r/t*, /f*o/b*r/*, /f*o/ba*/test, /f*o/ba*/*est, /f*o/ba*/t*st, /f*o/ba*/te*t, /f*o/ba*/tes*, /f*o/ba*/*st, /f*o/ba*/*e*t, /f*o/ba*/*es*, /f*o/ba*/t*t, /f*o/ba*/t*s*, /f*o/ba*/te*, /f*o/ba*/*t, /f*o/ba*/*s*, /f*o/ba*/*e*, /f*o/ba*/t*, /f*o/ba*/*, /f*o/*r/test, /f*o/*r/*est, /f*o/*r/t*st, /f*o/*r/te*t, /f*o/*r/tes*, /f*o/*r/*st, /f*o/*r/*e*t, /f*o/*r/*es*, /f*o/*r/t*t, /f*o/*r/t*s*, /f*o/*r/te*, /f*o/*r/*t, /f*o/*r/*s*, /f*o/*r/*e*, /f*o/*r/t*, /f*o/*r/*, /f*o/*a*/test, /f*o/*a*/*est, /f*o/*a*/t*st, /f*o/*a*/te*t, /f*o/*a*/tes*, /f*o/*a*/*st, /f*o/*a*/*e*t, /f*o/*a*/*es*, /f*o/*a*/t*t, /f*o/*a*/t*s*, /f*o/*a*/te*, /f*o/*a*/*t, /f*o/*a*/*s*, /f*o/*a*/*e*, /f*o/*a*/t*, /f*o/*a*/*, /f*o/b*/test, /f*o/b*/*est, /f*o/b*/t*st, /f*o/b*/te*t, /f*o/b*/tes*, /f*o/b*/*st, /f*o/b*/*e*t, /f*o/b*/*es*, /f*o/b*/t*t, /f*o/b*/t*s*, /f*o/b*/te*, /f*o/b*/*t, /f*o/b*/*s*, /f*o/b*/*e*, /f*o/b*/t*, /f*o/b*/*, /f*o/*/test, /f*o/*/*est, /f*o/*/t*st, /f*o/*/te*t, /f*o/*/tes*, /f*o/*/*st, /f*o/*/*e*t, /f*o/*/*es*, /f*o/*/t*t, /f*o/*/t*s*, /f*o/*/te*, /f*o/*/*t, /f*o/*/*s*, /f*o/*/*e*, /f*o/*/t*, /f*o/*/*, /fo*/bar/test, /fo*/bar/*est, /fo*/bar/t*st, /fo*/bar/te*t, /fo*/bar/tes*, /fo*/bar/*st, /fo*/bar/*e*t, /fo*/bar/*es*, /fo*/bar/t*t, /fo*/bar/t*s*, /fo*/bar/te*, /fo*/bar/*t, /fo*/bar/*s*, /fo*/bar/*e*, /fo*/bar/t*, /fo*/bar/*, /fo*/*ar/test, /fo*/*ar/*est, /fo*/*ar/t*st, /fo*/*ar/te*t, /fo*/*ar/tes*, /fo*/*ar/*st, /fo*/*ar/*e*t, /fo*/*ar/*es*, /fo*/*ar/t*t, /fo*/*ar/t*s*, /fo*/*ar/te*, /fo*/*ar/*t, /fo*/*ar/*s*, /fo*/*ar/*e*, /fo*/*ar/t*, /fo*/*ar/*, /fo*/b*r/test, /fo*/b*r/*est, /fo*/b*r/t*st, /fo*/b*r/te*t, /fo*/b*r/tes*, /fo*/b*r/*st, /fo*/b*r/*e*t, /fo*/b*r/*es*, /fo*/b*r/t*t, /fo*/b*r/t*s*, /fo*/b*r/te*, /fo*/b*r/*t, /fo*/b*r/*s*, /fo*/b*r/*e*, /fo*/b*r/t*, /fo*/b*r/*, /fo*/ba*/test, /fo*/ba*/*est, /fo*/ba*/t*st, /fo*/ba*/te*t, /fo*/ba*/tes*, /fo*/ba*/*st, /fo*/ba*/*e*t, /fo*/ba*/*es*, /fo*/ba*/t*t, /fo*/ba*/t*s*, /fo*/ba*/te*, /fo*/ba*/*t, /fo*/ba*/*s*, /fo*/ba*/*e*, /fo*/ba*/t*, /fo*/ba*/*, /fo*/*r/test, /fo*/*r/*est, /fo*/*r/t*st, /fo*/*r/te*t, /fo*/*r/tes*, /fo*/*r/*st, /fo*/*r/*e*t, /fo*/*r/*es*, /fo*/*r/t*t, /fo*/*r/t*s*, /fo*/*r/te*, /fo*/*r/*t, /fo*/*r/*s*, /fo*/*r/*e*, /fo*/*r/t*, /fo*/*r/*, /fo*/*a*/test, /fo*/*a*/*est, /fo*/*a*/t*st, /fo*/*a*/te*t, /fo*/*a*/tes*, /fo*/*a*/*st, /fo*/*a*/*e*t, /fo*/*a*/*es*, /fo*/*a*/t*t, /fo*/*a*/t*s*, /fo*/*a*/te*, /fo*/*a*/*t, /fo*/*a*/*s*, /fo*/*a*/*e*, /fo*/*a*/t*, /fo*/*a*/*, /fo*/b*/test, /fo*/b*/*est, /fo*/b*/t*st, /fo*/b*/te*t, /fo*/b*/tes*, /fo*/b*/*st, /fo*/b*/*e*t, /fo*/b*/*es*, /fo*/b*/t*t, /fo*/b*/t*s*, /fo*/b*/te*, /fo*/b*/*t, /fo*/b*/*s*, /fo*/b*/*e*, /fo*/b*/t*, /fo*/b*/*, /fo*/*/test, /fo*/*/*est, /fo*/*/t*st, /fo*/*/te*t, /fo*/*/tes*, /fo*/*/*st, /fo*/*/*e*t, /fo*/*/*es*, /fo*/*/t*t, /fo*/*/t*s*, /fo*/*/te*, /fo*/*/*t, /fo*/*/*s*, /fo*/*/*e*, /fo*/*/t*, /fo*/*/*, /*o/bar/test, /*o/bar/*est, /*o/bar/t*st, /*o/bar/te*t, /*o/bar/tes*, /*o/bar/*st, /*o/bar/*e*t, /*o/bar/*es*, /*o/bar/t*t, /*o/bar/t*s*, /*o/bar/te*, /*o/bar/*t, /*o/bar/*s*, /*o/bar/*e*, /*o/bar/t*, /*o/bar/*, /*o/*ar/test, /*o/*ar/*est, /*o/*ar/t*st, /*o/*ar/te*t, /*o/*ar/tes*, /*o/*ar/*st, /*o/*ar/*e*t, /*o/*ar/*es*, /*o/*ar/t*t, /*o/*ar/t*s*, /*o/*ar/te*, /*o/*ar/*t, /*o/*ar/*s*, /*o/*ar/*e*, /*o/*ar/t*, /*o/*ar/*, /*o/b*r/test, /*o/b*r/*est, /*o/b*r/t*st, /*o/b*r/te*t, /*o/b*r/tes*, /*o/b*r/*st, /*o/b*r/*e*t, /*o/b*r/*es*, /*o/b*r/t*t, /*o/b*r/t*s*, /*o/b*r/te*, /*o/b*r/*t, /*o/b*r/*s*, /*o/b*r/*e*, /*o/b*r/t*, /*o/b*r/*, /*o/ba*/test, /*o/ba*/*est, /*o/ba*/t*st, /*o/ba*/te*t, /*o/ba*/tes*, /*o/ba*/*st, /*o/ba*/*e*t, /*o/ba*/*es*, /*o/ba*/t*t, /*o/ba*/t*s*, /*o/ba*/te*, /*o/ba*/*t, /*o/ba*/*s*, /*o/ba*/*e*, /*o/ba*/t*, /*o/ba*/*, /*o/*r/test, /*o/*r/*est, /*o/*r/t*st, /*o/*r/te*t, /*o/*r/tes*, /*o/*r/*st, /*o/*r/*e*t, /*o/*r/*es*, /*o/*r/t*t, /*o/*r/t*s*, /*o/*r/te*, /*o/*r/*t, /*o/*r/*s*, /*o/*r/*e*, /*o/*r/t*, /*o/*r/*, /*o/*a*/test, /*o/*a*/*est, /*o/*a*/t*st, /*o/*a*/te*t, /*o/*a*/tes*, /*o/*a*/*st, /*o/*a*/*e*t, /*o/*a*/*es*, /*o/*a*/t*t, /*o/*a*/t*s*, /*o/*a*/te*, /*o/*a*/*t, /*o/*a*/*s*, /*o/*a*/*e*, /*o/*a*/t*, /*o/*a*/*, /*o/b*/test, /*o/b*/*est, /*o/b*/t*st, /*o/b*/te*t, /*o/b*/tes*, /*o/b*/*st, /*o/b*/*e*t, /*o/b*/*es*, /*o/b*/t*t, /*o/b*/t*s*, /*o/b*/te*, /*o/b*/*t, /*o/b*/*s*, /*o/b*/*e*, /*o/b*/t*, /*o/b*/*, /*o/*/test, /*o/*/*est, /*o/*/t*st, /*o/*/te*t, /*o/*/tes*, /*o/*/*st, /*o/*/*e*t, /*o/*/*es*, /*o/*/t*t, /*o/*/t*s*, /*o/*/te*, /*o/*/*t, /*o/*/*s*, /*o/*/*e*, /*o/*/t*, /*o/*/*, /*o*/bar/test, /*o*/bar/*est, /*o*/bar/t*st, /*o*/bar/te*t, /*o*/bar/tes*, /*o*/bar/*st, /*o*/bar/*e*t, /*o*/bar/*es*, /*o*/bar/t*t, /*o*/bar/t*s*, /*o*/bar/te*, /*o*/bar/*t, /*o*/bar/*s*, /*o*/bar/*e*, /*o*/bar/t*, /*o*/bar/*, /*o*/*ar/test, /*o*/*ar/*est, /*o*/*ar/t*st, /*o*/*ar/te*t, /*o*/*ar/tes*, /*o*/*ar/*st, /*o*/*ar/*e*t, /*o*/*ar/*es*, /*o*/*ar/t*t, /*o*/*ar/t*s*, /*o*/*ar/te*, /*o*/*ar/*t, /*o*/*ar/*s*, /*o*/*ar/*e*, /*o*/*ar/t*, /*o*/*ar/*, /*o*/b*r/test, /*o*/b*r/*est, /*o*/b*r/t*st, /*o*/b*r/te*t, /*o*/b*r/tes*, /*o*/b*r/*st, /*o*/b*r/*e*t, /*o*/b*r/*es*, /*o*/b*r/t*t, /*o*/b*r/t*s*, /*o*/b*r/te*, /*o*/b*r/*t, /*o*/b*r/*s*, /*o*/b*r/*e*, /*o*/b*r/t*, /*o*/b*r/*, /*o*/ba*/test, /*o*/ba*/*est, /*o*/ba*/t*st, /*o*/ba*/te*t, /*o*/ba*/tes*, /*o*/ba*/*st, /*o*/ba*/*e*t, /*o*/ba*/*es*, /*o*/ba*/t*t, /*o*/ba*/t*s*, /*o*/ba*/te*, /*o*/ba*/*t, /*o*/ba*/*s*, /*o*/ba*/*e*, /*o*/ba*/t*, /*o*/ba*/*, /*o*/*r/test, /*o*/*r/*est, /*o*/*r/t*st, /*o*/*r/te*t, /*o*/*r/tes*, /*o*/*r/*st, /*o*/*r/*e*t, /*o*/*r/*es*, /*o*/*r/t*t, /*o*/*r/t*s*, /*o*/*r/te*, /*o*/*r/*t, /*o*/*r/*s*, /*o*/*r/*e*, /*o*/*r/t*, /*o*/*r/*, /*o*/*a*/test, /*o*/*a*/*est, /*o*/*a*/t*st, /*o*/*a*/te*t, /*o*/*a*/tes*, /*o*/*a*/*st, /*o*/*a*/*e*t, /*o*/*a*/*es*, /*o*/*a*/t*t, /*o*/*a*/t*s*, /*o*/*a*/te*, /*o*/*a*/*t, /*o*/*a*/*s*, /*o*/*a*/*e*, /*o*/*a*/t*, /*o*/*a*/*, /*o*/b*/test, /*o*/b*/*est, /*o*/b*/t*st, /*o*/b*/te*t, /*o*/b*/tes*, /*o*/b*/*st, /*o*/b*/*e*t, /*o*/b*/*es*, /*o*/b*/t*t, /*o*/b*/t*s*, /*o*/b*/te*, /*o*/b*/*t, /*o*/b*/*s*, /*o*/b*/*e*, /*o*/b*/t*, /*o*/b*/*, /*o*/*/test, /*o*/*/*est, /*o*/*/t*st, /*o*/*/te*t, /*o*/*/tes*, /*o*/*/*st, /*o*/*/*e*t, /*o*/*/*es*, /*o*/*/t*t, /*o*/*/t*s*, /*o*/*/te*, /*o*/*/*t, /*o*/*/*s*, /*o*/*/*e*, /*o*/*/t*, /*o*/*/*, /f*/bar/test, /f*/bar/*est, /f*/bar/t*st, /f*/bar/te*t, /f*/bar/tes*, /f*/bar/*st, /f*/bar/*e*t, /f*/bar/*es*, /f*/bar/t*t, /f*/bar/t*s*, /f*/bar/te*, /f*/bar/*t, /f*/bar/*s*, /f*/bar/*e*, /f*/bar/t*, /f*/bar/*, /f*/*ar/test, /f*/*ar/*est, /f*/*ar/t*st, /f*/*ar/te*t, /f*/*ar/tes*, /f*/*ar/*st, /f*/*ar/*e*t, /f*/*ar/*es*, /f*/*ar/t*t, /f*/*ar/t*s*, /f*/*ar/te*, /f*/*ar/*t, /f*/*ar/*s*, /f*/*ar/*e*, /f*/*ar/t*, /f*/*ar/*, /f*/b*r/test, /f*/b*r/*est, /f*/b*r/t*st, /f*/b*r/te*t, /f*/b*r/tes*, /f*/b*r/*st, /f*/b*r/*e*t, /f*/b*r/*es*, /f*/b*r/t*t, /f*/b*r/t*s*, /f*/b*r/te*, /f*/b*r/*t, /f*/b*r/*s*, /f*/b*r/*e*, /f*/b*r/t*, /f*/b*r/*, /f*/ba*/test, /f*/ba*/*est, /f*/ba*/t*st, /f*/ba*/te*t, /f*/ba*/tes*, /f*/ba*/*st, /f*/ba*/*e*t, /f*/ba*/*es*, /f*/ba*/t*t, /f*/ba*/t*s*, /f*/ba*/te*, /f*/ba*/*t, /f*/ba*/*s*, /f*/ba*/*e*, /f*/ba*/t*, /f*/ba*/*, /f*/*r/test, /f*/*r/*est, /f*/*r/t*st, /f*/*r/te*t, /f*/*r/tes*, /f*/*r/*st, /f*/*r/*e*t, /f*/*r/*es*, /f*/*r/t*t, /f*/*r/t*s*, /f*/*r/te*, /f*/*r/*t, /f*/*r/*s*, /f*/*r/*e*, /f*/*r/t*, /f*/*r/*, /f*/*a*/test, /f*/*a*/*est, /f*/*a*/t*st, /f*/*a*/te*t, /f*/*a*/tes*, /f*/*a*/*st, /f*/*a*/*e*t, /f*/*a*/*es*, /f*/*a*/t*t, /f*/*a*/t*s*, /f*/*a*/te*, /f*/*a*/*t, /f*/*a*/*s*, /f*/*a*/*e*, /f*/*a*/t*, /f*/*a*/*, /f*/b*/test, /f*/b*/*est, /f*/b*/t*st, /f*/b*/te*t, /f*/b*/tes*, /f*/b*/*st, /f*/b*/*e*t, /f*/b*/*es*, /f*/b*/t*t, /f*/b*/t*s*, /f*/b*/te*, /f*/b*/*t, /f*/b*/*s*, /f*/b*/*e*, /f*/b*/t*, /f*/b*/*, /f*/*/test, /f*/*/*est, /f*/*/t*st, /f*/*/te*t, /f*/*/tes*, /f*/*/*st, /f*/*/*e*t, /f*/*/*es*, /f*/*/t*t, /f*/*/t*s*, /f*/*/te*, /f*/*/*t, /f*/*/*s*, /f*/*/*e*, /f*/*/t*, /f*/*/*, /*/bar/test, /*/bar/*est, /*/bar/t*st, /*/bar/te*t, /*/bar/tes*, /*/bar/*st, /*/bar/*e*t, /*/bar/*es*, /*/bar/t*t, /*/bar/t*s*, /*/bar/te*, /*/bar/*t, /*/bar/*s*, /*/bar/*e*, /*/bar/t*, /*/bar/*, /*/*ar/test, /*/*ar/*est, /*/*ar/t*st, /*/*ar/te*t, /*/*ar/tes*, /*/*ar/*st, /*/*ar/*e*t, /*/*ar/*es*, /*/*ar/t*t, /*/*ar/t*s*, /*/*ar/te*, /*/*ar/*t, /*/*ar/*s*, /*/*ar/*e*, /*/*ar/t*, /*/*ar/*, /*/b*r/test, /*/b*r/*est, /*/b*r/t*st, /*/b*r/te*t, /*/b*r/tes*, /*/b*r/*st, /*/b*r/*e*t, /*/b*r/*es*, /*/b*r/t*t, /*/b*r/t*s*, /*/b*r/te*, /*/b*r/*t, /*/b*r/*s*, /*/b*r/*e*, /*/b*r/t*, /*/b*r/*, /*/ba*/test, /*/ba*/*est, /*/ba*/t*st, /*/ba*/te*t, /*/ba*/tes*, /*/ba*/*st, /*/ba*/*e*t, /*/ba*/*es*, /*/ba*/t*t, /*/ba*/t*s*, /*/ba*/te*, /*/ba*/*t, /*/ba*/*s*, /*/ba*/*e*, /*/ba*/t*, /*/ba*/*, /*/*r/test, /*/*r/*est, /*/*r/t*st, /*/*r/te*t, /*/*r/tes*, /*/*r/*st, /*/*r/*e*t, /*/*r/*es*, /*/*r/t*t, /*/*r/t*s*, /*/*r/te*, /*/*r/*t, /*/*r/*s*, /*/*r/*e*, /*/*r/t*, /*/*r/*, /*/*a*/test, /*/*a*/*est, /*/*a*/t*st, /*/*a*/te*t, /*/*a*/tes*, /*/*a*/*st, /*/*a*/*e*t, /*/*a*/*es*, /*/*a*/t*t, /*/*a*/t*s*, /*/*a*/te*, /*/*a*/*t, /*/*a*/*s*, /*/*a*/*e*, /*/*a*/t*, /*/*a*/*, /*/b*/test, /*/b*/*est, /*/b*/t*st, /*/b*/te*t, /*/b*/tes*, /*/b*/*st, /*/b*/*e*t, /*/b*/*es*, /*/b*/t*t, /*/b*/t*s*, /*/b*/te*, /*/b*/*t, /*/b*/*s*, /*/b*/*e*, /*/b*/t*, /*/b*/*, /*/*/test, /*/*/*est, /*/*/t*st, /*/*/te*t, /*/*/tes*, /*/*/*st, /*/*/*e*t, /*/*/*es*, /*/*/t*t, /*/*/t*s*, /*/*/te*, /*/*/*t, /*/*/*s*, /*/*/*e*, /*/*/t*, /*/*/*]

3) Sau đó, tôi lặp qua các mục trong danh sách này ở trên và xác thực nếu nó chỉ khớp với một đường dẫn tệp duy nhất trong mảng đầu vào của đường dẫn tệp. (Tôi làm điều này bằng cách kiểm tra hai điều: là số lượng dấu gạch chéo giống nhau và có khớp với biểu thức chính mà mọi thứ *được thay thế bằng .*.)
Nếu nó: giữ cho (đầu tiên) ngắn nhất, cuối cùng chúng ta sẽ trả về.


Có gì >>>? Tôi biết >>là thay đổi đúng bitwise.
Pavel

2
@Pavel Đối với số nguyên dương, >>>hoạt động tương tự như >>. Nhưng đối với các số nguyên âm, nó thay đổi bit chẵn lẻ thành 0 (bạn có thể xem một số ví dụ ở đây tại phần " >> vs >>> " ). -1>>>1chỉ là một biến thể ngắn hơn của Integer.MAX_VALUE(và 1<<31sẽ là Integer.MIN_VALUE).
Kevin Cruijssen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.