แต่งเติมในช่องว่าง


18

ให้เราบอกว่าเรามีชุดของฟังก์ชั่นเฉพาะเกี่ยวกับสตริง ฟังก์ชั่นเหล่านี้มีลักษณะเหมือนเติมในช่องว่างหรือ madlib ยกเว้นว่าพวกเขาจะใช้เพียงหนึ่งอินพุตและใช้เพื่อเติมลงในช่องว่างทั้งหมดของพวกเขา ตัวอย่างเช่นเราอาจมีฟังก์ชั่นที่ดูเหมือน

I went to the ____ store and bought ____ today.

หากเราใช้ฟังก์ชันนี้กับสตริงcheeseผลลัพธ์จะเป็น:

I went to the cheese store and bought cheese today.

เราสามารถแสดงฟังก์ชันเหล่านี้เป็นรายการสตริงที่ไม่ว่างโดยที่ช่องว่างเป็นเพียงช่องว่างระหว่างสตริง ตัวอย่างฟังก์ชั่นของเราด้านบนจะเป็น:

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

ด้วยการแทนค่านี้มีเพียงหนึ่งการแทนสำหรับทุก ๆ ฟังก์ชันของการเรียงลำดับนี้และเพียงหนึ่งฟังก์ชันสำหรับแต่ละการแทนเท่านั้น

สิ่งที่เรียบร้อยจริงๆคือชุดของฟังก์ชั่นดังกล่าวปิดภายใต้องค์ประกอบ กล่าวคือการจัดองค์ประกอบของฟังก์ชั่นสองอย่างของเราเป็นหน้าที่หนึ่งของฟังก์ชันเหล่านี้เสมอ เช่นถ้าฉันเขียนฟังก์ชันของเราด้านบนด้วย

["blue ", ""]

(ฟังก์ชั่นที่blueเพิ่มเข้าสู่อินพุต) เรารับฟังก์ชั่น:

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

สิ่งเหล่านี้จะซับซ้อนกว่านี้เล็กน้อย เช่นถ้าเราเขียนฟังก์ชันแรกด้วย

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

ผลที่ได้คือ

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

งาน

งานของคุณคือการรับฟังก์ชั่นสองอย่างตามที่อธิบายไว้ในรายการสตริงที่ไม่ว่างเปล่าและแสดงองค์ประกอบเป็นสตริงที่ไม่ว่างเปล่า

สำหรับจุดประสงค์ของการท้าทายรายการสามารถเป็นคอนเทนเนอร์ที่เรียงลำดับซึ่งอนุญาตการทำซ้ำและสตริงอาจเป็นชนิดสตริงดั้งเดิมรายการของอักขระหรือรายการจำนวนเต็ม

นี่คือคำตอบของจะได้คะแนนเป็นไบต์ด้วยจำนวนไบต์ที่น้อยกว่าจะดีกว่า

กรณีทดสอบ

["","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
คำตอบที่มีอยู่ทั้งหมด 3 ข้อล้มเหลวในปัจจุบันหากใช้อักขระ ASCII ที่ไม่สามารถพิมพ์ได้บางตัวในอินพุต (SOH, TAB หรือ LF ขึ้นอยู่กับคำตอบ) ดังนั้นฉันคิดว่าคุณควรตัดสินใจจริง ๆ ว่าอินพุตนั้น จำกัด ไว้ที่ ASCII ที่พิมพ์ได้หรือไม่
Arnauld

@Annauld ตกลงตอนนี้มันไม่ จำกัด และฉันไม่เคยเห็นเหตุผลที่จะเปลี่ยนมันดังนั้นมันจะยังคงอยู่
ตัวช่วยสร้างข้าวสาลี

2
@KevinCruijssen ของฉันใช้ได้ตั้งแต่ศูนย์ไม่ใช่ตัวอักษร คุณสมบัติภาษาที่โชคดีช่วยออก
Jonathan Allan

1
@ SriotchilismO'Zaic My 05AB1E กำลังเข้าร่วม / แยกโดยการขึ้นบรรทัดใหม่ คำตอบ JavaScript และ Haskell คือการเข้าร่วม / แยกโดยแท็บคำตอบ C # ด้วยอักขระที่ไม่สามารถพิมพ์ได้ `` (SOH) ดังนั้นสิ่งเหล่านี้จึงไม่ถูกต้องเช่นกัน แต่ฉันก็ไม่รู้ Perl 5 ก็ดีเช่นกัน เพื่อที่หนึ่งอาจถูกต้อง
Kevin Cruijssen

3
@ Roman คุณไม่สามารถสันนิษฐานได้ว่าตัวละครใด ๆ จะไม่ปรากฏในอินพุตดังนั้นคุณสามารถใช้เป็นตัวคั่นได้ คุณต้องแก้ปัญหาที่เกิดขึ้นจริง
ข้าวสาลี Wizard

คำตอบ:


11

เยลลี่ 6 ไบต์

j0j@ṣ0

ลิงก์ dyadic ยอมรับการแสดงฟังก์ชันแรกทางด้านขวาและการแทนฟังก์ชันที่สองทางด้านซ้ายซึ่งให้การแทนฟังก์ชันที่เป็นผลลัพธ์ การแทนฟังก์ชันแต่ละรายการเป็นรายการของอักขระ (วุ้นไม่มีสตริงอื่น)

ลองออนไลน์! (ข้อโต้แย้งแบบเต็มโปรแกรมมีการระบุไว้ในสัญกรณ์ Python สตริงกลายเป็นรายการส่วนท้ายแสดงการแสดง Python ของเอาต์พุตของ Link)

นี่คือชุดทดสอบซึ่งทำการรีฟอร์แมตเอาต์พุตของลิงก์เช่นอินพุต

อย่างไร?

ใช้ประโยชน์จากรายการประเภทผสมของเจลลี่เพื่ออนุญาตการแสดงโดเมนทั้งหมด (รายการใด ๆ ของตัวละคร) โดยใช้ศูนย์จำนวนเต็มเป็นตัวยึดตำแหน่ง:

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

หากเราจำเป็นต้องจัดการกับรายการผสมของวุ้นใด ๆ (รวมถึงรายการที่มีความลึกหรือรูปร่างใด ๆ ) เราสามารถใช้แปด byter นี้: j,©⁹jœṣ®ซึ่งใช้อาร์กิวเมนต์คู่ที่เป็นเจ้าของสถานที่



5

Python 3.8 (เผยแพร่ล่วงหน้า) ,  60  58 ไบต์

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

ฟังก์ชั่นที่ไม่มีชื่อยอมรับสองรายการของสตริงaและbซึ่งจะส่งกลับรายการของสตริง

ลองออนไลน์! หรือดูการทดสอบในตัว

อย่างไร?

รูปแบบแรกสตริงคั่นvซึ่งไม่สามารถพบได้ในหรือa bจากนั้นรูปแบบสตริงโดยการเข้าร่วมขึ้นสตริงในสำเนาb vจากนั้นจัดรูปแบบสตริงโดยรวมสตริงเข้าaด้วยกัน ในที่สุดก็แยกสตริงที่อินสแตนซ์ของvเพื่อให้รายการของสตริง

ในขณะที่มั่นใจvไม่ได้อยู่ในaหรือbเราต้องมั่นใจว่าvจะไม่ทำให้เราแตกในช่วงต้นในกรณีที่สตริงทั้งหมดในaและbมีความเท่าเทียมกัน ในการทำเช่นนั้นเราจัดตั้งvโดยการรวมสตริงทั้งหมดในทั้งสองรายการด้วยอินสแตนซ์ของสตริง (ที่นี่'&') และเพิ่มอักขระพิเศษที่แตกต่างกัน (ที่นี่'$') โปรดทราบว่าการแยกอย่างใดอย่างหนึ่งไม่เพียงพอเนื่องจากสตริงทั้งหมดในอินพุตอาจเท่ากับอักขระที่เลือก


คุณสามารถป้อนตัวอย่างที่&ต้องการได้หรือไม่? และการใช้''.join(a+b)+'$'ไม่เพียงพอ?
ตัวช่วยสร้างข้าวสาลี

ฉันใช้เวลาสักพัก แต่['$','$'] ['$','$']จะเป็นหนึ่ง
ตัวช่วยสร้างข้าวสาลี

ใช่ถ้าสตริงทั้งหมดเท่ากับอักขระที่เลือก'$'และผลลัพธ์จะมีมากกว่าหนึ่งสตริงเราต้องการอักขระที่แตกต่างกันในนั้นเพื่อหลีกเลี่ยงการแยกก่อน
Jonathan Allan

2

05AB1E , 4 15 19 9 11 ไบต์

«TýR©ý¹sý®¡

ต่างจากคำตอบของเยลลี่สตริง"0"และจำนวนเต็ม0และลอยของ 05AB1E มี0.0ค่าเท่ากัน (ดังนั้น) ดังนั้นฉันจึงไม่สามารถแยก / เข้าร่วมด้วยจำนวนเต็ม นี่คือสาเหตุที่เรามีวิธีแก้ปัญหา +15 ไบต์เป็นวิธีแก้ปัญหาถึงแม้ว่าฉันได้เล่นกอล์ฟกลับไปเป็น 9 ไบต์แล้ว ขอบคุณ@JonathanAllanสำหรับการค้นหา 2 ข้อบกพร่อง

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

«            # 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
สิ่งนี้จะล้มเหลวหากอินพุตมีการขึ้นบรรทัดใหม่ (OP บอกว่าอินพุตไม่ถูก จำกัด ในขณะนี้)
Erik the Outgolfer

@EriktheOutgolfer ทุกคำตอบอื่น ๆ มีปัญหาเดียวกัน btw
Kevin Cruijssen

@EriktheOutgolfer สามารถตีกอล์ฟได้มากกว่านี้ แต่ได้ทำการแก้ไขอย่างรวดเร็วและสกปรกสำหรับตอนนี้
Kevin Cruijssen

1
เอ่อขออภัยเกี่ยวกับเรื่องนี้ ... มันจะไม่ทำงานถ้ารายการอินพุตมีสตริงที่มีการขึ้นบรรทัดใหม่เท่านั้น :( (มันจะแตกเร็ว)
Jonathan Allan

1
@JanathanAllan Lol .. เอาละฉันเดาได้แค่ขอบคุณสำหรับการค้นหาข้อบกพร่องเหล่านี้ .. ฉันหวังว่ามันจะได้รับการแก้ไขแล้วและคุณจะไม่พบสิ่งอื่น .. แม้ว่าฉันจะมีความรู้สึกที่คุณอาจจะ ..
Kevin Cruijssen

2

ภาษา Wolfram (Mathematica) , 62 61 ไบต์

""<>#&/@Flatten[#~(R=Riffle)~I/.I->#2~R~I]~SequenceSplit~{I}&

ลองออนไลน์!

-1 ขอบคุณชาวโรมัน


แม้ว่ามันจะไม่ใช่เอาต์พุตที่ถูกต้อง แต่มันจะส่งคืนฟังก์ชันที่ทำงานจริง .. (34 ไบต์)

(g=a""<>a~Riffle~#&)[#]@*g[#2]&

ลองออนไลน์!


1
61 ไบต์Riffleโดยการรีไซเคิล
Roman

2

Japtet , 8 ไบต์

ปรับวิธีการโจนาธาน

qVqN²)qN

ลองมัน

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"

คืออะไรNในกรณีนี้หรือไม่? ถ้าฉันเข้าใจถูกต้อง (ใช้ฟังก์ชั่นการค้นหาของ TryIt-link) มันจะทำซ้ำNสองครั้ง ( ) จากนั้นจะใช้เพื่อเข้าร่วมอินพุตที่สองV( VqN²) จากนั้นใช้สตริงทั้งหมดนั้นเพื่อเข้าร่วมอินพุตU( โดยปริยาย) ( q...)) และในที่สุดก็แยกสตริงผลลัพธ์บนN( qN) แต่Nในกรณีนี้คืออะไร?
Kevin Cruijssen

เดี๋ยวก่อนฉันคิดว่าฉันดูผิดp(...)วิธีในการค้นหา มันต่อท้าย2อินพุตทั้งคู่ที่จับคู่กันไม่ได้ ให้ผลลัพธ์เท่านั้น[["w","x","y","z"],["ab","cd","e"],2]และจะใช้รายการทั้งหมดเพื่อเข้าร่วม ทำไมคนสุดท้ายถึงqNไม่ออกจาก2รายการผลลัพธ์ในกรณีนั้น? หรือดัดแปลงต้นฉบับN?
Kevin Cruijssen

1
@KevinCruijssen เพิ่มคำอธิบาย แต่คุณคิดออกมาได้ไหม และใช่pushองค์ประกอบที่เป็นอาร์เรย์ใน JS จะปรับเปลี่ยนอาร์เรย์เดิม
Shaggy


1

J , 44 43 42 29 ไบต์

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

ลองออนไลน์!

-13 ไบต์ขอบคุณไมล์!

วิธีนี้ใช้จำนวนเต็มและครบกำหนดเป็นไมล์

วิธีการดั้งเดิมกับสตริง

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

ลองออนไลน์!

หมายเหตุ: ฉันได้ปรับ -3 off TIO ให้เป็นบัญชีแล้ว f=.

ใช้วิธีการของ Jonathan Allen ดัดแปลงสำหรับ J.

นี่เป็นเรื่องยากสำหรับกอล์ฟเนื่องจาก J ไม่มีวิธีการ "เข้าร่วม" ในตัวและฉันอยากรู้ว่าจะสามารถปรับปรุงให้ดีขึ้นได้หรือไม่

g คำกริยาช่วยที่ทำให้เรา "เข้าร่วม"


การทำงานกับรายการของจำนวนเต็มเป็น input ผมพบว่า 29 ถ่านแก้ปัญหา , _<;._1@,(;@}:@,@,.(,_&,)&.>/)ใช้อินฟินิตี้เป็นค่าแมวมองไปรู้จักที่จะแยก_ <;._1การเข้าร่วมครั้งแรกทำได้โดยใช้การลด/เพื่อสร้างกล่องขนาดใหญ่หนึ่งกล่องจากนั้นเพียงสร้างรูปร่าง
ไมล์

น่าประทับใจมาก ขอบคุณ @miles อันนี้แน่นอนรู้สึกเหมือนมีห้องพักให้ปรับปรุง แต่ฉันไม่เห็นว่า
โยนาห์

@miles ไม่ควรg&.:(a.&i.&.>)นับจำนวนไบต์หรือฉันขาดอะไรไป?
โยนาห์

สหกรณ์กล่าวถึงการป้อนข้อมูลที่อาจจะเป็นรายการของตัวอักษรหรือเป็นรายการของจำนวนเต็มดังนั้นฟังก์ชั่นผู้ช่วยที่เป็นเพียงการแปลงจากกล่องของอาร์เรย์ถ่านกล่องของอาร์เรย์ int สำหรับการดูง่ายขึ้น
ไมล์

อาฉันลืมไปแล้วขอบคุณ
โยนาห์



0

Perl 5 ( -lp), 20 ไบต์

ตามที่ @JonathanAllan แสดงความคิดเห็นนี่เป็นโปรแกรมเต็มรูปแบบที่ใช้สำหรับ IO แท็บเป็นตัวคั่นรายการและบรรทัดใหม่เพื่อแยกทั้งสองรายการ

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

TIO

แท็บและการขึ้นบรรทัดใหม่ได้รับการแต่งตั้งเพราะสะดวกมากขึ้นในการตรวจสอบกรณีทดสอบมิฉะนั้นอาจมีการเปลี่ยนแปลงกับตัวละครที่ไม่สามารถพิมพ์และ\1\2

( -02l012p)

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

TIO

มันทำงานอย่างไร,

  • -02 : เพื่อตั้งค่าตัวคั่นเรคคอร์ดอินพุตเป็น \2
  • -l: เพื่อลบตัวแยกอินพุตออกจากอาร์กิวเมนต์เริ่มต้น$_และเพื่อเพิ่มตัวคั่นระเบียนผลลัพธ์ไปยังเอาต์พุตเริ่มต้น
  • -012: เพื่อตั้งค่าตัวแยกเร็กคอร์ดเอาท์พุทเป็น\012( \n) เพื่อให้เอาต์พุตตรวจสอบได้ง่ายขึ้น
  • -p : เพื่อพิมพ์อาร์กิวเมนต์เริ่มต้น

  • $n=<>; : เพื่ออ่านบันทึกถัดไปและเพื่อมอบหมายให้ $n

  • chop$n; : เพื่อลบตัวคั่นออกจาก $n
  • s/\x1/$n/g: เพื่อแทนที่สิ่งที่เกิดขึ้นทั้งหมด\1ด้วย$n

2
Perl ของฉันแทบจะไม่มีอยู่จริง แต่ฉันเชื่อว่านี่เป็นโปรแกรมเต็มรูปแบบที่ใช้สำหรับ IO, แท็บเป็นตัวคั่นรายการและขึ้นบรรทัดใหม่เพื่อแยกทั้งสองรายการ มันจะรับอินพุตด้วยตัวละครเหล่านี้ได้อย่างไร?
Jonathan Allan

@JanathanAllan คุณถูกต้องฉันไม่มีเวลาเพิ่มคำอธิบายเมื่อส่งฉันจะพยายามทำ
Nahuel Fouilleul

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.