Инъекция из двух строк в одну строку

14

Вызов

Напишите программу, которая применяет инъективную функцию, которая принимает упорядоченную пару строк в качестве входных данных и одну строку в качестве выходных. Другими словами, каждый вход должен отображаться на уникальный выход.

конкретика

  • Входными данными могут быть любые две строки произвольной длины, но они будут состоять только из печатных символов ASCII (коды ).[32,126]
  • Аналогично, выходная строка не имеет ограничений по длине, но она должна состоять только из печатных символов ASCII.
  • Если ваш язык не может обрабатывать строки произвольной длины, программа может просто теоретически работать для строк любого размера.
  • Соотношение между входами и выходами должно быть согласованным между выполнениями программы. В противном случае, используемое вами отображение полностью зависит от вас, если это инъекция.
  • Вход упорядочен. Если две входные строки различаются, они должны выдавать другой вывод, чем если бы они были поменяны местами. stf(s,t)f(t,s)
  • Не каждая строка должна быть возможным выводом.
  • Самый короткий ответ на каждом языке выигрывает!

Контрольные примеры

Следующие входы должны привести к различным выходам. Чтобы избежать путаницы, строки окружены гильеметами («») и разделены пробелами.

"Привет, мир"
«Лельхо» «дроул»
"разные"
"не то же самое"

«Код» «Гольф»
«Ко» «ДеГольф»
«CodeGolf» «»

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

«Abc», »« def »
«Abc» «,« def »
«Abc» »« def »
«Abc» »« def »

«\» «" »
«\\» «\" »
минус семь
источник
8
Хм, я только что заметил «Напишите программу, которая ...» - обратите внимание, что по мета-консенсусу (в настоящее время 46 вверх, 1 вниз) «Ограничение только программами требует явного указания« полной программы », а не просто« программы »» . Я надеюсь, что вы не хотели пытаться ограничить это, но если вы это сделаете, вам нужно будет соответствующим образом обновить пост и обратиться к тем из нас, кто уже представил функции в качестве ответов.
Джонатан Аллан
4
@JonathanAllan Цель состояла в том, чтобы разрешить функции.
минус семь
3
Может ли какая-либо из строк быть пустой?
Лохматый
2
@ Shaggy Да, или оба могут.
минус семь
1
Можем ли мы иметь несколько тестов? Благодарность!
ouflak

Ответы:

17

бред, 30 29 27 23 байта

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

Попробуйте онлайн!

Входы разделены 0x01байтом.

Это превращается ["foo", "bar"]в fUToUToUTUTbUTaUTrUT. Чтобы восстановить исходные две строки, возьмите группы из 3 символов, найдите ту, в которой нет второй буквы U, и разбейте ее там.

Дверная ручка
источник
@Grimy Извините, неправильно понял "Входы разделены байтом 0x01."
Wastl
15

JavaScript (ES6), 14 байт

Принимает ввод как массив из 2 строк. Вдохновлен ответом Луиса .

JSON.stringify

Попробуйте онлайн!


JavaScript (ES6),  21  20 байт

Принимает вход как (a)(b).

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

Попробуйте онлайн!

Возвращает длину a , за которой следует запятая, а затем конкатенация a и b .

Arnauld
источник
Проклятье! Собирался использовать stringifyтрюк сам!
Лохматый
Перерывы с a="hello","" b="world"иa="hello" b="","world"
Soleil
1
@Soleil Это дало бы ["\"hello\",\"\"","\"world\""]и ["\"hello\"","\"\",\"world\""].
Арно
1
@ Arnauld защита от обратной косой черты не будет видна. Функция не вводит.
Солей
1
@ Солей Я не понимаю, что ты имеешь в виду. JSON.stringify()определенно убегает ". Смотрите шестнадцатеричный дамп .
Арно
15

jq -c, 0 байт

Попробуйте онлайн!

Это определенно похоже на обман ...? Но, похоже, соответствует правилам вызова.

По умолчанию jqвыводит вводимые данные в удобочитаемом формате JSON. -c(Компактный) флаг , который указывает jqна выход в «компактном» стиле, который удаляет символ новой строки (так как вызов запрещает непечатаемых ASCII).

Дверная ручка
источник
1
OP допускает пустой ввод, поэтому a = "", b = "x" не даст такой же вывод, как a = "x" b = ""
Gnudiff
3
@ Gnudiff Как так? Они бы дали ["","x"]и ["x",""]соответственно
дверная ручка
1
Извини, ты прав.
Гнудифф,
7

Python 3 , 3 байта

str

(Встроенная) функция, которая, учитывая список из двух строк, дает строковое представление списка

Попробуйте онлайн!

Джонатан Аллан
источник
2
Более содержательным , чем Pyth ...
Trichoplax
Ну, 1-байтовое решение Pyth `делает то же самое.
Андерс Касеорг
5

Japt -S , 3 байта

Я все еще чувствую, что, должно быть, что-то здесь упускаю

®mc

Попытайся

Возможно 2 байта:

mq

Попытайся

Или растягивая его с помощью этого 1 байта:

U

Попытайся

Первая версия отображает каждую строку в массиве на его кодовые точки и выводит их вместе с пробелом.

Вторая версия разбивает каждую строку на массив символов и выводит их вместе с пробелом.

И третья версия, которая выглядит как мошенничество, просто выводит ввод с -Qфлагом, выполняя тяжелую работу над srringifyним.

мохнатый
источник
5

Pyth , 4 байта

jNmC

Попробуйте онлайн!

Это преобразует каждую строку в базу 256, а затем соединяет их в порядке с ". Поскольку результаты представляют собой числа, они "однозначно разделяют их, и исходные строки можно восстановить с помощью mCsdczN.

FryAmTheEggman
источник
1
@AndersKaseorg предлагает 1 байт .
Кевин Круйссен
@KevinCruijssen Мне известно, что через несколько минут после публикации я просто предпочитаю дух этого решения. В любом случае, спасибо за то, что подняли его, и, безусловно, не стесняйтесь размещать его самостоятельно :)
FryAmTheEggman
Мне действительно также нравится ваш ответ. :) И нет, я даже не знаю, Pyth. Если вы хотите, вы можете опубликовать его в качестве отдельного ответа (или комбинированного ответа, отредактировав его), в противном случае Андерс Касорг может опубликовать его, поскольку именно он упомянул его в комментарии.
Кевин Круйссен
4

T-SQL, 38 байт

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

ivarcharaб

Использует QUOTENAME, который окружает строки, []а также экранирует любые внутренние скобки. Должен отображаться на уникальный выход.

BradC
источник
1
Та же длина на MySQL: SELECT CONCAT(QUOTE(a),QUOTE(b))FROM t попробуйте онлайн
Night2
4

Зш , 7 байт

<<<$@:q

Попробуйте онлайн!

Неявно объединяет аргументы на пространствах. qМодификатор говорит ЗШ цитировать аргументы, которые кардинально ускользают пространства, обеспечивая неэкранированное пространство однозначно разделяет два аргумента.

(Без q, "a " "b"и "a" " b"оба дали бы "a b".)

GammaFunction
источник
3

MATL , 1 байт

j

Код принимает массив из двух строк в качестве входных данных и выводит строковое представление этого массива.

Попробуйте онлайн!

объяснение

Код просто читает входные данные в виде строки, без оценки.

Луис Мендо
источник
1
Это действительно принимает две строки в качестве ввода? Кажется, что это просто печатает ввод, что бы это ни было. Попробуйте онлайн!
Джеймс
1
@DJ Он просто читает недооцененный ввод, поэтому он читает что угодно. Это лазейка? Более стандартным подходом было бы взять оцененный ввод как массив и затем преобразовать в строковое представление. Но результат будет таким же, как мой код, поэтому я бы сказал, что это различие ненаблюдаемо
Луис Мендо
3

Желе , 2 байта

ŒṘ

Монадическая ссылка, принимающая список из двух списков символов в качестве аргумента, который выдает один список символов.

Попробуйте онлайн!

Как?

Это встроенный способ получения строкового представления Python, просто.

Джонатан Аллан
источник
3

05AB1E , 2 байта

₁ö

Попробуйте онлайн! Интерпретирует каждую строку как целое число-256, а затем печатает их в форме [1, 2].


05AB1E, 1 байт (срок действия неизвестен)

â

Попробуйте онлайн!

Принимает декартово произведение ввода с собой. Кавычки во входных данных не экранируются, что может привести к путанице. Я перебрал все комбинации до 12 ", "и"], [" столкновения не нашел; тем не менее, я не могу доказать, что для более длинных строк нет столкновений. Если кто-нибудь может придумать доказательства или контрпример, я был бы очень признателен!

Тривиальный 0-байтовый код завершается ошибкой из-за того, что кавычки не экранированы: входные данные ( ", ", пустая строка) и (пустая строка ", ") оба выдают результат ["", "", ""].

1-байт º(зеркально отображает каждую входную строку) также дает сбой из-за этого: входные данные ( ", "" ,", пустая строка) и (пустая строка " ,"", ") оба выдают результат ["", "" ,"", "" ,"", ""].

Grimmy
источник
3

C # с 26 байтами (спасибо Лукасу Лангу, Кевину Круйссену и Джо Кингу)

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

tio.run лямбда

Солей
источник
1
Пожалуйста, подумайте об использовании tio.run
Вер Ник говорит, что восстановите Монику
Это все еще распространяется на ("a <>", "b") и ("a", "<> b") - обратите внимание, что невозможно обрабатывать все случаи, если вы просто объединяете входные данные, независимо от того, что вы поставить между / вокруг них - нужно как-то изменить строки
Lukas Lang
1
Извините, по-прежнему нет: ("1", "11111111111") и ("11111111111", "1") - что работает с другой стороны (и даже короче), так это $"{a.Length}.{a}{b}"- вы всегда можете извлечь aиb из этого без каких-либо двусмысленность (просто читайте до тех пор, пока первым не .ab
Лукас Ланг
1
@LukasLang Отлично. Спасибо за продолжение.
Солей
1
Большое спасибо @JoKing!
Солей
2

PowerShell , 22 байта

Много исправлений благодаря Маззи

"$($args|% le*)"+$args

Попробуйте онлайн!

Возьми пять, о боже.

Veskah
источник
"ab" "c"и "a" "bc"оба выдают одинаковый результат.
BradC
@JoKing Вещи должны быть исправлены. С надеждой.
Веска
1
15 байтов с $ OFS ?
Андрей Одегов
1

CSS + HTML, 55 + 20 = 75 байт

Введите входные данные в HTML после <code>тегов. Визуально вводит буквы по одной из каждого ввода в вывод. Когда вход длиннее, чем другой, визуальные пробелы отображаются для пропущенной буквы (букв) более короткого ввода. Также одна запятая добавлена ​​в HTML для обеспечения уникальности визуального вывода (я надеюсь).

*{position:absolute;letter-spacing:9px}code>code{left:9px
<code>abcdefg<code>hijklmn</code>,

night2
источник
1

Perl 6 , 6 3 байта

&dd

Попробуйте онлайн!

Выводит представление объекта в STDERR.

Джо Кинг
источник
Я не достаточно знаком с Perl - как бы вы вводили строку, содержащую пробелы здесь?
минус семь
2
@ negativeseven вот так
Grimmy
@negativeseven Да, извините, я просто использовал сокращенный синтаксис для списков строк. Вы можете сделать это в типичном стиле, как["Hello, ", "World!"]
Джо Кинг,
1

Луа , 27 байт

print(('%q%q'):format(...))

Попробуйте онлайн!

Полная программа, принять входные данные в качестве аргументов.

Вдохновлен ответом zsh, так как он также использует %qмодификатор для использования внутреннего движка безопасной строки.

Кроме того, я могу думать только о

('%q%q'):format

но я не уверен, что это приемлемый ответ.

Валь говорит восстановить Монику
источник
Я не думаю, что второе допустимо, так ('%q%q'):formatкак не приводит к объекту, который, например, может быть назначен переменной. Это просто вызывает синтаксическую ошибку самостоятельно. Синтаксис двоеточия - это просто сокращение, '%q%q'.format('%q%q', ...)а Lua не допускает частичного применения функций
Jo King
@ JoKing Да, ты прав, я думаю.
говорит
1

sed , 19 байт

N
s/ /. /g
s/\n/: /

Попробуйте онлайн!

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 ": "
GammaFunction
источник
1

C (gcc) , 59 байт

Спасибо Грими за предложение.

Принимает массив входных строк (из которых «2» - правильный номер для этой задачи) и печатает их значения символов, включая завершающий NUL. Технически %pформатер используется printfдля указателей, но он отлично работает для отображения шестнадцатеричных значений произвольных целых чисел, если вы не разборчивы в том, как они выглядят!

f(s,t)char**s,*t;{for(;t=*s++;)for(;printf("%p",*t++)^5;);}

Попробуйте онлайн!

ErikF
источник
Ницца! Вот 59 .
Grimmy
0

Баш , 11 байт

echo ${@@Q}

Попробуйте онлайн!

${parameter@Q}цитирует параметр для повторного использования в качестве ввода. В случае массива он цитирует каждый элемент.

GammaFunction
источник