Складати заповнити заготовки


18

Скажімо, у нас є певний набір функцій на рядках. Ці функції схожі на заповнення заготовок або мадлібів, за винятком того, що вони беруть лише один вхід і використовують його для заповнення всіх своїх заготовок. Наприклад, у нас може бути функція, яка виглядає так

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
Усі три існуючі відповіді наразі не відповідають, якщо у вводі використовується який-небудь символ, що не роздруковується, ASCII (SOH, TAB або LF, залежно від відповіді). Тому я думаю, вам слід дійсно вирішити, чи вхід обмежений для друку ASCII чи ні.
Арнольд

@Arnauld Добре, як і зараз, це не обмежено, і я не бачив причин змінювати це, щоб воно залишилося.
Опублікувати Rock Garf Hunter

2
@KevinCruijssen міна дійсна, оскільки нуль не є символом. Пощастила мовна функція, яка допомагає.
Джонатан Аллан

1
@ SriotchilismO'Zaic Мій 05AB1E приєднувався / розщеплювався новими рядками. Відповіді JavaScript та Haskell приєднуються / розбиваються вкладками, відповідь C # недрукованим символом `` (SOH), тому вони також є недійсними. Я теж не знаю Perl 5 досить добре. Так що це може бути дійсним.
Kevin Cruijssen

3
@ Роман Ви не можете припустити, що будь-який символ не відображатиметься на вході, щоб ви могли використовувати його як роздільник. Ви дійсно повинні вирішити завдання.
Опублікувати Rock Garf Hunter

Відповіді:


11

Желе , 6 байт

j0j@ṣ0

Діадичне посилання, що приймає перше представлення функції праворуч і друге представлення функції зліва, яке дає результуюче представлення функції. Кожне представлення функції - це список списків символів (у Jelly немає інших рядків).

Спробуйте в Інтернеті! (повнопрограмні аргументи наведені в нотації Python; рядки стають списками. Нижній колонтитул відображає Python-представлення виводу Link.)

Ось тестовий набір, який переформатує вихід Link, як і входи.

Як?

Скористайтеся списками змішаного типу Jelly, щоб дозволити весь домен представлень (будь-який список списків символів), використовуючи цілий нуль у якості власника місця:

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

Якщо нам знадобиться мати справу з будь-яким зі змішаних списків Jelly (включаючи будь-яку глибину чи форму), ми могли б використовувати цей вісім байт: 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)+'$'недостатньо?
Опублікувати Rock Garf Hunter

Це зайняло у мене деякий час, але ['$','$'] ['$','$']було б одним.
Опублікувати Rock Garf Hunter

Так, якщо всі рядки дорівнюють вибраному '$'символу, а результат буде більше, ніж один рядок, нам потрібен інший символ, щоб уникнути розбиття рано.
Джонатан Аллан

2

05AB1E , 4 15 19 9 11 байт

«TýR©ý¹sý®¡

На відміну від відповіді Jelly, рядок "0", ціле число 0і float 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
Це не вдається, якщо на вході є нові рядки (ОП заявив, що вхід зараз необмежений).
Ерік Аутгольфер

@EriktheOutgolfer Кожна інша відповідь має ту саму проблему btw.
Kevin Cruijssen

@EriktheOutgolfer Однозначно можна пограти ще трохи, але поки що швидко і брудно виправити.
Kevin Cruijssen

1
Ах, вибачте з цього приводу ... це не буде спрацьовувати, якщо списки вхідних даних містять рядки, що містять лише нові рядки :( (він розділиться рано)
Джонатан Аллан

1
@JonathanAllan Lol .. Ну добре, я думаю, я можу лише подякувати тобі за те, що знайшов цих помилок .. Я сподіваюся, що це зараз виправлено, і ти нічого більше не знайдеш .. Хоча я маю відчуття, що ти можеш ..
Кевін Кройсейсен

2

Мова Вольфрама (Mathematica) , 62 61 байт

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

Спробуйте в Інтернеті!

-1 завдяки Роману


Хоча це не є дійсним результатом, це повертає функцію, яка насправді виконує роботу .. (34 байти)

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

Спробуйте в Інтернеті!


1
61 байт шляхом переробки Riffle.
Роман

2

Japt , 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), він повторюється 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, додав пояснення, але ви майже все це зрозуміли. І так, pushing, елементи для масиву в JS модифікує вихідний масив.
Кошлатий


1

J , 44 43 42 29 байт

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

Спробуйте в Інтернеті!

-13 байт завдяки милям!

Цей підхід використовує цілі числа і обумовлений милями.

оригінальний підхід зі струнами

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

Спробуйте в Інтернеті!

Примітка. Я відкоригував -3 від TIO для обліку f=.

Використовує метод Джонатана Аллена, адаптований для Дж.

Це було напрочуд важко для гольфу, оскільки J не має вбудованого методу "приєднатися", і мені було б цікаво побачити, чи можна його значно покращити.

g є дієсловом helper, яке дає нам "приєднатися"


Робота зі списком цілих чисел в якості вхідних даних, я знайшов 29 обвуглене рішення , _<;._1@,(;@}:@,@,.(,_&,)&.>/)використовує нескінченність , _як значення сторожового знати , де розкол <;._1. Сполучення спочатку робиться за допомогою зменшення, /щоб утворити одну велику коробку, потім її просто формувати масив.
милі

Це вражає. Дякую @miles. Цей, безумовно, відчував, що є місце для покращення, але я не бачив, як.
Іона

@miles Чи не слід g&.:(a.&i.&.>)рахувати байтів чи я щось пропускаю?
Йона

ОП згадувало, що введення може бути як список символів або як список цілих чисел, так що функція помічника полягає лише в перетворенні з ящиків масивів char в коробки масивів Int для легшого перегляду
миль

Ах, я забув це, спасибі
Jonah



0

Perl 5 ( -lp), 20 байт

Як прокоментував @JonathanAllan, це повна програма, що використовує для IO вкладку як роздільник списку та новий рядок для розділення двох списків.

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

ТІО

вкладку та новий рядок обрано тому, що зручніше перевіряти тестові випадки, інакше їх можна було б змінити на символи, що не друкуються, \1та \2.

( -02l012p)

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

ТІО

Як це працює,

  • -02 : встановити роздільник запису вхідного сигналу на \2
  • -l: видалити роздільник вводу з аргументу за замовчуванням $_та додати роздільник записів виводу до виводу за замовчуванням
  • -012: встановити роздільник записів на вихідний \012( \n), щоб виведення було легше перевірити
  • -p : для друку аргументу за замовчуванням

  • $n=<>; : читати наступний запис і призначити його $n

  • chop$n; : видалити роздільник з $n
  • s/\x1/$n/g: Замінити всі входження \1з$n

2
Моя Perl майже не існує, але я вважаю, що це повна програма, що використовує для IO вкладку як роздільник списку та новий рядок для розділення двох списків. Як він може приймати дані з цими символами?
Джонатан Аллан

@JonathanAllan, ви праві, у мене не було часу додавати пояснення під час подання, я спробую це зробити
Nahuel Fouilleul

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.