後方関係


10

プログラムや関数を書く2つのASCII文字列を与えられ、そのAB、文字列を生成しますA'し、B'共通部分文字列は、その場所にどこを逆転しています。検索のプロセスA'は次のとおりです。

  1. A' 最初は空です。
  2. 最初の文字が場合AであるB、の最長プレフィックス見つけるAのサブであるがB。からこの接頭辞を削除しA、その逆をに追加しA'ます。
  3. それ以外の場合は、この最初の文字をから削除しAてに追加しA'ます。
  4. Aが空になるまで、手順2〜3を繰り返します。

検索B'も同様に行われます。

文字列A = "abc bab"とを考えてみましょうB = "abdabc"。の場合A'、これは何が起こるかです:

  • A = "abc bab":最初の文字"a"はBにあり、Bで見つかったAの最長の接頭辞は"abc"です。このプレフィックスをAから削除し、その逆"cba"をA 'に追加します。
  • A = " bab":最初の文字" "はBにないため、この文字をAから削除してA 'に追加します。
  • A = "bab":最初の文字"b"はBにあり、Bで見つかったAの最長の接頭辞は"b"です。このプレフィックスをAから削除し、その逆(まだ"b")をA 'に追加します。
  • A = "ab":最初の文字"a"はBにあり、Bで見つかったAの最長の接頭辞は"ab"です。このプレフィックスをAから削除し、その逆"ba"をA 'に追加します。
  • A = "":Aは空なので停止します。

したがって、取得しA' = "cba" + " " + "b" + "ba" = "cba bba"ます。B 'の場合、プロセスは同様です。

B = "abdabc"  ->  "a" in A, remove prefix "ab"
B = "dabc"    ->  "d" not in A, remove "d"
B = "abc"     ->  "a" in A, remove prefix "abc"

したがって、取得しB' = "ba" + "d" + "cba" = "badcba"ます。

最後に、2つの文字列を返します。

(A', B') = ("cba bba", "badcba")

テストケース

"abc bab", "abdabc" -> "cba bba", "badcba"
"abcde", "abcd bcde" -> "dcbae", "dcba edcb"
"hello test", "test banana" -> "hello tset", "tset banana"
"birds flying high", "whistling high nerds" -> "bisdr flyhgih gni", "wihstlhgih gni nesdr"

バイト単位の最短コードが優先されます。


すべての入力が小文字のASCIIであると想定しますか?正確な出力は、"cba bba", "badcba"引用符とコンマを含めるのと同じようなものですか?
AdmBorkBork 2015

@TimmyD正確な入力/出力形式はあなたの選択です。入力が小文字のASCIIであるとは限りません-印刷可能なASCIIである可能性があります。
orlp 2015

空の文字列は正しい入力ですか?
MtnViewMark 2015

@MtnViewMarkはい。
orlp 2015

回答:



2

Haskell、120 111バイト

import Data.List
a&b=(a#b,b#a)
[]#_=[]
(a:y)#b=[a]%y where p%(i:w)|reverse(i:p)`isInfixOf`b=(i:p)%w;p%x=p++x#b

テスト実行:

λ: "abc bab"&"abdabc"
("cba bba","badcba")

λ: "abcde"&"abcd bcde"
("dcbae","dcba edcb")

λ: "hello test"&"test banana"
("hello tset","tset banana")

λ: "birds flying high"&"whistling high nerds"
("bisdr flyhgih gni","wihstlhgih gni nesdr")

1

SWI-Prolog、312バイト

a(A,B,X,Y):-b(A,B,"",X),b(B,A,"",Y).
b(A,B,R,Z):-A="",R=Z;sub_string(A,0,1,_,C),(sub_string(B,_,1,_,C),(string_length(A,J),I is J-1,between(0,I,K),L is J-K,sub_string(A,0,L,_,S),sub_string(B,_,L,_,S),string_codes(S,E),reverse(E,F),string_codes(Y,F));S=C,Y=C),string_concat(S,V,A),string_concat(R,Y,X),b(V,B,X,Z).

例:a("birds flying high","whistling high nerds",X,Y).出力

X = "bisdr flyhgih gni",
Y = "wihstlhgih gni nesdr" .

道、あまりにも文字列を扱うときにプロローグがある冗長な方法を示して行く長すぎるソリューション。`birds flying high`文字列("birds flying high")の代わりにコード配列()を使用して、このことを短縮できる可能性があります。


1

Python 2.7、 169 156 152 141バイト

m=lambda A,B:(b(A,B),b(B,A))
def b(A,B,C=''):
 while A:j=next((j for j in range(len(A),0,-1)if A[:j]in B),1);C+=A[:j][::-1];A=A[j:]
 return C

この関数mは、2つの文字列を入力として受け取りb、仕様に従って実際の処理を行う関数を2回呼び出します。
デモはこちら
それをテストする-

l=[("abc bab", "abdabc"),
("abcde", "abcd bcde"),
("hello test", "test banana"),
("birds flying high", "whistling high nerds")]
for e in l:
    print m(*e)

出力:

('cba bba', 'badcba')
('dcbae', 'dcba edcb')
('hello tset', 'tset banana')
('bisdr flyhgih gni', 'wihstlhgih gni nesdr')

PS:ソリューションを使用してorlpに感謝 next()


m=lambda A,B:(b(A,B),b(B,A))
orlp 2015

またwhile len(A)>0、ちょうどと置き換えることができますwhile A。同様ににif len(p)>0なりif pます。
orlp 2015

if len(p)することもできますif p。(すでに上で述べましたが、あなたはそれを逃しました。)
mbomb007 '26

@ mbomb007正しく読みませんでした。に置き換えられましlen(p)>0len(p)。:)
カメハメハ

さらに短い:while A:j=next((j for j in range(len(A),0,-1)if A[:j]in B),1);C+=A[:j][::-1];A=A[j:]
orlp 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.