সাধারণ কোড গল্ফ চ্যালেঞ্জ: চরিত্র নিদর্শন!


22

এই চ্যালেঞ্জে আপনি এক্স, ওয়াই এবং জেড এর উদাহরণস্বরূপ স্ট্রিং সহ ইনপুট হিসাবে একটি স্ট্রিং পাবেন। "XYZZ"। এক্স, ওয়াই এবং জেড একটি নির্দিষ্ট চরিত্রের প্রতিনিধিত্ব করে। এই প্যাটার্নটি তখন দ্বিতীয় স্ট্রিং ইনপুটটির সাথে তুলনা করা হয়। যদি দ্বিতীয় ইনপুটটিতে প্যাটার্নটি একটি স্ট্রিং হিসাবে উপস্থিত থাকে তবে Trueঅন্যথায় ফিরে আসুন False। একবার শব্দের মধ্যে কোনও নিদর্শন পাওয়া গেলে প্রোগ্রামটি অনুসন্ধান বন্ধ করে ফিরে আসে True

উদাহরণ

প্যাটার্ন: "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, বা অন্যান্য সত্যবাদী / মিথ্যা মানগুলি হওয়া উচিত।

অন্যান্য গুরুত্বপূর্ণ / দরকারী তথ্য

  • প্যাটার্নটিতে একটি এক্স, ওয়াই এবং জেড থাকা দরকার নেই, এটিতে এক্স এবং ওয়াই বা এমনকি (যদিও কিছুটা অর্থহীন) কেবল এক্স এর থাকতে পারে।
  • প্যাটার্নটি খালি থাকতে পারে না, তবে এটি পরীক্ষার কেস হিসাবে ব্যবহৃত হবে না।
  • অনুসন্ধানের স্ট্রিং খালি থাকবে না, এবং ছোট হাতের অক্ষরে থাকবে।
  • প্যাটার্নে X, Y এবং Z এর বর্ণমালা ক্রম কিছু যায় আসে না।
  • এক্স, ওয়াই এবং জেড অবশ্যই অনন্য অক্ষর হতে হবে
  • আপনি যে কোনও লাইব্রেরি ব্যবহার করতে পারেন।
  • স্কোরটি কোড আকার দ্বারা , বাইটে নির্ধারিত হয় । সর্বনিম্ন স্কোর জয়।

শুভকামনা!


প্যাটার্নটি যে কোনও কিছু হতে পারে। আমার সম্ভবত উল্লেখ করা উচিত ছিল যে প্যাটার্নটিতে একটি এক্স, ওয়াই এবং জেড থাকতে হবে না, এটিতে কেবল একটি এক্স এবং ওয়াই থাকতে পারে Those এই নিদর্শনগুলি কেবল উদাহরণ, যদিও, নিজের সাথে নির্দ্বিধায় আসতে অনুভব করুন সেই নিদর্শনগুলির সাথে উদাহরণ।
notHalfBad

"প্যাটার্নটি বিদ্যমান" আপনার অর্থ কী? একটি সংলগ্ন অংশ হিসাবে? সাবস্ট্রিং হিসাবে? বলতে পারেন, এক্স এবং ওয়াই একই জিনিসটির পক্ষে দাঁড়াবেন?
xnor

@ এক্সনর এক্স এবং ওয়াই অবশ্যই প্রত্যেকের থেকে পৃথক হতে হবে এবং আমি যে প্যাটার্নটি বিদ্যমান তা বলতে পারা যায় যে স্ট্রিংয়ের যে কোনও জায়গায় প্যাটার্নের সাথে মেলে এমন একটি স্ট্রিং রয়েছে। আমি এগুলিকে আমার চ্যালেঞ্জের বর্ণনায় স্পষ্ট করে যোগ করব।
notHalfBad

3
সম্পর্কিত। (একই কথা, তবে সাবস্ট্রিংয়ের জন্য নয়, প্যাটার্নটির সঠিক মিলগুলির জন্য জিজ্ঞাসা করে))
মার্টিন ইন্দার

4
আরও বিশদ: প্যাটার্নটি কি খালি থাকতে পারে? অনুসন্ধানের স্ট্রিং? অনুসন্ধানের স্ট্রিংটি কি কেবল ছোট হাতের অক্ষর ব্যবহার করবে? সমতুল্য নিদর্শনগুলির মধ্যে প্যাটার্নটি বর্ণানুক্রমিকভাবে প্রথম হবে, অর্থাত প্রথমে এক্স ব্যবহার করবে তারপর Y তারপর জেড?
এক্সনোর

উত্তর:


12

পার্ল 5 , 85 বাইট

পিটার টেলরের পরামর্শের জন্য 40 বাইট সংরক্ষণ করা হয়েছে! (পার্থক্যগুলি দেখতে আমার পুরানো সংস্করণটি নীচে দেখুন)

কোড + -plপতাকা 83 বাইট ।

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

এটি অনলাইন চেষ্টা করুন!

XYXYZ রূপান্তরিত হয়েছে ((?!\1).)((?!\1)(?!\2).)\1\2((?!\1)(?!\2)(?!\3).)(হ্যাঁ, কয়েকটি পরীক্ষা সত্য হতে পারে না, তবে এটি সেইরকম ছোট), এবং দ্বিতীয় ইনপুটটি সেই রেজেজের বিরুদ্ধে পরীক্ষা করা হয়। (এটি কীভাবে কাজ করে তার আরও অন্তর্দৃষ্টি পেতে আমার পুরানো সংস্করণটির ব্যাখ্যা দেখুন)


আমার পুরানো সংস্করণ:
আমার প্রথম সংস্করণে আমি যে ভুল করেছি তা নির্দেশ করার জন্য আরনাউল্ডকে ধন্যবাদ।
113 বাইট কোড + -plপতাকা এবং -Mre=eval

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

এটি অনলাইন চেষ্টা করুন!

(।) (।) (।): উদাহরণস্বরূপ XYXYZ প্রথম Regex প্যাটার্ন রূপান্তর করবে \ 1 \ 2, এবং শেষে যদি চেক করতে একটি পরীক্ষা যোগ $1, $2এবং $3বিভিন্ন আছেন: যদি তাই হয়, $\এক সেট করা হয়। তারপরে, দ্বিতীয় ইনপুটটি এই রেজেক্সের বিরুদ্ধে টেস্টস, এবং জড়িতভাবে $\শেষে মুদ্রিত হয়।
এক্সওয়াইএক্সওয়াইজেডের জন্য উত্পন্ন রেইজেক্সটি (.)(.)\1\2(.)(?{++$c;$\=1if!grep{$v{$c}{${$_}}++}1..3})^
(আমি যখন আমার একটি মুহুর্ত থাকি তখন ব্যাখ্যাগুলিতে কিছুটা বিশদ যুক্ত করব)


সুতরাং, নন-রেইজেক্সকে রেজেক্সে পরিণত করতে রেজেক্স ব্যবহার করছেন? কুলিও
ম্যাথু রোহ

@ আরনাউল্ড প্রকৃতপক্ষে, ধন্যবাদ। (আমি অবশ্যই চ্যালেঞ্জটি খুব দ্রুত পড়েছি, আমার খারাপ)। এটি ঠিক করার জন্য বাই-কাউন্ট দ্বিগুণ করতে হয়েছিল, তবে এটি এখন কাজ করে!
দাদা

এটি কি গল্ফিয়ের মতো একটি রেইজেক্স তৈরি করতে হবে না (.)((?!\1).)\1\2((?!\1)(?!\2).)?
পিটার টেলর

@ পিটার টেইলর সম্ভবত .. আমি অস্পষ্টভাবে এটি সম্পর্কে ভেবেছিলাম, তবে এটি উত্পন্ন করা কঠিন (দীর্ঘতর পড়তে হবে) বলে মনে হয়েছিল .. আমার একটি মুহুর্ত থাকলে আমার অন্য চেহারা হবে।
দাদা

@ পিটার টেলর কিছুই মনে করেন না, এটি ৩০ বাইট সংক্ষিপ্ত হতে চলেছে; আমি কিছুটা আপডেট করব, ধন্যবাদ :)
দাদা

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

জাভাস্ক্রিপ্ট (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)(.)/

আমি পিসিআরই এবং জাভাস্ক্রিপ্ট রিজেক্সের মধ্যে একটি আকর্ষণীয় পার্থক্য লক্ষ্য করেছি: পিসিআরই -তে ক্যাপচার গ্রুপটি সংজ্ঞায়িত করার আগে \<n>ব্যর্থ হয় (এবং তাই (?!\<n>)সফল হয়), যখন জাভাস্ক্রিপ্ট এটি সাফল্যের সাথে খালি স্ট্রিংয়ের সাথে মেলে (এবং তাই (?!\<n>)ব্যর্থ হয়)।


7

পাইথন 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

05 এ বি 1 , 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 প্রদান করবে, সত্য না হলে শূন্য হবে।


XYZ এর সম্ভাব্য মানগুলি ফেরত দেওয়ার অনুমতি দেওয়া হলে এটি 14 বাইট হতে পারে:

05 এ বি 1 ই , 14 বাইট

ÙœJv¹y…XYZ‡²å—

অনলাইনে চেষ্টা করুন 2!


ধরে নিলাম যে একটি খালি নয় স্ট্রিং 05AB1E তে সত্য এবং খালিটি মিথ্যা বলে মনে হচ্ছে, আপনার দ্বিতীয় সংস্করণটি সেই অনুমানের সাথে মেনে চলবে।
ডেনিস

1
"Abcd" এবং "XYZZ" ইনপুট-এ ভুল ফলাফল। আপনাকে ডিফল্ট প্রতিস্থাপন হিসাবে একটি চতুর্থ অক্ষর যুক্ত করতে হবে।
জিবি

@ ডেনিস: আমরা যদি মেটা পোস্ট দিয়ে যাই তবে 05AB1E এর একমাত্র সত্যবাদী মূল্যবোধগুলি হ'ল 1এবং True(যা সাধারণত এই ধরণের চ্যালেঞ্জগুলির জন্য একটি অপূর্ণতা), তবে যদি চ্যালেঞ্জের স্পেকটিকে আমাদের চ্যালেঞ্জের জন্য সত্য / মিথ্যা সংজ্ঞা দেওয়ার অনুমতি হিসাবে ব্যাখ্যা করা যায় তবে দ্বিতীয় সংস্করণ আপনি বলছেন হিসাবে কাজ করে।
এমিগানা

@ এমিগনা ওহ, আমি সে সম্পর্কে অসচেতন ছিলাম।
ডেনিস

4

জাভা 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

পিএইচপি, 89 বাইট

@ ক্রিসটফ এবং @ টিটাসের উপহার

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

পিএইচপি, 105 বাইট

@ ক্রিসটফের উপহার

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

পিএইচপি, 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
এর ++$pপরিবর্তে 2 টি বাইট ব্যবহার করে আপনার সাশ্রয় করা উচিত ($p+1), যদিও আমি এটি পরীক্ষা করে নিই।
ব্যবহারকারী59178

1
আমার জন্য কাজ করে না: স্যান্ডবক্স । যাই হোক একটি golfed কোডের সংস্করণ: [,$a,$b]=$argv;foreach(str_split($a)as$k=>$v)$r.=$k==($p=strpos($a,$v))?"(.)":"\\".++$p;echo preg_match("#$r#",$b);
ক্রিস্টোফ

1
এটি উপহার হিসাবে নিন: [,$a,$b]=$argv;foreach(str_split($a)as$v)$r.=$x[$v]?"\\$x[$v]":'(.)'.!$x[$v]=++$y;echo preg_match("#$r#",$b);(মনে রাখবেন যে আপনার পুরানো স্কোরগুলি ব্যবহার করে রাখা উচিত <strike>)
ক্রিস্টোফ

1
@ ক্রিসটফ একটি উপহার ছিল সেই সাথে শেখার প্রচেষ্টা !। আমি আপনার সুন্দর সমাধানের সাথে যে পয়েন্টগুলি পৌঁছাতে পারি তার চেয়ে বেশি মূল্যবান।
জার্গ হালসারম্যান

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])
তিতাস

4

সি #, 184 165 155 বাইট

ধন্যবাদ অ্যালোইসডিজি!

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

আমি কেবল লক্ষ্য করেছি যে এটি গল্ফ করছে যে আমি যে যুক্তিগুলি ব্যবহার
করিনি

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.. থাকবে: এস
কেভিন ক্রুইজসেন

ডাবল চেকটি আসলে গল্ফিংয়ে অদৃশ্য হয়ে যাওয়া সিস্টেমটি যদি আরও বড় থেকে ছেড়ে যায়, তাই গুলি খুব ব্যবহৃত হয়েছিল, আমি আরও উন্নতি করব w ধন্যবাদ!
ডাউনরেপ_নেশন

আপনি আপনার সমস্ত ভেরিয়েবলকে এক লাইনে int l = p.Length,i = 0, j;
ডিক্যালার

লুপের জন্য আপনার i++এবং আপনারকে স্থানান্তর করতে পারে j--। উদাহরণস্বরূপ:for(j=i;j>=0;)if(p[i]==p[j]==(n[i]!=n[j--]))
অ্যালোইসডজি বলেছেন মিনিকা পুনরায় ইনস্টল করুন

3

রুবি, 63 61 বাইট

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

একটি রেজেক্স প্যাটার্ন অনুসন্ধান করার পরিবর্তে, কেবলমাত্র সম্ভাব্য সমস্ত উপায়ে 'এক্স', 'ওয়াই' এবং 'জেড' প্রতিস্থাপনের চেষ্টা করুন এবং একটি আক্ষরিক মিল খুঁজে পান।

(আসলে কারুসোমপুটিংয়ের 05AB1E উত্তরের মতো একই ধারণা)


2

জাভাস্ক্রিপ্ট (ES6), 92 89 87 86 বাইট

বাক্য গঠন সিনট্যাক্সে ইনপুট p(প্যাটার্ন) এবং s(স্ট্রিং) নেয় (p)(s)। রিটার্ন 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)

ফর্ম্যাট এবং মন্তব্য

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

গণিত 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.