Wörter dehnen

32

Schreiben Sie ein Programm oder eine Funktion, die Buchstaben in einem Wort dupliziert, sodass alle duplizierten Buchstaben, die im Wort von links nach rechts angeordnet sind, das Eingabearray bilden.

Beispielsweise:

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

Eingang

  • Das Startwort (zB chameleon)
  • Ein Array von Zeichen ( [c,a,l,n]) oder eine Zeichenfolge zur Darstellung eines Arrays ( caln) oder ähnliches
  • Die Eingabe kann über Funktionsparameter, STDIN oder Sprachäquivalente erfolgen
  • Alle Eingaben erfolgen in Kleinbuchstaben (az)

Ausgabe

  • Das veränderte Wort

  • Wenn es mehrere Lösungen gibt, kann jede gedruckt werden

    input: banana [n,a]  
    possible outputs: bannaana, banannaa
                         |-|---------|-|--->[n,a]
    
  • Sie können davon ausgehen, dass das Eingabewort (nicht unbedingt das Array) die Buchstaben im Array enthält (in der angegebenen Reihenfolge).

  • Sie können auch davon ausgehen, dass die Eingaben keine aufeinander folgenden Buchstaben haben, die gleich sind (NICHT Apfel, Aussenseiter, Grün, Glas, Tür ...)

Beispiele

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.

Kürzeste Sendung gewinnt!

Leaderboard (Danke an Martin Büttner für das Snippet)

Stretch Maniac
quelle
@AlexA. nur eine Instanz, da ansonsten das Array, das durch die doppelten Buchstaben gebildet wird [c,o,c,o], eher als [c,o].
Stretch Maniac
Ja, tut mir leid, es noch einmal zu lesen, das ist offensichtlich. Vielen Dank.
Alex A.
2
Wenn Sie sehen, dass dies viele Antworten enthält und viele in denselben Sprachen, möchten Sie das Bestenlisten-Snippet hinzufügen ? Wenn ja, bearbeite ich es gerne und ändere die Antworten, die nicht das erforderliche Header-Format verwenden.
Martin Ender
@ MartinBüttner Das habe ich vergessen! Hinzugefügt. Ich musste ändern #answer-listund #language-listBreite 50%zu überlappenden Spalten in Ihrem Snippet zu vermeiden.
Stretch Maniac
1
Klarstellung (siehe meine bash+ sedAntwort): Ist es illegal für banana, na=> baannana? Ich war der Ansicht, dass "Sie davon ausgehen können, dass alle Eingaben die Buchstaben im Array (in der angegebenen Reihenfolge) enthalten" Antworten zulassen , aber nicht erfordern sollen , um beide Listen nacheinander zu verarbeiten. @Manatwork interpretierte sie jedoch unterschiedlich.
Toby Speight

Antworten:

5

Pyth, 14 Bytes

s+L&@d<Q1.(QZz

Demonstration.

Eingabestil:

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

Erläuterung:

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.
isaacg
quelle
43

Brainfuck, 46 45 (63 mit druckbaren Zeichen in der Eingabe)

Kompatibel mit Alex Pankratovs BFF (Brainfuck-Interpreter für SPOJ und Ideone) und Thomas Corts BFI (für Anarchy Golf).

In der druckbaren Version wird das Array zuerst als Zeichenfolge gefolgt von einem Tabulator gefolgt von der Startzeichenfolge ohne abschließende Zeilenumbrüche verwendet.

Demonstration auf ideone.

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

Wir können einige Bytes einsparen, indem wir \x00als Trennzeichen anstelle des Tabulators verwenden:

,[>,]
<[<]
<,+
[
  -.
  [>+>-<<-]
  >>
  [
    <[>+<-]
  ]
  <[.[-]]
  ,+
]
Mitch Schwartz
quelle
22
Das Gefühl, wenn BF kürzer als mein Python-Code ist .. :(
Kade
6
Normalerweise mag ich Brainfuck nicht, aber das ist großartig!
Dennis
Das ist schön.
Joshpbarron
14

CJam, 15 Bytes

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

Probieren Sie es online aus.

Wie es funktioniert

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).
Dennis
quelle
Es ist ein Kampf der CJams! Sie und Sp haben beide 15-Byte-CJam-Antworten, und 15 ist derzeit die kürzeste. :)
Alex A.
3
@AlexA. Warte einfach auf Pyth. Sie warten nur ...
Sp3000
2
Klingt, als würdest du besser Pyth lernen. ;)
Alex A.
12

C 62 Bytes

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

Nun, das ist überraschend wettbewerbsfähig.

Wir definieren eine Funktion f(char*, char*), die den String als erste Eingabe und das zu duplizierende Array von Zeichen als zweite Eingabe verwendet.

Einige Testcodes:

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

Welche Drucke:

oonomaatoopeia

Probieren Sie es online !

Wenn es akzeptabel ist, ein Makro anstelle einer Funktion zu übergeben, ist das Folgende #define g(s,c)nur 58 Bytes , erfordert aber tatsächliche Zeiger sund muss cdiese sein:

#define g(s,c)while(*s-*c||putchar(*c++),*s)putchar(*s++);
BrainSteel
quelle
1
Vielen Dank, dass ich den Kommaoperator nachschlagen musste . Das ist nützlich!
Oliphaunt - wieder Monica
11

CJam, 15 Bytes

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

Ein alternativer CJam-Ansatz. Probieren Sie es online aus

Erläuterung

Für jedes Zeichen in der zweiten Zeichenfolge machen wir zwei Dinge.

  1. Teilen Sie das aktuelle Suffix des Strings durch das Zeichen, z "beeper" "e" -> ["b" "" "p" "r"]

  2. Löscht die erste Zeichenfolge im Array, fügt zwei Zeichen ein und setzt den Rest des Arrays wieder mit dem Zeichen zusammen, z "b" "ee" "eper". Die letzte Zeichenfolge ist das neue Suffix.

Sp3000
quelle
9

Retina, 33 Bytes

Weitere Informationen zu Retina.

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

Das erwartet die zwei Zeichenfolgen auf STDIN, die von einem Newline getrennt werden.

Zu Zählzwecken wird jede Zeile in eine separate Datei geschrieben, \ndie durch ein tatsächliches Zeilenumbruchzeichen (0x0A) ersetzt werden sollte. Wenn Sie dies tatsächlich testen möchten, ist es bequemer, dies in eine einzelne Datei zu \nschreiben, in der es unverändert bleibt, und dann Retina mit der -sOption aufzurufen, bevor Sie die Datei übergeben.

Erläuterung

(Veraltet ... Ich habe es geschafft, den Marker loszuwerden ... Ich werde dies später aktualisieren.)

Jedes Zeilenpaar ist eine reguläre Ersetzung (erste Zeile das Muster, zweite Zeile die Ersetzung).

^
#

Dadurch wird ein #als Markierung am Anfang der Eingabezeichenfolge eingefügt.

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

Dies findet den ersten Buchstaben in der Eingabe (nach der Markierung), der dem nächsten zu duplizierenden Buchstaben entspricht, dupliziert diesen Buchstaben, verschiebt die Markierung dahinter und legt das erste Zeichen der zweiten Zeichenfolge ab. Das +`Symbol an der Vorderseite weist Retina an, dies wiederholt zu tun, bis sich die Zeichenfolge nicht mehr ändert (in diesem Fall, weil die zweite Zeichenfolge leer ist und alle erforderlichen Buchstaben dupliziert wurden).

#
<empty>

Zum Schluss räumen wir den String auf, indem wir den Marker fallen lassen.

Martin Ender
quelle
2
Ich dachte mir, dass die Netzhaut eine schöne Lösung haben würde, und ich hatte Recht, weil Sie eine gefunden haben. Als ich zum ersten Mal Ihre Beschreibung überflog, las ich das Ende mit "Wir räumen die Saite auf, indem wir das Mikrofon fallen lassen ."
mbomb007
@ mbomb007 Ich hatte gehofft, das "Mikrofon" loszuwerden, indem ich nur einzelne Buchstaben duplizierte, denen keine Duplikate folgen, aber ich kann es nicht in weniger als 33 Bytes tun. (Es gibt eine kaputte 28-Byte-Version im Revisionsverlauf.)
Martin Ender
@ mbomb007 Zu Ihrer Information, ich habe es jetzt geschafft, die Markierung zu entfernen, aber die Anzahl der Bytes ist immer noch die gleiche. Das sieht aber immer noch gut aus.
Martin Ender
Abgesehen davon ist mir gerade aufgefallen
mbomb007
@ mbomb007 Ja, mir ist bewusst. Ich werde wahrscheinlich eine hinzufügen, nachdem ich einige der wichtigsten herausragenden Funktionen implementiert habe.
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:])

Eine gierige rekursive Lösung. Speichert, bob der erste Buchstabe der Zeichenfolge sder erste Buchstabe der lzu verdoppelnden Zeichenfolge ist . Wenn ja, nehmen Sie einen dieser Buchstaben und stellen Sie ihn vor den rekursiven Aufruf mit dem Rest von sund entfernen Sie das erste Element von l. Wenn nicht b, machen Sie dasselbe, aber verdoppeln Sie den Buchstaben nicht und entfernen Sie ihn nicht von l.

Der Code prüft s[:1]==l[:1] anstatt s[0]==l[0]einen Indexfehler zu vermeiden, wenn soder lleer ist.

xnor
quelle
6

Prolog 95, 83 79 56 Bytes

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

Beispiel:

d(`chameleon`,`caln`).

kehrt zurück

cchaamelleonn

Bearbeiten: 4 Bytes dank Oliphaunt gespeichert

Edit2: 20 Bytes mit dem veralteten put/1SWI-Prolog-Prädikat statt gespeichert writef. 1 Byte gespeichert, das das Rekursionsendprädikat d([],_).von ersetzt d(_,_).. Funktioniert nicht, wenn die Reihenfolge der beiden Definitionen von dvertauscht ist, aber das ist uns im Golfcode egal. Weitere 2 Bytes gespeichert, wobei die Klammern entfernt wurdenH=[A|T],put(A),d(S,T)

Tödlich
quelle
1
Ich bin mir nicht sicher, warum dies abgelehnt wurde. Fügen Sie Ihrem Code möglicherweise eine Erklärung hinzu?
Alex A.
1
Sie können implizit durch die Vereinheitlichung vier Bytes speichern: H=[A|T]. Machen Sie es außerdem ein wenig lesbarer, indem Sie die Leerzeichen durch Zeilenumbrüche ersetzen.
Oliphaunt - wieder Monica
@Oliphaunt Vielen Dank für den Vorschlag, ich habe diese leichte Optimierung nicht gesehen, nachdem ich meinen Code ursprünglich geändert habe, um die H = [A | T] -Klausel zu verwenden.
Fatalize
5

Python 2, 83 74 72 65 Bytes

Hier gibt es keine besonderen Tricks. xist die Zeichenfolge, yist das Array von Zeichen, die dupliziert werden.Um zu klären, ob dies nicht richtig kopiert wurde, ist die erste Einrückungsstufe ein Leerzeichen, die nächste ein Tabulator.

Edit 1: 9 Bytes mit String-Manipulation anstelle von pop () gespeichert.

2 bearbeiten: 2 Bytes mit gespeichert, -~um gum 1 zu erhöhen .

Edit 3: 7 Bytes mit y[:1]Trick gespeichert, danke an xnor dafür!

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

Schau es dir hier an.

Richtig formatiert und erklärt:

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.
Kade
quelle
Msgstr "Sie können davon ausgehen, dass alle Eingaben die Buchstaben im Array enthalten (in der Reihenfolge)." Das sollte Ihnen einige Bytes ersparen.
mbomb007
2
Sie können das erste Element aus einer möglicherweise leeren Zeichenfolge als abrufen y[:1].
Donnerstag,
Mir ist jetzt klar, dass man nicht so viele sparen kann, wie ich dachte, weil man es y=y[g:]so macht. " Nicht wenige" sind also eine Übertreibung.
mbomb007
@ Vioz- Ich habe nachgedacht y[:1]==c. Funktioniert es?
Donnerstag,
@xnor Ja, wenn ich stattdessen die Buchstaben nehme, die ersetzt werden müssen. Vielen Dank!
Kade,
5

Excel VBA, 110 Bytes

Dies ist mein erster Einstieg in CodeGolf, also hoffe ich, dass dies in Ordnung ist.

Sie geben das eingegebene Wort in A1 ein und anschließend die zu ersetzenden Buchstaben in B1. Das resultierende Wort wird in einem Meldungsfeld angezeigt.

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
Wightboy
quelle
2
Wenn VBA nicht einrückungsempfindlich ist, können Sie alle Einrückungen entfernen und ein paar Bytes sparen. Ich denke, Sie können auch alle Leerzeichen nach Kommas und um Operatoren loswerden. Sollte Ihnen ein paar Bytes sparen.
Fund Monica's Lawsuit
@QPaysTaxes Danke für deine Bearbeitung. Ich drückte Rollback, nur um zu sehen, was es tun würde. Sie sind sich nicht sicher, ob Sie dadurch Punkte oder etwas für Ihre Bearbeitung verloren haben?
Wightboy
Nein, ich habe immer noch die +2, obwohl ich ein bisschen verwirrt war. Möglicherweise möchten Sie erneut einen Rollback ausführen. Zumindest laut drei hochrangigen Vertretern war es eine gute Bearbeitung.
Fund Monica Klage
@ QPaysTaxes Ich stimme zu, dass mir die Bearbeitung gefallen hat. Denke, ich habe gerade ein zu oft zurückgesetzt.
Wightboy
Ich kann es nicht sagen. Mobile zeigt die Dinge nicht gerade gut an. Letztendlich kommt es jedoch auf den Code an, nicht auf die Formatierung.
Fund Monica Klage
4

Haskell, 42 Bytes

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

Anwendungsbeispiel:

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

Wie es funktioniert:

Wenn eine Zeichenfolge leer ist, ist das Ergebnis die erste Zeichenfolge. Andernfalls: Wenn die ersten Zeichen der Zeichenfolgen übereinstimmen, nehmen Sie sie zweimal und fügen Sie einen rekursiven Aufruf mit den Enden der Zeichenfolgen hinzu. Wenn die Zeichen nicht übereinstimmen, nehmen Sie das erste Zeichen der ersten Zeichenfolge und fügen Sie einen rekursiven Aufruf mit dem Ende der ersten Zeichenfolge und derselben zweiten Zeichenfolge hinzu.

nimi
quelle
4

Pyth, 18 17 Bytes

sm?+d.(QZqd&QhQdz

Live-Demo.

1 Byte dank @Jakube gespeichert.

Erläuterung:

                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.

Originalfassung:

jkm?+d.(QZqd&QhQdz

Live-Demo für Original.

kirbyfan64sos
quelle
4

Javascript, 47 Bytes

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

Nutzung einiger ES6-Funktionen.

Müsli
quelle
1
Ist diese Arbeit richtig für onomatopoeia, oao?
Alex A.
1
@AlexA. Ausgaben: "oonoomaatoopooeiaa". Oh ich verstehe. Wird reparieren
Getreide
Fest, denke ich. Viele Zeichen hinzugefügt :(
Cereal
b.indexOf(d)==0Versuchen Sie stattdessen~b.search(d)
Ismael Miguel
@IsmaelMiguel searchgilt nur für Zeichenfolgen. Musste b in ein Array ändern
Cereal
3

Pyth, 16 Bytes

u|pH<GJxGH>GJwz

Probieren Sie es online aus: Demonstration

Das ist ziemlich abgedreht. Stack-basierte Sprachen könnten hier einen Vorteil haben.

Erläuterung

                   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
Jakube
quelle
@isaacg Hilfe? Es muss etwas kürzer sein ...
Jakube
Und eleganter ;-)
Jakube
1
Verstanden in 14 - 1 weniger als CJam ist der beste Ort, um zu sein.
isaacg
3

JavaScript ES6, 47 Bytes

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

Angenommen, sist ein Array["c","a","l","n"]

Shmiddty
quelle
2

> <> (Fisch) , 68 34 Bytes

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

Sie können es unter http://fishlanguage.com/playground ausführen, indem Sie den String als Anfangsstapel (mit "Marken", dh "Chamäleon") und das Array zusätzlicher Buchstaben als Eingangsstapel (ohne "Marken", dh "Caln") eingeben.

Vergessen Sie nicht, die Give-Taste zu drücken, um den Eingabestapel zu setzen.

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: Halbiert es! :)

Fongoid
quelle
2

R 119

Basierend auf der Antwort von @ Alex ist diese um ein paar Bytes kürzer:

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
        }
      )
    )
  )
}
jja
quelle
2

Perl, 73, 62, 59, 56

Ein völlig neuer Ansatz führt zu viel besseren Ergebnissen. Trotzdem wette ich, dass es kürzer sein kann.

Anrufen als f('coconut', ['c','o']).

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

Suchen Sie für jedes Zeichen im Array das erste Vorkommen, duplizieren Sie es und setzen Sie alles in Großbuchstaben um. Geben Sie dann die gesamte Zeichenfolge zurück, die in Kleinbuchstaben konvertiert wurde.

BEARBEITEN: Rasiert ein paar weitere Charaktere, indem shiftund entfernt werden pop.


Die vorherige Version:

sub f{join '',map{shift @{$_[0]}if s/($_[0][0])/$1$1/;$_}split //,shift}
jja
quelle
Die neue Version respektiert die Zeichenreihenfolge nicht mehr. (Übrigens: "Das foreachSchlüsselwort ist eigentlich ein Synonym für das forSchlüsselwort, Sie können also auch eines verwenden." - Foreach Loops .)
Manatwork
@manatwork Das sollte es tun. Und danke für den forHinweis. Es ist jetzt tatsächlich kürzer.
JJ
2

Rubin, 52 47 Bytes

Lösung:

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

Beispiel:

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

Erläuterung:

Proc-Form einer Methode, die als erstes Argument einen String und als zweites Argument ein Array von Zeichen verwendet. Ordnet einen Block einem Array der Zeichen im Zeichenfolgenargument zu, das jedes Zeichen mit dem ersten Element des Vergleichsarrays vergleicht. Wenn eine Übereinstimmung vorliegt, wird das erste Element des Vergleichsarrays entfernt und verdoppelt.


aktualisieren

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

Brian Davis
quelle
Sie können die Klammern um die Parameter überspringen s,a. Und *''ist gleichbedeutend mit .join. Das ist 5 Bytes gespeichert, aber ich immer noch schlagen Sie von einem (bis jetzt): D
daniero
2

Perl, 51 Bytes

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

Die Eingabe erfolgt über STDIN. Die erste Eingabe ist das Startwort (z. B. chameleon), die zweite Eingabe sind die Buchstaben als einzelne Zeichenfolge (z caln. B. ).

Das Obige ist nur eine verschleierte ("hübschere") Methode, um Folgendes zu tun:

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

Während wir jeden Buchstaben durchgehen, ersetzen wir vom Wortanfang bis zum Buchstaben im Quellwort nur den neuen Buchstaben und hängen die Übereinstimmung (gespeichert in $&) an unser Ergebnis an. Da die Übereinstimmung den Buchstaben enthält und dann durch den Buchstaben ersetzt wird, erscheint jeder Buchstabe zweimal.

Da STDIN an beide Eingaben ein neues Zeilenzeichen anfügt, erfassen wir garantiert die Reste des vollständigen Wortes der letzten Übereinstimmung, dh des neuen Zeilenzeichens.

Allen G
quelle
2

REGXY, 24 Bytes

Verwendet REGXY , eine auf Regex-Substitution basierende Sprache. Es wird angenommen, dass die Eingabe das Startwort und das durch Leerzeichen getrennte Array ist (z. B. "Chamäleon Caln").

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

Das Programm vergleicht ein Zeichen in der ersten Zeichenfolge mit dem ersten Zeichen nach einem Leerzeichen. Wenn dies zutrifft, wird das Zeichen in der Ersetzung wiederholt und das Zeichen im Array wird entfernt (also nicht zurück in die Zeichenfolge angehängt). Die Verarbeitung wird in die zweite Zeile verschoben, die nur einen Zeiger zurück auf die erste Zeile darstellt, wodurch die Verarbeitung für das Ergebnis der vorherigen Ersetzung wiederholt wird. Eventuell gibt es nach dem Leerzeichen keine Zeichen. An diesem Punkt stimmt der zweite Zweig der Abwechslung überein, wodurch das nachfolgende Leerzeichen aus dem Ergebnis entfernt wird. Der reguläre Ausdruck stimmt dann nicht überein, die Verarbeitung ist abgeschlossen und das Ergebnis wird zurückgegeben.

Wenn es hilft, sind die iterativen Schritte der Ausführung wie folgt:

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

Das Programm wird mit dem Beispielinterpreter im obigen Link korrekt kompiliert und ausgeführt, aber die Lösung ist möglicherweise etwas frech, da sie auf einer Annahme beruht, dass die Sprachspezifikation nicht genau ist. Die Spezifikation gibt an, dass das erste Token in jeder Zeile (vor dem /) als Beschriftung fungiert. Es wird jedoch davon ausgegangen, dass ein Null-Beschriftungszeiger auf den ersten Befehl in der Datei mit einer Null-Beschriftung verweist (oder mit anderen Worten, das 'null' ist ein gültiges Etikett). Eine weniger freche Lösung wäre:

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

Das sind 27 Bytes

Jarmex
quelle
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``

Dies ist eine anonyme Funktion, die zwei Parameter verwendet: das Startwort als Zeichenfolge und die Zeichen, die als Array gespannt werden sollen. Ungolfed-Code, der ES5 verwendet und die unten stehende Benutzeroberfläche testet.

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>

NinjaBearMonkey
quelle
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

Anrufen als:

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

Möglicherweise ist die Anzahl der Bytes furchtbar falsch ... Verwendet eine Mischung aus Leerzeichen und Tabulatoren.

Beta-Zerfall
quelle
1

rs, 39 bytes

Weitere Informationen zu rs.

Es gibt bereits eine Retina-Antwort, aber ich denke, diese verwendet einen etwas anderen Ansatz. Sie wurden auch separat erstellt: Als ich anfing, an dieser zu arbeiten, war diese Antwort noch nicht veröffentlicht worden.

Außerdem ist dieser ohnehin 6 Bytes länger. :)

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

Live-Demo und Testsuite.

kirbyfan64sos
quelle
Ich mag diesen Debug-Schalter in Ihrem Interpreter wirklich.
Dennis
@ Tennis Danke!
kirbyfan64sos
1

JavaScript, 92 Zeichen

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}

Freie Version:

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;
}
SirPython
quelle
1

R, 136 128 122 Bytes

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)}

Dadurch wird eine unbenannte Funktion erstellt, die eine Zeichenfolge und einen Zeichenvektor als Eingabe akzeptiert und eine Zeichenfolge an STDOUT ausgibt. Um es zu nennen, geben Sie ihm einen Namen.

Ungolfed + Erklärung:

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)
}

Beispiele:

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

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

8 Bytes dank MickeyT und weitere 3 dank jja!

Alex A.
quelle
Du cat(p,sep='')könntest es benutzen, um ein paar direkt an STDOUT auszugeben
MickyT
@ MickyT: Habe nicht daran gedacht! Danke, bearbeitet. :)
Alex A.
1
Eigentlich message(p)ist kürzer.
JJ
@jja: Ich wusste nicht message, das ist großartig! Vielen Dank! Bearbeitet, um Ihren Vorschlag zu verwenden.
Alex A.
1

Bash + sed, 51

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

Eingabe von stdin; Zeichen, die als einzelnes Argument verdoppelt werden sollen:

$ echo chameleon | strtech caln
cchaamelleonn

Dies funktioniert, indem ein sed-Programm erstellt $2und dann ausgeführt wird $1. Das sed-Programm ersetzt das erste Vorkommen jedes Ersetzungsbuchstabens durch zwei Kopien seiner Großbuchstaben und setzt am Ende das gesamte Los zurück. Im obigen Beispiel lautet das generierte sed-Programm

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

hübsch gedruckt:

# 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&/

Ich benutze den Großbuchstaben, um Zeichen zu markieren, die bisher verarbeitet wurden. Dies vermeidet das erneute Verdoppeln von Zeichen, die bereits verdoppelt wurden, oder das Anwenden einer Verdopplung vor der vorherigen.

Frühere Version, vor der Klarstellung, dass die Reihenfolge der Ersatzliste wichtig ist (44 Zeichen):

sed "`sed 's/./s!&!\U&&!;/g'<<<$1`s/.*/\L&/"
Toby Speight
quelle
Falsch. strtech na <<< bananagibt "baannana" aus, aber zuerst sollte ein Vorkommen auf "n" verdoppelt werden, erst danach ein Vorkommen von "a".
Manatwork
In diesem Fall habe ich die Frage falsch verstanden. es war nicht explizit, dass die Bestellung bedeutete, dass frühere Briefe nicht verdoppelt werden sollten, nur dass Sie in der Lage sein würden , eine nachfolgende zu verdoppeln. Ich werde über eine Alternative nachdenken, die diese neue Anforderung erfüllt.
Toby Speight
Kein Problem, ich habe es auch nicht gleich beim ersten Mal richtig verstanden. Ich schlage vor, Ihre Antwort während des Denkens zu löschen (Sie können sie später jederzeit wiederherstellen), um die Gefahr einer Abwertung zu vermeiden.
Manatwork
@manatwork: Ich habe den Fragesteller um Klärung gebeten und eine alternative Antwort geliefert, die das Lesen der Regeln zufriedenstellt (aber es hat mich 7 Zeichen gekostet)
Toby Speight
0

Python, 53 92 Bytes

Ich habe festgestellt, dass meine Lösung in Python 2 und 3 gleich lang ist.

BEARBEITEN: Mann, diesen Fall zu beheben, wenn mehrere Ersetzungen desselben Buchstabens durchgeführt werden (während immer noch dieselbe Methode angewendet wird), war ein wenig arbeitsaufwendig.

Python 2:

Probieren Sie es hier aus

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))
mbomb007
quelle
0

Mathematica, 66 Bytes

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

Beispiel:

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

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

Out[2]= "bannaana"
Alephalpha
quelle
0

Lua, 76 78 76 75 58 53 Bytes

Neue, komplett überarbeitete Lösung mit Hilfe von Wieselkatze und SquidDev! komm schon Jungs, wir können Brainfuck schlagen: P

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

Erklärung kommt morgen. Probieren Sie es hier aus.


Originelle Lösung: 2 Bytes gespart dank @ kirbyfan64sos!

Lua ist eine ziemlich schreckliche Sprache zum Golfspielen, deshalb denke ich, dass ich für diese eine ziemlich gute Sprache gemacht habe.

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

Code Erklärung, zusammen mit der ungolfed Version:

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

Probieren Sie es hier aus. (Veralteter Code, aber dasselbe Konzept, nur weniger erfolgreich, wird morgen aktualisiert.)


quelle
Auf zwei Bytes hinzugefügt, da ich einen Fehler beheben musste, bei dem alle im Array definierten Buchstaben durch ihre Duplikate ersetzt wurden.
Ich denke, Sie können die Zeilenumbrüche nach function f(x,y)und nach entfernen und print(x)sparen Sie zwei Bytes.
kirbyfan64sos