쉘 글롭 골프


11

이 작업은 glob 확장 후 파일의 최단 경로를 출력하는 것입니다.

쉘 글 로빙이란 무엇입니까? 대부분의 셸 *에서 경로의 문자를 사용하여 위치의 모든 문자를 나타낼 수 있습니다. 디렉토리가있는 경우 예를 들어, foo파일을 포함 bar baz하고 asdf, 그 다음 foo/b*에 확장됩니다 foo/bar foo/baz.

이제 현재 디렉토리에 파일이 ihavealongname있고 다른 것은 없다고 가정 해 봅시다. 이 파일을 참조 *하려면을 입력하면 전체 이름을 입력하지 않고 하나의 파일 만 나타냅니다.

디렉토리에라는 파일이 포함되어 있으면 두 파일과 모두 일치하므로 ialsohavealongname수행 할 수 없습니다 *. 나는 적어도해야만 할 것이다 ih*.

*패턴은 또한 내가 찾고 파일 위의 디렉토리를 일치 작동합니다. 이 두 디렉토리 인 경우 foobar,하지만 foo단지 파일을 포함 baz하고 bar파일을 포함 asdf, 나는 일치시킬 수 있습니다 foo/baz*/baz. 또는 더 간결하게 */b*. bar비어 있으면 */*작동합니다.

작업 : "현재 디렉토리"를 나타내는 경로의 문자열 배열과 단일 대상 경로가 주어지면 * s를 확장 한 후 해당 대상 경로로만 확장 될 수있는 가장 짧은 문자열을 출력하십시오.

대상 경로는 경로의 배열에 대한 인덱스, 전달 된 경로 배열의 첫 번째 항목 또는 하드 코딩이 아닌 다른 편리한 방법으로 자체 문자열로 사용할 수 있습니다. 확실하지 않은 경우 의견을 물어보십시오.

대상 경로는 "현재 디렉토리"에 있어야합니다.

모든 경로에 영숫자 ASCII (및 /s) 만 포함되어 있다고 가정 할 수 있습니다 . 루팅 (로 시작 /) 또는 상대 (로 시작하지 않는) 입력 경로로 사용할 수 있습니다 /.

똑같이 짧은 가능성이 여러 개 있으면 그중 일부 또는 전부를 반환하십시오.

이것은 가장 적은 바이트가 이깁니다!

Kevin Cruijssen 덕분에 테스트 사례 .


4
그래서 우리는 파일 이름에 공백이 포함되지 않은 가정 할 수있다, 줄 바꿈, 백 슬래시, *, ?, [ 등? 파일과 디렉토리 이름이 영숫자
라고 말하면 가장 쉬울 것입니다.

3
실제 디스크 I / O 부분은 많은 언어에서 지루합니다. 예를 들어 perl에서는 파일 이름을 가져 와서 모든 경로 구성 요소를 대체하고 *perl glob을 실행 하여 관련성이있는 모든 파일 이름을 얻습니다 (예 : foo/bar/baz됩니다 */*/*). 그 후에는 문자열 처리 문제가됩니다. 그리고 그 도전은 이미 충분히 어렵다. 나는이 challengwe가 "영숫자 (및 /) 상대 경로 의 목록을 주었을 때이 기존 목표 경로와 일치하는 가장 짧은 구를 찾으십시오.
Ton Hospel

1
@KevinCruijssen 물론, 그것은 재미있는 도전이며 대부분 순수한 골프 언어를 멀리해야합니다. 나는 실제 프로그램이 필요할 것이라고 생각합니다 (지루하고 폭발적으로 폭발 할 것입니다. 처리해야 할 경우를 거의 다루기 시작하십시오. 사용 : 여기에 꽃밥 사건 a*f선택 azzf에서가 azzf, azzg, bzzf. a*b*c등 으로 의지로 확장하십시오 .
Ton Hospel

2
@TonHospel 확신합니다. 이제 경로 배열을 입력으로 사용합니다.
Pavel

4
@WeijunZhou 나는 입력에 대해 마음을 바꿨다. 이제 일련의 경로를 사용할 수 있습니다.
Pavel

답변:


8

펄 (5) , 136 (107) 102 바이트

포함 +2을 위해n0

STDIN에 파일 목록을 제공하십시오. 첫 번째 파일은 대상 파일로 간주됩니다

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

줄 바꿈 문자를 작성하지 않고 코드 만 :

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

솔루션을 인쇄 한 후 의도적으로 충돌이 발생합니다.

여전히 너무 길다 (사용 $a1/0매우 어색함). 그러나 시작이며 합리적으로 효율적이어야합니다.

온라인으로 사용해보십시오!

작동 원리

이 프로그램은 후보 문자열을 빈 문자열부터 시작하여 뒤에서 앞으로 자릅니다. 그것은이 너비 첫번째 방법으로, 길이가 0이므로 제 globs와 시도된다 않는다 (단`)이면 길이 1 (등 t, i, *), (같은 다음 길이 2 fb, i*, *g, **), 다음에 길이가 3 등까지 glob은 첫 번째 경로와 만 일치합니다. 그러면 문제를 해결하는 가장 짧은 glob가됩니다 (같은 길이의 다른 것이 존재할 수 있음).

길이 globs와는 n+1길이 globs와에서 생성 된 n경로의리스트에서 각 문자를 앞에 붙이는도 *각각 길이 글롭 앞에 n. 그래서 예를 들어 길이 3 글로브는 *i*길이 4 globs의를 기여 f*i*, o*i*, o*i*, /*i*, b*i*... s*i*, t*i*그리고 마지막으로 **i*. 입력 경로 목록의 모든 문자는 여러 번 표시되거나 전혀 일치하지 않는 것으로 이해되므로 의미가 없습니다.

순진하게 이렇게하면 조합 폭발이 일어날 수 있습니다. 그렇기 때문에 전체 glob의 끝에서 glob가 사용 된 경우 경로에서 일치 할 수있는 지점을 결정하여 모든 후보 glob가 얼마나 유용한 지 평가합니다. ;일치 할 수있는 각 위치 에를 삽입하여이 작업을 수행 합니다. 예를 들어 glob의 t*경우 문자열을 가져옵니다.

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

이것은 글로브의 "구별 력"을 나타냅니다. 정확히 동일한 구별 력을 갖는 모든 글로브는 똑같이 좋습니다. 완전한 글로브가 끝날 때 서로 교체하면 모두 정확히 동일한 경로와 일치합니다. 따라서 가장 짧은 것을 사용할 수 있습니다.

따라서 길이 n글롭을 고려할 때 먼저 고유 한 힘을 봅니다. n이미 고려되고 확장 된 길 이나 더 짧은 길이의 글로브가 있었기 때문에이 글로브는 무의미하며 정리됩니다. 예를 들어 **i*동일한 구별 력이 이미로 표시되었으므로 후보를 제거 *i*합니다. 또한 f*i*구별 문자열이 없기 때문에 불가능한 후보를 제거합니다.;원래 경로 목록 만 있으면됩니다. 첫 번째 불가능한 glob 만 허용되며 다른 모든 glob은 동일한 구별되는 힘을 가진 것으로 간주되어 정리됩니다. 그리고 첫 번째 확장조차도 모든 확장이 여전히 불가능하고 고려 될 때 정리되기 때문에 실제로 확장되지는 않습니다. Simularly in*에 의해 정리 될 것 i*

위의 내용은 매우 공격적인 가지 치기로 이어 지므로 프로그램은 매우 짧은 시간에 복잡한 사례를 처리 할 수 ​​있습니다. 그러나 가장 큰 비효율은 후보 글롭 ;에 식별 가능한 문자열의 대상 경로 부분 바로 앞의 문자뿐만 아니라 가능한 모든 문자로 접두사를 붙인다는 것입니다. 앞에 추가되지 않은 모든 추가 문자는 ;문제가 발생하지 않아서 제거 될 수 없기 때문에 문제가되지 않지만 ;, 다른 경로에서 바로 이전 문자를 남깁니다 . 결국 프로그램은 주어진 경로의 모든 조합과 일치 할 수있는 glob도 빌드합니다. 그것이 첫 번째 경로에 집중해야한다는 것은 전혀 모른다.

이제 문제에 대한 해결책을 고려하십시오. 주어진 예에서 */*er/t. 이것은 다음과 같은 구별 문자열을 제공합니다.

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

;첫 번째 위치에 (따라서 첫 번째 경로와 일치) 있고 ;다른 경로의 시작 부분에없는 (따라서 다른 경로가 일치하지 않음) 솔루션을 인식합니다.

알고리즘을 설명하면 이제 실제 프로그램에 도달합니다.

후보 glob은 현재 고려중인 glob를 포함하는 @a변수 $a를 사용하여 반복 되는 배열에 있습니다. 대신에 *글로브에서 나는 그러나 사용합니다 \w*그래서 $a대신 글로브의 정규식 사실이다. 루프가 실행되는 동안 루프되는 배열에 요소를 추가 할 수있는 펄 for 루프의 기이함을 남용하고 새로운 요소가 루프에서 선택됩니다. 길이 n+1글로브를 생성 할 때 모든 길이 n글로브가 이미 배열되어 있기 때문에 @a이것이 가장 우선합니다.

-n0옵션 (전체 입력에 대한 암시 적 루프) 으로 인해 경로 목록은 $_하나의 큰 문자열로 표시되며 각 경로는 개행으로 종료됩니다

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

{ }우리 안에는 :

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 `$_`.

죄송합니다. 방금 파괴 $_했으며 다음 루프에 필요할 것입니다. 실제 작업 코드를 안에 넣습니다.

s%%  ...code.. %e

이것은 시작시 빈 문자열과 일치하며 $_코드를 실행하여 대체 대상을 결정할 수 있습니다. 내가 확인하면 빈 문자열에 그 코드를 평가하는 $_말에 의지해도 나는 변화를 그대로 유지 $_하는 동안 code.

$_구별 문자열 로 바꾼 직후로 돌아갑니다 .

$$_//= expression

이것은 다음과 같습니다

$seen{$_} //= expression

//perl은 'defined or입니다. or두 번째 인수가 첫 번째 인수 인 경우에만 평가되는 단락과 같습니다 undef. +=다른 언어 와 마찬가지로 과제와 결합 할 수도 있습니다. 따라서 그들이 존재하지 않는 요소에 액세스 할 때 얻는 $_해시 %seen입니다. undef식을 실행하고 키에 값으로 할당하십시오 $_. 따라서 기본적으로 "이것이 처음 인 경우에만 표현식을 평가하십시오"라는 의미를 expression반환하지 않으면 확실히 undef구별되는 문자열을 볼 수 있습니다. 때문에 $_를 포함하도록 보장 \n그것은 구별 문자열을 저장하는 펄 글로벌 해시를 남용, 그렇게하는 사실 안전에 $$_대신$seen{$_}

를 들어 expressionI 사용 :

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

기본적으로 "구분 문자열의 모든 문자 (줄 바꿈 제외)에 *대해 현재 글로 앞에 추가하고 후보 글롭 배열에 푸시합니다." Execpt I 사용 \w*에 대한 *(내가 사용할 수있는 유효한 정규식을 얻는 ''대신 ""하나의 백 슬래시를 제거하는하지만 내가 명령 줄에서 내 코드를 실행할 수 없습니다). 이것은 또한 이것을 선택 ;하여 후보 glob에 추가하지만 나중에 다시 테스트 할 때 불가능한 glob $_이 아니며 ;정리됩니다.

/^;/>/\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

공지 사항 /^;/>/\n;/, 해결책은 아직 발견되지 않은 경우에는 빈 문자열 값 동등 물이 빈 대체 문자열로이 의지 기능 그래서 및 $_복원됩니다


내가 얻을 TIO에 오류가 있지만 로컬로 작동합니다. 왜 그런지 아십니까?
Pavel

1
@Pavel -E최신 언어 수준을 활성화합니다. 5.10.0사용할 수 있으려면 최소한 perl이 필요 합니다 say. use 5.10.0;헤더 섹션에 넣으면 작동합니다. 을 사용하여 언어 수준을 설정할 수없는 옵션도 어쨌든 무료로 계산합니다 -E. 사실 모든 옵션 (I도 계산하지 않아도 요즘 무료로 계산 n0) 그러나 나는 펄에 대해 너무 관대 한 생각
톤 Hospel

2
오류와 함께 종료 해도 1/문제가 없으므로 솔루션이 유효합니다! 나는 ... 너무 것을 기억해야합니다
돔 헤이스팅스

7

자바 10, 854 824 796 738 728 703 688 655 652 647 624 바이트

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);}

엉망 .. 이것은 자바에서 쉬운 일이 아니다. 확실히 몇 백 바이트로 골프를 칠 수는 있지만, 마침내 그것이 지금 작동하고 있다는 것이 기쁩니다. 말했지. :) @ceilingcat
덕분에 -5 바이트 . Java 8에서 Java 10으로 전환하는 -23 바이트

파일 경로의 문자열 배열 (디렉토리를 구분 된 항목으로 포함하고 /앞에 오는을 포함하는 모든 항목 포함 ) 및 grop 할 입력 파일 경로가있는 문자열로 입력하십시오.

설명:

온라인으로 사용해보십시오. ialsohavealongname/ ihavealongnameaswell가 있는 테스트 케이스의 길이는 약간 단축되었으며 TIO에서 60 초 이상 시간 초과되는 대신 5-10 초 안에 작동 s.add(x.replaceAll("~+","\\*"));하도록 대체되었습니다 {s.remove(x);s.add(x.replaceAll("~+","\\*"));}.

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

추가 일반 설명 :

예 : /foo, /foo/bar, /foo/barber, /foo/bar/test, /foo/barber/test, /foo/barber/testing, /foo/barber/coding, /foo/test주어진 파일 경로와 foo/bar/testgrop에 대한 입력 파일 경로를 사용합니다.

1) 파일 경로 입력을 /로 나누고, 분리 된 단어의 모든 파일 그루핑을 생성합니다.

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) 그런 다음이 단어를 사용하여 동일한 순서로 모든 순열을 생성합니다 ( /중간 및 앞면에 다시 적용 ).

[/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) 그런 다음 위 목록의 항목을 반복하고 파일 경로의 입력 배열에서 단일 파일 경로와 일치하는지 확인합니다. (두 가지를 확인 하여이 작업을 수행합니다. 슬래시의 양이 같고 모든 *것이 교체 된 정규 표현식과 일치합니까 .*?)
그렇다면 (첫 번째)를 가장 짧게 유지하십시오.


무엇입니까 >>>? 나는 >>비트 단위의 올바른 변화 라는 것을 알고 있습니다.
Pavel

2
@Pavel 양의 정수의 >>>경우와 동일하게 작동합니다 >>. 그러나 음의 정수의 경우 패리티 비트가 0으로 변경됩니다 ( " >> vs >>> " 섹션에서 일부 예를 볼 수 있음 ). -1>>>1단지 짧은 변종 Integer.MAX_VALUE(그리고 1<<31것입니다 Integer.MIN_VALUE).
Kevin Cruijssen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.