Digamos que temos um conjunto específico de funções em strings. Essas funções são como preencher os espaços em branco ou madlibs, exceto que eles apenas recebem uma entrada e a usam para preencher todos os espaços em branco. Por exemplo, podemos ter uma função que se parece com
I went to the ____ store and bought ____ today.
Se aplicássemos essa função à string, cheese
o resultado seria:
I went to the cheese store and bought cheese today.
Podemos representar essas funções como uma lista não vazia de cadeias, onde os espaços em branco são simplesmente as lacunas entre as cadeias. Por exemplo, nossa função acima seria:
["I went to the ", " store and bought ", " today."]
Com essa representação, há apenas uma representação para cada função desse tipo e apenas uma função para cada representação.
Uma coisa realmente interessante é que o conjunto de tais funções é fechado sob composição. Ou seja, a composição de duas de nossas funções é sempre outra dessas funções. Por exemplo, se eu compor nossa função acima com
["blue ", ""]
(a função que antecede blue
a entrada) Recebemos a função:
["I went to the blue ", " store and bought blue ", " today."]
Estes podem ficar um pouco mais complexos. Por exemplo, se compormos a primeira função com
["big ", " and ", ""]
O resultado é
["I went to the big ", " and ", " store and bought big ", "and", " today."]
Tarefa
Sua tarefa é executar duas funções, como descritas como listas de cadeias não vazias, e produzir sua composição como uma lista de cadeias não vazias.
Para o objetivo desse desafio, uma lista pode ser qualquer contêiner ordenado que permita duplicatas e uma sequência pode ser do tipo nativo, uma lista de caracteres ou uma lista de números inteiros.
Esse é o código do golfe - as respostas serão pontuadas em bytes, com menos bytes sendo melhores.
Casos de teste
["","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"]
Respostas:
Gelatina , 6 bytes
Um link diádico que aceita a primeira representação de função à direita e a segunda representação de função à esquerda, que produz a representação de função resultante. Cada representação de função é uma lista de listas de caracteres (o Jelly não possui outras strings).
Experimente online! (os argumentos do programa completo são fornecidos na notação Python; as strings se tornam listas. O rodapé mostra uma representação Python da saída do Link.)
Aqui está um conjunto de testes que reformata a saída do Link como as entradas.
Quão?
Aproveita as listas de tipos mistos de Jelly para permitir todo o domínio de representações (qualquer lista de listas de caracteres) usando o número inteiro zero como marcador de posição:
Se precisássemos lidar com qualquer uma das listas mistas de Jelly (incluindo aquelas de qualquer profundidade ou forma), poderíamos usar este oito byter:
j,©⁹jœṣ®
que usa os argumentos emparelhados como o marcador de posição.fonte
Haskell , 78 bytes
Experimente online!
fonte
Python 3.8 (pré-lançamento) ,
6058 bytesUma função sem nome que aceita duas listas de cadeias
a
eb
, que retorna uma lista de cadeias.Experimente online! Ou veja a suíte de testes .
Quão?
Primeiro forma uma cadeia separadora
v
, que não pode ser encontrada dentroa
oub
. Em seguida, forma uma string juntando as stringsb
com cópias dev
. Em seguida, forma uma string juntando as stringsa
com cópias disso. Finalmente divide essa string nas instâncias dev
para fornecer uma lista de strings.Garantindo ao mesmo tempo
v
não está naa
oub
devemos também garantir quev
não vai nos fazer dividir cedo no caso em que todas as cordas ema
eb
são iguais. Para fazer isso, formamosv
juntando todas as seqüências de caracteres em ambas as listas às instâncias de uma sequência de caracteres (aqui'&'
) e adicionamos um caractere extra diferente (aqui'$'
). Observe que fazer isso isoladamente não é suficiente, pois todas as seqüências de caracteres nas entradas podem ser iguais ao caractere escolhido.fonte
&
é necessário? e usar''.join(a+b)+'$'
não é suficiente?['$','$'] ['$','$']
seria um.'$'
caractere escolhido e o resultado for mais de uma string, precisamos de um caractere diferente para evitar a divisão antecipada.05AB1E ,
41519911 bytesDiferentemente da resposta Jelly, a string
"0"
, o inteiro0
e o float de 05AB1E0.0
são todos (um pouco) iguais, então não posso dividir / unir por um número inteiro. É por isso que tínhamos os +15 bytes como soluções alternativas, embora eu tenha devolvido agora aos 9 bytes. Graças a @ JonathanAllan por encontrar 2 bugs.Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
Wolfram Language (Mathematica) ,
6261 bytesExperimente online!
-1 graças a Roman
Embora não seja uma saída válida, isso retorna uma função que realmente faz o trabalho .. (34 bytes)
Experimente online!
fonte
Riffle
.Japt , 8 bytes
Adapta a abordagem de Jonathan .
Tente
fonte
N
neste caso? Se eu entendi direito (usando a funcionalidade de pesquisa do link TryIt), ele se repeteN
duas vezes (N²
). Em seguida, ele é usado para ingressar na segunda entradaV
(VqN²
) e, em seguida, usa toda a string para ingressar na primeira entradaU
( implícita) (q...)
). E finalmente divide a string resultante emN
(qN
). Mas o que háN
neste caso?p(...)
método errado na pesquisa. Ele anexa as2
duas entradas emparelhadas, não é? SomenteN²
resulta em[["w","x","y","z"],["ab","cd","e"],2]
e usa toda a lista para ingressar. Por que a finalqN
não deixa a2
lista de resultados nesse caso? OuN²
modifica o originalN
?push
ing elementos para uma matriz em JS modifica a matriz original.Haskell , 62 bytes
Experimente online!
Aqui está a minha resposta Haskell. Funciona em qualquer tipo de lista.
fonte
J ,
44434229 bytesExperimente online!
-13 bytes graças a milhas!
Essa abordagem usa números inteiros e é devido a milhas.
abordagem original com strings
Experimente online!
Nota: ajustei -3 do TIO para dar conta de
f=.
Usa o método de Jonathan Allen, adaptado para J.
Isso foi surpreendentemente difícil para o golfe, já que J não possui um método de "associação" incorporado, e eu ficaria curioso para ver se ele pode ser melhorado significativamente.
g
é um verbo auxiliar que nos dá "junção"fonte
_<;._1@,(;@}:@,@,.(,_&,)&.>/)
usa o infinito_
como o valor sentinela para saber onde dividir<;._1
. A união é feita primeiro com o comando reduzir/
para formar uma caixa grande e, em seguida, é apenas a forma da matriz.g&.:(a.&i.&.>)
contar para os bytes ou estou faltando alguma coisa?JavaScript (Node.js) ,
8579 bytesExperimente online!
fonte
JavaScript, 37 bytes
Também se adapta a abordagem de Jonathan .
Experimente online
fonte
Perl 5 (
-lp
), 20 bytesComo @JonathanAllan comentou, este é um programa completo usando, para E / S, uma guia como separador de lista e uma nova linha para separar as duas listas.
TIO
a guia e a nova linha foram escolhidas porque era mais conveniente verificar os casos de teste; caso contrário, poderiam ser alterados para caracteres não imprimíveis
\1
e\2
.(
-02l012p
)TIO
Como funciona,
-02
: para definir o separador de registros de entrada como\2
-l
: para remover o separador de entrada do argumento padrão$_
e adicionar o separador de registro de saída à saída padrão-012
: para definir o separador de registros de saída como\012
(\n
) para facilitar a verificação da saída-p
: para imprimir o argumento padrão$n=<>;
: ler o próximo registro e atribuir a$n
chop$n;
: para remover o separador de$n
s/\x1/$n/g
: para substituir todas as ocorrências de\1
por$n
fonte
JavaScript (ES6),
6259 bytesGuardado 3 bytes graças a @Shaggy
Esta é uma versão fixa da resposta de Luis (agora excluída) para suportar todos os caracteres.
Experimente online!
fonte