Iniekcja z dwóch ciągów do jednego ciągu

14

Wyzwanie

Napisz program, który zastosuje funkcję iniekcyjną, która przyjmuje uporządkowaną parę łańcuchów jako dane wejściowe i jeden łańcuch jako dane wyjściowe. Innymi słowy, każde wejście musi być odwzorowane na unikalne wyjście.

Specyfika

  • Dane wejściowe mogą być dowolnymi dwoma łańcuchami o dowolnej długości, ale będą składały się wyłącznie z drukowalnych znaków ASCII (kody ).[32,126]
  • Podobnie łańcuch wyjściowy nie ma ograniczenia długości, ale musi składać się wyłącznie z drukowalnych znaków ASCII.
  • Jeśli twój język nie obsługuje łańcuchów o dowolnej długości, program może jedynie teoretycznie działać na łańcuchy dowolnej wielkości.
  • Odwzorowanie wejść na wyjścia powinno być spójne między uruchomieniami programu. W przeciwnym razie mapowanie, którego używasz, zależy wyłącznie od Ciebie, o ile jest to zastrzyk.
  • Dane wejściowe są uporządkowane. Jeśli dwa ciągi wejściowe są różne, powinny generować inny wynik niż w przypadku zamiany. stfa(s,t)fa(t,s)
  • Nie każdy ciąg musi być możliwym wyjściem.
  • Najkrótsza odpowiedź w każdym języku wygrywa!

Przypadki testowe

Wszystkie poniższe dane wejściowe powinny dawać różne wyniki. Aby uniknąć pomyłek, ciągi znaków są otoczone przez gilety («») i oddzielone pojedynczymi spacjami.

"Witaj świecie"
«Lelho» «drowl»
"różne"
"nie ten sam"

«Kod» «Golf»
«Co» «deGolf»
«CodeGolf» «»

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

"Alfabet"
"Alfabet"
"Alfabet"
"Alfabet"

«\» «" »
«\\» «\" »
ujemna siódemka
źródło
8
Hmm właśnie zauważyłem „Napisz program, który ...” - zauważ, że według meta konsensusu (obecnie 46 w górę, 1 w dół) „Ograniczenie do samych programów wymaga wyraźnego określenia„ pełnego programu ”, a nie tylko„ programu ” . Mam nadzieję, że nie chciałeś tego ograniczyć, ale jeśli tak, musisz odpowiednio zaktualizować post i zwrócić się do tych z nas, którzy przesłali już funkcje jako odpowiedzi.
Jonathan Allan
4
@JonathanAllan Celem było zezwolenie na funkcje.
minus siedem,
3
Czy któryś z ciągów może być pusty?
Kudłaty
2
@Shaggy Tak, jedno lub oba mogą.
ujemne siedem
1
Czy możemy mieć jakieś przypadki testowe? Dzięki!
ouflak

Odpowiedzi:

17

pieprzenie mózgu, 30 29 27 23 bajtów

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

Wypróbuj online!

Wejścia są oddzielone 0x01bajtem.

To zamienia się ["foo", "bar"]w fUToUToUTUTbUTaUTrUT. Aby odzyskać oryginalne dwa ciągi, weź grupy 3 znaków, znajdź ten, w którym nie ma drugiej litery U, i podziel go tam.

Klamka
źródło
@Grimy Niestety, źle zrozumiany „Dane wejściowe są oddzielone bajtem 0x01”.
wastl
15

JavaScript (ES6), 14 bajtów

Pobiera dane wejściowe jako tablicę 2 ciągów znaków. Zainspirowany odpowiedzią Luisa .

JSON.stringify

Wypróbuj online!


JavaScript (ES6),  21  20 bajtów

Pobiera dane wejściowe jako (a)(b).

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

Wypróbuj online!

Zwraca długość za , po której następuje przecinek, a następnie konkatenację za i b .

Arnauld
źródło
Do cholery! Właśnie chciałem skorzystać z tej stringifysztuczki!
Kudłaty
Zrywa z a="hello","" b="world"ia="hello" b="","world"
Soleil
1
@Soleil That daje ["\"hello\",\"\"","\"world\""]i ["\"hello\"","\"\",\"world\""].
Arnauld
1
@Arnauld ochrona przed odwrotnym ukośnikiem nie będzie widoczna. Funkcja nie wstrzyknie.
Soleil
1
@Soleil Nie rozumiem, co masz na myśli. JSON.stringify()zdecydowanie ucieka ". Zobacz zrzut heksowy .
Arnauld,
15

jq -c, 0 bajtów

Wypróbuj online!

To zdecydowanie czuje się jak oszukiwanie ...? Ale wydaje się być zgodny z zasadami wyzwania.

Domyślnie jqwyświetla dane wejściowe w formacie JSON czytelnym dla człowieka. Flaga -c(kompaktowa) informuje jqo wyjściu w stylu „kompaktowym”, co usuwa znaki nowej linii (ponieważ wyzwanie zabrania drukowania ASCII bez możliwości drukowania).

Klamka
źródło
1
OP zezwala na puste dane wejściowe, więc a = = "", b = "x" nie dałoby takiego samego wyniku jak a = "x" b = ""
Gnudiff 28.09.19
3
@Gnudiff Jak to możliwe? Dali ["","x"]i ["x",""]odpowiednio
Klamka
1
Przepraszam, masz rację.
Gnudiff
7

Python 3 , 3 bajty

str

(Wbudowana) funkcja, która, biorąc pod uwagę listę dwóch ciągów, daje ciąg reprezentujący listę

Wypróbuj online!

Jonathan Allan
źródło
2
Bardziej zwięzłe niż Pyth ...
trichoplax
Cóż, 1 bajtowe rozwiązanie Pyth `robi to samo.
Anders Kaseorg
5

Japt -S , 3 bajty

I nadal czuję, że musi być brakuje czegoś tutaj ...

®mc

Spróbuj

Prawdopodobnie 2 bajty:

mq

Spróbuj

Lub rozciąganie za pomocą tego 1-bajtowego:

U

Spróbuj

Pierwsza wersja mapuje każdy ciąg znaków w tablicy na punkty kodowe i wyświetla je połączone spacją.

Druga wersja dzieli każdy ciąg znaków na tablicę znaków i wyświetla je połączone spacją.

A trzecia wersja, która wydaje się oszustwem, po prostu wysyła sygnał wejściowy z -Qflagą wykonującą ciężkie podnoszenie srringify.

Kudłaty
źródło
5

Pyth , 4 bajty

jNmC

Wypróbuj online!

Konwertuje każdy ciąg na bazę 256, a następnie łączy je w kolejności za pomocą ". Ponieważ wyniki są liczbami, "jednoznacznie je rozdzielają, a oryginalne ciągi znaków można odzyskać mCsdczN.

FryAmTheEggman
źródło
1
@AndersKaseorg sugeruje 1 bajt .
Kevin Cruijssen
@KevinCruijssen Zdaję sobie z tego sprawę od kilku minut po opublikowaniu tego, po prostu wolę ducha tego rozwiązania. Dzięki, że i tak o tym
wspomniałeś
Naprawdę podoba mi się również twoja odpowiedź. :) I nie, nawet nie znam Pytha. Jeśli chcesz, możesz opublikować je osobno jako oddzielną odpowiedź (lub łączną odpowiedź, edytując tę), w przeciwnym razie Anders Kaseorg może ją opublikować, ponieważ to on wspomniał o niej w komentarzu.
Kevin Cruijssen
4

T-SQL, 38 bajtów

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

javarcharzab

Używa QUOTENAME, który otacza ciągi znaków, []a także unika wewnętrznych nawiasów klamrowych. Powinny mapować do unikalnego wyniku.

BradC
źródło
1
Ta sama długość na MySQL: SELECT CONCAT(QUOTE(a),QUOTE(b))FROM t wypróbuj online
Night2
4

Zsh , 7 bajtów

<<<$@:q

Wypróbuj online!

Niejawnie łączy argumenty na spacje. qModyfikator mówi zsh przytoczyć argumenty, który w zasadniczy sposób ucieka przestrzenie, zapewniając Niecytowany przestrzeń jednoznacznie oddziela dwa argumenty.

(Nie q, "a " "b"i "a" " b"będzie zarówno wydajność "a b").

Funkcja Gamma
źródło
3

MATL , 1 bajt

j

Kod pobiera tablicę dwóch ciągów jako dane wejściowe i generuje ciąg reprezentujący tę tablicę.

Wypróbuj online!

Wyjaśnienie

Kod po prostu odczytuje dane wejściowe jako ciąg znaków, bez wartości.

Luis Mendo
źródło
1
Czy to naprawdę wymaga dwóch ciągów jako danych wejściowych? Wygląda na to, że po prostu drukuje dane wejściowe, bez względu na to, jakie są. Wypróbuj online!
James
1
@DJ Po prostu czyta nieocenione dane wejściowe, więc czyta wszystko. Czy to jest luka? Bardziej standardowym podejściem byłoby przyjęcie obliczonego wejścia jako tablicy, a następnie konwersja do reprezentacji ciągu. Ale wynik byłby taki sam jak w moim kodzie, więc argumentowałbym, że rozróżnienie jest nie do zaobserwowania
Luis Mendo
3

Galaretka , 2 bajty

ŒṘ

Monadyczny link akceptujący listę dwóch list znaków jako argument, który daje pojedynczą listę znaków.

Wypróbuj online!

W jaki sposób?

Jest to wbudowane, aby uzyskać reprezentację ciągu Python, po prostu.

Jonathan Allan
źródło
3

Haskell, 4 bajty

show

Wbudowany Haskell, aby zmienić rzeczy w łańcuchy. Dane wejściowe są traktowane jako para ciągów.

Wypróbuj online!

nimi
źródło
3

05AB1E , 2 bajty

₁ö

Wypróbuj online! Interpretuje każdy ciąg jako liczbę całkowitą 256, a następnie drukuje dwa w formie [1, 2].


05AB1E, 1 bajt (nieznana ważność)

â

Wypróbuj online!

Bierze kartezjański produkt wkładu ze sobą. Cytaty w danych wejściowych nie są poprzedzane znakami ucieczki, co może powodować zamieszanie. Brutalnie zmusiłem wszystkie kombinacje do 12 ", "i "], ["nie znalazłem żadnej kolizji; nie mogę jednak udowodnić, że nie ma żadnych kolizji dla dłuższych łańcuchów. Jeśli ktokolwiek może wymyślić dowód lub kontrprzykład, byłbym bardzo wdzięczny!

Trywialny bajt 0 nie powiedzie się, ponieważ nie są poprzedzane cudzysłowami: dane wejściowe ( ", "pusty ciąg) i (pusty ciąg ", ") dają wynik ["", "", ""].

1-bajtowy º(odbicie każdego ciągu wejściowego) również się nie udaje z tego powodu: dane wejściowe ( ", "" ,"pusty ciąg) i (pusty ciąg " ,"", ") dają wynik ["", "" ,"", "" ,"", ""].

Ponury
źródło
3

C # z 26 bajtami (dzięki Lukas Lang, Kevin Cruijssen i Jo King)

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

tio.run lambda

Soleil
źródło
1
Proszę rozważyć użycie tio.run
Ver Nick mówi Przywróć Monikę
To wciąż się psuje („a <>”, „b”) i („a”, „<> b”) - pamiętaj, że nie można obsłużyć wszystkich przypadków, jeśli po prostu łączysz dane wejściowe, bez względu na to, co umieść między nimi / wokół nich - musisz jakoś zmodyfikować ciągi znaków
Lukas Lang,
1
Niestety, wciąż nie: („1”, „11111111111”) i („11111111111”, „1”) - to, co działa z drugiej strony (i jest jeszcze krótsze), to $"{a.Length}.{a}{b}"- zawsze możesz wyodrębnić ai bz tego bez żadnych dwuznaczność (wystarczy przeczytać do pierwszego, .aby uzyskać długość a, bto jest reszta
Lukas Lang
1
@LukasLang Świetnie. Dziękuję za dalsze działania.
Soleil,
1
Wielkie dzięki @JoKing!
Soleil
2

Węgiel drzewny , 12 bajtów

⪫E²⭆⪪S"⪫""λ,

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

 E²             Repeat twice
     S          Input a string
    ⪪ "         Split it on `"`s
   ⭆            Map over each piece and join
       ⪫""λ     Wrap each piece in `"`s
⪫          ,    Join the two results with a `,`
                Implicitly print
Neil
źródło
2

PowerShell , 22 bajty

Wiele poprawek dzięki mazzy

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

Wypróbuj online!

Weź pięć, o mój.

Veskah
źródło
"ab" "c"i "a" "bc"oba wytwarzają tę samą wydajność.
BradC
@JoKing Things powinno zostać naprawione. Ufnie.
Veskah
1
15 bajtów z $ OFS ?
Andrei Odegov,
1

CSS + HTML, 55 + 20 = 75 bajtów

Podaj dane wejściowe w <code>tagach HTML po . Wizualnie wstrzykuje litery jeden po drugim z każdego wejścia do wyjścia. Gdy dane wejściowe są dłuższe od innych, wyświetlane są wizualne spacje dla brakującej litery (liter) krótszej litery. Do HTML dodano także przecinek, aby wymusić wyjątkowość wyników wizualnych (mam nadzieję).

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

Noc 2
źródło
1

Perl 6 , 6 3 bajty

&dd

Wypróbuj online!

Wysyła reprezentację obiektu do STDERR.

Jo King
źródło
Nie znam się zbyt dobrze na Perlu - jak tu wpisać ciąg zawierający spacje?
ujemna siedem
2
@negativeseven jak ten
Grimmy
@negativeseven Tak, przepraszam, właśnie używałem składni skrótów do list ciągów. Możesz to zrobić w typowy sposób, jak["Hello, ", "World!"]
Jo King
1

Lua , 27 bajtów

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

Wypróbuj online!

Pełny program, weź dane jako argumenty.

Zainspirowany odpowiedzią zsh, ponieważ używa również %qmodyfikatora do korzystania z wewnętrznego silnika bezpiecznego ciągu.

Mogę też wymyślić tylko

('%q%q'):format

ale nie jestem pewien, czy jest to akceptowalna odpowiedź.

val mówi Przywróć Monikę
źródło
Nie sądzę, aby druga była poprawna, ponieważ ('%q%q'):formatnie skutkuje obiektem, który można na przykład przypisać do zmiennej. Po prostu sam powoduje błąd składniowy. Składnia dwukropka jest tylko skrótem, '%q%q'.format('%q%q', ...)a Lua nie zezwala na częściowe stosowanie funkcji
Jo King
@JoKing Tak, myślę, że masz rację.
val mówi Przywróć Monikę
1

sed , 19 bajtów

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

Wypróbuj online!

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 ": "
Funkcja Gamma
źródło
1

C (gcc) , 59 bajtów

Dzięki Grimy za sugestię.

Pobiera tablicę ciągów wejściowych (z których „2” jest poprawną liczbą dla tego wyzwania) i wypisuje ich wartości znaków, w tym końcowe NUL. Technicznie rzecz biorąc, %pużywany przez formatyzator printfjest do wskazywania, ale działa dobrze do wyświetlania wartości szesnastkowych dowolnych liczb całkowitych, jeśli nie jesteś wybredny, jak wyglądają!

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

Wypróbuj online!

ErikF
źródło
Ładny! Oto 59 .
Grimmy,
0

Bash , 11 bajtów

echo ${@@Q}

Wypróbuj online!

${parameter@Q}podaje parametr do ponownego użycia jako dane wejściowe. W przypadku tablicy cytuje każdy element.

Funkcja Gamma
źródło