La composizione riempie gli spazi vuoti


18

Diciamo che abbiamo un insieme particolare di funzioni sulle stringhe. Queste funzioni sono un po 'come riempire gli spazi vuoti o i madlibs, tranne che prendono solo un input e lo usano per riempire tutti i loro spazi. Ad esempio potremmo avere una funzione simile

I went to the ____ store and bought ____ today.

Se applicassimo questa funzione alla stringa cheeseil risultato sarebbe:

I went to the cheese store and bought cheese today.

Possiamo rappresentare queste funzioni come un elenco non vuoto di stringhe, in cui gli spazi vuoti sono semplicemente gli spazi tra le stringhe. Ad esempio la nostra funzione sopra sarebbe:

["I went to the ", " store and bought ", " today."]

Con questa rappresentazione esiste una sola rappresentazione per ogni funzione di questo tipo e una sola funzione per ogni rappresentazione.

Una cosa davvero ordinata è che l'insieme di tali funzioni è chiuso sotto composizione. Ciò significa che la composizione di due delle nostre funzioni è sempre un'altra di queste funzioni. Ad esempio se compongo la nostra funzione sopra con

["blue ", ""]

(la funzione che antepone bluel'ingresso) Otteniamo la funzione:

["I went to the blue ", " store and bought blue ", " today."]

Questi possono però diventare un po 'più complessi. Ad esempio se componiamo la prima funzione con

["big ", " and ", ""]

Il risultato è

["I went to the big ", " and ", " store and bought big ", "and", " today."]

Compito

Il tuo compito è quello di prendere due funzioni come descritte come elenchi di stringhe non vuoti e generare la loro composizione come un elenco di stringhe non vuoti.

Ai fini di questa sfida, un elenco può essere qualsiasi contenitore ordinato che consente duplicati e una stringa può essere un tipo di stringa nativo, un elenco di caratteri o un elenco di numeri interi.

Questo è il risposte saranno segnate in byte con meno byte migliori.

Casi test

["","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"]

1
Tutte e 3 le risposte esistenti attualmente falliscono se nell'input viene utilizzato un carattere ASCII non stampabile (SOH, TAB o LF, a seconda della risposta). Quindi penso che dovresti davvero decidere se l'input è limitato a ASCII stampabile o meno.
Arnauld,

@Arnauld Ok, per ora non ha restrizioni e non ho visto un motivo per cambiarlo, così rimarrà.
Wheat Wizard

2
La mia @KevinCruijssen è valida poiché zero non è un personaggio. Funzionalità di lingua fortunata che aiuta.
Jonathan Allan,

1
@ SriotchilismO'Zaic Il mio 05AB1E si stava unendo / dividendo per newline. Le risposte JavaScript e Haskell si uniscono / si dividono per schede, la risposta C # per il carattere non stampabile `` (SOH), quindi anche quelle non sono valide. Tuttavia, non conosco abbastanza bene Perl 5. In modo che uno potrebbe essere valido.
Kevin Cruijssen,

3
@Roman Non si può presumere che nessun carattere apparirà nell'input in modo da poterlo usare come separatore. Devi effettivamente risolvere la sfida.
Wheat Wizard

Risposte:


11

Gelatina , 6 byte

j0j@ṣ0

Un collegamento diadico che accetta la prima rappresentazione della funzione a destra e la seconda rappresentazione della funzione a sinistra che produce la rappresentazione della funzione risultante. Ogni rappresentazione di funzione è un elenco di elenchi di caratteri (Jelly non ha altre stringhe).

Provalo online! (gli argomenti del programma completo sono riportati nella notazione Python; le stringhe diventano elenchi. Il piè di pagina mostra una rappresentazione Python dell'output del Link.)

Ecco una suite di test che riformatta l'output del Link come gli input.

Come?

Sfrutta gli elenchi di tipi misti di Jelly per consentire l'intero dominio di rappresentazioni (qualsiasi elenco di elenchi di caratteri) utilizzando lo zero intero come segnaposto:

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 avessimo bisogno di trattare una delle liste miste di Jelly (comprese quelle di qualsiasi profondità o forma) potremmo usare questo otto byte: j,©⁹jœṣ®che usa gli argomenti accoppiati come segnaposto .



5

Python 3.8 (pre-release) ,  60  58 byte

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

Una funzione senza nome che accetta due elenchi di stringhe ae bche restituisce un elenco di stringhe.

Provalo online! Oppure vedi la suite di test .

Come?

Innanzitutto forma una stringa di separazione v, che non può essere trovata all'interno ao b. Quindi forma una stringa unendo le stringhe bcon copie di v. Quindi forma una stringa unendo le stringhe acon copie di quella. Infine divide quella stringa nelle istanze di vper dare un elenco di stringhe.

Pur garantendo che vnon ci sia ao bdobbiamo anche assicurarci che vnon ci facciano dividere in anticipo nel caso in cui tutte le stringhe siano ae bsiano uguali. Per fare ciò, ci formiamo vunendo tutte le stringhe in entrambe le liste con le istanze di una stringa (qui '&') e aggiungiamo un ulteriore carattere diverso (qui '$'). Notare che eseguire una delle due operazioni separatamente non è sufficiente poiché tutte le stringhe negli input potrebbero eguagliare il carattere scelto.


Potresti dare un esempio di input dove &è richiesto? e l'utilizzo ''.join(a+b)+'$'non è abbastanza?
Wheat Wizard

Mi ci è voluto un po ', ma ['$','$'] ['$','$']sarebbe uno.
Wheat Wizard

Sì, se tutte le stringhe sono uguali al '$'carattere scelto e il risultato sarà più di una stringa, avremo bisogno di un carattere diverso per evitare di dividere in anticipo.
Jonathan Allan,

2

05AB1E , 4 15 19 9 11 byte

«TýR©ý¹sý®¡

A differenza della risposta di Jelly, stringa "0", numero intero 0e float di 05AB1E 0.0sono tutti (un po ') uguali, quindi non posso dividere / unire per un numero intero. Questo è il motivo per cui abbiamo avuto i +15 byte come soluzioni alternative, anche se ora l'ho ripristinato a 9 byte. Grazie a @JonathanAllan per aver trovato 2 bug.

Provalo online o verifica tutti i casi di test .

Spiegazione:

«            # 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)

2
Ciò ha esito negativo se l'input ha nuove righe (OP ha dichiarato che l'input non è attualmente limitato).
Erik the Outgolfer

@EriktheOutgolfer Ogni altra risposta ha lo stesso problema tra l'altro.
Kevin Cruijssen,

@EriktheOutgolfer Può sicuramente giocare a golf ancora un po ', ma per ora ha apportato una soluzione rapida e sporca.
Kevin Cruijssen,

1
Mi dispiace per questo ... non funzionerà se gli elenchi di input contengono stringhe contenenti solo nuove righe :( (si dividerà presto)
Jonathan Allan

1
@JonathanAllan Lol .. Ah bene, immagino di poterti solo ringraziare per aver trovato questi bug .. Spero che sia stato risolto ora e non troverai nient'altro .. Anche se ho la sensazione che potresti ..
Kevin Cruijssen


2

Japt , 8 byte

Adatta l'approccio di Jonathan .

qVqN²)qN

Provalo

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"

Cosa c'è Nin questo caso? Se lo capisco correttamente (usando la funzionalità di ricerca del link TryIt), si ripete Ndue volte ( ). Quindi utilizza quello per unire il secondo input V( VqN²), quindi usa l'intera stringa per unire il primo (implicito) input U( q...)). E infine divide la stringa risultante su N( qN). Ma cosa c'è Nin questo caso?
Kevin Cruijssen, il

Ah aspetta, penso di aver esaminato il p(...)metodo sbagliato nella ricerca. Accoda 2entrambi gli ingressi accoppiati insieme no? Risultati solo [["w","x","y","z"],["ab","cd","e"],2]e utilizza l'intero elenco per partecipare. Perché la finale qNnon lascia la 2lista dei risultati in quel caso? O modifica l'originale N?
Kevin Cruijssen, il

1
@KevinCruijssen, ha aggiunto una spiegazione ma hai praticamente capito. E, sì, pushing elementi in un array in JS modifica l'array originale.
Shaggy,


1

J , 44 43 42 29 byte

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

Provalo online!

-13 byte grazie alle miglia!

Questo approccio utilizza numeri interi ed è dovuto alle miglia.

approccio originale con stringhe

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

Provalo online!

Nota: ho modificato -3 del TIO per tener conto f=.

Utilizza il metodo di Jonathan Allen, adattato per J.

È stato sorprendentemente difficile giocare a golf, dal momento che J non ha un metodo "join" integrato e sarei curioso di vedere se può essere migliorato in modo significativo.

g è un verbo helper che ci dà "unisciti"


Lavorando con un elenco di numeri interi come input, ho trovato una soluzione a 29 caratteri , _<;._1@,(;@}:@,@,.(,_&,)&.>/)utilizza infinito _come valore sentinella per sapere dove dividere <;._1. L'unione viene prima effettuata utilizzando il comando Riduci /per formare una grande scatola, quindi solo la sua modellazione dell'array.
miglia

È impressionante. Grazie @miles. Sembrava che ci fosse spazio per migliorare, ma non ho visto come.
Giona,

@miles Il g&.:(a.&i.&.>)conteggio verso i byte non dovrebbe mancare o mi manca qualcosa?
Giona,

L'OP ha menzionato che l'input potrebbe essere un elenco di caratteri o un elenco di numeri interi, quindi la funzione di supporto è solo quella di convertire da scatole di array di caratteri a scatole di array int per una visualizzazione più semplice
miglia

Ah, l'ho dimenticato, grazie
Giona il



0

Perl 5 ( -lp), 20 byte

Come ha commentato @JonathanAllan, questo è un programma completo che utilizza, per IO, una scheda come separatore di elenchi e una nuova riga per separare i due elenchi.

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

TIO

la scheda e la nuova riga sono state scelte perché più convenienti per controllare i casi di test, altrimenti potrebbero essere cambiati in caratteri non stampabili \1e \2.

( -02l012p)

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

TIO

Come funziona,

  • -02 : per impostare il separatore record di input su \2
  • -l: per rimuovere il separatore di input dall'argomento predefinito $_e per aggiungere il separatore del record di output all'output predefinito
  • -012: per impostare il separatore dei record di output su \012( \n) in modo che l'output sia più facile da controllare
  • -p : per stampare l'argomento predefinito

  • $n=<>; : leggere il prossimo record e assegnare a $n

  • chop$n; : per rimuovere il separatore da $n
  • s/\x1/$n/g: per sostituire tutte le occorrenze di \1con$n

2
Il mio Perl è quasi inesistente ma credo che si tratti di un programma completo che utilizza, per IO, una scheda come separatore di elenchi e una nuova riga per separare i due elenchi. Come può accettare input con questi caratteri?
Jonathan Allan,

@JonathanAllan, hai ragione, non ho avuto il tempo di aggiungere spiegazioni quando invio, proverò a fare
Nahuel Fouilleul,

0

JavaScript (ES6),  62  59 byte

Salvato 3 byte grazie a @Shaggy

Questa è una versione fissa della risposta di Luis (ora eliminata) per supportare tutti i personaggi.

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

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.