Об’єднання двох рядків


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 Ні, вибачте
Аднан

Чи можна брати струни у зворотному порядку?
Мего

Відповіді:


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
NOOO! Ви також не можете прийняти Желі! Ми залишимося з усіма модами, як майстри з гольфу.
Rɪᴋᴇʀ

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

3
@RikerW Мені просто довелося вибити когось іншого, побивши мене, передавши власне рішення Джеллі. ¯ \ _ (ツ) _ / ¯
Мартін Ендер

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

Як це працює:

  • якщо обидва списки не порожні, виберіть голову 1-го списку, якщо заголовок 2-го списку ".", інше виберіть голову другого списку. Додайте рекурсивний дзвінок із хвостами списків.

  • якщо принаймні один список порожній, додайте обидва списки.

Редагувати: @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) кожної пари. Якщо це a ., ми використовуємо той, який символ має більший код, інакше ми використовуємо те, що прийшло з другого вводу. Отриманий масив joinредагується в рядок і повертається.


2

C, 106 89 байт

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);}

Тестуйте наживо на ideone .


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
випадкова

1

Python 2, 70 байт

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

Спробуйте тут!

Спочатку ми створюємо обидва рядки в один список. Якщо друга струна довша, ніж перша, вона прокладена None( map(None,x,y)робить це).
Потім ми повторюємо цей список із jсимволом з першого рядка та символом з kдругого рядка. Ми вибираємо, kякщо це не крапка, інакшеj .

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


1

Perl, 48 + 3 = 51 байт

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

Ба не може знайти коротше рішення. (Той самий підхід, що і у відповіді JavaScript @ Qwertiy).
Вимагає -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.