これらの文字列を明確にする


42

このコメントチェーンに触発され ...

enklactはこの挑戦から抜け出したいが、私はできない...

@ETHproductions to enklact(v):一意の要素で構成されるサブセクションを使用してルックアップテーブルを実装します。


Enklactingは、ルックアップテーブルを圧縮する非常に便利な方法です。たとえば、次の色のリストがあるとします。

red
green
blue
yellow
purple
orange

入力として色を取り、このリストのインデックスを返すことができるようにしたい場合は、明らかに簡単な方法があります。

["red", "green", "blue", "yellow", "purple", "orange"].index(input())

しかし、より少ないバイトでこれを行う方法があります:

"rgbypo".index(input()[0])

これは、各文字列の最初の(または0番目の)インデックスが一意であるため機能します。この例は明らかですが、時には少し難しい場合があります。このリストのルックアップテーブルを作成する場合はどうなりますか?

Sweet Onion Chicken Teriyaki
Oven Roasted Chicken
Turkey Breast
Italian BMT
Tuna
Black Forest Ham
Meatball Marinara

この場合、これはできません。

"SOTITBM".index(input()[0])

a 'T'で始まる2つの異なる入力、つまり「Tuna」と「Turkey」があるためです。別のインデックスを見る必要があります。各文字列の4番目のインデックスを見ると、それらはすべて一意であることがわかります。だから私たちはこれを行うことができます...

"enklact".index(input()[3])

この場合、「enklaction string」は「enklact」です。

それが今日の挑戦につながります...

文字列のリストを指定すると、有効なenklaction文字列が返されます。または、言い換えると、文字列のリストを指定すると、各文字が一意であり、各文字列のi番目の文字を結合して文字列が形成される新しい文字列を返します。

有効なenklaction文字列が存在しない場合は、代わりに空の文字列または一貫した偽の値を送信する必要があります。いつものように、関数または完全なプログラムのいずれかが許可されており、入出力形式は許容範囲内です(理由はありますが)。

各文字列には印刷可能なASCIIのみが含まれ、このチャレンジでは大文字と小文字が区別されます。

これはなので、選択した言語で可能な限り短いプログラムを作成してください。

テストケース

Input:
Programming
Puzzles
Code
Golf

Output (any one of these):
"ozdl"
"gzef"


Input:
the quick
brown fox
jumped over
lazy dogs

Output:
"tbjl"
"hrua"
"eomz"
" wpy"
"qne "
"if o"
"kxvs"

Note that "u dd" and "coog" are not valid.


Input:
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday

Output:
""


Input:
AbC
aBc
bbC

Output:
"Aab"


Input:
@#$%^_
Hello_World
How are you?

Output:
"#eo"
"$lw"
"%l "
"^oa"


Input:
a
ab
ac

Output:
""

有効な文字列のリストを返すことはできますか?
LyricLy

@LyricLyうーん、今考えてみると、もっと理にかなっているでしょう。しかし、すでに答えがあり、最初のものを返すのにあまりボイラープレートではないので、私はノーと言うつもりです、それは任意の有効な文字列でなければなりません。
DJMcMayhem

入力された文字列が空でないことを保証できますか?
musicman523

6
一貫性のある偽の値は一貫性のあるタイプのエラーになる可能性がありますか?
スチューイーグリフィン

2
すみませんが、正しい動詞はenklactateです。
エリックアウトゴルファー

回答:


8

Python3、59バイト

lambda l:{len({*d}):''.join(d)for d in zip(*l)}.get(len(l))

enklactの文字列を返します。それ以外の場合はNoneを返します


8

パイソン268の 67 61バイト

lambda a:`{0:j for j in zip(*a)if len(set(j))==len(j)}`[6::5]

オンラインでお試しください!

改善点


出力が文字列である必要がない場合:

Python 3、49バイト

lambda a:[j for j in zip(*a)if len({*j})==len(j)]

オンラインでお試しください!



@JoKingエレガントで実装済み。
ニール

私はmax(`j`[2::5]for j in[""]+zip(*a)if len(set(j))==len(j))、バイトを節約するために動作すると思います。
リン

@Lynnありがとう、更新しました。
ニール

7

網膜43 32バイト

+/^(.).+^\1|^$/ms&m`^.

|""Lm`^.

オンラインでお試しください!編集:@MartinEnderのおかげで11バイトを保存しました。説明:

+

入力が変わる間繰り返します...

/^(.).+^\1|^$/ms&

... 1行が空であるか、2行が同じ文字で始まる場合のみ...

m`^.

...すべての行の最初の文字を削除します。したがって、a)すべての行が異なる文字で始まる場合は繰り返しが停止します。その場合、条件が失敗して入力が変更されないか、b)少なくとも1行が空になり、その場合はすべての文字が最終的に削除されます。その時点で入力の変更が停止します。

|""L`^.

すべての行の最初の文字を収集します。(解決策がなかった場合、上記のループはすべてを削除し、収集するものはありません。)


正規表現オプションも正規表現修飾子を使用します(終了区切り文字の直後にそれらを記述します):tio.run
Martin Ender

実際、これにより、2番目のステージtio.run/##K0otycxLNPz/X1s/…を完全に取り除くことができます(どういうわけかm、ここではグループに適用できません。条件付きステージはオプションを伝搬しないようです)。
マーティンエンダー

もちろん、最初のバージョンの無限ループのバグを解決する条件付きループではなく、条件付きループをループします。とてもきちんとした!
ニール

5

Haskell、71バイト

f x|elem""x=""|y<-head<$>x,and[filter(==a)y==[a]|a<-y]=y|1<2=f$tail<$>x

オンラインでお試しください!

BMOはany null x→で3バイトを保存しましたelem""x

ØrjanJohansenはsum[1|b<-y,a==b]<2→でバイトを保存しましたfilter(==a)[y]==[a]

説明

f x|elem""x=""                      -- Once any of the strings is empty, return "".
   |y<-head<$>x                     -- Otherwise, let y be all the first letters...
   ,and[                 |a<-y]     -- If, for all a in y,
        filter(==a)y==[a]           -- a occurs just once in y:
                               =y   -- return y.
   |1<2=f$tail<$>x                  -- Else, chop off all the first letters and recurse.

Prelude.head: empty list解決策がない場合にエラー()を投げてもOKで|elem""x=""あれば、61バイト消去できます


1
短いテスト:filter(==a)y==[a]
Ørjanヨハンセン

4

ルビー、38バイト

->x,*y{x.zip(*y).find{|z|z==z-[p]|[]}}

オンラインでお試しください!

バグを指摘してくれたGBに感謝します。


一致がなく、最初の文字列が最短でない場合は失敗します。
GB

@GB例を挙げてください。私はあなたの説明に従って最後のテストを修正しましたが、うまくいきました。
キリルL.

["abc"、 "ac"、 "acd"]を試してください
GB

なるほど、あなたは正しい。修正する必要があります。
キリルL.

4

Pyth、6バイト

>1{I#C

テストスイート。

出力は、デフォルトで許可されているシングルトンリストです。リスト[](空のリスト、偽)は、文字列をenklactifiedにできない場合に返されます。

説明

> 1 {I#C –完全なプログラム。
     C –入力を転置し、不在を切り取ります。
    #–フィルター:
  {I –重複排除の下で不変。
> 1 –スライス1。Pythonでlist [:1]。

Pyth、5バイト

これは、クラッシュが偽の値としてカウントされる場合に有効でした。

h{I#C

テストスイート。


3

Haskell76 74バイト

f t=last$"":(id=<<foldr(zipWith(#))([[]]<$t)t)
x#[s]=[x:s|all(/=x)s]
x#e=e

オンラインでお試しください!最後の有効な検索文字列、またはそのような文字列が存在しない場合は空の文字列を返します。


71 69バイト

偽の値が許可されているため、一貫した例外をスローする場合:

f t=head$id=<<foldr(zipWith(#))([[]]<$t)t
x#[s]=[x:s|all(/=x)s]
x#e=e

オンラインでお試しください!empty list文字列が見つからない場合は例外をスローし、見つからない場合は最初の有効な文字列を返します。

-ØrjanJohansenのおかげで2バイト


1
notElem x に短縮できますall(/=x)
Ørjanヨハンセン

2

ゼリー、7バイト

z0Q€fZḢ

文字列を暗号化できない場合、整数0を返します。

オンラインでお試しください!

使い方

z0Q€fZḢ  Main link. Argument: A (string array)

z0       Zip/transpose, filling shorter rows with 0.
  Q€     Unique each deduplicate resulting string.
     Z   Zip/transpose, without using a filler.
    f    Filter; keep only string that appear in the results to both sides.
      Ḣ  Head; extract the first string. Returns 0 if the array is empty.


2

スタックス9 8 バイト

åτIⁿs↓µg

実行してデバッグする

説明(開梱):

M{c0-u=}j Full program, implicit input
          e.g. ["Programming", "Puzzles", "Code", "Golf"]
M         Transpose
                ["PPCG", "ruoo", "ozdl", "gzef", "rl\0\0", "ae\0\0", "ms\0\0", "m\0\0\0", "i\0\0\0", "n\0\0\0", "g\0\0\0"]
 {     }j Find first matching element:
            e.g. "PPCG"
  c0-       Copy and remove zero bytes (padding)
                 "PPCG" "PPCG"
     u      Unique
                 "PPCG" "PCG"
      =     Check if equal:
                 1
          First matching here: "ozdl". If none is found, the stack is empty
          Implicit output if anything on stack

2

R、127バイト

function(S,s=sapply(S,substring,x<-1:max(nchar(S)+1),x))cat(rbind(s[!apply(s,1,anyDuplicated)&!rowSums(s==""),],"")[1,],sep="")

オンラインでお試しください!

sapply通常matrix、すべてlength(FUN(X[[i]]))が等しい場合にaを返しますが、when を除きlength(FUN(X[[i]]))==1、その場合はaを返しますvector。行列演算を使用するためには、それから、我々はしなければならないsubstring私たちが保証する必要があるよりも、さらに1 matrix理由である、xにまで及びますmax(nchar(S)+1)

次に、重複も空の文字列もない行をフィルタリングします。単一の文字列のみを返すことができるため、最初の文字列を取得します。ただし、基準を満たす行がない場合はエラーをスローするため、追加の行を""最後に追加します。

次に、指定enklactされた文字列または空の文字列を出力します。


2

R116の 107 95バイト

R + pryr

pryr::f(for(i in 1:min(nchar(v)))`if`(anyDuplicated(t<-substr(v,i,i)),0,{cat(t,sep="")
break}))

オンラインでお試しください!

ベースR

function(v)for(i in 1:min(nchar(v)))`if`(anyDuplicated(t<-substr(v,i,i)),0,{cat(t,sep="")
v=0})

オンラインでお試しください!

Giuseppeのおかげで、これら2つのバリアントは9バイトを節約します。

説明:

これにより、ベクター内のすべての文字v列が最短の長さに効果的に切り捨てられ、後続のインデックスで繰り返されます。次に、選択した文字内に重複があるかどうかを確認し、重複していない場合は貼り付けて、で印刷しcatます。すべてのインデックスが重複した結果を返す場合、空の文字列が出力されます。ループを停止するために、またはループを中断するためにベクトルをゼロにするベースR関数を使用
して、すべて匿名pryr関数でラップされbreakます。


1
良いですね!これはにgolfedことができる107バイトR+pryrまたは107バイトベースR.中
ジュゼッペ・

2

Japt、9バイト

入力を文字配列の配列として受け取り、文字配列を返すか、 undefined

y æ_f eZâ

試してみてください(プログラムの最初に新しい行を追加し、コードqR mqを改行区切り文字列として入力して、配列を作成する手間を省きます。)


説明

y             :Transpose
  æ_          :Pass each array Z through a function and return the first that returns true
    f         :  Filter nulls (used for padding when transposing)
      e       :  Test for equality with
       Zâ     :  Z deduplicated

ソリューションを読む前にこのチャレンジを試してみましたが、ほぼ同じソリューションが得られましたz æ_¬eZ¬â
。– Nit

入力形式以外はまったく同じです。
シャギー



1

C(gcc)、161バイト

f(s,i)char**s;{char**t,a[255],*u=a;for(i=0;memset(a,0,255),u&&~i;i+=!!~i&&u)for(t=s;(u=u?*t++:0)&&~(i=u[i]?i:-1)&&!a[u[i]]++;);while(~i&&(u=*s++))putchar(u[i]);}

オンラインでお試しください!

各文字位置は複製についてテストされ、重複が検出された場合はスキップされます。これは、最も短い文字列が終了するまで続けられます。残念ながらASCIIのみです。DBCS/ UTF-8文字列は、この機能をひどく壊します!



1

Japt、12バイト

undefined非enklactic文字列を返します。

y ·æ_¬n ä¦ e

オンラインでお試しください!

説明:

y ·æ_¬n ä¦ e
y             // Split the input at newlines and transpose
  ·           // Join on newlines 
   æ_         // Return the first item that returns truthy when ran through:
     ¬n       //   Sort
        ä¦    //   Reduce with !=
           e  //   All items are truthy (unique)

入力を文字配列の配列として取得し、2を捨てることで2バイトを節約できるはずsplitです。
シャギー

1

Wolfram言語(Mathematica)、54バイト

#&@@Select[PadRight@#,#~FreeQ~0&&Union@#==Sort@#&]&

オンラインでお試しください!

文字のリストのリストを入力として受け取り、文字のリストを返します。「Transpose」演算子に対応するU + F3C7が含まれています。

#1適切な文字列が存在しない場合、無視できるエラーを返します。

説明:

PadRight@#

各「文字列」(文字のリスト)が同じ長さになるように入力を埋め込みます。これにより、整数0(文字列ではない"0")が追加されます。次に転置します。

Select[ ... ,#~FreeQ~0&&Union@#==Sort@#&]

整数を含まず0、すべて一意の文字を含む文字列を選択します。

#&@@

最初のものを入手してください。


1

JavaScript(ES6)、66バイト

文字列を返すか、undefined解が存在しない場合。

f=(a,i=0)=>a.every(s=>(o[k+=c=s[i],c]^=1)&&c,o=k=[])?k:c&&f(a,i+1)

オンラインでお試しください!

コメント済み

f = (           // f = recursive function taking:
  a,            //   a[] = input array
  i = 0         //   i   = pointer
) =>            //
  a.every(s =>  // for each string s in a[]:
    (o[k +=     //   append to the key string k
      c = s[i], //   the character c at position i in s
      c] ^= 1   //   and toggle o[c] (undefined -> 1 -> 0)
    ) && c,     //   additionally, make sure that c is defined
    o = k = []  //   start with o = k = empty array
  ) ?           // every() is true if all characters were distinct and defined:
    k           //   in which case we return k
  :             // else:
    c &&        //   provided that every() didn't fail because of an undefined character,
    f(a, i + 1) //   try again at the next position

1

23 21バイト

@Neilのおかげで-2バイト!

§ΦE⌊EθLι⭆θ§λι⬤ι⁼¹№ιλ⁰

オンラインでお試しください!


えー、いつa)q常に文字列であるのをやめたのですかb)StringMapは非文字列で動作し始めたのですか?とにかく、あなたRangeは不要で、2バイト節約できます。
ニール

@Neil a)配列/オブジェクト入力を追加したときb)> _>よくわかりません。たぶん、whileループを修正した頃です(申し訳ありませんが、これらのいずれかに言及するのを忘れていました)
ASCIIのみ

1

、9バイト

ḟS=UḞz:∞ø

オンラインでお試しください!

説明

fS=UḞz:∞ø
    Ḟz:∞ø  Transpose the input dropping characters of longer strings
    Ḟ        Fold right
     z:      Zip with prepend
       ∞ø    Infinite list of empty lists
ḟS=U       Find the first string without duplicates, returns an empty string if none
ḟ            Return first value satisfying predicate
  =          Equal
 S U         to itself with duplicates removed

←ġLTover Ḟz:∞øを使用すると、1バイト節約できます。
ბიმო


1

Perl 6、27バイト

{([Z] $_).first:{.Set==$_}}

オンラインでお試しください!

ルビー版が支持されたことを確認した後、私はアプローチをコピーし、文字列の代わりに文字リストを使用しました。好きじゃない。

私のより古く、より正しい提出は以下の通りです:

Perl 6、38バイト

分割、圧縮、一意性の確認、結合。

{[~] ([Z] @_>>.comb).first:{.Set==$_}}

オンラインでお試しください!


1

C(GCC) 121の 113 110バイト

i;d;f(s)char**s;{char**_=s,x[255]={0},y[99]={0};for(d=i=0;*_;)d+=x[y[i++]=*(*_++)++]++;d=d?*x?0:f(s):puts(y);}

オンラインでお試しください!

非ゴルフ

void enklactify(char *strings[]) {
    int quit = 0;
    while (!quit) {
        char **arg = strings;      // current row
        int exists[255] = {0};     // which characters exist in the column
        char output[99] = {0};     // will hold output string
        int index = 0;             // where to insert in output
        int duplicates = 0;        // have we found any duplicates?
        while (*arg != NULL) {
            char *word = *arg;     // current word
            char first = *word;    // first letter of current word
            if (exists[first])
                duplicates = 1;    // we found a duplicate
            exists[first] = 1;     // mark it as in our string
            output[index] = first; // add it to our output
            index++;
            (*arg)++;              // advances the current word to the next
                                   // character by reference (chops first char)
            arg++;                 // advance to next whole argument
        }

        if (!duplicates) {         // This is a valid solution
            puts(output);
            quit = 1;
        }

        if (exists[0]) {           // We hit the null terminator of one of the
                                   // input strings, so we failed
            quit = 1;
        }
    }
}

-3 ceilingcatのおかげ

これは、Cの文字列ポインターに1を追加して文字列の「テール」を取得する機能を悪用します。主なバイトセーバーは次のとおりです。

  • d+=x[y[i++]=*(*_)++]++これは、最初の文字列の最初の文字追加_するとy、最初の文字列を進み_、最初の文字を削除するには、追加xのその文字のエントリをd、そして増分が言ったxエントリ
  • q=d?*x:puts(y)その印刷y場合は、d設定中に非ゼロであるq非ゼロ値、またはセットにq非ゼロの最初の要素があればx、我々は、文字列の一方の端部であった場合は、非ゼロである(その要素が非であると述べゼロ)

編集:whileループから再帰的な末尾呼び出しに切り替えて、forループから角かっこを削除することにより、バイトを削った。


提案for(d=i=0;*_;)の代わりfor(d=0,i=0;*_;++_)*(*_++)++]++;d=d?!*x*f(s)代わりに*(*_)++]++;d=d?*x?0:f(s)
ceilingcat

0

Pyth、13バイト

e+kf{IT@.TQ.t

ここで試してみてください

e+kf{IT@.TQ.t
           .tQ   Transpose the (implicit) input with padding.
        .TQ      Transpose the input without padding.
       @         Take the strings in both.
   f{IT          Find the ones that have no duplicates.
e+k              Get the last, or an empty string.

1
すべての有効な文字列のリストを返すことは有効ではないようです。
LyricLy

@LyricLy修正。
ニーモニック

0

、139バイト

func[b][m: length? first b foreach a b[m: min m length? a]repeat n m[c: copy[]foreach a b[append c a/(n)]if c = unique c[return rejoin c]]]

オンラインでお試しください!

説明:

入力を文字列のブロック(リスト)として受け取ります。enklaction文字列などを返しますnone

f: func[b][
    m: length? first b                   ; the minimal length of the first string  
    foreach a b[m: min m length? a]      ; find the minimal length of all strings
    repeat n m[                          ; limit the search to the minimal length
        c: copy[]                        ; an empty block  
        foreach a b[append c a/(n)]      ; for each string append the current char
        if c = unique c[return rejoin c] ; if all chars are unique, return the block
    ]  
]

0

ローダ80 77バイト

f a{a|seq 0,#_|try{{|i|a|[_[i:i+1]]|orderedUniq|concat|[_]if[#_1=#a]}_|head}}

オンラインでお試しください!

Cows quackのおかげで-1バイト

説明:

f a{
  a|         /* Push the strings in a to the stream */
             /* For each string (_): */
  seq 0,#_|     /* Push a range from 0 to the length of _ to the stream */
  try{       /* Ignore errors during the following block */
    {|i|        /* For each i in the stream: */
      a|           /* Push strings in a to the stream */
      [_[i:i+1]]|  /* For each string, push the ith character to the stream */
      orderedUniq| /* Remove duplicate characters */
      concat|      /* Join the characters into a string */
      [_]if        /* Push the string to the stream if */
      [#_1=#a]     /* Its length is the length of a */
    }_|
    head        /* Take the first string in the stream and return it */
  }
}

tryキーワードがあれば発生するエラー却下するために使用されたi中で最小の文字列の長さよりも大きい場合a、または応答がないとheadエラーが発生します。


seqバイトを保存するために括弧を削除できます
Kritixi Lithos

@Cowsquackありがとう!
fergusq

0

Java 10、106バイト

a->{for(int i=0;;i++){var r="";for(var s:a)r+=s[i];if(r.length()==r.chars().distinct().count())return r;}}

解決策が見つからない場合、空の文字列を返す代わりにエラーを返します。入力は文字行列です。

オンラインでお試しください。

説明:

a->{                  // Method with character-matrix parameter and String return-type
  for(int i=0;;i++){  //  Loop `i` upwards
    var r="";         //   Result-String, starting empty
    for(var s:a)      //   Loop over the character-arrays of the input
      r+=s[i];        //    And append every `i`'th character to `r`
    if(r.length()==r.chars().distinct().count())
                      //   If `r` only contains unique characters
      return r;}}     //    Return `r` as result

OPはエラーを許可したくないように見えましたが、間違いなく投稿自体にそれを入れませんでした。
Ørjanヨハンセン

0

Clojure、59バイト

#(for[s(apply map list %):when(=(count(set s))(count %))]s)

文字のリストのリストを返します。


0

APL + WIN、35 33バイト

Adámのおかげで2バイト節約

テキストの行を文字マトリックスとして要求します。

⊃((↑⍴¨a)=+/¨((a⍳¨a)=⍳¨⍴¨a))/a←,⌿⎕

オンラインでお試しください!Dyalog Classic提供

説明:

a←,⌿⎕ prompts for input and creates a nested vector of the input matrix columns

((a⍳¨a)=⍳¨⍴¨a) creates a binary vector for each nested element with a 1 for each unique element

((↑⍴¨a)=+/¨ sums each binary vector and compares to number of characters in each element

(...)/a←⊂[1]⎕ selects only those elements where number of uniques = column length

⊃ converts nested vector back to a matrix of each valid enklaction string 

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