Zwei Zeichenfolgen zusammenführen

18

Einführung

Angenommen, S 1 = a...bund S 2 = ..c... Wenn wir sie aufeinander legen, erhalten wir:

a...b
..c..

Wir verschmelzen beide Zeichenketten mit dem .flüssigen Zeichen (das sich überlappen kann). Wir bekommen das:

a.c.b

Wenn einer der Strings länger als der andere ist, wenden wir einfach denselben Algorithmus an:

a.....b
..c..  

becomes:

a.c...b

und

a.....b
..c.......

becomes:

a.c...b...

Wenn zwei Zeichen kollidieren, verwenden wir nur das unterste Zeichen, z

a..b
...c

becomes:

a..c

Die Aufgabe

Geben Sie bei zwei nicht leeren Zeichenfolgen die zusammengeführte Zeichenfolge aus. Beachten Sie, dass die Eingabe nur Punkte und Kleinbuchstaben enthält (oder Großbuchstaben, falls dies praktischer ist).

Testfälle

Input              Output
a....b ..c...      a.c..b
aaaaaa bbbbbb      bbbbbb
ab.ab. b.b.b.      bbbab.
a.......b c        c.......b

Das ist , also gewinnt die Einsendung mit der geringsten Anzahl von Bytes!

Adnan
quelle
Ist eine Eingabe a.....b ..c.......möglich? Was ist die Ausgabe dann?
Luis Mendo
@DonMuesli Das würde werden a.c...b....
Adnan
Können wir eine Liste von Zeichen anstelle einer Zeichenkette ausgeben?
Denker
@DenkerAffe Nein, sorry
Adnan
Können die Saiten in umgekehrter Reihenfolge bespielt werden?
Mego

Antworten:

10

Gelee , 5 Bytes

Œu»Œl

Eingabe über Kommandozeilenargumente.

Probieren Sie es online!

Erläuterung

Dies ist ein direkter Port meiner CJam-Antwort (eine Erklärung, warum dies funktioniert, finden Sie hier):

Œu     # Convert first argument to upper case.
  »    # Element-wise maximum between both strings.
   Œl  # Convert result back to lower case.
Martin Ender
quelle
5
NOOO! Sie können Jelly auch nicht adoptieren! Wir werden mit allen Mods als Golf-Meister zurückbleiben.
5.
@ Rikerw haha, warum denkst du, sie sind Mods? weil sie gut Golf spielen können: P
cat
3
@RikerW Ich musste nur jemanden davon abhalten, mich zu schlagen, indem ich meine eigene Lösung nach Jelly portierte. ¯ \ _ (ツ) _ / ¯
Martin Ender
15

CJam, 9 Bytes

leul.e>el

Teste es hier.

Erläuterung

Nutzt die Tatsache, dass '.' < upper case letters < lower case letters. Auf diese Weise .überschreibt ein Buchstabe , wenn das elementweise Maximum zwischen zwei Zeichenfolgen gesetzt wird, a. Sie können jedoch festlegen, dass ein Buchstabe aus der zweiten Eingabe einen Buchstaben aus der ersten überschreibt, wenn der erste in Großbuchstaben geschrieben wird. Verwirrend? Hier ist einer der Testfälle als Beispiel:

ab.ab.
b.b.b.

Zuerst in Großbuchstaben konvertieren:

AB.AB.
b.b.b.

Nehmen Sie das elementweise Maximum:

bBbAb.

Zurück in Kleinbuchstaben konvertieren:

bbbab.

Und so funktioniert der Code:

l    e# Read first line.
eu   e# Convert to upper case.
l    e# Read second line.
.e>  e# Take element-wise maximum. If the lengths are different, the additional elements
     e# from the longer list are just appended.
el   e# Convert back to lower case.
Martin Ender
quelle
4
Nizza eu/ elTrick!
Luis Mendo
6

Javascript ES6, 52 55 Zeichen

(a,b)=>b.replace(/\./g,(m,i)=>a[i]||m)+a.slice(b.length)

Prüfung

f=(a,b)=>b.replace(/\./g,(m,i)=>a[i]||m)+a.slice(b.length)
;`
a....b ..c...      a.c..b
aaaaaa bbbbbb      bbbbbb
ab.ab. b.b.b.      bbbab.
a.......b c        c.......b
c a....b           a....b
`.split('\n').filter(Boolean).map(s=>s.split(/\s+/)).every(a=>f(a[0],a[1])==a[2])
Qwertiy
quelle
1
Dies f('c', 'a....b')
schlägt
@ dev-null, behoben
Qwertiy
4

Im Ernst, 10 Bytes

,û,Z`M`MΣù

Probieren Sie es online!

Verwendet die gleiche Strategie wie Martins CJam-Antwort

Erläuterung:

,û,Z`M`MΣù
,û          get first string, uppercase
  ,Z        get second string, zip with first string
    `M`M    map maximum
        Σù  join and uppercase
Mego
quelle
4

Oktave, 50 Bytes

function c=m(a,b)c=b;c(a>0)=a;i=b>46;c(i)=b(i);end
Rainer P.
quelle
Sie können !=durch>
Luis Mendo
3

Haskell, 43 42 Bytes

(a:b)#(c:d)|c<'a'=a:b#d|1<2=c:b#d
a#b=a++b

Anwendungsbeispiel: "ab.ab." # "b.b.b."-> "bbbab.".

Wie es funktioniert:

  • Wenn beide Listen nicht leer sind, wählen Sie den Kopf der ersten Liste, wenn der Kopf der zweiten Liste ist ".", oder wählen Sie den Kopf der zweiten Liste. Fügen Sie einen rekursiven Aufruf mit den Endpunkten der Listen hinzu.

  • Wenn mindestens eine Liste leer ist, hängen Sie beide Listen an.

Bearbeiten: @Lynn hat ein Byte gespeichert. Vielen Dank!

nimi
quelle
"Sie können davon ausgehen, dass die Eingabe nur Punkte und Kleinbuchstaben enthält" , damit Sie überprüfen können c<'a', ob ein Byte gespeichert ist.
Lynn
3

Python 2, 47 Bytes

lambda s,t:`map(max,s.upper(),t)`[2::5].lower()
xsot
quelle
sehr golfig! Ich suche nach einem Weg, um Upper () und Lower () loszuwerden, aber bisher kein Glück ...
Max
2

Julia, 101 Bytes

f(s,t,r=i->rpad(i,max((n=endof)(s),n(t)),"."))=join([min(a,b)<90?max(a,b):b for(a,b)=zip(r(s),r(t))])

Dies ist eine Funktion, die zwei Zeichenfolgen akzeptiert und eine Zeichenfolge zurückgibt.

Wir berechnen mdie maximale Länge der beiden Eingaben, definieren dann eine Funktion r, die ihre Eingabe mit .s auf Länge mauffüllt, und speichern diese als Funktionsargument. Wir wählen dann zipdie richtigen gepolsterten Eingänge und überprüfen das Minimum (wie durch den ASCII-Code definiert) jedes Paares. Wenn es ein ist ., verwenden wir dasjenige Zeichen, das den größeren Code hat, andernfalls verwenden wir dasjenige, das aus der zweiten Eingabe stammt. Das resultierende Array wird joinin eine Zeichenfolge umgewandelt und zurückgegeben.

Alex A.
quelle
2

C 106 89 Bytes

i,j,k;f(s,z)char*s,*z;{for(i=0,j=k=1;j|k;i++)putchar((k=k?z[i]:0)>46|!(j=j?s[i]:0)?k:j);}

Teste live auf ideone .

entfernt
quelle
1

Netzhaut , 55

$

+ `(.? (\ S *) (\ w) | (\ S) (\ S *).?) (\ S *. *)
$ 2 $ 5 $ 6 $ 3 $ 4


Zeile 5 ist ein einzelnes Leerzeichen. Zeile 6 ist eine leere Zeile (ohne abschließenden Zeilenumbruch).

Probieren Sie es online aus.

Ich habe dieses in GNU sed gestartet (mit der Option -r). Einfacher Port zu Retina, sobald ich die Regexes herausgefunden habe. Die sed Version ist:

s/$/ /
:
s/(.?(\S* )(\w)|(\S)(\S* ).?)(\S* .*)/\2\5\6\3\4/
t
s/ *//
Digitales Trauma
quelle
1
Die Retina-Version schlägt fehl mita..k.f....b c...f.g...g. => .c..kffg...g
randomra
1

Python 2, 70 Bytes

lambda x,y:"".join([k if k!="."and k else j for j,k in map(None,x,y)])

Probieren Sie es hier aus!

Zuerst erstellen wir beide Strings zu einer Liste. Wenn die zweite Zeichenfolge länger als die erste ist, wird sie mit None( map(None,x,y)tut das) aufgefüllt .
Dann iterieren wir über diese Liste, wobei jes sich um das Zeichen aus der ersten Zeichenfolge und kdas aus der zweiten Zeichenfolge handelt. Wir entscheiden, kob es kein Punkt ist und ansonsten j.

Dies könnten 61 Bytes sein, wenn ich das Ergebnis als Liste von Zeichen anstelle einer Zeichenfolge ausgeben könnte.

Denker
quelle
1

Perl, 48 + 3 = 51 Bytes

s/\./substr($^I,$.=pos,1)||$&/ge;$_.=substr$^I,$.

Bah kann keine kürzere Lösung finden. (Gleicher Ansatz wie die Antwort von @ Qwertiy in JavaScript).
Erfordert -plund nimmt Eingaben von stdinund entgegen-i

$ perl -i'a...ce' -ple's/\./substr($^I,$.=pos,1)||$&/ge;$_.=substr$^I,$.' <<< '..b.d..f'
a.b.de..f
undlrc
quelle
$_^=$^I^$^I;s/\.|\0/substr$^I,pos,1or$&/ge
Ton Hospel
0

PHP> = 7.1, 58 Bytes

for([,$x,$y]=$argv;~$c=$y[$i++];)$c<_?:$x[$i-1]=$c;echo$x;

Online Version

Jörg Hülsermann
quelle
0

q / kdb + 43 40 Bytes

Lösung:

lower{l:max(#:)each(x;y);upper[l$x]|l$y}

Beispiel:

q)lower{l:max(#:)each(x;y);upper[l$x]|l$y}["a..b..";"...c"]
"a..c.."

Erläuterung:

(#:)                // k equivalent of count
max (#:) each(x;y)  // takes each string, count the length, return maximum
l$x                 // whites-space pad string x to length l
|                   // take the maximum (per Martin's strategy)
upper[...]          // convert padded string 1 to uppercase
lower{...}          // convert result of function to lowercase

Anmerkungen: Ich nutze den Vorteil von "Bei zwei nicht leeren Zeichenfolgen " und gehe davon aus, dass Eingaben Zeichenfolgen sind. In kdb "c"ist ein Atom, (),"c"ist ein String, sonst müssen 6 Bytes zum Score addiert werden, da wir kein Atom auffüllen können $...

Streetster
quelle