Scalenie dwóch łańcuchów

18

Wprowadzenie

Powiedzmy, że S 1 = a...bi S 2 = ..c... Jeśli umieścimy je jeden na drugim, otrzymamy:

a...b
..c..

Scalamy oba ciągi znaków ze .znakiem płynnym (który może się nakładać). Otrzymujemy to:

a.c.b

Jeśli jeden ciąg jest dłuższy niż drugi, po prostu stosujemy ten sam algorytm:

a.....b
..c..  

becomes:

a.c...b

i

a.....b
..c.......

becomes:

a.c...b...

Jeśli dwa znaki się zderzają, używamy po prostu znaku dolnego, np

a..b
...c

becomes:

a..c

Zadanie

Biorąc pod uwagę dwa niepuste ciągi, wyślij scalony ciąg. Uwaga: można założyć, że dane wejściowe zawierają tylko kropki i małe litery (lub wielkie litery, jeśli jest to wygodniejsze).

Przypadki testowe

Input              Output
a....b ..c...      a.c..b
aaaaaa bbbbbb      bbbbbb
ab.ab. b.b.b.      bbbab.
a.......b c        c.......b

To jest , więc wygrywanie z najmniejszą ilością bajtów wygrywa!

Adnan
źródło
Czy a.....b ..c.......możliwe jest wprowadzanie danych ? Jaka jest zatem wydajność?
Luis Mendo,
@DonMuesli To się stanie a.c...b....
Adnan,
Czy możemy wypisać listę znaków zamiast ciągu?
Denker
@DenkerAffe Nie, przepraszam
Adnan
Czy ciągi mogą być brane w odwrotnej kolejności?
Mego

Odpowiedzi:

10

Galaretka , 5 bajtów

Œu»Œl

Wprowadzanie za pomocą argumentów wiersza polecenia.

Wypróbuj online!

Wyjaśnienie

To jest bezpośredni port mojej odpowiedzi CJam (zobacz to, aby wyjaśnić, dlaczego to działa):

Œu     # Convert first argument to upper case.
  »    # Element-wise maximum between both strings.
   Œl  # Convert result back to lower case.
Martin Ender
źródło
5
NIEEEE! Nie możesz też adoptować Galaretki! Zostaną nam wszystkie mody jako mistrzowie golfa.
Rɪᴋᴇʀ
@rikerw haha, dlaczego uważasz, że to mody? ponieważ są dobrzy w golfie: P
cat
3
@RikerW Musiałem tylko uprzedzić kogoś, kto mnie bije, przenosząc własne rozwiązanie do Jelly. ¯ \ _ (ツ) _ / ¯
Martin Ender
15

CJam, 9 bajtów

leul.e>el

Sprawdź to tutaj.

Wyjaśnienie

Wykorzystuje fakt, że '.' < upper case letters < lower case letters. W ten sposób, biorąc pod uwagę elementarne maksimum między dwoma łańcuchami, dowolna litera zastępuje literę a ., ale możemy sprawić, że litera z drugiego wejścia zastąpi literę z pierwszego, jeśli pierwsza litera będzie większa. Zagmatwane? Oto jeden z przypadków testowych jako przykład:

ab.ab.
b.b.b.

Konwertuj najpierw na wielkie litery:

AB.AB.
b.b.b.

Weź maksimum elementarne:

bBbAb.

Konwertuj z powrotem na małe litery:

bbbab.

A oto jak kod to robi:

l    e# Read first line.
eu   e# Convert to upper case.
l    e# Read second line.
.e>  e# Take element-wise maximum. If the lengths are different, the additional elements
     e# from the longer list are just appended.
el   e# Convert back to lower case.
Martin Ender
źródło
4
Nicea eu/ elsztuczka!
Luis Mendo,
6

JavaScript ES6, 52 55 znaków

(a,b)=>b.replace(/\./g,(m,i)=>a[i]||m)+a.slice(b.length)

Test

f=(a,b)=>b.replace(/\./g,(m,i)=>a[i]||m)+a.slice(b.length)
;`
a....b ..c...      a.c..b
aaaaaa bbbbbb      bbbbbb
ab.ab. b.b.b.      bbbab.
a.......b c        c.......b
c a....b           a....b
`.split('\n').filter(Boolean).map(s=>s.split(/\s+/)).every(a=>f(a[0],a[1])==a[2])
Qwertiy
źródło
1
Nie powiedzie się to dla danych wejściowych takich jak:f('c', 'a....b')
andlrc
@ dev-null, naprawiono
Qwertiy
4

Poważnie, 10 bajtów

,û,Z`M`MΣù

Wypróbuj online!

Używa tej samej strategii, co odpowiedź Martina CJama

Wyjaśnienie:

,û,Z`M`MΣù
,û          get first string, uppercase
  ,Z        get second string, zip with first string
    `M`M    map maximum
        Σù  join and uppercase
Mego
źródło
4

Oktawa, 50 bajtów

function c=m(a,b)c=b;c(a>0)=a;i=b>46;c(i)=b(i);end
Rainer P.
źródło
Można zastąpić !=przez>
Luis Mendo
3

Haskell, 43 42 bajty

(a:b)#(c:d)|c<'a'=a:b#d|1<2=c:b#d
a#b=a++b

Przykład użycia: "ab.ab." # "b.b.b."-> "bbbab.".

Jak to działa:

  • jeśli obie listy są niepuste, wybierz nagłówek pierwszej listy, jeśli nagłówek drugiej listy jest ".", w przeciwnym razie wybierz nagłówek drugiej listy. Dołącz rekurencyjne połączenie z ogonami list.

  • jeśli przynajmniej jedna lista jest pusta, dołącz obie listy.

Edycja: @Lynn zapisał bajt. Dzięki!

nimi
źródło
„Możesz założyć, że dane wejściowe zawierają tylko kropki i małe litery” , więc możesz sprawdzić, c<'a'aby zapisać bajt.
Lynn,
3

Python 2, 47 bajtów

lambda s,t:`map(max,s.upper(),t)`[2::5].lower()
xsot
źródło
bardzo golfowy! Szukam sposobu na pozbycie się górnego () i dolnego (), ale jak dotąd nie mam szczęścia ...
Max
2

Julia, 101 bajtów

f(s,t,r=i->rpad(i,max((n=endof)(s),n(t)),"."))=join([min(a,b)<90?max(a,b):b for(a,b)=zip(r(s),r(t))])

Jest to funkcja, która akceptuje dwa ciągi i zwraca ciąg.

Obliczamy mjako maksymalną długość dwóch sygnałów wejściowych, a następnie definiujemy funkcję, rktóra odpowiednio uzupełnia dane wejściowe. s do długości mi przechowujemy ją jako argument funkcji. Następnie zipdobieramy odpowiednio wypełnione wejścia i sprawdzamy minimum (zgodnie z kodem ASCII) każdej pary. Jeśli jest to ., używamy dowolnego znaku, który ma większy kod, w przeciwnym razie używamy tego, który pochodzi z drugiego wejścia. Powstała tablica jest joinedytowana w łańcuch i zwracana.

Alex A.
źródło
2

C, 106 89 bajtów

i,j,k;f(s,z)char*s,*z;{for(i=0,j=k=1;j|k;i++)putchar((k=k?z[i]:0)>46|!(j=j?s[i]:0)?k:j);}

Testuj na żywo na ideone .

oddalony
źródło
1

Siatkówka oka , 55

$

+ `(.? (\ S *) (\ w) | (\ S) (\ S *).?) (\ S *. *)
2 USD 5 USD 6 USD 3 USD 4 USD


Linia 5 to pojedyncza spacja. Linia 6 jest pustą linią (bez końcowej nowej linii).

Wypróbuj online.

Zacząłem ten w GNU sed, (z opcją -r). Prosty port do Retina, kiedy już zrozumiałem wyrażenia regularne. Wersja sed to:

s/$/ /
:
s/(.?(\S* )(\w)|(\S)(\S* ).?)(\S* .*)/\2\5\6\3\4/
t
s/ *//
Cyfrowa trauma
źródło
1
Wersja Retina zawodzia..k.f....b c...f.g...g. => .c..kffg...g
randomra
1

Python 2, 70 bajtów

lambda x,y:"".join([k if k!="."and k else j for j,k in map(None,x,y)])

Wypróbuj tutaj!

Najpierw tworzymy zip oba ciągi znaków na jedną listę. Jeśli drugi ciąg jest dłuższy niż pierwszy, jest dopełniany None( map(None,x,y)robi to).
Następnie iterujemy tę listę jjako znak z pierwszego łańcucha i kten z drugiego łańcucha. Wybieramy, kczy nie jest to kropka i inaczejj .

Może to być 61 bajtów, gdybym mógł wyświetlić wynik jako listę znaków zamiast łańcucha.

Denker
źródło
1

Perl, 48 + 3 = 51 bajtów

s/\./substr($^I,$.=pos,1)||$&/ge;$_.=substr$^I,$.

Bah nie może znaleźć krótszego rozwiązania. (Takie samo podejście jak w odpowiedzi JavaScript @ Qwertiy).
Wymaga -pli pobiera dane wejściowe z stdini-i

$ perl -i'a...ce' -ple's/\./substr($^I,$.=pos,1)||$&/ge;$_.=substr$^I,$.' <<< '..b.d..f'
a.b.de..f
andlrc
źródło
Przedłużyć docelowy ciąg (który również wygląda bardzo ładnie):$_^=$^I^$^I;s/\.|\0/substr$^I,pos,1or$&/ge
Ton Hospel
0

PHP> = 7,1, 58 bajtów

for([,$x,$y]=$argv;~$c=$y[$i++];)$c<_?:$x[$i-1]=$c;echo$x;

Wersja online

Jörg Hülsermann
źródło
0

q / kdb +, 43 40 bajtów

Rozwiązanie:

lower{l:max(#:)each(x;y);upper[l$x]|l$y}

Przykład:

q)lower{l:max(#:)each(x;y);upper[l$x]|l$y}["a..b..";"...c"]
"a..c.."

Wyjaśnienie:

(#:)                // k equivalent of count
max (#:) each(x;y)  // takes each string, count the length, return maximum
l$x                 // whites-space pad string x to length l
|                   // take the maximum (per Martin's strategy)
upper[...]          // convert padded string 1 to uppercase
lower{...}          // convert result of function to lowercase

Uwagi: Korzystam z „Biorąc pod uwagę dwa niepuste ciągi i zakładam, że dane wejściowe są ciągami. W kdb "c"jest atomem, (),"c"jest łańcuchem, w przeciwnym razie trzeba dodać 6 bajtów do wyniku, ponieważ nie możemy użyć $do wypełnienia atomu ...

streetster
źródło