Mã thách thức golf đơn giản: Mô hình nhân vật!


22

Trong thử thách này, bạn nhận được một chuỗi dưới dạng đầu vào chứa chuỗi X, Y và Z, vd. "XÁC". X, Y và Z đại diện cho một nhân vật cụ thể. Mẫu này sau đó được so sánh với đầu vào chuỗi thứ hai. Nếu mẫu tồn tại dưới dạng một chuỗi con trong đầu vào thứ hai, ngược lại True, trả về False. Khi một mẫu được tìm thấy trong từ, chương trình sẽ ngừng tìm kiếm và trả về True.

Ví dụ

Hoa văn: "XXYY"

succeed ---> True (pattern found: ccee)
success ---> False (pattern not matched)
balloon ---> True (pattern found: lloo)

Hoa văn: "XYXYZ"

bananas ---> True (pattern found: nanas)
banana  ---> False (pattern not found)
  • Lưu ý: Đây không phải là đầu vào thực tế. Đây là một ví dụ về cách chương trình nên hoạt động. Chương trình của bạn sẽ xuất Truehoặc False, hoặc các giá trị Truthy / Falsy khác.

Thông tin quan trọng / hữu ích khác

  • Mẫu không cần chứa X, Y và Z, nó có thể chứa X và Y hoặc thậm chí (mặc dù hơi vô nghĩa) chỉ X.
  • Mẫu không thể để trống, nhưng mẫu này sẽ không được sử dụng làm trường hợp thử nghiệm.
  • Chuỗi tìm kiếm sẽ không trống và sẽ là chữ thường.
  • Thứ tự chữ cái của X, Y và Z trong mẫu không quan trọng.
  • X, Y và Z phải là các ký tự duy nhất.
  • Bạn có thể sử dụng bất kỳ thư viện nào bạn muốn.
  • Điểm số được xác định bởi kích thước mã , tính bằng byte. Điểm số thấp nhất chiến thắng.

Chúc may mắn!


Các mô hình có thể là bất cứ điều gì. Tôi có lẽ nên đề cập rằng mẫu không nhất thiết phải có X, Y và Z, nó có thể chỉ có X và Y. Những mẫu đó chỉ là ví dụ, vì vậy, hãy thoải mái đưa ra mẫu của riêng bạn ví dụ với những mẫu đó.
notHalfBad

Bạn có ý nghĩa gì "mô hình tồn tại"? Là một đoạn liền kề? Là một chuỗi con? Có thể nói, X và Y đại diện cho cùng một thứ không?
xnor

@xnor X và Y phải độc lập với nhau, và ý của tôi là mẫu hiện có là bất cứ nơi nào trong chuỗi đều có một chuỗi con khớp với mẫu. Tôi sẽ thêm những điều này vào mô tả thách thức của tôi để làm rõ.
notHalfBad

3
Liên quan. (Điều tương tự, nhưng yêu cầu chính xác các mẫu phù hợp, không phải cho các chuỗi con.)
Martin Ender

4
Thêm chi tiết: Mẫu có thể để trống không? Chuỗi tìm kiếm? Chuỗi tìm kiếm sẽ chỉ sử dụng chữ cái viết thường? Mẫu sẽ được sắp xếp theo thứ tự abc trước trong số các mẫu tương đương, tức là sử dụng X trước sau đó là Y sau đó là Z?
xnor

Câu trả lời:


12

Perl 5 , 85 byte

Đã lưu 40 byte nhờ đề xuất của Peter Taylor! (xem phiên bản cũ hơn của tôi dưới đây để thấy sự khác biệt)

83 byte mã + -plcờ.

s/./$h{$&}?"\\$h{$&}":($h{$&}=$.,join("",map"(?!\\$_)",1..$.++)."(.)")/ge;$_=<>=~$_

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

XYXYZ được chuyển thành ((?!\1).)((?!\1)(?!\2).)\1\2((?!\1)(?!\2)(?!\3).)(yup, một số thử nghiệm không thể đúng, nhưng nó ngắn hơn theo cách đó) và đầu vào thứ hai sau đó được kiểm tra theo biểu thức chính quy đó. (xem phần giải thích về phiên bản cũ hơn của tôi để có thêm trực giác về cách thức hoạt động của nó)


Phiên bản cũ hơn của tôi:
Cảm ơn Arnauld vì đã chỉ ra một lỗi tôi đã mắc phải trong phiên bản đầu tiên của mình.
113 byte mã + -plcờ và -Mre=eval.

s/./$h{$&}?"\\$h{$&}":($h{$&}=++$i,"(.)")/ge;$_.='(?{++$c;$\=1if!grep$v{$c}{${$_}}++,1..'.(keys%h).'})^';<>=~$_}{

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

Trong ví dụ XYXYZ: regex đầu tiên sẽ chuyển đổi mẫu thành (.) (.) \ 1 \ 2 (.) Và thêm vào cuối một bài kiểm tra để kiểm tra xem $1, $2$3có khác không: nếu vậy, $\được đặt thành một. Sau đó, đầu vào thứ hai là các thử nghiệm đối với biểu thức chính quy này và $\được in ngầm ở cuối.
Regex được tạo cho XYXYZ là (.)(.)\1\2(.)(?{++$c;$\=1if!grep{$v{$c}{${$_}}++}1..3})^.
(Tôi sẽ thêm một chút chi tiết vào phần giải thích khi tôi có thời gian)


Vì vậy, sử dụng regex để biến non-regex thành regex? coolio
Matthew Roh

@Arnauld Thật vậy, cảm ơn. (Tôi phải đọc thử thách quá nhanh, xấu của tôi). Phải tăng gấp đôi số lượng để sửa nó, nhưng nó hoạt động ngay bây giờ!
Dada

Nó sẽ không phải là golfer để tạo ra một regex như thế (.)((?!\1).)\1\2((?!\1)(?!\2).)nào?
Peter Taylor

@Peter Taylor có thể .. Tôi mơ hồ nghĩ về nó, nhưng dường như khó hơn (đọc lâu hơn) để tạo ra .. Tôi sẽ có một cái nhìn khác khi tôi có một khoảnh khắc.
Dada

@Peter Taylor nevermind, nó sẽ ngắn hơn 30 byte; Tôi sẽ cập nhật nó một chút, cảm ơn :)
Dada

10

Thạch , 9 byte

=þ
ẆÇ€ċÇ}

Trả về số lần mẫu được tìm thấy, khác không là trung thực và không là sai.

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

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

ẆÇ€ċÇ}  Main link. Left argument: s (string). Right argument: p (pattern)

Ẇ       Window; generate all substrings of s.
 ǀ     Map the helper link over the substrings.
    Ç}  Apply the helper link to p.
   ċ    Count the number of times the right result appears in the left result.


=þ      Helper link. Argument: t (string)

=þ      Compare all characters of t for equality with all characters of t, yielding
        a square matrix of Booleans.

8

JavaScript (ES6), 94 byte

f=
(p,s)=>s.match(p.replace(/./g,c=>m[c]||(t=r,r=`(?!\\${++g})`+r,m[c]=`\\`+g,t),g=m=[],r=`(.)`))
<div oninput=o.textContent=!!f(p.value,s.value)><input id=p placeholder=Pattern><input id=s placeholder=String><span id=o>

Hoạt động bằng cách chuyển đổi mô hình thành biểu thức chính quy, ví dụ: XYXYZnó tạo ra/(.)(?!\1)(.)\1\2(?!\2)(?!\1)(.)/ .

Tôi nhận thấy một sự khác biệt thú vị giữa PCRE và JavaScript regrec: trong PCRE, \<n>thất bại (và do đó (?!\<n>)thành công) trước khi nhóm chụp được xác định, trong khi JavaScript, nó khớp với chuỗi trống (và do đó (?!\<n>)không thành công).


7

Python 2 , 70 byte

f=lambda p,s:s>''and(map(s.find,s[:len(p)])==map(p.find,p))|f(p,s[1:])

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

Kiểm tra xem một chuỗi có khớp với một mẫu bằng phương thức trong câu trả lời này không . Sử dụng tiền tố của chuỗi tìm kiếm có độ dài bằng mẫu. Loại bỏ ký tự đầu tiên của chuỗi chuỗi cho đến khi tìm thấy kết quả khớp hoặc Falsenếu nó trở nên trống rỗng


73 byte:

f=lambda p,s:s>''and(map(s.find,s)==map(p.find,p))|f(p,s[1:])|f(p,s[:-1])

Dùng thử trực tuyến

Kiểm tra xem một chuỗi có khớp với mẫu bằng phương thức trong không câu trả lời này không . Kiểm tra đệ quy tất cả các chuỗi con bằng cách phân nhánh để loại bỏ ký tự đầu tiên hoặc cuối cùng cho đến khi chuỗi trống.



4

05AB1E , 19 16 byte

ÙœJv¹y…XYZ‡²åi1q

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


ÙœJ              # Get powerset of all unique characters in string.
   v             # Loop through each...
    ¹            # Push input word.
     y           # Push current set of letters in powerset.
      …XYZ‡      # Replace each of the 3 letters in the original word with XYZ.
           ²å    # Check if second input is in this string, push 1 if it is.
             i1q # If 1, push 1 and quit.

Sẽ trả về 1 nếu đúng, null nếu không đúng.


Đây có thể là 14 byte nếu trả về các giá trị có thể có của XYZ:

05AB1E , 14 byte

ÙœJv¹y…XYZ‡²å—

Dùng thử trực tuyến 2!


Giả sử rằng một chuỗi không trống là trung thực trong 05AB1E và rằng một chuỗi trống là sai, phiên bản thứ hai của bạn phải tuân thủ thông số kỹ thuật.
Dennis

1
Kết quả sai khi nhập "abcd" và "XYZZ". Bạn cần thêm một chữ cái thứ tư như một sự thay thế mặc định.
GB

@Dennis: Nếu chúng tôi đi theo meta post, các giá trị trung thực duy nhất trong 05AB1E là 1True(thường là nhược điểm của các loại thử thách này), nhưng nếu thông số thử thách có thể được hiểu là cho phép chúng tôi xác định sự thật / giả dối cho thử thách phiên bản thứ hai hoạt động như bạn nói.
Emigna

@Emigna Ồ, tôi không biết điều đó.
Dennis

4

Java 7, 177 176 173 byte

Object c(String p,String s){int i=p.length();if(s.length()<i)return 0>1;for(;i-->0;)if(p.indexOf(p.charAt(i))!=s.indexOf(s.charAt(i)))return c(p,s.substring(1));return 1>0;}

Giải trình:

Object c(String p, String s){                             // Method with two String parameters and Object return-type
  int i = p.length();                                     //  Index that starts at the length of the pattern
  if(s.length() < i)                                      //  If the length of the input is smaller than the length of the pattern
    return 0>1;//false                                    //   Simply return false
  for(;i-->0;)                                            //  Loop from 0 to length_of_pattern
    if(p.indexOf(p.charAt(i)) != s.indexOf(s.charAt(i)))  //   If the index of the characters of the pattern and input aren't matching
     return c(p, s.substring(1));                         //    Return the recursive-call of pattern and input minus the first character
                                                          //  End of loop (implicit / single-line body)
  return 1>0;//true                                       //  If every index of the characters are matching: return true
}                                                         // End of method

Mã kiểm tra:

Hãy thử nó ở đây.

class M{
  static Object c(String p,String s){int i=p.length();if(s.length()<i)return 0>1;for(;i-->0;)if(p.indexOf(p.charAt(i))!=s.indexOf(s.charAt(i)))return c(p,s.substring(1));return 1>0;}

  public static void main(String[] a){
    System.out.println(c("XXYY", "succeed"));
    System.out.println(c("XXYY", "success"));
    System.out.println(c("XXYY", "balloon"));

    System.out.println(c("XYXYZ", "bananas"));
    System.out.println(c("XYXYZ", "banana"));
  }
}

Đầu ra:

true
false
true
true
false

4

PHP, 89 byte

Quà tặng từ @Christoph @Titus

for(;$v=$argv[1][$i++];)$r.=$$v?"\\".$$v:"(.)".!$$v=++$j;echo preg_match("#$r#",$argv[2]);

PHP, 105 byte

Quà tặng từ @Christoph

foreach(str_split($argv[1])as$v)$r.=$x[$v]?"\\$x[$v]":"(.)".!$x[$v]=++$y;echo preg_match("#$r#",$argv[2]);

PHP, 167 byte

[,$a,$b]=$argv;foreach($s=str_split($a)as$v)$r[]=$k++>strpos($a,$v)?"\\".(1+array_search($v,array_keys(array_count_values($s)))):"(.)";echo preg_match(_.join($r)._,$b);

1
Bạn sẽ có thể lưu 2 byte bằng cách sử dụng ++$pthay vì ($p+1), mặc dù tôi chưa thực sự kiểm tra nó.
dùng59178

1
Không làm việc cho tôi: Sandbox . Dù sao, một phiên bản golfed của mã : [,$a,$b]=$argv;foreach(str_split($a)as$k=>$v)$r.=$k==($p=strpos($a,$v))?"(.)":"\\".++$p;echo preg_match("#$r#",$b);.
Christoph

1
Hãy coi đây là một món quà: [,$a,$b]=$argv;foreach(str_split($a)as$v)$r.=$x[$v]?"\\$x[$v]":'(.)'.!$x[$v]=++$y;echo preg_match("#$r#",$b);(Lưu ý rằng bạn nên giữ điểm số cũ của mình bằng cách sử dụng <strike>)
Christoph

1
@Christoph Một món quà là nỗ lực học tập với !. Đó là giá trị hơn sau đó những điểm mà tôi có thể đạt được với giải pháp tốt đẹp của bạn.
Jörg Hülsermann

1
Tôi đếm 109, không phải 108. -3 byte nếu bạn không sao chép $argvvào $a$b; -6 byte với for(;a&$v=$argv[1][$i++];); -1 byte với tên biến dài hơn ( thực sự ! : Sử dụng $vvthay vì $v, $iithay vì $i, $rrthay vì $r, $yythay vì $yvà bạn có thể sử dụng $$vvthay vì $x[$v])
Titus

4

C #, 184 165 155 byte

cảm ơn aloisdg!

bool c(string p,string n){for(int l=p.Length,i=0,j;i<l;i++)for(j=i;j>=0;)if(p[i]==p[j]==(n[i]!=n[j--]))return l!=n.Length&&c(p,n.Substring(1));return 2>1;}

giải pháp quay lui, như một phần thưởng, nó hoạt động với một mô hình với bất kỳ ký tự nào!

    public static bool c(string p,string n)
    {
        for (int l = p.Length, i = 0, j; i < l; i++)
            for (j = i; j >= 0;)
                if (p[i]==p[j]==(n[i]!=n[j--]))
                    return l != n.Length && c(p,n.Substring(1));
        return 2>1;
    }

Tôi chỉ nhận thấy việc chơi golf bị lộ logic mà tôi không sử dụng, sẽ cập nhật sớm
downrep_nation 14/03/2017

2
Trước hết, tại sao var s=l==n.Length;? Bạn chỉ sử dụng nó tại return s?!s:(nơi !sluôn luôn false), vì vậy nó có thể được thay đổi thành return l==n.Length?0>1:. Ngoài ra, đây là gì : (n[i]!=n[j]||n[i]!=n[j]). Bạn kiểm tra n[i]!=n[j]hai lần .. Điều này sẽ luôn là true or true/ false or false..: S
Kevin Cruijssen 14/03/2017

Việc kiểm tra kép thực sự còn sót lại từ một hệ thống lớn hơn nếu biến mất trong môn đánh gôn, vì vậy nó đã được sử dụng rất nhiều, tôi sẽ cải thiện nó hơn nữa. Cảm ơn!
hạ cấp

Bạn có thể decal tất cả các biến của bạn trong một dòngint l = p.Length,i = 0, j;
aloisdg nói Phục hồi lại

Có thể di chuyển của bạn i++j--bên trong vòng lặp for. ví dụ:for(j=i;j>=0;)if(p[i]==p[j]==(n[i]!=n[j--]))
aloisdg nói Phục hồi lại

3

Ruby, 63 61 byte

->a,b{a.chars.permutation.any?{|w|a.tr((w|[])*'','XYZW')[b]}}

Thay vì tìm kiếm mẫu biểu thức chính quy, chỉ cần thử thay thế 'X', 'Y' và 'Z' theo tất cả các cách có thể và tìm một kết quả khớp theo nghĩa đen.

(Trên thực tế khái niệm tương tự như câu trả lời 05AB1E của carusocomputing)


2

JavaScript (ES6), 92 89 87 86 byte

Đưa đầu vào p(mẫu) và s(chuỗi) theo cú pháp currying(p)(s) . Trả về 0/ 1.

p=>g=s=>s&&g(s.slice(1))|[...p].every((C,i,x)=>C==(x[c=s[i]]=x[c]||'XYZ'[c&&j++]),j=0)

Định dạng và nhận xét

p =>                             // main function: takes pattern p as input, returns g
  g = s =>                       // g = recursive function: takes string s as input
    s &&                         // if s is not empty:
      g(s.slice(1))              //   do a recursive call, starting at the next character
    |                            // merge the result with this iteration
    [...p].every((C, i, x) =>    // for each character C at position i in p:
      C ==                       //   check whether C is matching the next expected
      (                          //   character, which is either:
        x[c = s[i]] = x[c] ||    //   - a substitution character already associated to s[i]
        'XYZ'[c && j++]          //   - the next substitution character ('X', 'Y' or 'Z')
      ),                         //   - undefined if c = s[i] doesn't exist or j > 2
      j = 0                      //   initialize j = pointer in 'XYZ'
    )                            //

Các trường hợp thử nghiệm

let f =

p=>g=s=>s&&g(s.slice(1))|[...p].every((C,i,x)=>C==(x[c=s[i]]=x[c]||'XYZ'[c&&j++]),j=0)

console.log(f("XXYY")("succeed"))   // 1
console.log(f("XXYY")("success"))   // 0
console.log(f("XXYY")("balloon"))   // 1
console.log(f("XYXYZ")("bananas"))  // 1
console.log(f("XYXYZ")("banana"))   // 0


0

Mathicala 18 ký tự (không tính chuỗi & mẫu)

StringContainsQ[string,pattern]

Ví dụ:

StringContainsQ["succeed", x_ ~~ x_ ~~ y_ ~~ y_]

True

StringContainsQ["bananas", x_ ~~ y_ ~~ x_ ~~ y_ ~~ z_]

True


Điều này không hợp lệ vì nó không lấy chuỗi và mẫu làm đầu vào chuỗi theo yêu cầu.
lirtosiast
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.