シンプルなコードゴルフチャレンジ:キャラクターパターン!


22

このチャレンジでは、X、Y、Zなどの文字列を含む文字列を入力として受け取ります。「XYZZ」。X、Y、Zは特定の文字を表します。次に、このパターンを2番目の文字列入力と比較します。パターンが2番目の入力に部分文字列として存在する場合はreturn True、そうでない場合はreturn 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、またはその他のTruthy / Falsy値を出力する必要があります。

その他の重要/有用な情報

  • パターンには、X、Y、およびZを含める必要はありません。XとY、または(多少無意味ですが)Xだけを含めることもできます。
  • パターンを空にすることはできませんが、これはテストケースとして使用されません。
  • 検索文字列は空ではなく、小文字になります。
  • パターン内のX、Y、Zのアルファベット順は重要ではありません。
  • X、Y、Z 一意の文字でなければなりません
  • 任意のライブラリを使用できます。
  • スコアは、バイト単位のコードサイズによって決まります。最低スコアが勝ちます。

がんばろう!


パターンは何でもかまいません。私はおそらくパターンはX、Y、およびZを持つ必要がないこと、それは言及していなければならない可能性がありそうあなた自身を思い付くこと自由に感じ、けれども、単にXとYを持っているそれらのパターンは単なる例であり、それらのパターンの例。
-notHalfBad

「パターンが存在する」とはどういう意味ですか?連続したチャンクとして?部分文字列として?たとえば、XとYは同じものを表すことができますか?
-xnor

@xnor XとY 互いに独立している必要あり、パターンが存在するということは、文字列のどこにでもパターンに一致するサブストリングがあることを意味します。これらをチャレンジの説明に追加して、明確にします。
-notHalfBad

3
関連。(同じことですが、部分文字列ではなく、パターンの完全一致を要求します。)
マーティンエンダー

4
詳細:パターンを空にすることはできますか?検索文字列?検索文字列は小文字のみを使用しますか?パターンは、同等のパターンの中でアルファベット順で最初になりますか。つまり、最初にXを使用し、次にYを使用し、次にZを使用しますか。
-xnor

回答:


12

Perl 5、85バイト

Peter Taylorの提案のおかげで40バイト節約されました!(違いを確認するには、以下の古いバージョンを参照してください)

83バイトのコード+ -plフラグ。

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

オンラインでお試しください!

XYXYZはに変換され((?!\1).)((?!\1)(?!\2).)\1\2((?!\1)(?!\2)(?!\3).)(そう、テストのいくつかは真ではないかもしれませんが、そのように短くなります)、2番目の入力がその正規表現に対してチェックされます。(それがどのように機能するかについての直観を得るために私の古いバージョンの説明を参照してください)


私の古いバージョン:
最初のバージョンで犯した間違いを指摘してくれたArnauldに感謝します。
113バイトのコード+ -plフラグ、および-Mre=eval

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

オンラインでお試しください!

例えばXYXYZに:(。)(。)(。)最初の正規表現は、\ 1 \ 2にパターンを変換され、最後にかどうかを確認するためのテストを追加し$1$2そして$3異なる:そうであれば、$\いずれかに設定されています。次に、2番目の入力がこの正規表現に対してテスト$\され、最後に暗黙的に出力されます。
XYXYZ用に生成された正規表現は(.)(.)\1\2(.)(?{++$c;$\=1if!grep{$v{$c}{${$_}}++}1..3})^です。
(少し時間があれば、説明にもう少し詳細を追加します)


だから、正規表現を使用して非正規表現を正規表現に変えるのですか?クーリオ
マシュー盧

@Arnauld確かに、ありがとう。(チャレンジを速すぎる速さで読んだに違いない)それを修正するためにバイトカウントを倍増する必要がありましたが、今は動作します!
ダダ

次のような正規表現を生成するのはゴルファーではないでしょう(.)((?!\1).)\1\2((?!\1)(?!\2).)か?
ピーターテイラー

@Peter Taylorかもしれません。私は漠然と考えていましたが、生成するのは難しい(長く読む)ように見えました。
ダダ

@Peter Taylorは決して気にしません。30バイト短くなります。少し更新します、ありがとう:)
ダダ

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>

パターンを正規表現に変換することにより機能XYXYZします/(.)(?!\1)(.)\1\2(?!\2)(?!\1)(.)/

PCREとJavaScript正規表現の興味深い違いに気付きました。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、空になるまで、文字列stringの最初の文字を切り取ります


73バイト:

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

オンラインで試す

この回答のメソッドを使用して、文字列がパターンに一致するかどうかを確認します。文字列が空になるまで最初または最後の文字を削除するように分岐することにより、すべての部分文字列を再帰的にチェックします。



4

05AB1E19 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.

trueの場合は1、trueでない場合はnullを返します。


XYZの可能な値を返すことが許可されている場合、これは14バイトになります。

05AB1E、14バイト

ÙœJv¹y…XYZ‡²å—

オンラインで試す2!


05AB1Eで空でない文字列が真実であり、空の文字列が偽であると仮定すると、2番目のバージョンは仕様に準拠する必要があります。
デニス

1
入力 "abcd"および "XYZZ"の結果が間違っています。デフォルトの置換として4番目の文字を追加する必要があります。
GB

@Dennis:メタ投稿を行う場合、05AB1Eの唯一の真実の値は1and True(これは通常、この種のチャレンジの欠点です)が、チャレンジ仕様がチャレンジの真実/偽を定義できると解釈できる場合2番目のバージョンは、あなたが言うように機能します。
エミグナ

@Emignaああ、私はそれを知らなかった。
デニス

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
実際にはテストしていません++$p($p+1)、の代わりにを使用して2バイトを節約できるはずです。
user59178

1
私のために動作しません:サンドボックスを。とにかく、ゴルフバージョンのコード:[,$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
@Christoph A Giftはの学習努力でした!。あなたの素敵な解決策で私が到達できたポイントよりも価値があります。
ヨルグヒュルサーマン

1
私がいない108、109を数える-3コピードント場合バイト$argv$aして$b、-6バイト、for(;a&$v=$argv[1][$i++];); 長い変数名を持つ-1バイト(本当に!:使用$vvの代わりに$v$ii代わりに$i$rr代わりに$r$yy代わりに$y使用することができますし、$$vv代わりに$x[$v]
テトス

4

C位、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;
    }

ゴルフをしていると、使用しなかったロジックが公開されていることに気付いたので、間もなく更新されます
-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]2回確認します。これは常にtrue or true/ false or false..:S
ケビンクルーッセン

ダブルチェックは、実際にはゴルフで消えた大きなifシステムから残ったので、sがよく使われました。さらに改善します。ありがとう!
downrep_nation

あなたは、1行にすべての変数をdecalreすることができますint l = p.Length,i = 0, j;
aloisdgは回復モニカ言う

あなたi++とあなたj--のforループ内を移動できます。例えば:for(j=i;j>=0;)if(p[i]==p[j]==(n[i]!=n[j--]))
aloisdgは回復モニカ言う

3

ルビー、63 61バイト

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

正規表現パターンを検索する代わりに、可能な限りすべての方法で「X」、「Y」、および「Z」を置き換えてみて、文字通りの一致を見つけてください。

(実際にはcarusocomputingの05AB1Eの答えと同じ概念)


2

JavaScript(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

Mathematica 18文字(文字列とパターンをカウントしない)

StringContainsQ[string,pattern]

例:

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

True

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

True


これは、必要に応じて文字列入力として文字列とパターンを受け取らないため無効です。
リルトシアスト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.