组成填空


18

假设我们在字符串上有一组特定的函数。这些函数有点像填入空格或madlib,不同之处在于它们仅接受一个输入并使用该输入来填入所有空白。例如,我们可能有一个看起来像

I went to the ____ store and bought ____ today.

如果我们将此功能应用于字符串cheese,结果将是:

I went to the cheese store and bought cheese today.

我们可以将这些函数表示为字符串的非空列表,其中的空格只是字符串之间的空白。例如,我们上面的函数将是:

["I went to the ", " store and bought ", " today."]

在这种表示形式下,此类每种功能只有一种表示形式,而每种表示形式仅一种功能。

一件真正整洁的事情是,这些功能的集合在组合时是封闭的。也就是说,我们两个功能的组合始终是这些功能中的另一个。例如,如果我用

["blue ", ""]

(添加blue到输入的函数)我们得到函数:

["I went to the blue ", " store and bought blue ", " today."]

这些可能会变得更加复杂。例如,如果我们用

["big ", " and ", ""]

结果是

["I went to the big ", " and ", " store and bought big ", "and", " today."]

任务

您的任务是采用描述为字符串的非空列表的两个函数,并将它们的组成作为字符串的非空列表输出。

出于此挑战的目的,列表可以是允许重复的任何有序容器,字符串可以是本机字符串类型,字符列表或整数列表。

这是答案,将以字节计分,而字节越少越好。

测试用例

["","xy"] ["ab",""] -> ["ab","xy"]
["x","y","z"] ["a","b"] -> ["xa","bya","bz"]
["xy"] ["ab"] -> ["xy"]
["","",""] ["a",""] -> ["a","a",""]
["x",""] ["","",""] -> ["x","",""]
["x","y","z"] ["a","b","c"] -> ["xa","b","cya","b","cz"]
["x","x","x"] ["a"] -> ["xaxax"]
["w","x","y","z"] ["ab","cd","e"] -> ["wab","cd","exab","cd","eyab","cd","ez"]

1
如果输入中使用了一些不可打印的ASCII字符(SOH,TAB或LF,具体取决于答案),当前所有3个现有答案都会失败。因此,我认为您应该真正决定输入是否限于可打印的ASCII。
Arnauld

@Arnauld好的,到目前为止,它是不受限制的,我还没有看到更改它的理由,因此它仍然存在。
小麦巫师

2
@KevinCruijssen我的有效,因为零不是一个字符。幸运的语言功能可以帮助您。
乔纳森·艾伦

1
@ SriotchilismO'Zaic我的05AB1E正在加入/换行。JavaScript和Haskell答案通过制表符连接/拆分,C#答案由不可打印字符``(SOH)组成,因此所有这些都同样无效。不过,我也不太了解Perl 5。这样一来可能是有效的。
凯文克鲁伊森

3
@罗马您不能假定任何字符都不会出现在输入中,因此可以将其用作分隔符。您必须真正解决挑战。
小麦巫师

Answers:


11

果冻,6 个字节

j0j@ṣ0

甲二进链路接受第一对函数表示第二对函数表示其产生所得到的函数表示。每个函数表示形式都是一个字符列表(Jelly没有其他字符串)。

在线尝试!(完整程序参数以Python表示法给出;字符串成为列表。页脚显示了Link输出的Python表示。)

这是一个测试套件,可以像输入一样重新格式化Link的输出。

怎么样?

利用Jelly的混合类型列表,通过使用整数零作为占位符来允许整个表示域(字符列表的任何列表):

j0j@ṣ0 - Link: b, a        e.g.    b = [['a','b'],['c','d'],['e']]
       -                   ...and  a = [['w'],['x'],['y'],['z']]
                             (i.e. test-case ["w","x","y","z"] ["ab","cd","e"])
j0     - join b with zeros         ['a','b',0,'c','d',0,'e']    
  j@   - join a with that          ['w','a','b',0,'c','d',0,'e','x','a','b',0,'c','d',0,'e','y','a','b',0,'c','d',0,'e','z']
    ṣ0 - split at zeros            [['w','a','b'],['c','d'],['e','x','a','b'],['c','d'],['e','y','a','b'],['c','d'],['e','z']
                             (i.e.: ["wab","cd","exab","cd","eyab","cd","ez"])

如果我们需要处理Jelly的任何混合列表(包括任何深度或形状的列表),我们都可以使用这八个byter:j,©⁹jœṣ®它将成对的参数用作占位符。



5

Python 3.8(预发布) 60  58字节

lambda a,b:(v:='&'.join(a+b)+'$').join(b).join(a).split(v)

一位不愿具名的函数接受字符串的两个列表,a并且b,它返回一个字符串列表。

在线尝试!或查看测试套件

怎么样?

首先形成分隔符字符串,va或中找不到b。然后通过将字符串b与的副本连接在一起来形成字符串v。然后通过将字符串a与该字符串的副本连接起来来形成字符串。最后在的实例处拆分该字符串v以提供字符串列表。

虽然确保v不在,a否则b我们还必须确保v在in a和in所有字符串b相等的情况下,我们不会早日分裂。为此,我们v将两个列表中的所有字符串与一个字符串的实例连接在一起(此处为'&'),并添加一个额外的不同字符(此处为'$')。请注意,单独执行任一操作还不够,因为输入中的所有字符串都可以等于所选字符。


您能否在&需要的地方给出示例输入?而且使用''.join(a+b)+'$'还不够?
小麦巫师

我花了一段时间,但['$','$'] ['$','$']会成为一个。
小麦向导

是的,如果所有字符串都等于所选'$'字符,并且结果将不止一个字符串,那么我们需要在其中输入一个不同的字符,以避免过早拆分。
乔纳森·艾伦

2

05AB1E4 15 19 9 11 字节

«TýR©ý¹sý®¡

与Jelly的答案不同,05AB1E的string "0",integer 0和float 0.0都(在某种程度上)相等,所以我不能用整数拆分/连接。这就是为什么我们有+15字节作为解决方法的原因,尽管我现在将其恢复为9字节。感谢@JonathanAllan发现了2个bug。

在线尝试验证所有测试用例

说明:

«            # Merge the two (implicit) input-lists together
 Tý          # Then using a "10" delimiter join all strings together
   R         # Reverse this string
    ©        # Store this string in variable `®` (without popping)
     ý       # Use this string as delimiter to join the second (implicit) input-list
      ¹sý    # Then join the first input-list by this entire string
         ®¡  # And split it back on variable `®` so it's the expected list of strings
             # (after which this result is output implicitly)

2
如果输入包含换行符,则此操作将失败(OP表示当前输入不受限制)。
暴民埃里克

@EriktheOutgolfer每个其他答案都有同样的问题。
凯文·克鲁伊森

@EriktheOutgolfer绝对可以打更多的高尔夫球,但是现在进行了快速又肮脏的修复。
凯文·克鲁伊森

1
嗯,对此感到抱歉...如果输入列表中包含仅包含换行符的字符串,它将不起作用:((它将尽早拆分)
Jonathan Allan

1
@JonathanAllan大声笑..唉,我想我只能感谢你发现这些错误。我希望它现在固定的,你不会找到任何东西。虽然我有一种感觉,你可能..
凯文Cruijssen


2

Japt,8字节

适应乔纳森的方法

qVqN²)qN

尝试一下

qVqN²)qN     :Implicit input of arrays U & V (N=[U,V])
q            :Join U with
 Vq          :  V joined with
   N²        :    Push 2 to N (modifying the original), which gets coerced to a string
             >     e.g., N=[["a","b"],["c","d"]] -> N=[["a","b"],["c","d"],2] -> "a,b,c,d,2"
     )       :End join
      qN     :Split on the modified N, which, again, gets coerced to a string
             > e.g., N=[["a","b"],["c","d"],2] -> "a,b,c,d,2"

什么是N在这种情况下?如果我正确理解(使用TryIt-link的搜索功能),它将重复N两次()。然后,它使用它来连接第二个输入VVqN²),然后使用整个字符串来连接第一个(隐式)输入Uq...))。最后在NqN)上分割结果字符串。但是N在这种情况下该怎么办?
凯文·克鲁伊森

等等,我想我在搜索中看错了p(...)方法。它将追加2到配对的两个输入上,不是吗。仅产生[["w","x","y","z"],["ab","cd","e"],2],并且使用整个列表进行加入。在这种情况下,决赛为什么不将结果qN2在结果列表中?还是修改原件N
凯文·克鲁伊森

1
@KevinCruijssen,添加了一个解释,但您几乎已经弄明白了。而且,是的,将push元素添加到JS中的数组会修改原始数组。
毛茸茸的


1

J44 43 42 29字节

_<;._1@,(;@}:@,@,.(,_&,)&.>/)

在线尝试!

-13字节感谢英里!

这种方法使用整数,是由于英里。

字符串的原始方法

g=.[:}.@,,.
f=.(<@0<@;;._1@,];@g<"0@[)<@0<@g]

在线尝试!

注意:我已将TIO调整为-3,以说明 f=.

使用Jonathan Allen的方法,适用于J。

这很难打高尔夫球,因为J没有内置的“ join”方法,我很想知道它是否可以显着改善。

g 是使我们“加入”的辅助动词


使用整数列表作为输入,我发现了一个29字符的解决方案_<;._1@,(;@}:@,@,.(,_&,)&.>/)使用无穷大_作为前哨值来知道在哪里拆分<;._1。连接首先使用reduce /形成一个大盒子,然后进行数组整形。
英里

这很让人佩服。谢谢@miles。这个人肯定感觉有需要改进的地方,但我不知道如何做。
约拿

@miles是否不应该g&.:(a.&i.&.>)计入字节数,否则我会丢失什么吗?
约拿

OP提到输入可以是字符列表或整数列表,因此帮助器功能只是将char数组的框转换为int数组的框以便于查看
英里

啊,我忘了,谢谢
约拿



0

Perl 5(-lp),20个字节

正如@JonathanAllan所说,这是一个完整的程序,对于IO,使用一个选项卡作为列表分隔符,并使用换行符分隔两个列表。

chop($n=<>);s/  /$n/g

蒂奥

选择选项卡和换行符是因为更方便地检查测试用例,否则可以将其更改为不可打印的字符\1\2

-02l012p

chop($n=<>);s//$n/g

蒂奥

怎么运行的,

  • -02 :将输入记录分隔符设置为 \2
  • -l:从默认参数中删除输入分隔符$_,并将输出记录分隔符添加到默认输出
  • -012:将输出记录分隔符设置为\012\n),以便于检查输出
  • -p :打印默认参数

  • $n=<>; :读取下一条记录并分配给 $n

  • chop$n; :从中删除分隔符 $n
  • s/\x1/$n/g:用替换所有出现\1$n

2
我的Perl几乎不存在,但是我认为这是一个完整的程序,对于IO,使用一个选项卡作为列表分隔符,并使用换行符分隔两个列表。如何接受这些字符的输入?
乔纳森·艾伦

@JonathanAllan,您是对的,我没有时间在提交时会添加说明,我会尽力做
Nahuel Fouilleul

0

JavaScript(ES6), 62  59字节

@Shaggy节省了3个字节

这是Luis答案的固定版本(现已删除),以支持所有字符。

a=>b=>a.map(e=escape).join(b.map(e)).split`,`.map(unescape)

在线尝试!

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.