Взаємно заповнюйте заготовки


11

Давши вхід з двох рядків із послідовностями підкреслень, що представляють відповідні слова, виведіть речення із заповненими "пробілами".

Найкращий спосіб описати цей виклик на прикладі. Ось приклад введення:

programming _____________ and code golf
programming puzzles ______ code ____

І ось відповідний вихід:

programming ___puzzles___ and code golf
programming puzzles _and__ code golf

Для цілей цього виклику "слово" визначається як послідовність однієї або декількох малих літер, а "порожнє" визначається як одна або декілька підкреслень (вхід завжди буде містити лише малі літери, пробіли та підкреслення) . Слова та пробіли у вхідних рядках відокремлюються поодинокими пробілами, а сума кількості слів і пробілів у реченнях завжди буде рівною.

Завдання завдання - заповнити всі пробіли правильними словами , які є словами, які займають той самий індекс в іншому рядку, коли розділяються пробілами.

  • Слово повинно бути в центрі поля, як показано зі словом "пазли" у наведеному вище прикладі - однакова кількість підкреслень залишається з обох сторін.

  • Якщо слово не може бути точно центровано, зайвий підкреслення може йти ліворуч або праворуч (наприклад, слова "та" у прикладі вище).

  • Завжди буде достатньо підкреслень, щоб слово підходило, але їх може бути рівно стільки, скільки довжина слова (наприклад, слово "гольф" у наведеному вище прикладі).

  • У обох рядках ніколи не буде порожнього місця в одному положенні.

Введення / вихід може бути будь-яким із наведених нижче (введення / виведення необов'язково повинні здійснюватися одним і тим же методом):

  • окремий рядок, розділений будь-яким символом, який не є алфавітом, пробілом або підкресленням (наприклад, рядок, розділений новою лінією чи комою)

  • масив / список / тощо. з двох струн

  • два аргументи функціонального / командного рядка (лише введення)

Оскільки це , найкоротший код у байтах виграє.

Наведений вище приклад може бути використаний як тестовий випадок. Ось більший тестовий випадок (другий рядок у висновку може дещо відрізнятися через різну поведінку центрування):

lorem _____ dolor _____ amet _______________ adipiscing elit mauris dapibus tincidunt _____________________________ accumsan fringilla proin vulputate viverra lorem fermentum dictum
lorem ipsum ______ sit _______ consectetur _______________ elit mauris dapibus tincidunt metus accumsan fringilla proin vulputate viverra lorem ____________________________ dictum

lorem ipsum dolor _sit_ amet __consectetur__ adipiscing elit mauris dapibus tincidunt ____________metus____________ accumsan fringilla proin vulputate viverra lorem fermentum dictum
lorem ipsum dolor_ sit _amet__ consectetur __adipiscing___ elit mauris dapibus tincidunt metus accumsan fringilla proin vulputate viverra lorem _________fermentum__________ dictum

Приємний бідуарний виклик.
Rɪᴋᴇʀ

Відповіді:


5

Піт, 30

jL;Cmm|*}J\_k.[lkhx#JdJkdCcR;Q

Вводить і виводить список двох рядків. Використовується досить базовий підхід розділення – zip – подвійна карта – центр – zip – приєднання.

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

Розширено:

jL;Cmm|*}J\_k.[lkhx#JdJkdCcR;Q   ##
                          cR;Q   ##  split
                         C       ##  zip
    mm                           ##  double map
      |*}J\_k.[lkhx#JdJkd        ##  centre
   C                             ##  zip
jL;                              ##  join

Я поясню ще раз, коли я справді впевнений, що більше не можу займатися гольфом, хоча це повинно бути досить зрозуміло, враховуючи всюдисущість підходу розділення – zip – подвійної карти – центр – zip – приєднання та інших.


8
Аааа, класичний підхід розділення-zip-подвійний карта-центр-zip-join. Я з приємністю пам’ятаю, що його використовували як вступний приклад у моїй лекції «Алгоритми 101».
Мартін Ендер

3
@ MartinBüttner Так, у мене є погані спогади про це, оскільки я проспав цей клас, довелось вирішувати проблеми на іспиті, використовуючи замість цього підхід дублікат-додавання-перегляд-відповідність-відповідь.
FryAmTheEggman

4
Я піду застосувати холодну воду до опіку.
Мартін Ендер

7

Сітківка , 102 100 93 88 байт

Кількість байтів передбачає кодування ISO 8859-1.

$
!¶$`
m`(?<=^(\w+ )*)(?=_.*¶(?<-1>\w+ )*(\w+))
$2
(([a-z])+)(?<-2>_)*(_*)\3|!\D+
$3$1$3

Рядки будуть розділені міжрядковим рядком. Якщо залишилось непарне число підкреслень, стороння буде після слова.

Спробуйте в Інтернеті!

Пояснення

Я здогадуюсь, це "підхід" дублювати-додавати-виглядати-відповідати-відповідати-додавати центр "або щось близьке ...

$
!¶$`

Почнемо з дублювання вводу (відокремленого !знаком a та рядка). Мета цього полягає в тому, що ми можемо потім обробити обидва рядки, отримуючи слова з наступного рядка (замість того, щоб обробляти другий рядок окремо).

m`(?<=^(\w+ )*)(?=_.*¶(?<-1>\w+ )*(\w+))
$2

Це зумовлює правильне слово до кожного проміжку. Почнемо з підрахунку поточної позиції слова з огляду (?<=^(\w+ )*)(позиція зберігається як глибина групи 1). Тоді lookahead a) гарантує, що ми знаходимося на початку пробілу шляхом зіставлення _, потім переходимо до наступного рядка з .*¶, відповідає правильній кількості слів, (?<-1>\w+ )*щоб потрапити на потрібне місце, а потім відповідає слову, знайденому там, (\w+)у групи 2.

(([a-z])+)(?<-2>_)*(_*)\3|!\D+
$3$1$3

Цей етап робить три речі:

  • Він видаляє підкреслення, відповідні довжині кожного слова. Це робиться шляхом підрахунку довжини слова в групу 2с([a-z])+ , а потім відповідність , що багато символи підкреслення (які ніколи не записуються назад).
  • Він зміщує слово в центр пробілу, захоплюючи половину решти підкреслень (_*)\3і записуючи їх $3$1$3назад.
  • Він видаляє дубльований ввід шляхом зіставлення !\D+та заміни його нічим.

4

Пітон 2, 109

def f(a,b):exec"print' '.join([x,y][x<'`'].center(len(x),'_')for x,y in zip(a.split(),b.split()));a,b=b,a;"*2

Функція приймає два рядки як аргументи та друкує вихід, як у прикладах. Він використовує нудний підхід, сstr.center(width, fillchar) виконуючи більшу частину роботи.

Спробуйте в Інтернеті .


1
Я не думаю, що вам потрібно z, якщо я не пропущу щось, що ви можете просто зробити своп після друку та вставки z.
FryAmTheEggman

@FryAmTheEggman так, ти маєш рацію. Дякую :)
grc

2

Рубі, 111 109 символів

->l{l.map(&:split).transpose.map{|c|c[m=c[0]<c[1]?0:1]=c[1-m].center c[m].size,?_
c}.transpose.map{|s|s*' '}}

Вхід: масив з 2 рядків; вихід: масив з 2 рядків.

Проба зразка:

2.1.5 :001 > puts ->l{l.map(&:split).transpose.map{|c|c[m=c[0]<c[1]?0:1]=c[1-m].center c[m].size,?_;c}.transpose.map{|s|s*' '}}[[
2.1.5 :002 >       'programming _____________ and code golf',
2.1.5 :003 >       'programming puzzles ______ code ____',
2.1.5 :004 >       ]]
programming ___puzzles___ and code golf
programming puzzles _and__ code golf

1

JavaScript, 194 185 байт

f=(m,n)=>(m=m.split` `,n=n.split` `,G=(x,i,a)=>x[0]!='_'?x:(b=(a?n:m)[i],s=x.length-b.length,(k='_'.repeat(s/2))+b+k+(s%2?'_':'')),H=(e,y)=>e.map((x,i)=>G(x,i,y)).join` `,[H(m,1),H(n)])

Приймає два рядки як параметри та виводить два рядки як масив / список


1

Математика 223

Для цього повинен бути коротший спосіб.

k=StringLength;m=StringSplit;
g=Partition[Riffle[m@#,m@#2],2]/.{{a_,a_}:> a<>" ",{a_,b_/; StringTake[b,1]=="_"}:> a<>" ",
{a_,b_}:>Table["_",Ceiling[z=(k@a-k@b)/2]]<>b<>""<>Table["_",Floor@z]<>" "}&;
s_~h~t_:={""<>g[s,t],""<>g[t,s]}

Вибірка зразка

h["programming _____________ and code golf", "programming puzzles ______ code ____"]

введіть тут опис зображення


0

Гема, 208 203 символи

\B=@set{i;0}
<I>=@push{${v;f};$0}@incr{i}
\n=@set{v;s}@set{i;0}
 =
\E=@repeat{$i;@cmps{$f;$s;@set{f;@fill-center{$f;$s}};;@set{s;@fill-center{$s;$f}}}@set{F;$f ${F;}}@set{S;$s ${S;}}@pop{f}@pop{s}}$F\n$S

Просто тому , що Хема має досконалу функцію для виконання цього завдання: .@fill-center{background;value}

Вхідні дані: 2 розділені рядки нового рядка (немає остаточного нового рядка); вихід: 2 рядки, розділені за допомогою нового рядка (з пробілами - не здається забороненим).

Проба зразка:

bash-4.3$ echo -ne 'programming _____________ and code golf\nprogramming puzzles ______ code ____' |
> gema '\B=@set{i;0};<I>=@push{${v;f};$0}@incr{i};\n=@set{v;s}@set{i;0}; =;\E=@repeat{$i;@cmps{$f;$s;@set{f;@fill-center{$f;$s}};;@set{s;@fill-center{$s;$f}}}@set{F;$f ${F;}}@set{S;$s ${S;}}@pop{f}@pop{s}}$F\n$S'
programming ___puzzles___ and code golf 
programming puzzles _and__ code golf 

0

C, 197 байт

#define c(w,y)l=strspn(w,"_"),r=strcspn(y," "),memcpy(w+(l-r)/2,y,r),w+=l,y+=r;
main(l,v,w,y,r)char**v,*w,*y;{for(w=v[1],y=v[2];*w;w++,y++)if(*w^*y)if(*w^95)c(y,w)else c(w,y)puts(v[1]);puts(v[2]);}

Вихідні дані

$ ./a.out "lorem _____ dolor _____ amet _______________ adipiscing elit mauris dapibus tincidunt _____________________________ accumsan fringilla proin vulputate viverra lorem fermentum dictum" "lorem ipsum ______ sit _______ consectetur _______________ elit mauris dapibus tincidunt metus accumsan fringilla proin vulputate viverra lorem ____________________________ dictum"
lorem ipsum dolor _sit_ amet __consectetur__ adipiscing elit mauris dapibus tincidunt ____________metus____________ accumsan fringilla proin vulputate viverra lorem fermentum dictum
lorem ipsum dolor_ sit _amet__ consectetur __adipiscing___ elit mauris dapibus tincidunt metus accumsan fringilla proin vulputate viverra lorem _________fermentum__________ dictum

0

ES6, 122 байти

a=>a.map(s=>s.split` `).map((s,n,a)=>s.map((w,i)=>w<'a'?(l=w.length,t=w+a[n^1][i]+w,t.substr(t.length-l>>1,l)):w).join` `)

Бере масив з двох рядків як єдиний параметр і повертає інший масив з двох рядків.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.