Слияние двух строк


18

Вступление

Допустим, что S 1 = a...bи S 2 = ..c... Если мы поместим их друг на друга, мы получим:

a...b
..c..

Мы объединяем обе строки с .жидким символом (который может перекрываться). Мы получаем это:

a.c.b

Если одна строка длиннее другой, мы просто применяем тот же алгоритм:

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

becomes:

a.c...b

и

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

becomes:

a.c...b...

Если два символа сталкиваются, мы просто используем нижний символ, например

a..b
...c

becomes:

a..c

Задание

Если даны две непустые строки, выведите объединенную строку. Обратите внимание , можно предположить , что вход содержит только периоды и строчные буквы (или прописные буквы , если это более удобно).

Контрольные примеры

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

Это , поэтому выигрывает представление с наименьшим количеством байтов!


Возможен ли ввод a.....b ..c.......? Какой выход тогда?
Луис Мендо

@DonMuesli Это станет a.c...b....
Аднан

Можем ли мы вывести список символов вместо строки?
Денкер

@DenkerAffe Нет, извините
Аднан

Можно ли взять строки в обратном порядке?
Mego

Ответы:


10

Желе , 5 байт

Œu»Œl

Ввод через аргументы командной строки.

Попробуйте онлайн!

объяснение

Это прямой порт моего ответа CJam (см. Объяснение, почему это работает):

Œu     # Convert first argument to upper case.
  »    # Element-wise maximum between both strings.
   Œl  # Convert result back to lower case.

5
НООО! Вы не можете принять желе тоже! У нас останутся все моды как мастера игры в гольф.
2016 года

@ rikerw ха-ха, почему ты думаешь, что они моды? потому что они хороши в гольфе: P
кот

3
@RikerW Я просто должен был опередить кого-то, кто избивал меня, перенеся свое собственное решение на Jelly. ¯ \ _ (ツ) _ / ¯
Мартин Эндер

15

CJam, 9 байт

leul.e>el

Проверьте это здесь.

объяснение

Использует тот факт, что '.' < upper case letters < lower case letters. Таким образом, когда берется поэлементный максимум между двумя строками, любая буква переопределяет a ., но мы можем сделать букву из второго ввода переопределив букву из первого, если мы в верхнем регистре первый. Смешение? Вот один из тестов в качестве примера:

ab.ab.
b.b.b.

Преобразование первого в верхний регистр:

AB.AB.
b.b.b.

Возьми поэлементный максимум:

bBbAb.

Преобразовать обратно в нижний регистр:

bbbab.

И вот как код делает это:

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.

4
Ницца eu/ elтрюк!
Луис Мендо

6

Javascript ES6, 52 55 символов

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

Тестовое задание

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

1
Это не удастся для ввода, таких как:f('c', 'a....b')
andlrc

@ dev-null, исправлено
Qwertiy




3

Haskell, 43 42 байта

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

Пример использования: "ab.ab." # "b.b.b."->"bbbab." .

Как это устроено:

  • если оба списка не пустые, выберите заголовок первого списка, если заголовок второго списка ".", либо выберите заголовок второго списка. Добавьте рекурсивный вызов с хвостами списков.

  • если хотя бы один список пуст, добавьте оба списка.

Редактировать: @Lynn сохранил байт. Благодарность!


«Вы можете предположить, что ввод содержит только точки и строчные буквы» , поэтому вы можете проверить, c<'a'чтобы сохранить байт.
Линн

3

Python 2, 47 байт

lambda s,t:`map(max,s.upper(),t)`[2::5].lower()

очень гольф Я ищу способ избавиться от верхнего () и нижнего (), но пока не повезло ...
Макс

2

Юлия, 101 байт

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

Это функция, которая принимает две строки и возвращает строку.

Мы вычисляем mкак максимальную длину двух входных данных, затем определяем функцию, rкоторая дополняет ввод справа .s до длины, mи сохраняем ее как аргумент функции. Затем мы вводим zipправильные входные данные и проверяем минимум (как определено кодом ASCII) каждой пары. Если это ., мы используем тот символ, который имеет больший код, в противном случае мы используем тот, который поступил из второго ввода. Полученный массив joinпреобразуется в строку и возвращается.



1

Сетчатка , 55

$

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


Строка 5 - это один пробел. Строка 6 - пустая строка (без завершающего символа новой строки).

Попробуйте онлайн.

Я начал этот в GNU sed (с опцией -r). Прямой порт в Retina, когда я разобрался с регулярными выражениями. Версия sed:

s/$/ /
:
s/(.?(\S* )(\w)|(\S)(\S* ).?)(\S* .*)/\2\5\6\3\4/
t
s/ *//

1
Версия Retina не работает сa..k.f....b c...f.g...g. => .c..kffg...g
randomra

1

Python 2, 70 байт

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

Попробуй это здесь!

Сначала мы создаем zip обе строки в один список. Если вторая строка длиннее первой, она дополняется None( map(None,x,y)делает это).
Затем мы перебираем этот список, jбудучи символом из первой строки и символом kиз второй строки. Мы выбираемk если это не точка и иначе j.

Это может быть 61 байт, если я могу вывести результат в виде списка символов вместо строки.


1

Perl, 48 + 3 = 51 байт

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

Бах не может найти более короткое решение. (Тот же подход, что и в ответе @ Qwertiy на JavaScript).
Требует -plи принимает данные от stdinи-i

$ perl -i'a...ce' -ple's/\./substr($^I,$.=pos,1)||$&/ge;$_.=substr$^I,$.' <<< '..b.d..f'
a.b.de..f

Предварительно растяните целевую строку (которая тоже выглядит очень красиво):$_^=$^I^$^I;s/\.|\0/substr$^I,pos,1or$&/ge
Тон Хоспел


0

q / kdb +, 43 40 байт

Решение:

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

Пример:

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

Объяснение:

(#:)                // 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

Примечания: я использую преимущество «Учитывая две непустые строки » и предполагаю, что входные данные являются строками. В kdb "c"это атом, (),"c"это строка, в противном случае нужно добавить 6 байтов к партитуре, поскольку мы не можем использовать $для дополнения атома ...

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.