Сполучення в реальному житті


14

В @ Адамов Dyalog APL Extended , то (в) оператор засоби сполучення: застосовувати одну функцію, а потім другу функцію, то зворотна першої. Приємно думати про реальні дії з точки зору сполучення:

Проблема перетворюється g в інший домен, де вона легше вирішується f, а потім перетворюється назад у вихідний домен. Приклад із реального життя - "під наркозом":

apply anesthetics
    perform surgery
wake up from anesthetics

Виклик

Зворотний рядок gє "un" g, і навпаки. Визначте будь-яку лінію між sта її зворотною, у тому порядку, як "під" s. Для кожного рядка fвведення в порядку:

  • Якщо fі її зворотна ситуація має місце, нічого не робіть
  • Якщо fне вказано жодної іншої дії, надрукуйтеf
  • Якщо fрядок "під" g, надрукуйте, f + " under " + gде +є конкатенація.

Вхідні дані

Непорожній багаторядковий рядок або список рядків тощо, що складається з пробілів і малих літер (замість цього можна використовувати великі регістри). Рівно один рядок розпочнеться з "un"; і це буде оберненою деякою іншою лінією. Жоден рядок не буде порожнім.

Вихідні дані

Виведіть у тому ж форматі, у якому ви приймали вхід, або відповідно до стандартного вводу / виводу.

Тестові приклади:

Input:
apply anesthetics
perform surgery
unapply anesthetics

Output:
perform surgery under apply anesthetics


Input:
unite asia
establish the silk road
ite asia

Output:
establish the silk road under unite asia


Input:
desire a book
walk to store
take the book
pay for the book
unwalk to store
read the book

Output:
desire a book
take the book under walk to store
pay for the book under walk to store
read the book


Input:
drink excessively
undrink excessively

Output:
[empty string]

1
У мене теж немає виходу, коли я п'ю надмірно
Стен Струм

1
чи не повинно бути "взяти книгу та оплатити її за прогулянку до магазину"? інакше не ясно, що перетворення еквівалентно оригіналу ...
Йона

1
@Jonah Ідея в ідеальному світі w = "прогулянка до магазину" і w ^ -1 = "розмовляти до магазину" є оберненими, тому математично wfw ^ -1wg ^ -1 = wfgw ^ -1.
ліртосіаст

Ну досить чесно, @lirtosiast.
Йона

Відповіді:


3

Брахілог , 90 байт

;Ṡ{hhH↰₂gB&hb~c[A,B,C]&tT;C↔↰U∧" under ",H,T;A↔↰,U|tT&hh,TgJ&hb;T↰Q∧J,Q|h}
~↰₃|↰₃
∧"un";?c

Я зробив це, будучи під враженням, що це може бути рекурсивно, і кілька підкреслень можуть бути укладені. Напевно, не оптимізовано. Крім того, що це брацилог, сантехніка займає досить багато байтів.

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


2

Сітківка , 82 байти

m{A`^(un)?(.+)¶(?(1)|un)\2$
^((un)?(.+)¶)(.+)¶((.+¶)*(?(2)|un)\3)$
$4 under $1$1$5

Спробуйте в Інтернеті! Посилання включає тестові випадки. Пояснення:

m{

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

A`^(un)?(.+)¶(?(1)|un)\2$

Шукайте рядки, які можуть починатися unі супроводжуватись рядком, який починається з unлише, якщо попереднього рядка немає, а решта - однаковий, і видаліть обидва рядки. (Це зміна поведінки від Retina 0.8.2, яка розбиває рядки перед спробою співпадіння, і тому ніколи не може видалити рядки, якщо для відповідності потрібно пройти більше ніж один рядок.)

^((un)?(.+)¶)(.+)¶((.+¶)*(?(2)|un)\3)$

Шукайте рядки, які можуть починатися un, а потім принаймні один рядок, а потім рядок, який починається unлише тоді, коли початкового рядка немає, а решта рядка однакова.

$4 under $1$1$5

Перемістіть оригінальну лінію вниз по одній лінії, а також додайте її underдо просто пройденої лінії. (Додаткові рядки будуть оброблятися повтором.)


2

Пітон 2 , 106 байт

s=input()
x=''
l=[]
for i in s:
 if'un'==i[:2]or'un'+i in s:x=(' under '+i)*(not x)
 else:l+=[i+x]
print l

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

Якщо вхід може бути списком зі STDIN, а висновок відокремлений у новому рядку, у нас є це 94-байтове рішення:

s=input()
x=''
for i in s:
 if'un'==i[:2]or'un'+i in s:x=(' under '+i)*(not x)
 else:print i+x

1

JavaScript (Babel Node) , 91 байт

Вводить введення як масив рядків у малому регістрі. Повертає ще один масив рядків.

a=>a.flatMap(s=>s==r|'un'+s==r?(u=u?'':' under '+s,[]):s+u,u='',r=a.find(s=>/^un/.test(s)))

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

Прокоментував

a =>                     // a[] = input array
  a.flatMap(s =>         // for each string s in a[]:
    s == r |             //   if s matches the reference string
    'un' + s == r ? (    //   or its opposite:
      u =                //     update u:
        u ?              //       if u is not an empty string:
          ''             //         turn it to an empty string
        :                //       else:
          ' under ' + s, //         set it to s with the ' under ' prefix
      []                 //     yield an empty array so that this entry is removed
    ) :                  //   else:
      s + u,             //     yield s followed by u
    u = '',              //   initialize u to an empty string
    r = a.find(s =>      //   initialize r ...
      /^un/.test(s)      //     ... to the string beginning with 'un'
    )                    //
  )                      // end of flatMap()


@ l4m2 Справді не вдалося. Тепер виправлено.
Арнольд

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