私の文字列はどの程度互換性がありますか?


12

前書き

同じ長さLの 2つの文字列AB、および整数K≥0を考えます。このチャレンジのために、Aが連結BCBの連続した部分文字列であるような長さKの文字列Cが存在する場合、文字列はK互換であると言います。ABABのサブストリングであるため、ABは常にL互換であることに注意してください(ただし、他のK <Lに対してK互換である場合もあります)。

入力

入力は、大文字と小文字のASCII文字で構成される、同じ正の長さの2つの文字列です。

出力

出力は、入力がK互換であるように、最小の非負整数Kでなければなりません。

入力を検討する

A = HHHHHH
B = HHttHH

Aはの部分文字列ではないため、これらは0互換ではありませんHHttHHHHttHH。また、AHHttHH#HHttHHどの文字がに​​配置されていてもサブストリングではないため、1互換ではありません#。ただし、A であるのサブストリングHHttHHHHHHttHHCは二文字列ですHH。したがって、入力は2互換であり、正しい出力は2です。

ルールとスコアリング

完全なプログラムまたは関数を作成できます。最小のバイトカウントが優先され、標準の抜け穴は許可されません。

テストケース

互換性条件は対称的であるため、2つの入力を交換しても出力は変更されません。

E G -> 1
E E -> 0
aB Bc -> 1
YY tY -> 1
abcd bcda -> 0
abcXd bxcda -> 4
Hello Hello -> 0
Hello olHel -> 1
aBaXYa aXYaBa -> 1
aXYaBa aBaXYa -> 1
HHHHHH HHttHH -> 2
abcdab cdabcd -> 2
XRRXXXXR XRXXRXXR -> 4
evveeetev tetevevev -> 7
vzzvzJvJJz vJJvzJJvJz -> 10
JJfcfJJcfJfb JcfJfbbJJJfJ -> 5
GhhaaHHbbhGGH HHaaHHbbGGGhh -> 9
OyDGqyDGDOGOGyG yDGqOGqDyyyyOyD -> 12
ffKKBBpGfGKpfGpbKb fGpbKbpBBBffbbbffK -> 9
UZuPPZuPdVdtuDdDiuddUPtUidtVVV dtUPtUidtVVVtDZbZZPuiUZuPPZuPd -> 21

リーダーボード

以下に、言語別のリーダーボードと勝者のリストを生成するスタックスニペットを示します。回答が表示されることを確認するには、フォームのヘッダーで開始します

## Language, N bytes

あなたは、取り消し線のタグを使用して、ヘッダーの古いスコアを保つことができます<s>57</s>として表示されます57

回答:


8

Pyth、16

lhf}QjT,vzvz+k.:

Bの2つのコピーの間に挿入すると、Aを含む文字列になるAの最も短い部分文字列を見つけます。

2行目に引用符がない場合、これは2バイト短くなりますが、奇妙に感じますか?

テストスイート


4

Python 3、155 168 157バイト

合計はの長さですA。開始とA終了を比較し、B合計から減算します。開始とB終了を比較し、A合計から減算します。合計が長さに等しくない限り、合計の絶対値を返します。その場合、0を返します。

def f(A,B):
    T=L=len(A)
    C=D=1
    for i in range(L,0,-1):
        if A[:i]==B[-i:]and C:
            T,C=T-i,0
        if A[-i:]==B[:i]and D:
            T,D=T-i,0
    return (0,abs(T))[T!=-L]

編集:f("abcdab","cdabcd")==2ケースを処理する


3
残念ながら、これはf("abcdab", "cdabcd")2になるはずです
ニール

@ニール良いキャッチ。これをテストケースに追加します。
ズガルブ


@ mEQ5aNLrK3lqs3kfSa5HbvsTWe0nIu画像を見て、「これは絵文字を使用するのは素晴らしいデバッガーのアイデアですが、バグが表示されない...」と考えていました。アドオンはこのサイトに大混乱をもたらすと思います。
NonlinearFruit

3

網膜、49バイト

.*?(?<=^(?=(.*)(?<4-3>.)*(.*) \2.*\1$)(.)*).+
$#4

オンラインでお試しください!(すべてのテストを一度に実行するために少し変更されています。)

トリックは、私たちが上の一部に後戻りする必要があるということですA我々がいることはありませんで発見しBて、これまでのところ、私はむしろ迷惑前後参照し、分散グループなしでこれを行うための方法を発見していません。


3

Jolf、40バイト

Wά)Ζ0W<ζli)? h++i]Iζ+ζniIoά0nΖhζ}onhn}wn

それを試してみてください!

私はジョルフにとってはまったく新しいのですが、これを理解しながら多くのことを学びました。少しぎこちないように見えますが、それでもおそらくさらにゴルフダウンできます。この説明を書いている間、2バイトをノックオフしました。

説明:

  Wά)                                      While ά (initialized to 16)
     Ζ0                                    Set ζ to 0
       W<ζli)                              While ζ < length(A)
             ? h++i]Iζ+ζniIoά0n            Set ά to 0 if (A + a substring from B of length n + A) contains B
                               Ζhζ         Increment ζ
                                  }onhn    Increment n (initialize to 0
                                       }wn Decrement n and print

私は真剣に試したことはありません。これは最適なソリューションかもしれませんが、範囲を超えてマッピングすることをお勧めします。(s0zliこのアプローチを試してみたい場合は、配列[0 ...長さi]を提供します。)
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴうーん、私はそれを見てみましょう...また、ドキュメント/ソースを調べているときに私が逃したifコマンドがありますか、それとも唯一のオプションですか?無関係な第3の議論がある?
うねる

?Jolfにある場合に最も近いです。それは三項のようなものです。?ABCs returns aが真の場合はB`、Cそれ以外の場合はB` 。
コナーオブライエン


2

JavaScript(ES6)、110バイト

(a,b)=>{for(i=0;;i++)for(j=i;j<=a.length;j++)if(b.startsWith(a.slice(j))&&b.endsWith(a.slice(0,j-i)))return i}

aそれらの両端に一致するまで真ん中からより長い部分をスライスすることによって動作しbます。ループは無限ではなく、前または前に停止しi == a.lengthます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.