Спряжение в реальной жизни

14

В Dyalog APL Extended от @ Adám оператор (under) означает сопряжение: примените одну функцию, затем вторую функцию, а затем инверсию первой. Интересно думать о реальных действиях с точки зрения сопряжения:

Задача преобразуется 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]
lirtosiast
источник
1
У меня тоже нет выхода, когда я пью чрезмерно
Stan Strum
1
не должно ли это быть "взять книгу и заплатить за книгу под прогулкой, чтобы хранить"? в противном случае не ясно, что преобразование эквивалентно оригиналу ...
Иона
1
@Jonah Идея в идеальном мире: w = "ходить в магазин", а w ^ -1 = "не ходить в магазин" - это инверсии, поэтому математически wfw ^ -1wg ^ -1 = wfgw ^ -1.
lirtosiast
Ах, честно, @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

Я сделал это, находясь под впечатлением, что это может быть рекурсивно, и несколько нижних слоев могут быть сложены. Вероятно, не оптимизирован. Кроме того, поскольку это bracylog, сантехника занимает довольно много байтов.

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

Kroppeb
источник
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

Python 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
Эрик Outgolfer
источник
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()
Arnauld
источник
@ l4m2 Действительно провал. Сейчас исправлено.
Арно