거꾸로 관계


10

프로그램이나 함수를 작성 개의 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".

마지막으로 두 문자열을 반환합니다.

(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

@TimmyD 정확한 입력 / 출력 형식이 선택됩니다. 입력이 소문자 ASCII 인 것으로 가정 할 수 없으며 인쇄 가능한 ASCII 일 수 있습니다.
orlp

빈 문자열이 올바른 입력입니까?
MtnViewMark 5

@MtnViewMark 예.
orlp

답변:


1

Pyth, 29 바이트

M&G+_Je|f}TH._GhGg.-GJHgzQgQz

테스트 하네스.

입력 형식은 다음과 같습니다

abc bab
"abdabc"

출력은 다음과 같습니다

cba bba
badcba

2

하스켈 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- 프롤로그, 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

파이썬 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하며, 스펙에 따라 실제 처리를 수행하는 함수를 두 번 호출합니다 .
여기 데모 .
그것을 테스트-

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

추신 : 솔루션을 사용하는 orlp 덕분에 next()


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

또한 while len(A)>0그냥로 바꿀 수 있습니다 while A. 비슷하게 if len(p)>0됩니다 if p.
orlp

if len(p)또한 될 수 있습니다 if p. (이미 위에서 말했지만 놓쳤습니다.)
mbomb007

@ mbomb007 제대로 읽지 못했습니다. 로 교체 len(p)>0했습니다 len(p). :)
Kamehameha

더 짧은 : 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.