Injeksi dari dua string ke satu string


13

Tantangan

Tulis sebuah program yang menerapkan fungsi injeksi yang mengambil pasangan string yang dipesan sebagai input dan satu string sebagai output. Dengan kata lain, setiap input harus dipetakan ke output yang unik.

Spesifik

  • Input mungkin setiap dua string panjang sewenang-wenang, tetapi akan hanya terdiri dari karakter ASCII yang dapat dicetak (kode [32,126] ).
  • Demikian pula, string output tidak memiliki batasan panjang, tetapi harus hanya terdiri dari karakter ASCII yang dapat dicetak.
  • Jika bahasa Anda tidak dapat menangani string dengan panjang sewenang-wenang, program mungkin hanya bekerja secara teoritis untuk string dengan ukuran berapa pun.
  • Pemetaan dari input ke output harus konsisten antara pelaksanaan program. Kalau tidak, pemetaan yang Anda gunakan sepenuhnya terserah Anda, asalkan itu injeksi.
  • Input dipesan. Jika dua string input berbeda, mereka harus menghasilkan output yang berbeda daripada jika mereka bertukar. stf(s,t)f(t,s)
  • Tidak setiap string harus berupa output yang memungkinkan.
  • Jawaban terpendek di setiap bahasa menang!

Uji kasus

Input berikut harus semuanya menghasilkan output yang berbeda. Untuk menghindari kebingungan, string dikelilingi oleh guillemets («») dan dipisahkan oleh spasi tunggal.

"Halo Dunia"
«Lelho» «drowl»
«Berbeda» «_rent»
"tidak sama"

«Kode» «Golf»
«Co» «deGolf»
«CodeGolf» «»

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

«Abc", »« def »
«Abc» «," def »
«Abc '» «def»
«Abc '» «def»

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

8
Hmm saya baru saja memperhatikan "Tulis sebuah program yang ..." - perhatikan bahwa dengan konsensus meta (saat ini 46 ke atas, 1 ke bawah) "Membatasi program yang adil membutuhkan secara eksplisit menentukan" program penuh "daripada hanya" program "" . Saya harap Anda tidak bermaksud untuk mencoba membatasi ini, tetapi jika Anda melakukannya Anda harus memperbarui posting yang sesuai dan alamat kita yang telah mengirimkan fungsi sebagai jawaban.
Jonathan Allan

4
@ JonathanAllan Tujuannya adalah untuk mengizinkan fungsi.
negatif tujuh

3
Bisakah salah satu senarnya kosong?
Shaggy

2
@ Shaggy Ya, salah satu atau keduanya bisa.
negatif tujuh

1
Bisakah kita memiliki beberapa test case? Terima kasih!
ouflak

Jawaban:


17

brainfuck, 30 29 27 23 byte

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

Cobalah online!

Input dipisahkan oleh 0x01byte.

Ini berubah ["foo", "bar"]menjadi fUToUToUTUTbUTaUTrUT. Untuk memulihkan dua string asli, ambil grup 3 karakter, temukan satu di mana huruf kedua tidak U, dan pisahkan di sana.


@ Grim Maaf, disalahpahami "Input dipisahkan oleh byte 0x01."
wastl

15

JavaScript (ES6), 14 byte

Mengambil input sebagai array dari 2 string. Terinspirasi oleh jawaban Luis .

JSON.stringify

Cobalah online!


JavaScript (ES6),  21  20 byte

Mengambil input sebagai (a)(b).

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

Cobalah online!

Mengembalikan panjang a , diikuti oleh koma, diikuti oleh rangkaian a dan b .


Persetan! Baru saja akan menggunakan stringifytrik sendiri!
Shaggy

Putus dengan a="hello","" b="world"dana="hello" b="","world"
Soleil

1
@ Solil Itu akan memberi ["\"hello\",\"\"","\"world\""]dan ["\"hello\"","\"\",\"world\""].
Arnauld

1
@Arnauld perlindungan backslash tidak akan terlihat. Fungsi tidak akan menyuntikkan.
Soleil

1
@Soleil Saya tidak mengerti maksud Anda. JSON.stringify()pasti lolos ". Lihat dump hex .
Arnauld

15

jq -c, 0 byte

Cobalah online!

Ini pasti terasa seperti selingkuh ...? Tetapi tampaknya memenuhi aturan tantangan.

Secara default, jqakan menampilkan inputnya dalam format JSON yang dapat dibaca manusia. The -c(kompak) flag memberitahu jqke output dalam "kompak" gaya, yang menghilangkan baris baru (karena tantangan melarang ASCII non-printable).


1
OP mengizinkan input kosong, jadi a = "", b = "x" tidak akan memberikan output yang sama dengan a = "x" b = ""
Gnudiff

3
@ Grudiff Bagaimana? Mereka akan memberi ["","x"]dan ["x",""]masing
Gagang Pintu

1
Maaf kamu benar
Gnudiff


5

Japt -S , 3 byte

Saya masih merasa harus kehilangan sesuatu di sini ...

®mc

Cobalah

Kemungkinan 2 byte:

mq

Cobalah

Atau lakukan peregangan dengan 1-byter ini:

U

Cobalah

Versi pertama memetakan setiap string dalam array ke titik-titik kodenya dan menampilkannya dengan spasi.

Versi kedua membagi setiap string ke array karakter dan menampilkannya bergabung dengan spasi.

Dan versi ketiga, yang terasa seperti selingkuh, hanya menampilkan input dengan -Qflag melakukan pengangkatan yang berat srringify.


5

Pyth , 4 byte

jNmC

Cobalah online!

Ini mengonversi setiap string ke basis 256 dan kemudian bergabung dengan mereka dalam urutan dengan a ". Karena hasilnya adalah masing-masing angka yang "dipisahkan dengan jelas dan string asli dapat dipulihkan dengan mCsdczN.


1
@AndersKaseorg menyarankan 1-byter .
Kevin Cruijssen

@KevinCruijssen Saya sudah menyadari itu sejak beberapa menit setelah saya memposting ini, saya hanya lebih suka semangat solusi ini. Terima kasih telah membawanya, dan pasti merasa bebas untuk mempostingnya sendiri :)
FryAmTheEggman

Saya memang lebih menyukai jawaban Anda. :) Dan nah, aku bahkan tidak tahu Pyth. Jika mau, Anda dapat mempostingnya sendiri sebagai jawaban yang terpisah (atau jawaban gabungan dengan mengedit yang ini), jika tidak Anders Kaseorg dapat mempostingnya, karena dialah yang menyebutkannya dalam komentar.
Kevin Cruijssen

4

T-SQL, 38 byte

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

sayavarcharSebuahb

Penggunaan QUOTENAME, yang mengelilingi string dengan []dan juga lolos dari tanda kurung internal. Harus memetakan ke hasil yang unik.


1
Panjang yang sama di MySQL: SELECT CONCAT(QUOTE(a),QUOTE(b))FROM t Cobalah online
Night2

4

Zsh , 7 byte

<<<$@:q

Cobalah online!

Secara implisit bergabung dengan argumen tentang ruang. Ituq pengubah memberitahu zsh mengutip argumen, yang krusial lolos spasi, memastikan ruang unescaped jelas memisahkan dua argumen.

(Tanpa q, "a " "b"dan "a" " b"keduanya akan menghasilkan "a b".)


3

MATL , 1 byte

j

Kode mengambil array dari dua string sebagai input, dan menampilkan representasi string dari array itu.

Cobalah online!

Penjelasan

Kode hanya membaca input sebagai string, tidak dievaluasi.


1
Apakah ini benar-benar mengambil dua string sebagai input? Sepertinya ini hanya mencetak input apa pun itu. Cobalah online!
James

1
@ DJ Hanya membaca input yang tidak dievaluasi, jadi membaca apa pun. Apakah ini celah? Pendekatan yang lebih standar adalah dengan mengambil input yang dievaluasi sebagai array dan kemudian mengkonversi ke representasi string. Tetapi hasilnya akan sama dengan kode saya, jadi saya berpendapat bahwa perbedaannya tidak dapat diamati
Luis Mendo

3

Jelly , 2 byte

ŒṘ

Tautan monadik yang menerima daftar dua daftar karakter sebagai argumennya yang menghasilkan satu daftar karakter.

Cobalah online!

Bagaimana?

Ini adalah bawaan untuk mendapatkan representasi string Python, simpel.


3

Haskell, 4 byte

show

Haskell built-in untuk mengubah segalanya menjadi string. Input diambil sebagai sepasang string.

Cobalah online!


3

05AB1E , 2 byte

₁ö

Cobalah online! Menafsirkan setiap string sebagai bilangan bulat 256, lalu mencetak keduanya dalam formulir [1, 2].


05AB1E, 1 byte (validitas tidak diketahui)

â

Cobalah online!

Mengambil produk cartesian dari input dengan sendirinya. Kutipan dalam input tidak luput, yang dapat menyebabkan kebingungan. Saya brute-paksa semua kombinasi hingga 12 ", "dan"], [" dan tidak menemukan tabrakan; Namun, saya tidak dapat membuktikan bahwa tidak ada tabrakan untuk string yang lebih panjang. Jika ada yang bisa memberikan bukti atau contoh tandingan, saya akan sangat menghargainya!

0-byter yang sepele gagal karena tanda kutip tidak diloloskan: input ( ", ", string kosong) dan (string kosong, ", ") keduanya menghasilkan output["", "", ""] .

1-byter º(mirror setiap string input) juga gagal karena ini: input ( ", "" ,", string kosong) dan (string kosong, " ,"", ") keduanya menghasilkan output ["", "" ,"", "" ,"", ""].


3

C # dengan 26 byte (terima kasih kepada Lukas Lang, Kevin Cruijssen dan Jo King)

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

tio.run lambda


1
Silakan pertimbangkan untuk menggunakan tio.run
Ver Nick berkata Reinstate Monica

Ini masih terpecah pada ("a <>", "b") dan ("a", "<> b") - perhatikan bahwa tidak mungkin untuk menangani semua case jika Anda hanya menggabungkan input, tidak peduli apa pun yang Anda lakukan. letakkan di antara / di sekitar mereka - Anda perlu mengubah string, entah bagaimana
Lukas Lang

1
Maaf, masih belum: ("1", "11111111111") dan ("11111111111", "1") - apa yang berhasil di sisi lain (dan bahkan lebih pendek) adalah ini $"{a.Length}.{a}{b}"- Anda selalu dapat mengekstraksi adan bdari sini tanpa ambiguitas (baca saja sampai yang pertama .untuk mendapatkan panjangnya a, bkemudian sisanya
Lukas Lang

1
@LukasLang Hebat. Terima kasih atas tindak lanjutnya.
Soleil

1
Banyak terima kasih @ JoKing!
Soleil

2

Arang , 12 byte

⪫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




Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.