Una relazione all'indietro


10

Scrivi un programma o una funzione che, dati due stringhe ASCII Ae B, produrranno stringhe A'e in B'cui le sottostringhe comuni sono invertite al loro posto. Il processo per la ricerca A'è il seguente:

  1. A' è inizialmente vuoto.
  2. Se il primo carattere di Aè in B, trova il prefisso più lungo di Acui è una sottostringa di B. Rimuovi questo prefisso da Ae aggiungi la sua inversione a A'.
  3. Altrimenti, rimuovi questo primo carattere Ae aggiungilo a A'.
  4. Ripetere i passaggi 2-3 fino a quando non Aè vuoto.

La ricerca B'viene eseguita in modo simile.

Esempio

Consideriamo le stringhe A = "abc bab"e B = "abdabc". Per A', questo è ciò che accade:

  • A = "abc bab": Il primo carattere "a"è in B e il prefisso più lungo di A trovato in B è "abc". Rimuoviamo questo prefisso da A e aggiungiamo la sua inversione "cba"ad A '.
  • A = " bab": Il primo personaggio " "non è in B, quindi rimuoviamo questo personaggio da A e lo aggiungiamo ad A '.
  • A = "bab": Il primo carattere "b"è in B e il prefisso più lungo di A trovato in B è "b". Rimuoviamo questo prefisso da A e aggiungiamo la sua inversione (che è ancora "b") ad A '.
  • A = "ab": Il primo carattere "a"è in B e il prefisso più lungo di A trovato in B è "ab". Rimuoviamo questo prefisso da A e aggiungiamo la sua inversione "ba"ad A '.
  • A = "": A è vuoto, quindi ci fermiamo.

Così otteniamo A' = "cba" + " " + "b" + "ba" = "cba bba". Per B ', il processo è simile:

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

Così otteniamo B' = "ba" + "d" + "cba" = "badcba".

Infine, restituiamo le due stringhe, vale a dire

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

Casi test

"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"

Vince il codice più breve in byte.


Supponiamo che tutti gli input siano ASCII minuscoli? Si prevede che l'output esatto sarà simile all'inclusione di "cba bba", "badcba"virgolette e virgola?
AdmBorkBork,

@TimmyD Il formato esatto di input / output è la tua scelta. Non puoi presumere che l'ingresso sia in ASCII minuscolo, potrebbe essere qualsiasi ASCII stampabile.
orlp,

La stringa vuota è un input legale?
MtnViewMark,

@MtnViewMark Sì.
orlp

Risposte:



2

Haskell, 120 111 byte

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

Esecuzioni di test:

λ: "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 byte

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

Esempio: a("birds flying high","whistling high nerds",X,Y).uscite

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

Un modo, una soluzione troppo lunga che mostra troppo quanto Prolog è prolisso quando si tratta di stringhe. Potrebbe essere possibile abbreviare questa cosa usando i codici array ( `birds flying high`) invece di stringhe ( "birds flying high").


1

Python 2.7, 169 156 152 141 byte

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

La funzione maccetta le 2 stringhe come input e chiama bdue volte la funzione che esegue l'elaborazione effettiva in base alle specifiche.
Demo qui .
Testarlo -

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

USCITE:

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

PS: grazie a orlp per la soluzione utilizzata next()


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

Inoltre è possibile sostituire while len(A)>0con solo while A. Allo stesso modo if len(p)>0diventa if p.
orlp,

if len(p)può anche essere if p. (Già detto sopra, ma te lo sei perso.)
mbomb007,

@ mbomb007 Non l'ho letto correttamente. Appena sostituito len(p)>0a len(p). Grazie :) :)
Kamehameha,

Ancora più breve: 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,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.