Nối chuỗi


8

Các thách thức

Cho hai chuỗi chỉ chứa các chữ cái viết thường và không có khoảng trắng, kết quả sẽ là chuỗi ngắn hơn, theo sau là dấu gạch dưới, theo sau là chuỗi dài hơn với phiên bản đầu tiên của một ký tự được loại bỏ cho mỗi ký tự mà nó chứa trong chuỗi ngắn hơn.

Bạn có thể giả sử các chuỗi sẽ luôn có độ dài khác nhau.

Các trường hợp thử nghiệm:

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)

Quy tắc

Đây là môn đánh gôn, vì vậy câu trả lời ngắn nhất bằng byte thắng!


2
" Loại bỏ sự xuất hiện đầu tiên " có nghĩa là gì khi chuỗi ngắn hơn có các ký tự trùng lặp?
Peter Taylor

2
Bốn ngày là rất ngắn để chọn một người chiến thắng, tôi đề nghị tối thiểu một vài tuần. Ngoài ra, trong tương lai tôi đề nghị đăng bài đầu tiên lên Sandbox nơi các thách thức có thể được làm rõ và cải thiện trước khi đi vào hoạt động.
xnor

3
chuỗi nhỏ hơn là chuỗi ngắn hơn ...... xin lỗi vì tiếng Anh không tốt của tôi
Ajay

6
Đầu ra juggle jugglerphải là gì? juggle_r(loại bỏ cho từng trường hợp ký tự) hoặc juggle_gr(loại bỏ cho từng ký tự riêng biệt)?
PurkkaKoodari

2
@ Pietu1998 Đó là một điểm tốt. Chúng ta nên giữ điều này cho đến khi được làm rõ
Luis Mendo

Câu trả lời:



3

JavaScript (ES6), 78 75 69 byte

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

Phá vỡ

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 

2

Haskell, 56 55 byte

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

-1 byte nhờ @xnor


Bạn có thể cắt một byte bằng cách ràng buộc y\\xcho 0<1bảo vệ khác.
xnor

filter(`notElem`x)yngắn hơn so y\\xvới nhập khẩu
Damien

@Damien Tôi nghĩ rằng sẽ loại bỏ tất cả các yếu tố xuất hiện x, không chỉ những yếu tố đầu tiên.
dianne

Ồ, vâng, bạn đúng.
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;}

Có thể có thể chơi gôn nhiều hơn bằng cách chỉ sử dụng mảng mà không có danh sách ..

Các trường hợp bất khả kháng & thử nghiệm:

Hãy thử nó ở đây.

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

Đầu ra:

sale_inwater
juggle_ostin
juggle_r

1

Java 8, 156 byte

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

Điều này có thể có thể được chơi golf thêm một số.

Các trường hợp thử nghiệm

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

1

Ruby, 65 byte

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

vô dụng

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

61 byte (trong trường hợp đối số là một chuỗi các chuỗi)

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

Cảm ơn, m-chrzan !


1
gsub!không hoạt động ở đây - bạn phải xóa lần xuất hiện đầu tiên của mỗi chữ cái. May mắn thay, sub!chính xác là như vậy, là một byte ngắn hơn.
m-chrzan

1
Ngoài ra, tôi nghĩ rằng bạn cần đặt tên lambda trong trường hợp này, vì cuối cùng bạn gọi nó. Tuy nhiên, làm a,b=b,a if a.size>b.sizeđể trao đổi các chuỗi là không đệ quy và tiết kiệm cho bạn một byte khác.
m-chrzan

@ m-chrzan Ồ, tôi không quan sát kỹ câu hỏi. Cảm ơn!
cia_rana

61 byte, đầu vào dưới dạng một chuỗi các chuỗi:->a{a.sort_by!(&:size);a[0].chars.map{|c|a[1].sub!c,""};a*?_}
m-chrzan

@ m-chrzan Tuyệt vời! Tôi đã thêm câu trả lời của bạn.
cia_rana

0

PHP, 154 byte

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

Thay vì $s=preg_replace("#(.*?)".$x."(.*)#","$1$2",$s);bạn cũng có thể sử dụngif($z=strstr($s,$x))$s=strstr($s,$x,1).substr($z,1);


0

R, 161 byte

Điều này hóa ra dài hơn nhiều so với tôi dự đoán, mặc dù, thao tác chuỗi thường tẻ nhạt trong R. Tôi cảm thấy rằng điều này có thể dễ dàng chơi được bằng cách sử dụng một cách tiếp cận khác.

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
}

0

Python 2, 81 72 byte

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

Dùng thử trực tuyến


2
Tôi nghĩ bạn có thể lưu 9 byte bằng cách thay thế hai dòng đầu tiên bằnga,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)}

Giải trình:

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
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.