从两根弦注入到一根弦


14

挑战

编写一个应用内射函数的程序,该函数将一对有序的字符串作为输入,一个字符串作为输出。换句话说,每个输入必须映射到唯一的输出。

细节

  • 该输入可以是任何任意长度的两个字符串,但将仅由可打印的ASCII字符(码)。[32,126]
  • 同样,输出字符串没有长度限制,但必须仅由可打印的ASCII字符组成。
  • 如果您的语言无法处理任意长度的字符串,则该程序理论上仅可用于任何大小的字符串。
  • 从输入到输出的映射在程序执行之间应保持一致。否则,您使用的映射完全取决于您,只要是注入即可。
  • 输入是有序的。如果两个输入字符串不同,则它们应产生与被交换时不同的输出。stf(s,t)f(t,s)
  • 并非每个字符串都必须是可能的输出。
  • 每种语言中最短的答案将获胜!

测试用例

以下输入均应导致不同的输出。为避免混淆,字符串被双音节(«»)包围,并用单个空格分隔。

“你好,世界”
«lelho»«拖网»
«差异»«_rent»
“不一样”

«代码»«高尔夫»
«公司»«高尔夫»
«CodeGolf»«»

«»«»
«»«»
«»«»
«»«»
«»«»

«abc”,»«def»
«abc»«,“ def»
«abc'»«'def»
«abc'»«'def»

«\»«“»
«\\»«\“»

8
嗯,我刚刚注意到“编写一个程序,...”-注意,通过元共识(当前为46个,向下1个)“限制为仅程序需要显式指定“完整程序”而不是仅指定“程序””。我希望您不是要限制此事,但是如果您这样做,则需要相应地更新此帖子,并解决我们当中已经提交功能作为答案的人员。
乔纳森·艾伦,

4
@JonathanAllan的目的是允许功能。

3
任一字符串都可以为空吗?
毛茸茸的

2
@Shaggy是的,一个或两个都可以。

1
我们可以有一些测试用例吗?谢谢!
ouflak

Answers:


17

brainfuck,30 29 27 23字节

,[-[+.>]-[>+<---]>.-.,]

在线尝试!

输入由一个0x01字节分隔。

这变成["foo", "bar"]fUToUToUTUTbUTaUTrUT。要恢复原来的两个字符串,请以3个字符为一组,找到第二个字母不在其中的那个U,然后在其中拆分。


@Grimy对不起,被误解了“输入之间用0x01字节分隔。”
wastl

15

JavaScript(ES6),14个字节

将输入作为2个字符串的数组。受路易斯的回答启发。

JSON.stringify

在线尝试!


JavaScript(ES6), 21个  20字节

将输入作为(a)(b)

a=>b=>[a.length,a]+b

在线尝试!

返回的长度,接着是逗号,随后的级联和。aab


他妈的!stringify自己就要用把戏了!
毛茸茸的

打破了a="hello","" b="world"a="hello" b="","world"
太阳城

1
@Soleil那会给["\"hello\",\"\"","\"world\""]["\"hello\"","\"\",\"world\""]
Arnauld

1
@Arnauld反斜杠保护将不可见。该功能将不会注入。
Soleil

1
@Soleil我不明白你的意思。JSON.stringify()绝对逃脱了"看到一个十六进制转储
Arnauld

15

jq -c,0个字节

在线尝试!

这绝对感觉像是在作弊...?但这似乎符合挑战的规则。

默认情况下,jq将以人类可读的JSON格式输出其输入。该-c(紧凑型)标记会jq在“紧凑型”风格,这消除了换行(因为挑战禁止非打印的ASCII)输出。


1
OP允许空输入,因此a =“”,b =“ x”不会提供与a =“ x” b =“”相同的输出
Gnudiff

3
@Gnudiff怎么回事?他们将给予["","x"]["x",""]分别
门把手

1
抱歉,您是对的。
Gnudiff


5

Japt -S,3 个字节

仍然觉得我一定在这里想念什么...

®mc

尝试一下

可能是2个字节:

mq

尝试一下

或用这种1圈拉伸它:

U

尝试一下

第一个版本将数组中的每个字符串映射到其代码点,并将它们与空格连接在一起输出。

第二个版本将每个字符串拆分为一个字符数组,并将它们输出并加一个空格。

而第三个版本,就像是作弊一样,只是输出带有-Q标志的输入,从而大大提高了srringify输入效果。


5

Pyth,4个字节

jNmC

在线尝试!

这会将每个字符串转换为基数256,然后按顺序将它们连接在一起"。由于结果是每个数字,因此可以"明确地将它们分开,并且可以使用来恢复原始字符串mCsdczN


1
@AndersKaseorg建议使用1-byter
凯文·克鲁伊森

@KevinCruijssen我已经知道,自发布此消息后几分钟,我只是更喜欢此解决方案的精神。感谢您反正提出它,并且绝对可以
自行

我确实也更喜欢您的回答。:)而且,我什至不认识Pyth。如果您希望自己将其发布为单独的答案(或通过编辑此答案组合而成的答案),否则Anders Kaseorg可以发布它,因为他是评论中提到它的人。
凯文·克鲁伊森

4

T-SQL,38个字节

SELECT QUOTENAME(a)+QUOTENAME(b)FROM i

ivarcharab

使用QUOTENAME,用[]括住字符串,并转义任何内部括号。应该映射到唯一的输出。


1
在MySQL上具有相同的长度:SELECT CONCAT(QUOTE(a),QUOTE(b))FROM t 在线尝试
Night2

4

Zsh,7个字节

<<<$@:q

在线尝试!

在空间上隐式加入参数。该q修改的zsh讲述引用的论据,其严重逃脱的空间,确保转义的空间分隔明确的两个参数。

(如果没有q"a " "b"并且"a" " b"将两者的产量"a b"。)


3

MATL,1个字节

j

该代码将两个字符串组成的数组作为输入,并输出该数组的字符串表示形式。

在线尝试!

说明

该代码简单地将输入读取为未经评估的字符串。


1
这真的需要两个字符串作为输入吗?看起来这只是打印输入内容。在线尝试!
詹姆斯

1
@DJ它只读取未评估的输入,因此它读取任何内容。有漏洞吗?一种更标准的方法是将评估的输入作为数组,然后转换为字符串表示形式。但是结果将与我的代码相同,因此我认为这种区别是不可观察的
Luis Mendo



3

05AB1E,2个字节

₁ö

在线尝试! 将每个字符串解释为以256为基数的整数,然后以形式打印两个字符串[1, 2]


05AB1E,1个字节(有效性未知)

â

在线尝试!

本身取输入的笛卡尔积。输入中的引号不能转义,这可能导致混乱。我蛮力强行向上的所有组合以12 ", ""], [",并没有发现任何碰撞; 但是,我无法证明较长的字符串没有任何冲突。如果有人可以提出证明或反例,我将不胜感激!

琐碎的0-byter失败,因为引号没有被转义:输入(", ",空字符串)和(空字符串,", ")都产生输出["", "", ""]

1字节º(镜像每个输入字符串)也因此失败,因为:输入(", "" ,",空字符串)和(空字符串," ,"", ")都产生输出["", "" ,"", "" ,"", ""]


3

具有26个字节的C#(感谢Lukas Lang,Kevin Cruijssen和Jo King)

a=>b=>$"{a.Length}.{a}{b}"

tio.run lambda



这仍然在(“ a <>”,“ b”)和(“ a”,“ <> b”)上断开-请注意,即使您只是串联输入,也无法处理所有情况放在它们之间/周围-您需要以某种方式修改字符串
Lukas Lang

1
抱歉,仍然不行:(“ 1”,“ 11111111111”)和(“ 11111111111”,“ 1”)-另一方面(甚至更短)起作用的是$"{a.Length}.{a}{b}"-您可以随时从中提取a和提取b任何内容歧义(直到第一个.得到长度的a,才读取,b然后是其余的
Lukas Lang

1
@LukasLang太好了。感谢您的跟进。
Soleil

1
非常感谢@JoKing!
Soleil

2

木炭,12字节

⪫E²⭆⪪S"⪫""λ,

在线尝试!链接是详细版本的代码。说明:

 E²             Repeat twice
     S          Input a string
    ⪪ "         Split it on `"`s
   ⭆            Map over each piece and join
       ⪫""λ     Wrap each piece in `"`s
⪫          ,    Join the two results with a `,`
                Implicitly print




1

CSS + HTML,55 + 20 = 75字节

<code>标记后的HTML中提供输入。在视觉上将每个输入中的字母逐一注入到输出中。当一个输入的长度大于另一个输入的长度时,将显示较短输入的缺少字母的可视空间。HTML中还添加了一个逗号,以强制视觉输出唯一性(我希望如此)。

*{position:absolute;letter-spacing:9px}code>code{left:9px
<code>abcdefg<code>hijklmn</code>,



1

Perl 6的6 3个字节

&dd

在线尝试!

将对象表示输出到STDERR。


我对Perl不太熟悉-您如何在此处输入包含空格的字符串?

2
@negativeseven 像这样
Grimmy19'Sep

@negativeseven是的,很抱歉,我只是对字符串列表使用了一种快捷语法。您可以采用典型的方式来做到这一点,例如["Hello, ", "World!"]
Jo King

1

Lua,27个字节

print(('%q%q'):format(...))

在线尝试!

完整程序,将输入作为参数。

受zsh答案的启发,它还使用%q修饰符来使用内部安全字符串引擎。

而且,我可以想到

('%q%q'):format

但我不确定这是否可以接受。


我认为第二个是无效的,因为('%q%q'):format它不会导致例如可以分配给变量的对象。它只会自行导致语法错误。冒号语法只是该方法的捷径'%q%q'.format('%q%q', ...),Lua不允许部分应用该功能
Jo King

@JoKing是的,我认为您是对的。
瓦尔说莫妮卡(Monica)

1

sed,19个字节

N
s/ /. /g
s/\n/: /

在线尝试!

N          # append the second string into the pattern space
s/ /. /g   # prefix all spaces with ".". Now ": " will not occur in the stiring
s/\n/: /   # replace the newline with ": "


1

C(gcc),59个字节

感谢格里米的建议。

接受输入字符串数组(其中“ 2”是此挑战的正确数字)并打印其字符值,包括结尾NUL。从技术上讲,所%p使用的格式化程序用于printf指针,但如果您对它们的外观不挑剔,则可以很好地显示任意整数的十六进制值!

f(s,t)char**s,*t;{for(;t=*s++;)for(;printf("%p",*t++)^5;);}

在线尝试!


真好!这是59
Grimmy




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.