Katakanlah kita memiliki seperangkat fungsi khusus pada string. Fungsi-fungsi ini seperti mengisi kekosongan atau madlibs, kecuali bahwa mereka hanya mengambil satu input dan menggunakannya untuk mengisi semua kekosongannya. Misalnya kita mungkin memiliki fungsi yang mirip
I went to the ____ store and bought ____ today.
Jika kita menerapkan fungsi ini ke string cheese
hasilnya adalah:
I went to the cheese store and bought cheese today.
Kita dapat merepresentasikan fungsi-fungsi ini sebagai daftar string yang tidak kosong, di mana yang kosong hanyalah celah di antara string. Misalnya fungsi kita di atas adalah:
["I went to the ", " store and bought ", " today."]
Dengan representasi ini, hanya ada satu representasi untuk setiap fungsi semacam ini dan hanya satu fungsi untuk setiap representasi.
Suatu hal yang sangat rapi adalah bahwa himpunan fungsi tersebut ditutup di bawah komposisi. Artinya komposisi dua fungsi kita selalu merupakan salah satu dari fungsi ini. Sebagai contoh jika saya menyusun fungsi kami di atas dengan
["blue ", ""]
(fungsi yang bergantung blue
pada input) Kami mendapatkan fungsi:
["I went to the blue ", " store and bought blue ", " today."]
Ini bisa menjadi sedikit lebih rumit. Misalnya jika kita membuat fungsi pertama dengan
["big ", " and ", ""]
Hasilnya adalah
["I went to the big ", " and ", " store and bought big ", "and", " today."]
Tugas
Tugas Anda adalah untuk mengambil dua fungsi seperti yang dijelaskan sebagai daftar string yang tidak kosong dan menampilkan komposisi mereka sebagai daftar string yang tidak kosong.
Untuk tujuan tantangan ini daftar dapat berupa wadah yang dipesan yang memungkinkan duplikat dan string dapat berupa tipe string asli, daftar karakter atau daftar bilangan bulat.
Ini adalah kode-golf jawaban akan dicetak dalam byte dengan lebih sedikit byte yang lebih baik.
Uji kasus
["","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"]
Jawaban:
Jelly , 6 byte
Tautan diad menerima representasi fungsi pertama di sebelah kanan dan representasi fungsi kedua di sebelah kiri yang menghasilkan representasi fungsi yang dihasilkan. Setiap representasi fungsi adalah daftar daftar karakter (Jelly tidak memiliki string lain).
Cobalah online!(argumen program penuh diberikan dalam notasi Python; string menjadi daftar. Footer menunjukkan representasi Python dari output Link.)
Ini dia test-suite yang memformat ulang keluaran Link seperti input.
Bagaimana?
Mengambil keuntungan dari daftar tipe campuran Jelly untuk memungkinkan seluruh domain representasi (daftar daftar karakter) dengan menggunakan integer nol sebagai place-holder:
Jika kami perlu berurusan dengan daftar campuran Jelly (termasuk yang memiliki kedalaman atau bentuk apa pun), kami dapat menggunakan byter delapan ini:
j,©⁹jœṣ®
yang menggunakan argumen berpasangan sebagai place-holder.sumber
Haskell , 78 byte
Cobalah online!
sumber
Python 3.8 (pra-rilis) ,
6058 byteFungsi yang tidak disebutkan namanya menerima dua daftar string,
a
danb
, yang mengembalikan daftar string.Cobalah online! Atau lihat test-suite .
Bagaimana?
Pertama membentuk string pemisah
v
,, yang tidak dapat ditemukan di dalama
ataub
. Kemudian bentuk string dengan menggabungkan stringb
dengan salinanv
. Kemudian bentuk string dengan menggabungkan stringa
dengan salinannya. Akhirnya membagi string itu pada contohv
untuk memberikan daftar string.Meskipun memastikan
v
tidak adaa
ataub
kita juga harus memastikan bahwav
tidak akan membuat kita terpecah lebih awal dalam kasus di mana semua string masuka
danb
sama. Untuk melakukannya, kita membentukv
dengan menggabungkan semua string di kedua daftar dengan instance string (di sini'&'
) dan menambahkan karakter yang berbeda dan berbeda (di sini'$'
). Perhatikan bahwa melakukan keduanya secara terpisah tidak cukup karena semua string dalam input dapat sama dengan karakter yang dipilih.sumber
&
diperlukan? dan menggunakan''.join(a+b)+'$'
tidak cukup?['$','$'] ['$','$']
akan menjadi satu.'$'
karakter yang dipilih dan hasilnya akan lebih dari satu string kita perlu karakter yang berbeda di sana untuk menghindari pemisahan lebih awal.05AB1E ,
41519911 byteTidak seperti jawaban Jelly, string
"0"
, integer0
, dan float 05AB1E0.0
semuanya (agak) sama, jadi saya tidak bisa memisahkan / bergabung dengan integer. Inilah sebabnya kami memiliki +15 byte sebagai solusi, meskipun saya telah memasukkannya kembali ke 9 byte sekarang. Terima kasih kepada @JonathanAllan untuk menemukan 2 bug.Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
sumber
Bahasa Wolfram (Mathematica) ,
6261 byteCobalah online!
-1 berkat Roman
Meskipun ini bukan output yang valid, ini mengembalikan fungsi yang benar-benar berfungsi .. (34 byte)
Cobalah online!
sumber
Riffle
.Japt , 8 byte
Adaptasi pendekatan Jonathan .
Cobalah
sumber
N
dalam kasus ini? Jika saya memahaminya dengan benar (menggunakan fungsi pencarian pada tautan-TryIt), itu mengulangiN
dua kali (N²
). Kemudian menggunakannya untuk bergabung dengan input keduaV
(VqN²
), dan kemudian menggunakan seluruh string untuk bergabung dengan input pertama (implisit)U
(q...)
). Dan akhirnya membagi string yang dihasilkan padaN
(qN
). Tapi apa yang adaN
dalam kasus ini?p(...)
metode yang salah dalam pencarian. Ini menambahkan2
ke kedua input yang dipasangkan bersama bukan. HanyaN²
menghasilkan[["w","x","y","z"],["ab","cd","e"],2]
, dan menggunakan seluruh daftar untuk bergabung. Mengapa finalqN
tidak meninggalkan2
ke daftar hasil dalam kasus itu? Atau apakahN²
memodifikasi yang asliN
?push
memasukkan elemen ke array di JS mengubah array asli.Haskell , 62 byte
Cobalah online!
Inilah jawaban Haskell saya. Ini bekerja pada semua jenis daftar.
sumber
J ,
44434229 byteCobalah online!
-13 bytes berkat mil!
Pendekatan ini menggunakan bilangan bulat dan karena mil.
pendekatan asli dengan string
Cobalah online!
Catatan: Saya telah menyesuaikan -3 dari TIO ke akun
f=.
Menggunakan metode Jonathan Allen, diadaptasi untuk J.
Ini mengejutkan sulit untuk bermain golf, karena J tidak memiliki metode "bergabung", dan saya ingin tahu apakah ini dapat ditingkatkan secara signifikan.
g
adalah kata kerja pembantu yang memberi kita "gabung"sumber
_<;._1@,(;@}:@,@,.(,_&,)&.>/)
menggunakan infinity_
sebagai nilai sentinel untuk mengetahui di mana untuk membagi<;._1
. Bergabung pertama kali dilakukan dengan menggunakan mengurangi/
untuk membentuk satu kotak besar, kemudian hanya membentuk array.g&.:(a.&i.&.>)
hitungan terhadap byte atau aku kehilangan sesuatu?JavaScript (Node.js) ,
8579 byteCobalah online!
sumber
JavaScript, 37 byte
Juga mengadaptasi pendekatan Jonathan .
Cobalah online
sumber
Perl 5 (
-lp
), 20 byteSeperti yang dikomentari @JonathanAllan, ini adalah program lengkap yang menggunakan, untuk IO, tab sebagai pemisah daftar dan baris baru untuk memisahkan kedua daftar.
TIO
tab dan baris baru dipilih karena lebih mudah untuk memeriksa kasus uji, jika tidak dapat diubah menjadi karakter yang tidak dapat dicetak
\1
dan\2
.(
-02l012p
)TIO
Bagaimana itu bekerja,
-02
: untuk mengatur pemisah rekaman input\2
-l
: untuk menghapus pemisah input dari argumen default$_
dan untuk menambahkan pemisah catatan output ke output default-012
: untuk mengatur pemisah catatan keluaran ke\012
(\n
) sehingga keluaran lebih mudah untuk diperiksa-p
: untuk mencetak argumen default$n=<>;
: untuk membaca catatan selanjutnya dan untuk ditugaskan$n
chop$n;
: untuk menghapus pemisah dari$n
s/\x1/$n/g
: untuk mengganti semua kejadian\1
dengan$n
sumber
JavaScript (ES6),
6259 byteDisimpan 3 byte berkat @Shaggy
Ini adalah versi tetap dari jawaban Luis (sekarang dihapus) untuk mendukung semua karakter.
Cobalah online!
sumber