Allungando le parole


32

Scrivi un programma o una funzione che duplica le lettere in una parola, in modo che tutte le lettere duplicate disposte da sinistra a destra nella parola formino l'array di input.

Per esempio:

input: chameleon, [c,a,l,n]
output: cchaamelleonn

Ingresso

  • La parola iniziale (ad es. chameleon)
  • Una matrice di caratteri ( [c,a,l,n]) o una stringa per rappresentare una matrice ( caln) o qualcosa di simile
  • L'input può avvenire tramite parametri di funzione, STDIN o equivalenti di lingua
  • Tutti gli input saranno lettere minuscole (az)

Produzione

  • La parola cambiata

  • Se ci sono più soluzioni, è possibile stamparne tutte

    input: banana [n,a]  
    possible outputs: bannaana, banannaa
                         |-|---------|-|--->[n,a]
    
  • Si può presumere che la parola di input (non necessariamente l'array) avrà le lettere nell'array (in ordine)

  • Puoi anche supporre che gli input non abbiano lettere consecutive uguali (NON apple, geek, green, glass, door ...)

Esempi

input: abcdefghij, [a,b,c]
output: aabbccdefghij

input: lizard, [i,a,r,d]
output: liizaarrdd

input: coconut, [c,o]
ouput: ccooconut or coccoonut or ccocoonut

input: onomatopoeia, [o,o,a,o,o]
output: oonoomaatoopooeia

input: onomatopoeia, [o,a,o]
output: oonomaatoopoeia or onoomaatoopoeia or oonomaatopooeia etc.

Il programma più corto vince!

Classifica (grazie a Martin Büttner per lo snippet)


@AlexA. solo un'istanza perché altrimenti sarebbe la matrice formata dalle lettere duplicate [c,o,c,o], piuttosto che [c,o].
Stretch Maniac,

Sì scusa, rileggerlo è ovvio. Grazie.
Alex A.

2
Visto che questo ha ottenuto un sacco di risposte, e molte nelle stesse lingue, saresti interessato ad aggiungere lo snippet della classifica ? In tal caso, sono felice di modificarlo e modificare le risposte che non utilizzano il formato di intestazione richiesto.
Martin Ender,

@ MartinBüttner me ne sono dimenticato! Aggiunto. Ho dovuto cambiare #answer-liste #language-listlarghezza 50%per evitare sovrapposizioni di colonne nel tuo frammento.
Stretch Maniac,

1
Chiarimento (vedi la mia bash+ sedrisposta): è illegale per banana, na=> baannana? Ho pensato che "Puoi presumere che tutti gli input avranno le lettere nell'array (in ordine)" ha lo scopo di consentire , ma non richiedere , risposte per elaborare entrambi gli elenchi in sequenza, ma @manatwork l'ha interpretato in modo diverso.
Toby Speight,

Risposte:


5

Pyth, 14 byte

s+L&@d<Q1.(QZz

Dimostrazione.

Stile di input:

banana
["b","a","n","a"]

Spiegazione:

s+L&@d<Q1.(Q0z
                  Implicit: z = input(); Q = eval(input())
 +L          z    Map (lambda d) over z, adding the result to each character.
    @d<Q1         Intersection of d with Q[:1], up to the first element of Q.
   &              Logical and - if the first arg is truthy, evaluate and
                  return the second arg, otherwise return first arg.
         .(Q0     Q.pop(0)
                  The addition will either be the empty string, for the empty
                  intersection, or the character that was Q[0] otherwise.

s                 Concatenate and print.

43

Brainfuck, 46 45 (63 con caratteri stampabili in input)

Compatibile con bff di Alex Pankratov (interprete brainfuck usato su SPOJ e ideone) e BFI di Thomas Cort (usato su Anarchy Golf).

La versione stampabile accetta prima l'array come stringa, seguito da una scheda, seguita dalla stringa iniziale senza una nuova riga finale.

Dimostrazione su ideone.

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

Possiamo salvare alcuni byte usando \x00come separatore anziché tab:

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

22
Quella sensazione quando BF è più corto del mio codice Python .. :(
Kade,

6
Di solito non mi interessa Brainfuck, ma è fantastico!
Dennis,

Questo è bellissimo.
Joshpbarron,

14

CJam, 15 byte

rr{_C#)/(C@s}fC

Provalo online.

Come funziona

rr              e# Read two whitespace-separated tokens from STDIN.
  {         }fC e# For each character C in the second string.
   _            e#   Duplicate the first string.
    C#          e#   Compute the index of the character in the string.
      )/        e#   Add 1 and split the string in slice of that size.
        (       e#   Shift out the first slice.
         C      e#   Push the character.
          @     e#   Rotate the remainder of the string in top of the stack.
           s    e#   Stringify (concatenate the slices).

È una battaglia dei CJams! Sia tu che Sp avete risposte CJam a 15 byte e 15 è attualmente la più breve. :)
Alex A.

3
@AlexA. Aspetta Pyth. Aspetta ...
Sp3000,

2
Sembra che faresti meglio ad imparare Pyth. ;)
Alex A.

12

C, 62 byte

f(char*s,char*c){while(*s-*c||putchar(*c++),*s)putchar(*s++);}

Bene, questo è sorprendentemente competitivo.

Definiamo una funzione f(char*, char*)che accetta la stringa come primo input e l'array di caratteri da duplicare come secondo input.

Alcuni codici di test:

int main (int argc, char** argv) {
    f("onomatopeia", "oao");
    return 0;
}

Che stampa:

oonomaatoopeia

Provalo online !

Se è accettabile inviare una macro anziché una funzione, i seguenti #define g(s,c)sono solo 58 byte , ma richiedono se cdevono essere puntatori effettivi:

#define g(s,c)while(*s-*c||putchar(*c++),*s)putchar(*s++);

1
Grazie per avermi fatto cercare l' operatore virgola . Questo è utile!
Oliphaunt: ripristina Monica il

11

CJam, 15 byte

rr{:X/(XX+@X*}/

Un approccio alternativo a CJam. Provalo online

Spiegazione

Per ogni carattere nella seconda stringa, facciamo due cose.

  1. Dividi il suffisso corrente della stringa per il carattere, ad es "beeper" "e" -> ["b" "" "p" "r"]

  2. Scollega la prima stringa nell'array, inserisce due caratteri, quindi ricongiunge il resto dell'array con il carattere, ad es "b" "ee" "eper". L'ultima stringa è il nuovo suffisso.


9

Retina, 33 byte

Ulteriori informazioni su Retina.

+`(?=(.))(((.)(?<!\4.))+\n)\1
$1$2

Ciò prevede le due stringhe su STDIN, separate da una nuova riga.

Ai fini del conteggio, ogni riga va in un file separato, \ndeve essere sostituita con un carattere di nuova riga (0x0A). Se in realtà vuoi testarlo, è più conveniente metterlo in un singolo file dove \nrimane com'è e quindi invocare Retina con l' -sopzione prima di passare il file.

Spiegazione

(Non aggiornato ... Sono riuscito a sbarazzarmi del marcatore ... Lo aggiornerò più tardi.)

Ogni coppia di righe è una sostituzione regex (prima riga lo schema, seconda riga la sostituzione).

^
#

Questo mette un #come marcatore all'inizio della stringa di input.

+`#(.*?(.))(.*\n)\2
$1$2#$3

Questo trova la prima lettera nell'input (dopo il marcatore) corrispondente alla lettera successiva da duplicare, duplica quella lettera, sposta il marcatore dietro di essa e rilascia il primo carattere della seconda stringa. Il +`davanti indica a Retina di farlo ripetutamente fino a quando la stringa non smette di cambiare (in questo caso, perché la seconda stringa è vuota e tutte le lettere richieste sono state duplicate).

#
<empty>

Infine, puliamo la corda facendo cadere il marker.


2
Ho pensato che la retina avrebbe avuto una buona soluzione, e avevo ragione, perché ne hai trovata una. Inoltre, quando ho scremato la tua descrizione per la prima volta, ho letto la fine come "puliamo la corda facendo cadere il microfono ".
mbomb007,

@ mbomb007 Speravo di sbarazzarmi del "mic" duplicando solo singole lettere che non hanno duplicati dopo di loro, ma non posso farlo in meno di 33 byte. (C'è una versione rotta di 28 byte nella cronologia delle revisioni.)
Martin Ender,

@ mbomb007 FYI, sono riuscito a rimuovere il marker ora, ma il conteggio dei byte è sempre lo stesso. Sembra comunque giocabile a golf.
Martin Ender,


@ mbomb007 Sì, lo so. Probabilmente ne aggiungerò uno dopo aver implementato alcune delle più importanti funzionalità eccezionali.
Martin Ender,

8

Python, 61

def f(s,l):b=s[:1]==l[:1];return s and-~b*s[0]+f(s[1:],l[b:])

Una soluzione avida ricorsiva. Salva bse la prima lettera della stringa sè la prima lettera della stringa ldi lettere da raddoppiare. In tal caso, prendi una di quelle lettere e anteponila alla chiamata ricorsiva con il resto di s, rimuovendo il primo elemento da l. In caso contrario b, fai lo stesso ma non raddoppiare la lettera e non rimuoverla l.

Il codice controlla s[:1]==l[:1]piuttosto che s[0]==l[0]evitare un errore di fuori indice quando so lè vuoto.


6

Prolog, 95 83 79 56 byte

d([A|S],H):-put(A),H=[A|T],put(A),d(S,T);d(S,H).
d(_,_).

Esempio:

d(`chameleon`,`caln`).

ritorna

cchaamelleonn

Modifica: salvato 4 byte grazie a Oliphaunt

Edit2: salvato 20 byte utilizzando il put/1predicato SWI-Prolog obsoleto anziché writef. Salvataggio di un byte in sostituzione del predicato di fine ricorsione d([],_).in d(_,_).. dTuttavia, non funzionerà se l'ordinamento delle due definizioni di viene scambiato, ma non ci importa di questo nel codice golf. Salvati altri 2 byte rimuovendo la parentesiH=[A|T],put(A),d(S,T)


1
Non sono davvero sicuro del motivo per cui questo è stato sottoposto a downgrade. Forse aggiungi qualche spiegazione al tuo codice?
Alex A.

1
È possibile salvare quattro byte unificando implicitamente: H=[A|T]. Inoltre, perché non renderlo un po 'più leggibile sostituendo gli spazi con nuove righe?
Oliphaunt: ripristina Monica il

@Oliphaunt Grazie per il suggerimento, non ho visto questa leggera ottimizzazione dopo aver originariamente modificato il mio codice per utilizzare la clausola H = [A | T].
Fatalizza il

5

Python 2, 83 74 72 65 byte

Nessun vero trucco speciale qui. xè la stringa, yè l'array di caratteri duplicati. Per chiarire se questo non viene copiato correttamente, il primo livello di rientro è uno spazio, il successivo è una scheda.

Modifica 1: salvato 9 byte usando la manipolazione di stringhe invece di pop ().

Modifica 2: salvato 2 byte utilizzando -~per incrementare gdi 1.

Modifica 3: salvato 7 byte usando il y[:1]trucco, grazie a xnor per questo!

def f(x,y,s=''):
 for c in x:g=y[:1]==c;s+=c*-~g;y=y[g:]
 print s

Controllalo qui.

Formattato e spiegato correttamente:

def f(x,y,s=''):           # Defining a function that takes our input,
                           # plus holds a variable we'll append to.
  for c in x:              # For every character in 'x', do the following:
    g = y[:1] == c         # Get the first element from the second string, will
                           # return an empty string if there's nothing left.
                           # Thanks to xnor for this trick!
    s += c * -~g           # Since int(g) would either evaluate to 0 or 1, we
                           # use the -~ method of incrementing g to multiply
                           # the character by 1 or 2 and append it to 's'
    y = y[g:]              # Again, since int(g) would either evaluate to 0
                           # or 1, use that to cut the first value off y, or
                           # keep it if the characters didn't match.
  print s                  # Print the string 's' we've been appending to.

"Si può presumere che tutti gli input avranno le lettere nella matrice (in ordine)." Ciò dovrebbe farti risparmiare parecchi byte.
mbomb007,

2
È possibile ottenere il primo elemento da una stringa possibilmente vuota come y[:1].
xnor

Ora mi rendo conto che non puoi salvarne quanti ne pensassi a causa di come lo stai facendo y=y[g:], quindi "un bel po '" è piuttosto un'esagerazione.
mbomb007,

@ Vioz- stavo pensando y[:1]==c. Funziona?
xnor

@xnor Sì, lo faccio se prendo invece le lettere che devono essere sostituite. Grazie!
Kade,

5

Excel VBA, 110 byte

Questa è la mia prima iscrizione a CodeGolf, quindi spero che vada bene.

Immettere la parola di input in A1 e quindi le lettere da sostituire in B1 e la parola risultante viene visualizzata in una finestra di messaggio.

w = Cells(1, 1)
l = Cells(2, 1)
For i = 1 To Len(w)
x = Left(w, 1)
R = R + x
If InStr(l, x) > 0 Then
R = R + x
End If
w = Right(w, Len(w) - 1)
Next
MsgBox R

2
Se VBA non è sensibile al rientro, è possibile eliminare tutti i rientri e salvare alcuni byte. Penso che puoi anche sbarazzarti di tutti gli spazi dopo le virgole e intorno agli operatori. Dovrebbe salvarti qualche byte.
Finanzi la causa di Monica il

@QPaysTaxes Grazie per la modifica. Ho premuto il rollback solo per vedere cosa avrebbe fatto. Non sei sicuro che ti abbia fatto perdere punti o qualcosa per la tua modifica?
Wightboy,

No, ho ancora il +2, anche se mi sono confuso per un po '. Potresti voler tornare indietro di nuovo; almeno secondo tre persone di alto livello, è stata una buona modifica.
Finanzi la causa di Monica il

@QPaysTaxes Sono d'accordo che mi è piaciuta la modifica. Penso di aver appena eseguito il rollback di una volta troppe volte.
Wightboy,

Non so dirlo. I dispositivi mobili non visualizzano esattamente le cose bene. Alla fine, tuttavia, ciò che conta è il codice, non la formattazione.
Finanzi la causa di Monica il

4

Haskell, 42 byte

(a:b)#e@(c:d)|a==c=a:a:b#d|1<2=a:b#e
a#_=a

Esempio di utilizzo:

*Main> "coconut" # "co"
"ccooconut"
*Main> "lizard" # "iard"
"liizaarrdd"
*Main> "onomatopoeia" # "ooaoo"
"oonoomaatoopooeia"

Come funziona:

Se una stringa è vuota, il risultato è la prima stringa. Altrimenti: se i primi caratteri delle stringhe corrispondono, prendilo due volte e aggiungi una chiamata ricorsiva con le code delle stringhe. Se i caratteri non corrispondono, prendi il primo carattere della prima stringa e aggiungi una chiamata ricorsiva con la coda della prima stringa e la stessa seconda stringa.


4

Pyth, 18 17 byte

sm?+d.(QZqd&QhQdz

Dimostrazione dal vivo.

Salvato 1 byte grazie a @Jakube.

Spiegazione:

                z  Read the first line of input.
 m                 For each character in that line
  ?      qd&QhQ    If (?) the first char of the stretch list (`&QhQ`) 
                   and the current character are equal,
   +d.(QZ          Then double the current character and pop an element off
                   the stretch list.
               d   Otherwise, just return the same character.
s                  Join all the characters together.

Versione originale:

jkm?+d.(QZqd&QhQdz

Demo live per originale.


4

Javascript, 47 byte

(a,b)=>a.replace(/./g,d=>b[0]!=d?d:d+b.shift())

Sfruttando alcune funzionalità ES6.


1
Fa questo lavoro correttamente per onomatopoeia, oao?
Alex A.

1
@AlexA. Uscite: "oonoomaatoopooeiaa". Ah capisco. Risolverà
Cereal il

Risolto, penso. Aggiunti molti personaggi :(
Cereal

Invece di b.indexOf(d)==0provare~b.search(d)
Ismael Miguel,

@IsmaelMiguel searchè applicabile solo alle stringhe. Ho dovuto cambiare b in un array
Cereal il

3

Pyth, 16 byte

u|pH<GJxGH>GJwz

Provalo online: dimostrazione

Questo è abbastanza confuso. Le lingue basate su stack potrebbero avere un vantaggio qui.

Spiegazione

                   implicit: z = 1st input line, w = 2nd
u             wz   reduce, start with G = z
                   for each H in w, update G to:
        xGH          index of H in G
       h             +1
      J              store in J
    <GJ              substring: G[:J] (everything before index J)
  pH                 print substring then H (without newlines)
 |                   afterwards (actually or, but p always returns 0)
           >GJ       substring: G[J:] (everything from index J to end)
                     update G with ^
                   afterwards implicitly print the remainder G

Aiuto @isaacg? Deve esserci qualcosa di più corto ...
Jakube,

E più elegante ;-)
Jakube,

1
Capito in 14 - 1 in meno di CJam è il posto migliore dove stare.
Isaacg,

3

JavaScript ES6, 47 byte

(w,s)=>w.replace(/./g,c=>c==s[0]?c+s.shift():c)

Presuppone sè una matrice["c","a","l","n"]


2

> <> (Pesce) , 68 34 byte

ri&:o&:&=\
l&io& /!?/
?!;20.\l!\

Puoi eseguirlo su http://fishlanguage.com/playground inserendo la stringa come stack iniziale (con "segni, cioè" camaleonte ") e l'array di lettere extra come stack di input (nessun" segno cioè caln).

Non dimenticare di premere il pulsante Give per eseguire il seeding dello stack di input.

r       reverses the stack
i&      reads in the first input, and stores it in the register
:o      copies the top of the stack, and outputs the top of the stack
&:&     puts register value on stack, copies it, then puts top stack into register
=       checks if the top two values are equal, if yes push 1, else push 0
?       if top value is non-zero, execute next instruction
!       skips the following instruction (unless it was skipped by the previous ?)

If yes, then we proceed on the same line
&o      puts register value on stack, and outputs it
i&      reads in the first input, and stores it in the register
l       puts length of stack on stack, then proceed to lowest line

If no, we go directly to the last line
l       As above.
?!;     If zero value (from length), then end execution
20.     Push 2 and 0 onto stack, then pop top two values, and go to that position (2,0) (i.e. next instruction is at (3,0))

EDIT: Dimezzato! :)


2

R, 119

Basato sulla risposta di @ Alex , questo è un paio di byte più corto:

function(s,a){message(unlist(lapply(strsplit(s,"")[[1]],function(x){if(length(a)&x==a[1]){a<<-a[-1];c(x,x)}else x})))}

Ungolfed:

function(s, a) {
  message(                             # Prints to output
    unlist(                            # Flattens list to vector
      lapply(                          # R's version of map
        strsplit(s,"")[[1]],           # Split vector to characters
        function (x) {
          if (length(a) & x == a[1]) { # If there are still elements in a
                                       # and there's a match
            a <<- a[-1]                # Modify a
            c(x, x)                    # And return the repeated character
          } else x                     # Otherwise just return it
        }
      )
    )
  )
}

2

Perl, 73 62 59 56

Un approccio completamente nuovo produce risultati molto migliori. Scommetto che può essere più breve.

Chiama come f('coconut', ['c','o']).

sub f{($s,$a)=@_;$s=~s/(.*?)($_)/\U$1$2$2/ for@$a;lc$s}

Per ogni personaggio dell'array, trova la prima occorrenza e duplicalo, quindi trasforma tutto in maiuscolo. Quindi restituisce l'intera stringa, convertita in minuscolo.

EDIT: rasato un paio di altri personaggi eliminando shifte pop.


La versione precedente:

sub f{join '',map{shift @{$_[0]}if s/($_[0][0])/$1$1/;$_}split //,shift}

La nuova versione non rispetta più l'ordine dei personaggi. (A proposito, "La foreachparola chiave è in realtà un sinonimo della forparola chiave, quindi è possibile utilizzare entrambi." - Foreach Loops .)
manatwork

@manatwork Dovrebbe farlo. E grazie per il forsuggerimento. In realtà è più breve ora.
jja,

2

Rubino, 52 47 byte

Soluzione:

f=->(s,a){s.chars.map{|c|c==a[0]?a.shift*2:c}.join}

Esempio:

p f.call('banana', ['n','a']) # => "bannaana"

Spiegazione:

Proc forma di un metodo che accetta una stringa come primo argomento e una matrice di caratteri come secondo argomento. Mappa un blocco su un array di caratteri nell'argomento stringa, che controlla ogni carattere rispetto al primo elemento dell'array di confronto e, se esiste una corrispondenza, rimuove il primo elemento dell'array di confronto e lo raddoppia.


aggiornare

f=->s,a{s.chars.map{|c|c==a[0]?a.shift*2:c}*''}


È possibile saltare le parentesi attorno ai parametri s,a. Ed *''è equivalente a .join. Sono 5 byte salvati, ma ti batto ancora di uno (per ora): D
daniero,

2

Perl, 51 byte

$s=<>;$s=~s=^.*$_=$_=,$,.=$&for split"",<>;print$,;

L'ingresso è fornito tramite STDIN. Il primo input è la parola iniziale (es. chameleon), Il secondo input sono le lettere come una singola stringa (es caln.).

Quanto sopra è solo un modo offuscato (leggi "più bello") di fare quanto segue:

$word = <>;
for $letter(split "", <>) {
   $word =~ s/^.*$letter/$letter/;
   $result .= $&;
}
print $result;

Mentre esaminiamo ogni lettera, sostituiamo dall'inizio della parola fino alla lettera nella parola sorgente con solo la nuova lettera e aggiungiamo la corrispondenza (memorizzata in $&) al nostro risultato. Poiché la corrispondenza include la lettera e quindi viene sostituita con la lettera, ogni lettera finisce per apparire due volte.

Poiché STDIN aggiunge un nuovo carattere di linea a entrambi i nostri input, siamo certi di catturare i resti dell'intera parola nell'ultima corrispondenza, ovvero il nuovo carattere di linea.


2

REGXY, 24 byte

Utilizza REGXY , un linguaggio basato sulla sostituzione regex. Si presume che l'input sia la parola iniziale e l'array, spazio separato (ad es. "Chameleon caln").

/(.)(.* )\1| /\1\1\2/
//

Il programma funziona abbinando un carattere nella prima stringa con il primo carattere dopo uno spazio. Se questo corrisponde, il carattere viene ripetuto nella sostituzione e il carattere nell'array viene rimosso (beh, non aggiunto alla stringa). L'elaborazione passa alla seconda riga, che è solo un puntatore alla prima riga, che fa sì che l'elaborazione si ripeta sul risultato della sostituzione precedente. Alla fine, non ci saranno caratteri dopo lo spazio, a quel punto il secondo ramo dell'alternanza corrisponderà, rimuovendo lo spazio finale dal risultato. La regex non riuscirà quindi a corrispondere, l'elaborazione è completata e il risultato viene restituito.

Se aiuta, le fasi iterative dell'esecuzione sono le seguenti:

chameleon caln
cchameleon aln
cchaameleon ln
cchaameleonn n
cchaameleonn  (with trailing space)
cchaameleonn

Il programma viene compilato ed eseguito correttamente con l'interprete di esempio nel collegamento sopra, ma la soluzione è forse un po 'sfacciata in quanto si basa su un presupposto nella vaghezza delle specifiche del linguaggio. La specifica afferma che il primo token su ogni riga (prima di /) funge da etichetta, ma il presupposto è che un puntatore etichetta null farà riferimento al primo comando nel file con un'etichetta null (o in altre parole, che "null" è un'etichetta valida). Una soluzione meno sfacciata sarebbe:

a/(.)(.* )\1| /\1\1\2/
b//a

Ciò equivale a 27 byte


1

JavaScript ES6, 72 byte

(s,a,i=0,b=[...s])=>a.map(l=>b.splice(i=b.indexOf(l,i+2),0,l))&&b.join``

Questa è una funzione anonima che accetta 2 parametri: la parola iniziale come stringa e i caratteri che si estendono come matrice. Codice non golfato che utilizza ES5 e testare l'interfaccia utente di seguito.

f=function(s,a){
  i=0
  b=s.split('')
  a.map(function(l){
    i=b.indexOf(l,i+2)
    b.splice(i,0,l)
  })
  return b.join('')
}

run=function(){document.getElementById('output').innerHTML=f(document.getElementById('s').value,document.getElementById('a').value.split(''))};document.getElementById('run').onclick=run;run()
<label>Starting word: <input type="text" id="s" value="onomatopoeia" /></label><br />
<label>Leters to duplicate: <input type="text" id="a" value="oao"/></label><br />
<button id="run">Run</button><br />Output: <output id="output"></output>


1

Python 2, 77

def f(x,y,b=''):
 for i in x:
    try:
     if i==y[0]:i=y.pop(0)*2
    except:0
    b+=i
 print b

Chiama come:

f('onomatopoeia',['o','a','o'])

Potrei avere il conteggio dei byte orribilmente sbagliato ... Usa una combinazione di spazi e schede.


1

rs, 39 byte

Maggiori informazioni su rs.

C'è già una risposta Retina, ma penso che questa usi un approccio leggermente diverso. Sono stati anche creati separatamente: quando ho iniziato a lavorare su questo, quella risposta non era stata pubblicata.

Inoltre, questo è comunque più lungo di 6 byte. :)

#
+#(\S)(\S*) ((\1)|(\S))/\1\4#\2 \5
#/

Demo live e suite di test.


Mi piace molto questo interruttore di debug nel tuo interprete.
Dennis,

@Dennis Grazie!
kirbyfan64sos,

1

JavaScript, 92 caratteri

function f(s,c){r="";for(i=0;i<s.length;i++){r+=s[i];if(c.indexOf(s[i])>-1)r+=s[i]}return r}

Versione non protetta:

function stretch(str, chars) {
    var ret = "";
    for(var i = 0; i < str.length; i++) {
        ret += str[i];
        if(chars.indexOf(str[i]) > -1) {
            ret += str[i];
        }
    }
    return ret;
}

1

R, 136 128 122 byte

function(s,a){p=strsplit(s,"")[[1]];for(i in 1:nchar(s))if(length(a)&&(x=p[i])==a[1]){p[i]=paste0(x,x);a=a[-1]};message(p)}

Ciò crea una funzione senza nome che accetta una stringa e un vettore di caratteri come input e stampa una stringa su STDOUT. Per chiamarlo, dagli un nome.

Ungolfed + spiegazione:

f <- function(s, a) {
    # Split s into letters
    p <- strsplit(s, "")[[1]]

    # Loop over the letters of s
    for (i in 1:nchar(s)) {

        # If a isn't empty and the current letter is the first in a
        if (length(a) > 0 && p[i] == a[1]) {

            # Replace the letter with itself duplicated
            p[i] <- paste0(p[i], p[i])

            # Remove the first element from a
            a <- a[-1]
        }
    }

    # Combine p back into a string and print it
    message(p)
}

Esempi:

> f("coconut", c("c","o"))
ccooconut

> f("onomatopoeia", c("o","a","o"))
oonomaatoopoeia

Risparmiato 8 byte grazie a MickeyT e altri 3 grazie a jja!


Potresti usare cat(p,sep='')per uscire direttamente in STDOUT per una coppia
MickyT

@MickyT: Non ci ho pensato! Grazie, a cura. :)
Alex A.

1
In realtà, message(p)è più breve.
jja,

@jja: non lo sapevo message, è fantastico! Grazie! Modificato per utilizzare il tuo suggerimento.
Alex A.

1

Bash + sed, 51

sed "`sed 's/./s!^[^&]*&!\U\&&!;/g'<<<$1`s/.*/\L&/"

Input da stdin; personaggi da raddoppiare come unico argomento:

$ echo chameleon | strtech caln
cchaamelleonn

Funziona costruendo un programma sed $2e quindi eseguendolo contro $1. Il programma sed sostituisce la prima occorrenza di ciascuna lettera sostitutiva con due copie della sua versione maiuscola e alla fine riduce l'intero lotto. Per l'esempio sopra, il programma sed generato è

s!^[^c]*c!\U&C!;s!^[^a]*a!\U&A!;s!^[^l]*l!\U&L!;s!^[^n]*n!\U&N!;s/.*/\L&/

pretty-stampati:

# if only sed had non-greedy matching...
s!^[^c]*c!\U&C!
s!^[^a]*a!\U&A!
s!^[^l]*l!\U&L!
s!^[^n]*n!\U&N!
s/.*/\L&/

Uso le lettere maiuscole per contrassegnare i caratteri elaborati finora; questo evita di raddoppiare i caratteri che sono già stati raddoppiati o di applicare un raddoppio prima del precedente.

Versione precedente, prima di chiarire che l'ordine dell'elenco di sostituzione è significativo (44 caratteri):

sed "`sed 's/./s!&!\U&&!;/g'<<<$1`s/.*/\L&/"

Non corretto. strtech na <<< bananagenera "baannana", ma prima un'occorrenza su "n" dovrebbe essere raddoppiata, solo successivamente un'occorrenza di "a".
arte

In quel caso, ho frainteso la domanda; non era esplicito che l'ordinamento significasse che le lettere precedenti non dovevano essere raddoppiate, semplicemente che si sarebbe potuto trovare una successiva da raddoppiare. Penserò a un'alternativa che soddisfi questo nuovo requisito.
Toby Speight,

Nessun problema, né ho capito bene la prima volta. Ti suggerisco di eliminare la tua risposta mentre pensi (puoi annullare l'eliminazione in qualsiasi momento in seguito), per evitare la possibilità di ottenere il downgrade.
arte

@manatwork: ho chiesto chiarimenti all'interrogatore e ho fornito una risposta alternativa che soddisfa quella lettura delle regole (ma mi è costato 7 caratteri per farlo)
Toby Speight

0

Python, 53 92 byte

Ho trovato la mia soluzione della stessa lunghezza in Python 2 e 3.

EDIT: Amico, risolvere quel caso quando si fanno più sostituzioni della stessa lettera (pur usando lo stesso metodo) ha richiesto un po 'di lavoro.

Python 2:

Provalo qui

def f(s,t):
 for c in t:s=s.replace(c,'%',1)
 print s.replace('%','%s')%tuple(x*2for x in t)

Python 3:

s,*t=input()
for c in t:s=s.replace(c,'%',1)
print(s.replace('%','%s')%tuple(x*2for x in t))

0

Mathematica, 66 byte

""<>Fold[Most@#~Join~StringSplit[Last@#,#2->#2<>#2,2]&,{"",#},#2]&

Esempio:

In[1]:= f = ""<>Fold[Most@#~Join~StringSplit[Last@#,#2->#2<>#2,2]&,{"",#},#2]&

In[2]:= f["banana", {"n", "a"}]

Out[2]= "bannaana"

0

Lua, 76 78 76 75 58 53 byte

Nuova soluzione completamente rielaborata con l'aiuto di wieselkatze e SquidDev! Forza ragazzi, possiamo battere il cervello: P

function f(a,b)print((a:gsub("["..b.."]","%1%1")))end

Spiegazione in arrivo domani. Provalo qui.


Soluzione originale: risparmiato 2 byte grazie a @ kirbyfan64sos!

Lua è una lingua piuttosto terribile in cui giocare a golf, quindi penso di aver fatto abbastanza bene per questo.

function f(x,y)for i=1,#x do g=y:sub(i,i)x=x:gsub(g,g..g,1)end print(x)end

Spiegazione del codice, insieme alla versione non modificata:

function f(x,y) --Define a function that takes the arguements x and y (x is the string to stretch, y is how to stretch it)
  for i=1,#x do --A basic for loop going up to the length of x
    g=y:sub(i,i) -- Define g as y's "i"th letter
    x=x:gsub(g,g..g,1) --Redefine x as x with all letter "g"s having an appended g after them, with a replace limit of 1.
  end
  print(x)
end

Provalo qui. (Codice obsoleto ma lo stesso concetto, solo meno golfato, aggiornerà domani)


Aggiunto su due byte perché dovevo correggere glitch dove avrebbe sostituito tutte le lettere definite nell'array con i loro duplicati.

Penso che puoi rimuovere le nuove righe dopo function f(x,y)e dopo print(x), risparmiando due byte.
kirbyfan64sos,
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.