Penggabungan string

8

Tantangan

Diberikan dua string yang hanya berisi huruf kecil dan tanpa spasi, hasilnya harus berupa string yang lebih pendek, diikuti oleh garis bawah, diikuti oleh string yang lebih panjang dengan instance karakter pertama yang dihapus untuk setiap karakter yang dikandungnya dalam string yang lebih pendek.

Anda dapat mengasumsikan senarnya akan selalu berbeda panjang.

Kasus uji:

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)

Aturan

Ini kode-golf, jadi jawaban tersingkat dalam byte menang!

Ajay
sumber
2
Apa yang dimaksud " hapus kejadian pertama " ketika string yang lebih pendek memiliki karakter duplikat?
Peter Taylor
2
Empat hari sangat singkat untuk memilih pemenang, saya sarankan setidaknya beberapa minggu. Juga, di masa depan saya akan menyarankan posting pertama ke Sandbox di mana tantangan dapat diklarifikasi dan ditingkatkan sebelum ditayangkan.
xnor
3
string yang lebih kecil adalah string yang lebih pendek ...... maaf untuk bahasa Inggris saya yang buruk
Ajay
6
Apa yang harus menjadi output juggle juggler? juggle_r(hapus untuk setiap instance karakter) atau juggle_gr(hapus untuk setiap karakter yang berbeda)?
PurkkaKoodari
2
@ Pietu1998 Itu poin bagus. Kita harus menunda ini sampai diklarifikasi
Luis Mendo

Jawaban:

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

Kerusakan

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
sumber
2

Haskell, 56 55 byte

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

-1 byte terima kasih kepada @xnor

dianne
sumber
Anda dapat memotong byte dengan mengikat y\\xuntuk 0<1penjaga yang lain.
xnor
filter(`notElem`x)ylebih pendek daripada y\\xdengan impor
Damien
@ Damen Saya pikir itu akan menghapus semua kemunculan elemen x, bukan hanya yang pertama.
dianne
Oh ya kamu benar.
Damien
1

Java 7, 262 byte

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

Mungkin bisa bermain golf lagi hanya dengan menggunakan array tanpa daftar ..

Kasus yang tidak disatukan & uji:

Coba di sini.

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

Keluaran:

sale_inwater
juggle_ostin
juggle_r
Kevin Cruijssen
sumber
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;}

Ini mungkin bisa golf lagi.

Kasus yang tidak disatukan & uji

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
sumber
1

Ruby, 65 byte

->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 byte (jika argumennya adalah array string)

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

Terima kasih, m-chrzan !

cia_rana
sumber
1
gsub!tidak berfungsi di sini - Anda harus menghapus kejadian pertama dari setiap huruf. Untungnya, sub!yang melakukan hal itu, lebih pendek satu byte.
m-chrzan
1
Juga, saya pikir Anda perlu memberi nama lambda dalam kasus ini, karena Anda akhirnya menyebutnya. Namun, melakukan a,b=b,a if a.size>b.sizepertukaran string adalah non-rekursif, dan menghemat satu byte lagi.
m-chrzan
@ m-chrzan Oh, saya tidak memperhatikan dengan seksama pertanyaan itu. Terima kasih!
cia_rana
61 byte, masukan sebagai larik string:->a{a.sort_by!(&:size);a[0].chars.map{|c|a[1].sub!c,""};a*?_}
m-chrzan
@ m-chrzan Hebat! Saya menambahkan jawaban Anda.
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";

Selain itu $s=preg_replace("#(.*?)".$x."(.*)#","$1$2",$s);Anda juga bisa menggunakanif($z=strstr($s,$x))$s=strstr($s,$x,1).substr($z,1);

Jörg Hülsermann
sumber
0

R, 161 byte

Ini ternyata jauh lebih lama dari yang saya harapkan, meskipun, manipulasi string biasanya membosankan di R. Saya merasa bahwa ini harus mudah golf dengan hanya menggunakan pendekatan lain.

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

Tidak berpakaian

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
sumber
0

Python 2, 81 72 byte

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

Cobalah online

mbomb007
sumber
2
Saya pikir Anda dapat menyimpan 9 byte dengan mengganti dua baris pertama dengana,b=sorted(input(),key=len)
dianne
0

Scala, 78 byte

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

Penjelasan:

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
sumber