String-Verkettung

8

Die Herausforderung

Bei zwei Zeichenfolgen, die nur Kleinbuchstaben und keine Leerzeichen enthalten, sollte das Ergebnis die kürzere Zeichenfolge sein, gefolgt von einem Unterstrich, gefolgt von der längeren Zeichenfolge, wobei die erste Instanz eines Zeichens für jedes Zeichen entfernt wird, das in der kürzeren Zeichenfolge enthalten ist.

Sie können davon ausgehen, dass die Zeichenfolgen immer unterschiedlich lang sind.

Testfälle:

sale
salinewater
Result: sale_inwater (only the first 'a' in salinewater is removed)

jostling
juggle
Result: juggle_ostin (juggle is the shorter string)

juggle
juggler
Result: juggle_r (a 'g' is removed for every 'g' in the shorter string)

Regeln

Dies ist Code-Golf, also gewinnt die kürzeste Antwort in Bytes!

Ajay
quelle
2
Was bedeutet " Erstes Auftreten entfernen ", wenn die kürzere Zeichenfolge doppelte Zeichen enthält?
Peter Taylor
2
Vier Tage sind sehr kurz, um einen Gewinner zu ermitteln. Ich würde mindestens ein paar Wochen vorschlagen. Außerdem würde ich in Zukunft vorschlagen, zuerst in der Sandbox zu posten, wo Herausforderungen geklärt und verbessert werden können, bevor sie live gehen.
xnor
3
kleinere Saite ist kürzere Saite ...... Entschuldigung für mein schlechtes Englisch
Ajay
6
Wofür soll die Ausgabe juggle jugglersein? juggle_r(für jede Zeicheninstanz juggle_grentfernen ) oder (für jedes einzelne Zeichen entfernen)?
PurkkaKoodari
2
@ Pietu1998 Das ist ein guter Punkt. Wir sollten dies auf Eis legen, bis geklärt ist
Luis Mendo

Antworten:

3

JavaScript (ES6), 78 75 69 Bytes

const 
     g=(x,y)=>x[y.length]?g(y,x):[...x].map(c=>y=y.replace(c,''))&&x+'_'+y
;

console.log(g.toString().length + 2);   // 69
console.log(g('sale', 'salinewater'))   // sale_inwater
console.log(g('juggle', 'juggler'))     // juggle_r
console.log(g('jostling','juggle'))     // juggle_ostin

Nervenzusammenbruch

x[y.length]?g(y,x):        \\ Make sure that x is the shorter string
[...x]                     \\ Spread string in array of characters
.map(c=>y=y.replace(c,'')) \\ For each character remove its first occurence in y
&&x+'_'+y                  \\ Concat x and changed y 
Lmis
quelle
2

Haskell, 56 55 Bytes

import Data.List
x%y|(0<$y)<(0<$x)=y%x|z<-y\\x=x++'_':z

-1 Byte dank @xnor

Dianne
quelle
Sie können ein Byte schneiden, indem Sie y\\xfür den 0<1ansonsten Schutz binden .
xnor
filter(`notElem`x)yist kürzer als y\\xbeim Import
Damien
@ Damien Ich denke, das würde alle Vorkommen von Elementen entfernen x, nicht nur die ersten.
Dianne
Oh ja, du hast recht.
Damien
1

Java 7, 262 Bytes

import java.util.*;String c(String z,String y){int i=0,l=y.length();if(z.length()>l)return c(y,z);List x=new ArrayList();for(;i<l;x.add(y.toCharArray()[i++]));for(Object q:z.toCharArray())x.remove(q);String r="";for(i=0;i<x.size();r+=x.get(i++));return z+"_"+r;}

Kann wahrscheinlich noch mehr Golf gespielt werden, indem nur Arrays ohne die Listen verwendet werden.

Ungolfed & Testfälle:

Probieren Sie es hier aus.

import java.util.*;
class M{
  static String c(String z, String y){
    int i = 0,
        l = y.length();
    if(z.length() > l){
      return c(y, z);
    }
    List x = new ArrayList();
    for(; i < l; x.add(y.toCharArray()[i++]));
    for(Object q : z.toCharArray()){
      x.remove(q);
    }
    String r = "";
    for(i = 0; i < (x.size()); r += x.get(i++));
    return z+"_"+r;
  }

  public static void main(String[] a){
    System.out.println(c("sale", "salinewater"));
    System.out.println(c("jostling", "juggle"));
    System.out.println(c("juggle", "juggler"));
  }
}

Ausgabe:

sale_inwater
juggle_ostin
juggle_r
Kevin Cruijssen
quelle
1

Java 8, 156 Bytes

String a(String x,String y){int l=x.length(),m=y.length();String b=l>m?x:y,s=m<l?y:x;for(char c:s.toCharArray()){b=b.replaceFirst(""+c,"");}return s+"_"+b;}

Dies kann wahrscheinlich noch mehr Golf gespielt werden.

Ungolfed & Testfälle

interface A {
    static String a(String x,String y){
        int l=x.length(),m=y.length();
        String b=l>m?x:y,s=m<l?y:x;
        for(char c:s.toCharArray()){
            b=b.replaceFirst(""+c,"");
        }
        return s+"_"+b;
    }

    static void main(String[]a) {
        System.out.println(a("sale","salinewater"));
        System.out.println(a("jostling","juggle"));
        System.out.println(a("juggle","juggler"));
    }
}
mrco
quelle
1

Ruby, 65 Bytes

->a,b{a,b=b,a if a.size>b.size;a.chars.map{|e|b.sub!e,""};a+?_+b}

ungolfed

->a, b{
  a, b = b, a if a.size > b.size
  a.chars.map { |e|
    b.sub! e, ""
  }
  a + ?_ + b
}

61 Bytes (falls das Argument ein Array von Zeichenfolgen ist)

->a{a.sort_by!(&:size);a[0].chars.map{|c|a[1].sub!c,""};a*?_‌​}

Danke, m-chrzan !

cia_rana
quelle
1
gsub!funktioniert hier nicht - Sie sollten das erste Vorkommen jedes Buchstabens entfernen. Glücklicherweise ist das sub!, was genau das tut, ein Byte kürzer.
m-chrzan
1
Ich denke auch, dass Sie das Lambda in diesem Fall benennen müssen, da Sie es am Ende nennen. Das a,b=b,a if a.size>b.sizeAustauschen der Zeichenfolgen ist jedoch nicht rekursiv und spart Ihnen ein weiteres Byte.
m-chrzan
@ m-chrzan Oh, ich habe die Frage nicht genau beobachtet. Vielen Dank!
cia_rana
61 Bytes, Eingabe als Array von Strings:->a{a.sort_by!(&:size);a[0].chars.map{|c|a[1].sub!c,""};a*?_}
m-chrzan
@ m-chrzan Großartig! Ich habe deine Antwort hinzugefügt.
Cia_rana
0

PHP, 154 Bytes

list($f,$s)=strlen($b=$argv[2])<strlen($a=$argv[1])?[$b,$a]:[$a,$b];foreach(str_split($f)as$x)$s=preg_replace("#(.*?)".$x."(.*)#","$1$2",$s);echo$f."_$s";

Anstelle von können $s=preg_replace("#(.*?)".$x."(.*)#","$1$2",$s);Sie auch verwendenif($z=strstr($s,$x))$s=strstr($s,$x,1).substr($z,1);

Jörg Hülsermann
quelle
0

R, 161 Bytes

Dies stellte sich als viel länger heraus, als ich erwartet hatte, obwohl die Manipulation von Saiten in R normalerweise mühsam ist. Ich bin der Meinung, dass dies leicht zu spielen sein sollte, wenn man nur einen anderen Ansatz verwendet.

function(x,y){s=strsplit;if(nchar(x)>nchar(y)){v=y;w=x}else{v=x;w=y};v=s(v,"")[[1]];w=s(w,"")[[1]];j=0;for(i in v){j=j+1;if(i==w[j])w[j]=""};cat(v,"_",w,sep="")}

Ungofled

function(x,y){
    s=strsplit                      # alias for stringsplit
    if(nchar(x)>nchar(y)){v=y;w=x}  # assign v/w for the short/long strings
    else{v=x;w=y}
    v=s(v,"")[[1]]                  # split short string into vector
    w=s(w,"")[[1]]                  # split long string into vector
    j=0
    for(i in v){                    # for each char in short string, check
        j=j+1                       # if is equal to corresponding char in
        if(i==w[j])w[j]=""          # long, replace long with "" if true
    }
    cat(v,"_",w,sep="")             # insert _ and print
}
Billywob
quelle
0

Python 2, 81 72 Bytes

a,b=sorted(input(),key=len)
for c in a:b=b.replace(c,"",1)
print a+"_"+b

Probieren Sie es online aus

mbomb007
quelle
2
Ich denke, Sie können 9 Bytes sparen, indem Sie die ersten beiden Zeilen durcha,b=sorted(input(),key=len)
dianne
0

Scala, 78 Bytes

def f(a:String,b:String):String={if(a.size>b.size)f(b,a)else
a+"_"+(b diff a)}

Erläuterung:

def f(a:String,b:String):String={ //define a method f which has two String parameters and returns a String
                                  //(because it's recursive, scala can't figure out the return type)
  if (a.size > b.size)            //make sure that a is the shorter string
    f(b, a)
  else
    a+"_"+(b diff a)              //`b diff a` removes all elements/chars of a from b
}
corvus_192
quelle