2つの文字列から1つの文字列への注入


13

チャレンジ

入力として文字列の順序付きペアを、出力として1つの文字列をとる単射関数を適用するプログラムを作成します。つまり、各入力は一意の出力にマップする必要があります。

仕様

  • 入力があってもよい、任意の任意の長さの2つの文字列のみ印刷可能なASCII文字(コードからなるであろう[32,126])。
  • 同様に、出力文字列には長さの制限はありませんが、印刷可能なASCII文字のみで構成する必要があります。
  • 言語が任意の長さの文字列を処理できない場合、プログラムは単に任意のサイズの文字列に対して理論的に機能する可能性があります。
  • 入力から出力へのマッピングは、プログラムの実行間で一貫している必要があります。それ以外の場合、インジェクションである限り、使用するマッピングは完全にユーザー次第です。
  • 入力が順序付けられます。2つの入力文字列が異なる場合、それらはスワップされた場合とは異なる出力を生成するはずです。stf(s,t)f(t,s)
  • すべての文字列が可能な出力である必要はありません。
  • 各言語の最短回答が勝ちます!

テストケース

次の入力はすべて異なる出力になるはずです。混乱を避けるため、文字列はギメット(«»)で囲まれ、単一のスペースで区切られています。

"こんにちは世界"
«lelho»«ドロール»
«diffe»«_rent»
"同じではありません"

«コード»«ゴルフ»
«Co»«deGolf»
«CodeGolf»«»

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

«abc "、»«def»
«abc»«、 "def»
«abc '»«' def»
«abc '»«' def»

«\»« "»
«\\»«\ "»

8
ノートをメタコンセンサス(現在は46アップ、1ダウン)であること-うーん、私はちょうど「というプログラムを書いてください...」気づいた完全なプログラム『だけではなく、『プログラム』「」だけのプログラムに制限することは、明示的に指定が必要です』。これを制限しようと意図したのではないことを願っていますが、もしそうした場合は、それに応じて投稿を更新し、回答としてすでに機能を送信した私たちのものに対処する必要があります。
ジョナサンアラン

4
@JonathanAllan意図は関数を許可することでした。
負の7

3
どちらの文字列も空にできますか?
シャギー

2
@Shaggyはい、どちらかまたは両方が可能です。
負の7

1
テストケースはありますか?ありがとう!
ouflak

回答:


17

brainfuck、30 29 27 23バイト

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

オンラインでお試しください!

入力は0x01バイトで区切られます。

このターン["foo", "bar"]fUToUToUTUTbUTaUTrUT。元の2つの文字列を復元するには、3文字のグループを取得し、2番目の文字がでない文字を見つけて、そこでU分割します。


@Grimy申し訳ありませんが、「入力は0x01バイトで区切られています」と誤解されました。
-wastl

15

JavaScript(ES6)、14バイト

入力を2つの文字列の配列として受け取ります。ルイスの答えに触発されました。

JSON.stringify

オンラインでお試しください!


JavaScript(ES6)、 21  20バイト

入力をとして受け取ります(a)(b)

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

オンラインでお試しください!

aの長さ、コンマ、ab連結が続きます。


ゴッドダムニット!stringify自分でトリックを使用しようとしていました!
シャギー

ブレイクとa="hello","" b="world"a="hello" b="","world"
ソレイユ

1
@Soleilそれは与えるだろう["\"hello\",\"\"","\"world\""]["\"hello\"","\"\",\"world\""]
アーナルド

1
@Arnauldのバックスラッシュ保護は表示されません。関数は挿入しません。
ソレイユ

1
@ソレイユ私はあなたが何を意味するのか理解できません。JSON.stringify()間違いなく逃げ"ます。16進ダンプを参照してください
アーナルド

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

それを試してみてください

最初のバージョンでは、配列内の各文字列をコードポイントにマップし、スペースで結合して出力します。

2番目のバージョンは、各文字列を文字配列に分割し、スペースで結合して出力します。

そして、欺瞞のように感じている3番目のバージョンは、ただで入力を出力-Qの重い物を持ち上げるやっフラグsrringifyそれをINGのを。


5

Pyth、4バイト

jNmC

オンラインでお試しください!

これは、各文字列を基数256に変換してから、aで順番に結合します"。結果はそれぞれの数字であるため、"それらは明確に分離され、元の文字列はで復元できますmCsdczN


1
@AndersKaseorgは1バイトを提案しています。
ケビンCruijssen

@KevinCruijssenこれを投稿してから数分以来、私はこのソリューションの精神を好むことを知っています。とにかくそれを持ち出してくれてありがとう、そして間違いなく自分で投稿してください:)
FryAmTheEggman

私もあなたの答えが好きです。:)そして、ああ、私もPythを知りません。必要に応じて、個別の回答(またはこの回答を編集して組み合わせた回答)として自分で投稿することができます。そうでない場合は、Anders Kaseorgが投稿できます。
ケビンクルーイッセン

4

T-SQL、38バイト

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

入力は既存のテーブルから取得されます varcharフィールドa そして b IOルールに従って

を使用します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

このコードは、2つの文字列の配列を入力として受け取り、その配列の文字列表現を出力します。

オンラインでお試しください!

説明

コードは、入力を評価されていない文字列として単に読み取ります。


1
これは本当に2つの文字列を入力として受け取りますか?これは何でも入力を印刷するようです。オンラインでお試しください!
ジェームズ

1
@DJ未評価の入力を読み取るため、何でも読み取ります。抜け穴ですか?より標準的なアプローチは、評価された入力を配列として取得し、文字列表現に変換することです。私は区別が観測不能であることを主張したいので、しかし結果は、私のコードと同じになります
ルイスMendo



3

05AB1E、2バイト

₁ö

オンラインでお試しください! 各文字列を基数256の整数として解釈し、2つの形式で出力し[1, 2]ます。


05AB1E、1バイト(不明な有効性)

â

オンラインでお試しください!

入力のデカルト積をそれ自体で取ります。入力内の引用符はエスケープされず、混乱を招く可能性があります。12までのすべての組み合わせを総当たり攻撃し", ""], ["し、任意の衝突を見つけられませんでした。ただし、長い文字列の衝突がないことを証明することはできません。誰かが証拠や反例を思い付くことができるなら、私はそれを高く評価します!

引用符がエスケープされていないため、単純な0バイトは失敗します。入力(", "、空の文字列)と(空の文字列", ")は両方ともoutputを生成します["", "", ""]

このため、1バイトº(各入力文字列をミラーリング)も失敗します。入力(", "" ,"、空の文字列)と(空の文字列、" ,"", ")は両方ともoutputを生成します["", "" ,"", "" ,"", ""]


3

26バイトのC#(Lukas Lang、Kevin Cruijssen、Jo Kingに感謝)

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

tio.run lambda


1
Please consider using tio.run
Ver Nick says Reinstate Monica

This still breaks on ("a<>","b") and ("a","<>b") - note that it is impossible to handle all cases if you're just concatenating the inputs, no matter what you put between/around them - you need to modify the strings somehow
Lukas Lang

1
Sorry, still not: ("1","11111111111") and ("11111111111","1") - what does work on the other hand (and is even shorter) is this $"{a.Length}.{a}{b}" - you can always extract a and b from this without any ambiguity (just read until the first . to get the length of a, b is then the rest
Lukas Lang

1
@LukasLang Great. Thanks for the follow ups.
Soleil

1
Many thanks @JoKing !
Soleil

2

Charcoal, 12 bytes

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

Try it online! Link is to verbose version of code. Explanation:

 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 bytes

Provide the inputs in the HTML after <code> tags. Visually injects letters one by one from each input into the output. When an input is longer than the other one, visual spaces are shown for missing letter(s) of the shorter input. Also one comma is added in HTML to force visual output uniqueness (I hope).

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



1

Perl 6, 6 3 bytes

&dd

Try it online!

Outputs the object representation to STDERR.


I'm not familiar enough with Perl - how would you input a string containing spaces here?
negative seven

2
@negativeseven like this
Grimmy

@negativeseven Yeah sorry, I was just using a shortcut syntax for lists of strings. You can do that in a typical fashion like ["Hello, ", "World!"]
Jo King

1

Lua, 27 bytes

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

Try it online!

Full program, take input as arguments.

Inspired by zsh answer, as it also use %q modifier to use internal safe-string engine.

Also, I can think of just

('%q%q'):format

but I'm not sure if this is acceptable answer.


I don't think the second is valid since ('%q%q'):format doesn't result in an object that can, for example, be assigned to a variable. It just causes a syntax error on its own. The colon syntax is just a shortcut for '%q%q'.format('%q%q', ...) and Lua doesn't allow partial application for functions
Jo King

@JoKing Yeah, you are right, I think.
val says Reinstate Monica

1

sed, 19 bytes

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

Try it online!

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 bytes

Thanks to Grimy for the suggestion.

Takes an array of input strings (of which "2" is the correct number for this challenge) and prints their character values, including the trailing NUL. Technically, the %p formatter used by printf is for pointers, but it works fine for displaying hex values of arbitrary integers if you're not picky about how they look!

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

Try it online!


Nice! Here’s a 59.
Grimmy




弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.