现实生活中的共轭


14

@Adám的 Dyalog APL扩展中(下)运算符表示共轭:应用一个函数,然后应用第二个函数,然后应用第一个函数的反函数。从共轭的角度考虑现实生活中的动作很有趣:

一个问题由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”开头;这将是其他一些线的反面。没有行将为空。

输出量

以您输入时使用的相同格式或标准I / O允许的格式输出。

测试用例:

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
当我过量饮酒时,我也没有任何输出
Stan Strum

1
难道不是“拿走书并付钱买书”吗?否则不清楚转换是否等同于原始转换...
Jonah

1
@Jonah这个想法是在理想的世界中w =“ walk to store”和w ^ -1 =“ unwalk to store”是逆的,因此从数学上来说wfw ^ -1wg ^ -1 = wfgw ^ -1。
lirtosiast

足够公平了,@ lirtosiast。
乔纳

Answers:


3

Brachylog,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,因此管道占用相当多的字节。

在线尝试!


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

1

JavaScript(Babel节点),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确实失败。现在已修复。
Arnauld

1

干净 147字节

import StdEnv,Data.List
a=inits;b=tails
$l=hd[w++[e++[' under ':u]\\e<-z]++y\\i<-a l&t<-b l,w<-a i&u<-i,z<-a t&[x:y]<-b t|u==['un':x]||x==['un':u]]

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.