Powiedzmy, że mamy określony zestaw funkcji na ciągach. Funkcje te przypominają wypełnianie pustych pól lub madlibów, z tym wyjątkiem, że pobierają tylko jeden wkład i używają go do wypełnienia wszystkich swoich pustych pól. Na przykład możemy mieć funkcję, która wygląda
I went to the ____ store and bought ____ today.
Jeśli zastosujemy tę funkcję do łańcucha, cheese
wynikiem będzie:
I went to the cheese store and bought cheese today.
Możemy reprezentować te funkcje jako niepustą listę ciągów, gdzie puste miejsca są po prostu przerwami między ciągami. Na przykład nasza powyższa funkcja to:
["I went to the ", " store and bought ", " today."]
Dzięki tej reprezentacji istnieje tylko jedna reprezentacja dla każdej funkcji tego rodzaju i tylko jedna funkcja dla każdej reprezentacji.
Naprawdę fajne jest to, że zestaw takich funkcji jest zamknięty w ramach kompozycji. To znaczy, że składanie się z dwóch naszych funkcji jest zawsze kolejną z tych funkcji. Na przykład, jeśli skomponuję naszą funkcję powyżej
["blue ", ""]
(funkcja, która przechodzi blue
do wejścia) Otrzymujemy funkcję:
["I went to the blue ", " store and bought blue ", " today."]
Mogą się one jednak nieco bardziej skomplikować. Na przykład, jeśli skomponujemy pierwszą funkcję z
["big ", " and ", ""]
Wynik to
["I went to the big ", " and ", " store and bought big ", "and", " today."]
Zadanie
Twoim zadaniem jest przyjęcie dwóch funkcji opisanych jako niepuste listy ciągów i wygenerowanie ich składu jako niepustej listy ciągów.
Na potrzeby tego wyzwania listą może być dowolny uporządkowany kontener, który zezwala na duplikaty, a ciąg może być rodzimym typem ciągu, listą znaków lub listą liczb całkowitych.
To jest odpowiedź na golfa kodowanego w bajtach, przy czym mniej bajtów jest lepszych.
Przypadki testowe
["","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"]
Odpowiedzi:
Galaretka , 6 bajtów
Dyadyczny link akceptujący pierwszą reprezentację funkcji po prawej i drugą reprezentację funkcji po lewej, która daje wynikową reprezentację funkcji. Każda reprezentacja funkcji jest listą znaków (Jelly nie ma innych ciągów znaków).
Wypróbuj online! (argumenty pełnego programu podano w notacji Pythona; ciągi stają się listami. Stopka pokazuje reprezentację wyjścia Link w Pythonie).
Oto pakiet testowy, który formatuje dane wyjściowe łącza podobnie jak dane wejściowe.
W jaki sposób?
Korzysta z list mieszanych typów Jelly, aby umożliwić całą domenę reprezentacji (dowolną listę list znaków), używając liczby całkowitej zero jako symbolu zastępczego:
Gdybyśmy musieli poradzić sobie z dowolną z mieszanych list Jelly (w tym tych o dowolnej głębokości lub kształcie), moglibyśmy użyć tego ośmiu bajtów:
j,©⁹jœṣ®
który używa sparowanych argumentów jako elementu zastępczego .źródło
Haskell , 78 bajtów
Wypróbuj online!
źródło
Python 3.8 (wersja wstępna) ,
6058 bajtówNienazwana funkcja akceptująca dwie listy ciągów
a
ib
, która zwraca listę ciągów.Wypróbuj online! Lub zobacz zestaw testowy .
W jaki sposób?
Najpierw tworzy ciąg separatora
v
, którego nie można znaleźć wewnątrza
lubb
. Następnie tworzy ciąg, łącząc ciągib
z kopiamiv
. Następnie tworzy ciąg, łącząc ciągia
z kopiami tego. Na koniec dzieli ten ciąg w przypadkach,v
aby uzyskać listę ciągów.Zapewniając jednocześnie
v
nie jesta
lubb
musimy również zapewnić, żev
przyzwyczajenie uczynić nas podzielić wcześnie w przypadku, gdy wszystkie ciągi wa
ib
są równe. Aby to zrobić, łączymyv
wszystkie ciągi na obu listach z wystąpieniami ciągu (tutaj'&'
) i dodajemy inny, inny znak (tutaj'$'
). Zauważ, że wykonanie jednego z nich osobno nie wystarczy, ponieważ wszystkie ciągi wejściowe mogą być równe wybranemu znakowi.źródło
&
jest to wymagane? a używanie''.join(a+b)+'$'
to za mało?['$','$'] ['$','$']
będzie jednym.'$'
znakowi, a wynikiem będzie więcej niż jeden ciąg, potrzebujemy tam innego znaku, aby uniknąć wcześniejszego podziału.05AB1E ,
41519911 bajtówW przeciwieństwie do odpowiedzi Jelly, ciąg 05AB1E
"0"
, liczba całkowita0
i liczba zmiennoprzecinkowa0.0
są (nieco) równe, więc nie mogę podzielić / dołączyć liczby całkowitej. Właśnie dlatego mieliśmy obejście +15 bajtów jako obejście, chociaż teraz grałem w golfa z powrotem do 9 bajtów. Dzięki @JonathanAllan za znalezienie 2 błędów.Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
Wolfram Language (Mathematica) ,
6261 bajtówWypróbuj online!
-1 dzięki Romanowi
Chociaż nie jest to poprawny wynik, zwraca funkcję, która faktycznie wykonuje zadanie. (34 bajty)
Wypróbuj online!
źródło
Riffle
.Japt , 8 bajtów
Dostosowuje podejście Jonathana .
Spróbuj
źródło
N
w tym przypadku? Jeśli dobrze to rozumiem (używając funkcji wyszukiwania łącza TryIt), powtarza sięN
dwa razy (N²
). Następnie używa tego, aby połączyć drugie wejścieV
(VqN²
), a następnie używa tego całego łańcucha, aby dołączyć pierwsze (niejawne) wejścieU
(q...)
). I na koniec dzieli wynikowy ciąg znaków naN
(qN
). Ale co jestN
w tym przypadku?p(...)
metody wyszukiwania. Dodaje2
oba sparowane wejścia razem, prawda? TylkoN²
wyniki[["w","x","y","z"],["ab","cd","e"],2]
i używa całej listy do dołączenia. Dlaczego w takim przypadku finałqN
nie pozostawia2
listy wyników? CzyN²
modyfikuje oryginałN
?push
ing elementy do tablicy w JS modyfikuje oryginalną tablicę.Haskell , 62 bajty
Wypróbuj online!
Oto moja odpowiedź Haskella. Działa na każdym typie listy.
źródło
J ,
44434229 bajtówWypróbuj online!
-13 bajtów dzięki milom!
To podejście wykorzystuje liczby całkowite i wynika z mil.
oryginalne podejście ze sznurkami
Wypróbuj online!
Uwaga: Dostosowałem -3 do TIO, aby uwzględnić
f=.
Wykorzystuje metodę Jonathana Allena, dostosowaną do J.
To było zaskakująco trudne do gry w golfa, ponieważ J nie ma wbudowanej metody „dołączenia” i byłbym ciekawy, czy można to znacznie poprawić.
g
to czasownik pomocniczy, który daje nam „dołączy攟ródło
_<;._1@,(;@}:@,@,.(,_&,)&.>/)
używa nieskończoności_
jako wartość wartowniczego wiedzieć, gdzie do podziału<;._1
. Łączenie odbywa się najpierw za pomocą funkcji zmniejsz,/
aby utworzyć jedno duże pudełko, a następnie po prostu kształtowanie tablicy.g&.:(a.&i.&.>)
liczyć się do bajtów, czy coś mi brakuje?JavaScript (Node.js) ,
8579 bajtówWypróbuj online!
źródło
JavaScript, 37 bajtów
Dostosowuje także podejście Jonathana .
Wypróbuj online
źródło
Perl 5 (
-lp
), 20 bajtówJak skomentował @JonathanAllan, jest to pełny program wykorzystujący, dla IO, kartę jako separator listy i nowy wiersz do oddzielenia dwóch list.
TIO
wybrano zakładkę i nowy wiersz, ponieważ wygodniej było sprawdzać przypadki testowe, w przeciwnym razie można je zmienić na znaki niedrukowalne
\1
i\2
.(
-02l012p
)TIO
Jak to działa,
-02
: aby ustawić separator rekordów wejściowych na\2
-l
: aby usunąć separator wejściowy z domyślnego argumentu$_
i dodać separator rekordu wyjściowego do domyślnego wyjścia-012
: aby ustawić separator rekordów wyjściowych na\012
(\n
), aby łatwiej było sprawdzić dane wyjściowe-p
: aby wydrukować domyślny argument$n=<>;
: aby przeczytać następny rekord i przypisać do$n
chop$n;
: aby usunąć separator$n
s/\x1/$n/g
: Zastąpienie wszystkich wystąpień\1
z$n
źródło
JavaScript (ES6),
6259 bajtówZaoszczędź 3 bajty dzięki @Shaggy
To jest poprawiona wersja odpowiedzi Luisa (teraz usunięta), która obsługuje wszystkie postacie.
Wypróbuj online!
źródło