รหัสท้าทายกอล์ฟง่าย ๆ : รูปแบบตัวละคร!


22

ในการท้าทายนี้คุณจะได้รับสตริงเป็นอินพุตที่มีสตริงของ X, Y และ Z เช่น "XYZZ" X, Y และ Z เป็นตัวแทนของตัวละครโดยเฉพาะ รูปแบบนี้จะถูกเปรียบเทียบกับอินพุตสตริงที่สอง หากรูปแบบที่มีอยู่เป็น substring ในการป้อนข้อมูลที่สองกลับมามิฉะนั้นผลตอบแทนTrue เมื่อรูปแบบที่พบในคำว่าโปรแกรมหยุดการค้นหาและผลตอบแทนFalseTrue

ตัวอย่าง

รูปแบบ: "XXYY"

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

รูปแบบ: "XYXYZ"

bananas ---> True (pattern found: nanas)
banana  ---> False (pattern not found)
  • หมายเหตุ: นี่ไม่ใช่อินพุตจริง นี่คือตัวอย่างของวิธีที่โปรแกรมควรทำงาน โปรแกรมของคุณควรส่งออกTrueหรือFalseหรือค่า Truthy / Falsy อื่น ๆ

ข้อมูลสำคัญ / มีประโยชน์อื่น ๆ

  • รูปแบบไม่จำเป็นต้องมี X, Y และ Z มันอาจมี X และ Y หรือแม้กระทั่ง (แม้ว่าจะไม่มีจุดหมาย) แม้เพียง X
  • รูปแบบต้องไม่ว่างเปล่า แต่จะไม่ใช้เป็นกรณีทดสอบ
  • สตริงการค้นหาจะไม่ว่างเปล่าและจะเป็นตัวพิมพ์เล็ก
  • ลำดับตัวอักษรของ X, Y และ Z ในรูปแบบไม่สำคัญ
  • X, Y และ Z ต้องเป็นอักขระที่ไม่ซ้ำกัน
  • คุณสามารถใช้ห้องสมุดใดก็ได้ที่คุณต้องการ
  • คะแนนจะถูกกำหนดโดยขนาดรหัสเป็นไบต์ คะแนนต่ำสุดชนะ

โชคดี!


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

คุณหมายถึง "รูปแบบที่มีอยู่"? ในฐานะที่เป็นก้อนที่ต่อเนื่องกัน? เป็นซับสตริงหรือไม่? สามารถพูดว่า X และ Y ยืนหยัดเพื่อสิ่งเดียวกันได้หรือไม่?
xnor

@ xnor X และ Y ต้องเป็นอิสระจาก eachother และสิ่งที่ฉันหมายถึงโดยรูปแบบที่มีอยู่คือที่ใดก็ได้ในสตริงที่มีสตริงย่อยที่ตรงกับรูปแบบ ฉันจะเพิ่มสิ่งเหล่านี้ลงในคำอธิบายการท้าทายของฉันเพื่อชี้แจง
ครึ่ง

3
ที่เกี่ยวข้อง (สิ่งเดียวกัน แต่ขอให้ตรงกับรูปแบบที่แน่นอนไม่ใช่สำหรับสายย่อย)
Martin Ender

4
รายละเอียดเพิ่มเติม: รูปแบบว่างเปล่าได้ไหม สตริงการค้นหา? สตริงการค้นหาจะใช้อักษรตัวพิมพ์เล็กเท่านั้นหรือไม่ รูปแบบจะเป็นตัวอักษรตามลำดับแรกในรูปแบบที่เทียบเท่ากันคือใช้ X ก่อนแล้วจึง Y ตามด้วย Z
xnor

คำตอบ:


12

Perl 5 , 85 ไบต์

บันทึก 40 ไบต์ด้วยคำแนะนำของ Peter Taylor! (ดูรุ่นเก่าของฉันร้องเพื่อดูความแตกต่าง)

83 ไบต์ของรหัส + -plธง

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

ลองออนไลน์!

XYXYZ ถูกแปลงเป็น((?!\1).)((?!\1)(?!\2).)\1\2((?!\1)(?!\2)(?!\3).)(yup, การทดสอบบางอย่างไม่เป็นความจริง แต่มันสั้นกว่านั้น) และข้อมูลที่สองจะถูกตรวจสอบกับ regex นั้น (ดูคำอธิบายของรุ่นเก่าของฉันเพื่อรับปรีชาว่ามันทำงานอย่างไร)


รุ่นเก่าของฉัน:
ขอบคุณ Arnauld ที่ชี้ให้เห็นข้อผิดพลาดที่ฉันทำในรุ่นแรกของฉัน
113 ไบต์ของรหัสเมือง + ธงและ-pl-Mre=eval

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

ลองออนไลน์!

บนตัวอย่าง XYXYZ: (.) (.) (.) The regex แรกที่จะแปลงรูปแบบไป \ 1 \ 2 และเพิ่มที่สิ้นสุดการทดสอบเพื่อตรวจสอบว่า$1, $2และ$3มีความแตกต่าง: ถ้าเป็นเช่นนั้น$\จะถูกตั้งค่าให้เป็นหนึ่ง จากนั้นอินพุตที่สองจะทดสอบกับ regex นี้และ$\จะถูกพิมพ์โดยไม่สิ้นสุดที่ส่วนท้าย
regex ที่สร้างขึ้นสำหรับ XYXYZ (.)(.)\1\2(.)(?{++$c;$\=1if!grep{$v{$c}{${$_}}++}1..3})^คือ
(ฉันจะเพิ่มรายละเอียดเพิ่มเติมเล็กน้อยในคำอธิบายเมื่อฉันมีเวลา)


ดังนั้นการใช้ regex เพื่อเปิดไม่ใช่ regex เพื่อ regex? coolio
Matthew Roh

@Annauld แน่นอนขอบคุณ (ฉันต้องอ่านการท้าทายเร็วเกินไปไม่ดี) ต้องทวีคูณเป็นสองเท่าเพื่อแก้ไข แต่ตอนนี้ใช้งานได้!
Dada

มันจะไม่นักกอล์ฟที่จะสร้าง regex (.)((?!\1).)\1\2((?!\1)(?!\2).)หรือไม่?
ปีเตอร์เทย์เลอ

@ ปีเตอร์เทย์เลอร์อาจจะ .. ฉันคิดว่ามันคลุมเครือ แต่มันดูยากขึ้น (อ่านให้นานขึ้น) เพื่อสร้าง .. ฉันจะมีหน้าตาอีกแบบเมื่อฉันมีเวลา
Dada

@ Peter Taylor ไม่เป็นไรมันจะสั้นลง 30 ไบต์ ฉันจะอัปเดตในไม่ช้าขอบคุณ :)
Dada

10

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

=þ
ẆÇ€ċÇ}

ส่งคืนจำนวนครั้งที่พบรูปแบบไม่ใช่ความจริงและไม่มีศูนย์เป็นเท็จ

ลองออนไลน์!

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

ẆÇ€ċÇ}  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 ไบต์

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>

ทำงานโดยการเปลี่ยนรูปแบบการลงกับ regexp เช่นการสร้างXYXYZ/(.)(?!\1)(.)\1\2(?!\2)(?!\1)(.)/

ฉันสังเกตเห็นความแตกต่างที่น่าสนใจระหว่าง PCRE และ JavaScript regexp: ใน PCRE \<n>ล้มเหลว (และดังนั้นจึง(?!\<n>)สำเร็จ) ก่อนกำหนดกลุ่มการดักจับในขณะที่ JavaScript มันตรงกับสตริงว่างเปล่า (ดังนั้นจึง(?!\<n>)ล้มเหลว)


7

Python 2 , 70 ไบต์

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

ลองออนไลน์!

ตรวจสอบว่าสตริงตรงกับรูปแบบโดยใช้วิธีการในคำตอบนี้ ใช้ส่วนนำหน้าของสตริงการค้นหาที่มีความยาวเท่ากับรูปแบบ ตัดอักขระตัวแรกของสตริงสตริงออกจนกว่าจะพบการจับคู่หรือFalseถ้าว่างเปล่า


73 ไบต์:

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

ลองออนไลน์

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



4

05AB1E , 19 16 ไบต์

ÙœJv¹y…XYZ‡²åi1q

ลองออนไลน์!


Ùœ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.

จะส่งคืน 1 ถ้าเป็นจริงเป็นโมฆะหากไม่เป็นจริง


สามารถเป็น 14 ไบต์หากอนุญาตให้ส่งคืนค่า XYZ ที่เป็นไปได้:

05AB1E , 14 ไบต์

ÙœJv¹y…XYZ‡²å—

ลองออนไลน์ 2!


สมมติว่าสตริงที่ไม่ว่างนั้นเป็นจริงใน 05AB1E และสตริงว่างนั้นเป็นเท็จรุ่นที่สองของคุณควรเป็นไปตามข้อกำหนด
Dennis

1
ผลลัพธ์ผิดพลาดในการป้อนข้อมูล "abcd" และ "XYZZ" คุณต้องเพิ่มตัวอักษรตัวที่สี่เป็นการทดแทนค่าเริ่มต้น
GB

@Dennis: ถ้าเราไปโดยเมตาโพสต์ค่าความจริงเพียงอย่างเดียวใน 05AB1E คือ1และTrue(ซึ่งมักจะเป็นข้อเสียเปรียบสำหรับความท้าทายเหล่านี้) แต่ถ้าตีความความท้าทายสามารถตีความได้ว่าช่วยให้เราสามารถกำหนดความจริง / เท็จสำหรับความท้าทาย รุ่นที่สองใช้งานได้ตามที่คุณพูด
Emigna

@ Emigna โอ้ฉันไม่รู้ตัว
Dennis

4

Java 7, 177 176 173 ไบต์

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

คำอธิบาย:

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

รหัสทดสอบ:

ลองที่นี่

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

เอาท์พุท:

true
false
true
true
false

4

PHP, 89 ไบต์

ของขวัญจาก@Christophและ@Titus

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

PHP, 105 ไบต์

ของขวัญจาก @Christoph

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

PHP, 167 ไบต์

[,$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
คุณควรจะสามารถบันทึกได้ 2 ไบต์โดยใช้++$pแทน($p+1)แม้ว่าฉันจะไม่ได้ทำการทดสอบ
user59178

1
ไม่ทำงานสำหรับฉัน: Sandbox [,$a,$b]=$argv;foreach(str_split($a)as$k=>$v)$r.=$k==($p=strpos($a,$v))?"(.)":"\\".++$p;echo preg_match("#$r#",$b);อย่างไรก็ตามรุ่นแข็งแรงเล่นกอล์ฟของรหัส:
Christoph

1
ใช้เป็นของขวัญ: [,$a,$b]=$argv;foreach(str_split($a)as$v)$r.=$x[$v]?"\\$x[$v]":'(.)'.!$x[$v]=++$y;echo preg_match("#$r#",$b);(โปรดทราบว่าคุณควรใช้คะแนนเดิมของคุณโดยใช้<strike>)
Christoph

1
@Christoph !ของขวัญเป็นความพยายามในการเรียนรู้ด้วย มันคุ้มค่ากับคะแนนที่ฉันจะได้รับจากทางออกที่ดีของคุณ
JörgHülsermann

1
ฉันนับ 109 ไม่ 108. -3 ไบต์ถ้าคุณไม่คัดลอก$argvไป$aและ$b; -6 ไบต์ด้วยfor(;a&$v=$argv[1][$i++];); -1 ไบต์ที่มีชื่อตัวแปรที่ยาวกว่า ( แน่นอน! : ใช้$vvแทน$v, $iiแทน$i, $rrแทนที่จะเป็น$r, $yyแทนที่จะเป็น$yและคุณสามารถใช้$$vvแทนได้$x[$v])
Titus

4

C #, 184 165 155 ไบต์

ขอบคุณ 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;}

วิธีการแก้ปัญหาย้อนรอยเป็นโบนัสมันทำงานร่วมกับรูปแบบกับตัวละครใด ๆ !

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

ฉันเพิ่งสังเกตว่ามันเล่นกับลอจิกที่ฉันไม่ได้ใช้จะอัปเดตในเร็ว ๆ นี้
downrep_nation

2
ครั้งแรกของทั้งหมดว่าทำไมvar s=l==n.Length;? คุณจะใช้มันในreturn s?!s:(ที่!sอยู่เสมอfalse) return l==n.Length?0>1:ดังนั้นจึงสามารถเปลี่ยนเป็น สิ่งนี้คืออะไร: (n[i]!=n[j]||n[i]!=n[j]). คุณตรวจสอบn[i]!=n[j]สองครั้ง .. นี่จะเป็นtrue or true/ false or false.. : S
Kevin Cruijssen

ตรวจสอบอีกครั้งจริง ๆ ที่เหลือจากที่ใหญ่กว่าถ้าระบบที่หายไปในการเล่นกอล์ฟดังนั้น s ถูกใช้มากฉันจะปรับปรุงมันต่อไป ขอบคุณ!
downrep_nation

คุณสามารถเขียนตัวแปรของคุณทั้งหมดในบรรทัดเดียวint l = p.Length,i = 0, j;
aloisdg พูดว่า Reinstate Monica

สามารถย้ายของคุณi++และของคุณj--ภายในสำหรับวง ตัวอย่างเช่น:for(j=i;j>=0;)if(p[i]==p[j]==(n[i]!=n[j--]))
aloisdg พูดว่า Reinstate Monica

3

ทับทิม, 63 61 ไบต์

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

แทนที่จะค้นหารูปแบบ regex เพียงลองแทนที่ 'X', 'Y' และ 'Z' ด้วยวิธีที่เป็นไปได้ทั้งหมดและค้นหาการจับคู่ตัวอักษร

(อันที่จริงแนวคิดเดียวกันกับคำตอบ 05AB1E ของ carusocomputing)


2

JavaScript (ES6), 92 89 87 86 ไบต์

จะเข้าp(รูปแบบ) และs(สตริง) (p)(s)ในไวยากรณ์ ผลตอบแทน/01

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)

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

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'
    )                            //

กรณีทดสอบ

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

Mathematica 18 ตัวอักษร (ไม่นับสตริงและลวดลาย)

StringContainsQ[string,pattern]

ตัวอย่าง:

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

True

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

True


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