Compondo preencher os espaços em branco

18

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, cheeseo 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 bluea 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 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"]
Assistente de Trigo
fonte
1
Todas as três respostas existentes atualmente falham se algum caractere ASCII não imprimível for usado na entrada (SOH, TAB ou LF, dependendo da resposta). Então eu acho que você realmente deve decidir se a entrada é restrita a ASCII imprimível ou não.
Arnauld
@ Arnauld Ok, bem como a partir de agora é irrestrito e eu não vi um motivo para mudar isso, para que ele permaneça.
Wheat Wizard
2
A mina @KevinCruijssen é válida, pois zero não é um personagem. Recurso de linguagem de sorte ajudando.
Jonathan Allan
1
@ SriotchilismO'Zaic Meu 05AB1E estava entrando / se separando por novas linhas. As respostas JavaScript e Haskell estão unindo / dividindo por guias, a resposta C # pelo caractere não imprimível `` (SOH), portanto, também são todas inválidas. Também não conheço o Perl 5 o suficiente. Para que um possa ser válido.
Kevin Cruijssen 29/07
3
@ Roman Você não pode assumir que nenhum caractere não aparecerá na entrada para que você possa usá-lo como um separador. Você deve realmente resolver o desafio.
Wheat Wizard

Respostas:

11

Gelatina , 6 bytes

j0j@ṣ0

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:

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

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.

Jonathan Allan
fonte
5

Haskell , 78 bytes

(a:b:r)#t@(x:s)|s>[]=(a++x):init s++((last s++b):r)#t|z<-a++x++b=(z:r)#t
x#_=x

Experimente online!

Laikoni
fonte
5

Python 3.8 (pré-lançamento) ,  60  58 bytes

lambda a,b:(v:='&'.join(a+b)+'$').join(b).join(a).split(v)

Uma função sem nome que aceita duas listas de cadeias ae b, 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 dentro aou b. Em seguida, forma uma string juntando as strings bcom cópias de v. Em seguida, forma uma string juntando as strings acom cópias disso. Finalmente divide essa string nas instâncias de vpara fornecer uma lista de strings.

Garantindo ao mesmo tempo vnão está na aou bdevemos também garantir que vnão vai nos fazer dividir cedo no caso em que todas as cordas em ae bsão iguais. Para fazer isso, formamos vjuntando 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.

Jonathan Allan
fonte
Você poderia dar um exemplo de entrada onde &é necessário? e usar ''.join(a+b)+'$'não é suficiente?
Wheat Wizard
Levei um tempo, mas ['$','$'] ['$','$']seria um.
Wheat Wizard
Sim, se todas as strings forem iguais ao '$'caractere escolhido e o resultado for mais de uma string, precisamos de um caractere diferente para evitar a divisão antecipada.
Jonathan Allan
2

05AB1E , 4 15 19 9 11 bytes

«TýR©ý¹sý®¡

Diferentemente da resposta Jelly, a string "0", o inteiro 0e o float de 05AB1E 0.0sã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:

«            # 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)
Kevin Cruijssen
fonte
2
Isso falhará se a entrada tiver novas linhas (o OP disse que a entrada está irrestrita no momento).
Erik the Outgolfer
@EriktheOutgolfer Todas as outras respostas têm o mesmo problema.
Kevin Cruijssen 29/07
@EriktheOutgolfer Definitivamente pode jogar golfe um pouco mais, mas foi uma solução rápida e suja por enquanto.
Kevin Cruijssen 29/07
1
Uh, desculpe por isso ... não funcionará se as listas de entrada contiverem seqüências contendo apenas linhas novas :( (será dividido mais cedo)
Jonathan Allan
1
@ JonathanAllan Lol .. Ah, bem, acho que só posso agradecer por encontrar esses bugs .. Espero que seja corrigido agora e você não encontre mais nada .. Embora eu tenha a sensação de que você pode ..
Kevin Cruijssen
2

Japt , 8 bytes

Adapta a abordagem de Jonathan .

qVqN²)qN

Tente

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"
Shaggy
fonte
O que há Nneste caso? Se eu entendi direito (usando a funcionalidade de pesquisa do link TryIt), ele se repete Nduas vezes ( ). Em seguida, ele é usado para ingressar na segunda entrada V( VqN²) e, em seguida, usa toda a string para ingressar na primeira entrada U( implícita) ( q...)). E finalmente divide a string resultante em N( qN). Mas o que há Nneste caso?
Kevin Cruijssen 30/07
Ah, espere, acho que procurei o p(...)método errado na pesquisa. Ele anexa as 2duas entradas emparelhadas, não é? Somente resulta em [["w","x","y","z"],["ab","cd","e"],2]e usa toda a lista para ingressar. Por que a final qNnão deixa a 2lista de resultados nesse caso? Ou modifica o original N?
Kevin Cruijssen 30/07
1
@KevinCruijssen, adicionou uma explicação, mas você já a descobriu. E, sim, pushing elementos para uma matriz em JS modifica a matriz original.
Shaggy
1

Haskell , 62 bytes

[a]#(c:d)=(a++c):d
(a:b)#c=a:b#c
[a]%b=[a]
(a:b)%c=[a]#c#(b%c)

Experimente online!

Aqui está a minha resposta Haskell. Funciona em qualquer tipo de lista.

Assistente de Trigo
fonte
1

J , 44 43 42 29 bytes

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

Experimente online!

-13 bytes graças a milhas!

Essa abordagem usa números inteiros e é devido a milhas.

abordagem original com strings

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

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"

Jonah
fonte
Trabalhando com a lista de números inteiros como entrada, encontrei uma solução de 29 caracteres , _<;._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.
milhas
Isso é impressionante. Obrigado @miles. Definitivamente, parecia que havia espaço para melhorar, mas não vi como.
Jonah
@miles Não deveria g&.:(a.&i.&.>)contar para os bytes ou estou faltando alguma coisa?
Jonah
O OP mencionou que a entrada pode ser uma lista de caracteres ou uma lista de números inteiros, de modo que a função auxiliar é apenas converter de caixas de matrizes de caracteres em caixas de matrizes int para facilitar a visualização
milhas
Ah eu esqueci isso, obrigado
Jonah
0

Perl 5 (-lp ), 20 bytes

Como @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.

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

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 \1e\2 .

( -02l012p)

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

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 \1por$n
Nahuel Fouilleul
fonte
2
Meu Perl é quase inexistente, mas acredito que este seja um programa completo usando, para E / S, uma guia como separador de listas e uma nova linha para separar as duas listas. Como ele aceita entradas com esses caracteres?
Jonathan Allan
@ JonathanAllan, você está correto, não tive tempo de adicionar explicações ao enviar tentarei fazer isso
Nahuel Fouilleul
0

JavaScript (ES6),  62  59 bytes

Guardado 3 bytes graças a @Shaggy

Esta é uma versão fixa da resposta de Luis (agora excluída) para suportar todos os caracteres.

a=>b=>a.map(e=escape).join(b.map(e)).split`,`.map(unescape)

Experimente online!

Arnauld
fonte