Sáng tác điền vào chỗ trống


18

Hãy để chúng tôi nói rằng chúng tôi có một bộ chức năng cụ thể trên chuỗi. Các hàm này giống như điền vào chỗ trống hoặc madlib, ngoại trừ việc chúng chỉ lấy một đầu vào và sử dụng nó để điền vào tất cả các khoảng trống của chúng. Ví dụ, chúng ta có thể có một chức năng trông giống như

I went to the ____ store and bought ____ today.

Nếu chúng ta áp dụng hàm này cho chuỗi cheese, kết quả sẽ là:

I went to the cheese store and bought cheese today.

Chúng ta có thể biểu diễn các hàm này dưới dạng một danh sách các chuỗi không trống, trong đó các khoảng trống chỉ đơn giản là các khoảng trống ở giữa các chuỗi. Ví dụ chức năng của chúng tôi ở trên sẽ là:

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

Với đại diện này, chỉ có một đại diện cho mọi chức năng của loại này và chỉ có một chức năng cho mỗi đại diện.

Một điều thực sự gọn gàng là tập hợp các chức năng như vậy được đóng dưới thành phần. Đó là để nói rằng thành phần của hai trong số các chức năng của chúng tôi luôn luôn là một trong những chức năng này. Ví dụ: nếu tôi soạn hàm của chúng tôi ở trên với

["blue ", ""]

(chức năng bluebổ sung cho đầu vào) Chúng tôi nhận được chức năng:

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

Chúng có thể phức tạp hơn một chút mặc dù. Ví dụ: nếu chúng ta soạn hàm đầu tiên với

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

Kết quả là

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

Bài tập

Nhiệm vụ của bạn là nhận hai hàm như được mô tả dưới dạng danh sách các chuỗi không trống và xuất thành phần của chúng dưới dạng danh sách các chuỗi không trống.

Với mục đích của thách thức này, một danh sách có thể là bất kỳ vùng chứa được đặt hàng nào cho phép trùng lặp và một chuỗi có thể là loại chuỗi gốc, danh sách các ký tự hoặc danh sách các số nguyên.

Đây là câu trả lời sẽ được tính bằng byte với ít byte hơn.

Các trường hợp thử nghiệm

["","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
Tất cả 3 câu trả lời hiện tại đều thất bại nếu một số ký tự ASCII không in được sử dụng trong đầu vào (SOH, TAB hoặc LF, tùy thuộc vào câu trả lời). Vì vậy, tôi nghĩ rằng bạn nên thực sự quyết định xem liệu đầu vào có bị hạn chế đối với ASCII có thể in hay không.
Arnauld

@Arnauld Ok cũng như bây giờ nó không bị hạn chế và tôi chưa thấy một lý do nào để thay đổi điều đó nên nó sẽ vẫn còn.
Phù thủy lúa mì

2
@KevinCruijssen của tôi hợp lệ vì số 0 không phải là ký tự. Tính năng ngôn ngữ may mắn giúp ra.
Jonathan Allan

1
@ SriotchilismO'Z Eld My 05AB1E đã tham gia / chia tách theo dòng mới. Các câu trả lời JavaScript và Haskell đang nối / tách bằng các tab, câu trả lời C # theo ký tự không thể in được `` (SOH), vì vậy tất cả đều không hợp lệ. Mặc dù vậy, tôi cũng không biết Perl 5 đủ tốt. Vì vậy, một trong những có thể là hợp lệ.
Kevin Cruijssen

3
@Roman Bạn không thể cho rằng bất kỳ ký tự nào sẽ không xuất hiện trong đầu vào để bạn có thể sử dụng nó làm dấu phân cách. Bạn phải thực sự giải quyết thách thức.
Phù thủy lúa mì

Câu trả lời:


11

Thạch , 6 byte

j0j@ṣ0

Liên kết dyadic chấp nhận biểu diễn chức năng đầu tiênbên phải và biểu diễn chức năng thứ haibên trái mang lại biểu diễn chức năng kết quả. Mỗi đại diện chức năng là một danh sách các danh sách các ký tự (Jelly không có chuỗi nào khác).

Hãy thử trực tuyến! (các đối số toàn chương trình được đưa ra trong ký hiệu Python; chuỗi trở thành danh sách. Chân trang hiển thị đại diện Python của đầu ra của Liên kết.)

Đây là bộ thử nghiệm định dạng lại đầu ra của Liên kết giống như đầu vào.

Làm sao?

Tận dụng lợi thế của danh sách loại hỗn hợp của Jelly để cho phép toàn bộ miền biểu diễn (bất kỳ danh sách danh sách ký tự nào) bằng cách sử dụng số nguyên 0 làm người giữ chỗ:

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"])

Nếu chúng ta cần phải xử lý bất kỳ danh sách hỗn hợp nào của Jelly (bao gồm cả các danh sách có độ sâu hoặc hình dạng bất kỳ), chúng ta có thể sử dụng tám byter này: j,©⁹jœṣ®sử dụng các đối số được ghép nối làm trình giữ chỗ.



5

Python 3,8 (tiền phát hành) ,  60  58 byte

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

Một hàm không tên chấp nhận hai danh sách các chuỗi abtrả về danh sách các chuỗi.

Hãy thử trực tuyến! Hoặc xem bộ thử nghiệm .

Làm sao?

Đầu tiên tạo thành một chuỗi phân tách, vkhông thể tìm thấy bên trong ahoặc b. Sau đó tạo thành một chuỗi bằng cách nối các chuỗi bvới các bản sao của v. Sau đó, tạo thành một chuỗi bằng cách nối các chuỗi avới các bản sao của chuỗi đó. Cuối cùng tách chuỗi đó tại các trường hợp vđể đưa ra danh sách các chuỗi.

Mặc dù đảm bảo vkhông có ahoặc bchúng tôi cũng phải đảm bảo rằng vsẽ không khiến chúng tôi bị chia tách sớm trong trường hợp tất cả các chuỗi trong abbằng nhau. Để làm như vậy, chúng tôi hình thành vbằng cách nối tất cả các chuỗi trong cả hai danh sách với các phiên bản của chuỗi (ở đây '&') và thêm một ký tự khác, khác (ở đây '$'). Lưu ý rằng thực hiện một trong hai cách ly là không đủ vì tất cả các chuỗi trong đầu vào có thể bằng ký tự được chọn.


Bạn có thể đưa ra một ví dụ đầu vào khi &cần thiết? và sử dụng ''.join(a+b)+'$'là không đủ?
Phù thủy lúa mì

Phải mất một thời gian nhưng tôi ['$','$'] ['$','$']sẽ là một.
Phù thủy lúa mì

Vâng, nếu tất cả các chuỗi bằng '$'ký tự được chọn và kết quả sẽ có nhiều hơn một chuỗi, chúng ta cần một ký tự khác trong đó để tránh chia tách sớm.
Jonathan Allan

2

05AB1E , 4 15 19 9 11 byte

«TýR©ý¹sý®¡

Không giống như câu trả lời của Jelly, chuỗi "0", số nguyên 0và float của 05AB1E 0.0đều bằng nhau (phần nào), vì vậy tôi không thể chia / nối bởi một số nguyên. Đây là lý do tại sao chúng tôi có +15 byte như cách giải quyết, mặc dù bây giờ tôi đã đánh nó trở lại thành 9 byte. Cảm ơn @JonathanAllan vì đã tìm thấy 2 lỗi.

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

«            # 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
Điều này không thành công nếu đầu vào có dòng mới (OP đã nói rằng đầu vào hiện không bị hạn chế).
Erik the Outgolfer

@EriktheOutgolfer Mọi câu trả lời khác đều có cùng một vấn đề btw.
Kevin Cruijssen

@EriktheOutgolfer Chắc chắn có thể chơi golf nhiều hơn, nhưng đã thực hiện một sửa chữa nhanh chóng và bẩn ngay bây giờ.
Kevin Cruijssen

1
Uh, xin lỗi về điều này ... nó sẽ không hoạt động nếu danh sách đầu vào chứa các chuỗi chỉ chứa dòng mới :( (nó sẽ phân chia sớm)
Jonathan Allan

1
@Jonathan ALLan Lol .. À, tôi đoán tôi chỉ có thể cảm ơn bạn vì đã tìm ra những lỗi này .. Tôi hy vọng nó đã được sửa chữa và bạn sẽ không tìm thấy gì khác .. Mặc dù tôi có cảm giác bạn có thể ..
Kevin Cruijssen


2

Japt , 8 byte

Thích nghi cách tiếp cận của Jonathan .

qVqN²)qN

Thử nó

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"

Là gì Ntrong trường hợp này? Nếu tôi hiểu chính xác (sử dụng chức năng tìm kiếm của liên kết TryIt), nó sẽ lặp lại Nhai lần ( ). Sau đó, nó sử dụng điều đó để tham gia đầu vào thứ hai V( VqN²), và sau đó sử dụng toàn bộ chuỗi đó để tham gia đầu vào (ẩn) đầu tiên U( q...)). Và cuối cùng tách chuỗi kết quả trên N( qN). Nhưng Ntrong trường hợp này là gì?
Kevin Cruijssen

Đợi đã, tôi nghĩ rằng tôi đã xem sai p(...)phương pháp trong tìm kiếm. Nó nối thêm 2cả hai đầu vào được ghép nối với nhau. Chỉ có kết quả [["w","x","y","z"],["ab","cd","e"],2]và nó sử dụng toàn bộ danh sách đó để tham gia. Tại sao trận chung kết qNkhông để lại 2danh sách kết quả trong trường hợp đó? Hay không sửa đổi bản gốc N?
Kevin Cruijssen

1
@KevinCruijssen, đã thêm một lời giải thích nhưng bạn đã tìm ra khá nhiều. Và, vâng, pushing các phần tử cho một mảng trong JS sửa đổi mảng ban đầu.
Xù xì


1

J , 44 43 42 29 byte

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

Hãy thử trực tuyến!

-13 bytes nhờ dặm!

Cách tiếp cận này sử dụng số nguyên và là do dặm.

cách tiếp cận ban đầu với chuỗi

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

Hãy thử trực tuyến!

Lưu ý: Tôi đã điều chỉnh -3 khỏi TIO cho tài khoản f=.

Sử dụng phương pháp của Jonathan Allen, thích nghi với J.

Điều này thật khó khăn khi chơi golf, vì J không có phương pháp "tham gia" tích hợp và tôi tò mò muốn xem liệu nó có thể được cải thiện đáng kể hay không.

g là động từ trợ giúp cho chúng ta "tham gia"


Làm việc với danh sách các số nguyên làm đầu vào, tôi tìm thấy một giải pháp 29 char , _<;._1@,(;@}:@,@,.(,_&,)&.>/)sử dụng vô hạn _làm giá trị sentinel để biết nơi phân chia <;._1. Tham gia đầu tiên được thực hiện bằng cách sử dụng rút gọn /để tạo thành một hộp lớn, sau đó chỉ là định hình mảng.
dặm

Ấn tượng đấy. Cảm ơn @miles. Điều này chắc chắn cảm thấy như có chỗ để cải thiện nhưng tôi đã không thấy làm thế nào.
Giô-na

@miles Không nên g&.:(a.&i.&.>)đếm số byte hoặc tôi thiếu thứ gì?
Giô-na

OP đề cập đầu vào đó có thể là một danh sách các nhân vật hoặc là một danh sách các số nguyên, do đó chức năng helper là chỉ để chuyển đổi từ hộp mảng char để hộp của mảng int để xem dễ dàng hơn
dặm

À tôi quên mất, cảm ơn
Jonah



0

Perl 5 ( -lp), 20 byte

Như @JonathanAllan đã nhận xét, đây là một chương trình đầy đủ sử dụng, đối với IO, một tab làm dấu tách danh sách và dòng mới để phân tách hai danh sách.

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

TIO

tab và dòng mới đã được chọn vì thuận tiện hơn để kiểm tra các trường hợp kiểm tra, nếu không có thể thay đổi thành các ký tự không in được \1\2.

( -02l012p)

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

TIO

Làm thế nào nó hoạt động,

  • -02 : để đặt dấu tách bản ghi đầu vào thành \2
  • -l: để xóa dấu phân cách đầu vào khỏi đối số mặc định $_và thêm dấu tách bản ghi đầu ra vào đầu ra mặc định
  • -012: để đặt dấu tách bản ghi đầu ra thành \012( \n) để kiểm tra đầu ra dễ dàng hơn
  • -p : để in đối số mặc định

  • $n=<>; : để đọc bản ghi tiếp theo và gán cho $n

  • chop$n; : để xóa dấu phân cách khỏi $n
  • s/\x1/$n/g: để thay thế tất cả các lần xuất hiện của \1với$n

2
Perl của tôi gần như không tồn tại nhưng tôi tin rằng đây là một chương trình đầy đủ sử dụng, đối với IO, một tab làm dấu tách danh sách và dòng mới để phân tách hai danh sách. Làm thế nào nó có thể chấp nhận đầu vào với các ký tự này?
Jonathan Allan


0

JavaScript (ES6),  62  59 byte

Đã lưu 3 byte nhờ @Shaggy

Đây là phiên bản cố định của câu trả lời của Luis (hiện đã bị xóa) để hỗ trợ tất cả các nhân vật.

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

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.