文字列の連結


8

チャレンジ

小文字のみが含まれ、スペースが含まれていない2つの文字列がある場合、結果は短い文字列、アンダースコア、長い文字列の順になり、短い文字列に含まれる各文字について、文字の最初のインスタンスが削除されます。

文字列の長さが常に異なると想定できます。

テストケース:

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)

ルール

これはコードゴルフなので、バイト単位の最短の答えが勝ちます!


2
短い文字列に重複した文字がある場合、「最初の出現を削除する」とはどういう意味ですか?
Peter Taylor

2
勝者を選ぶのに4日は非常に短いので、最低でも2週間はお勧めします。また、将来的には、最初にサンドボックスに投稿して、公開する前に課題を明確にして改善することをお勧めします。
xnor

3
小さい方の文字列は短い方の文字列です......私の悪い英語で申し訳ありません
Ajay

6
出力はどうあるべきjuggle jugglerですか?juggle_r(文字インスタンスごとに削除)またはjuggle_gr(個別の文字ごとに削除)?
PurkkaKoodari

2
@ Pietu1998それは良い点です。明確になるまで、これを保留にする必要があります
Luis Mendo 2016

回答:



3

JavaScript(ES6)、78 75 69バイト

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

壊す

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バイト

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

@xnorのおかげで-1バイト


そうでなければガードのy\\xためにバインドすることによってバイトを切ることができ0<1ます。
XNOR

filter(`notElem`x)yy\\xインポートよりも短い
ダミアン

@Damien x最初の要素だけでなく、の要素のすべての出現を削除すると思います。
ダイアン2016

ああ、そうです。
ダミアン

1

Java 7、262バイト

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

リストなしの配列を使用するだけで、さらにゴルフを楽しむことができます。

非ゴルフおよびテストケース:

ここで試してください。

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

出力:

sale_inwater
juggle_ostin
juggle_r

1

Java 8、156バイト

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

これはおそらくもう少しゴルフすることができます。

非ゴルフ&テストケース

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バイト

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

ない

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

61バイト(引数が文字列の配列の場合)

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

ありがとう、m-chrzan


1
gsub!ここでは機能しません-各文字の最初の出現を削除することになっています。さいわい、sub!これを正確に実行するは、1バイト短くなります。
m-chrzan 2016

1
また、この場合はラムダを呼び出す必要があるため、ラムダに名前を付ける必要があると思います。ただし、a,b=b,a if a.size>b.size文字列を交換することは再帰的ではなく、別のバイトを節約できます。
m-chrzan 2016

@ m-chrzanああ、私は質問を注意深く観察しませんでした。ありがとう!
cia_rana

61バイト、文字列の配列として入力:->a{a.sort_by!(&:size);a[0].chars.map{|c|a[1].sub!c,""};a*?_}
m-chrzan

@ m-chrzanすばらしい!私はあなたの答えを追加しました。
cia_rana

0

PHP、154バイト

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

$s=preg_replace("#(.*?)".$x."(.*)#","$1$2",$s);あなたの代わりに使うこともできますif($z=strstr($s,$x))$s=strstr($s,$x,1).substr($z,1);


0

R、161バイト

これは予想よりもはるかに長いことが判明しましたが、通常、Rでは文字列の操作が面倒です。別のアプローチを使用するだけで簡単にゴルフを楽しめます。

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

逃げる

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

Scala、78バイト

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

説明:

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
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.