Enklactify các chuỗi


42

Lấy cảm hứng từ chuỗi bình luận này ...

Tôi muốn enklactthoát khỏi thử thách này nhưng tôi không thể ...

@ETHproductions to enklact (v): để thực hiện bảng tra cứu bằng cách sử dụng một phần phụ bao gồm các phần tử duy nhất.


Enklacting là một cách rất hữu ích để nén bảng tra cứu. Ví dụ: giả sử bạn có danh sách các màu sau:

red
green
blue
yellow
purple
orange

Nếu bạn muốn có thể lấy màu làm đầu vào và trả về chỉ mục của nó trong danh sách này, rõ ràng là cách đơn giản:

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

Nhưng có một cách chúng ta có thể làm điều này theo cách ít byte hơn:

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

Điều này hoạt động vì chỉ mục đầu tiên (hoặc 0) của mỗi chuỗi là duy nhất. Ví dụ này là rõ ràng, nhưng đôi khi nó khó hơn một chút. Điều gì xảy ra nếu chúng ta muốn tạo một bảng tra cứu cho danh sách này?

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

Trong trường hợp này, chúng tôi không thể làm điều này:

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

bởi vì có hai đầu vào khác nhau bắt đầu bằng một 'T', đó là "Cá ngừ" và "Thổ Nhĩ Kỳ". Chúng ta phải xem xét một chỉ số khác nhau. Nếu bạn nhìn vào chỉ mục thứ 4 của mỗi chuỗi, bạn sẽ nhận thấy rằng tất cả chúng đều là duy nhất. Vì vậy, chúng ta có thể làm điều này ...

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

Trong trường hợp này, "chuỗi enklaction" là "enklact".

Điều đó dẫn chúng ta đến thử thách ngày hôm nay ...

Đưa ra một danh sách các chuỗi, trả về bất kỳ chuỗi enklaction hợp lệ nào. Hay nói cách khác, đưa ra một danh sách các chuỗi, trả về bất kỳ chuỗi mới nào trong đó mỗi chữ cái là duy nhất và chuỗi được hình thành bằng cách nối chữ cái thứ i của mỗi chuỗi.

Nếu không có chuỗi enklaction hợp lệ, việc gửi của bạn phải trả về một chuỗi trống hoặc giá trị giả mạo nhất quán thay thế. Như thường lệ, các chức năng hoặc chương trình đầy đủ đều được cho phép và các định dạng đầu vào / đầu ra được cho phép (trong lý do).

Mỗi chuỗi sẽ chỉ chứa ASCII có thể in được và thử thách này phân biệt chữ hoa chữ thường.

Đây là , vì vậy hãy cố gắng viết chương trình ngắn nhất có thể bằng ngôn ngữ bạn chọn!

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

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

Chúng tôi có thể trả về một danh sách các chuỗi hợp lệ không?
LyricLy

@LyricLy Hmm, bây giờ tôi nghĩ về nó, điều đó sẽ có ý nghĩa hơn. Nhưng vì đã có câu trả lời và không quá nhiều câu trả lời để trả về câu đầu tiên, tôi sẽ nói không, nó sẽ là một chuỗi hợp lệ.
DJMcMayhem

Chúng tôi có thể đảm bảo không có chuỗi nào được nhập không?
sĩ523

6
Giá trị giả mạo nhất quán có thể là một lỗi của loại nhất quán?
Stewie Griffin

2
Xin lỗi, nhưng tôi nghĩ động từ đúng là enklactate .
Erik the Outgolfer

Câu trả lời:


8

Python3, 59 byte

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

Trả về một chuỗi với enklact, Không có gì khác


8

Python 2 , 68 67 61 byte

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

Hãy thử trực tuyến!

Cải tiến

  • Từ 68 byte đến 67 byte bởi Jo King
  • Từ 66 đến 65 byte bởi Lynn

Nếu đầu ra sẽ không phải là một chuỗi:

Python 3 , 49 byte

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

Hãy thử trực tuyến!



@JoKing Thanh lịch và thực hiện.
Neil

Tôi nghĩ rằng max(`j`[2::5]for j in[""]+zip(*a)if len(set(j))==len(j))hoạt động, để tiết kiệm một byte.
Lynn

@Lynn cảm ơn và cập nhật.
Neil

7

Võng mạc , 43 32 byte

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

|""Lm`^.

Hãy thử trực tuyến! Chỉnh sửa: Đã lưu 11 byte nhờ @MartinEnder. Giải trình:

+

Lặp lại trong khi đầu vào thay đổi ...

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

... chỉ khi một dòng trống hoặc hai dòng bắt đầu bằng cùng một ký tự ...

m`^.

... xóa ký tự đầu tiên của mỗi dòng. Do đó, việc lặp lại dừng lại nếu a) tất cả các dòng bắt đầu bằng các ký tự khác nhau, trong trường hợp điều kiện không thành công và đầu vào không bị thay đổi, hoặc b) ít nhất một dòng trở nên trống rỗng, trong trường hợp đó tất cả các ký tự cuối cùng sẽ bị xóa, tại điểm đầu vào dừng thay đổi.

|""L`^.

Thu thập các ký tự đầu tiên của mỗi dòng. (Nếu không có giải pháp, vòng lặp trên sẽ xóa mọi thứ và sẽ không có gì để thu thập.)


Các tùy chọn Regex cũng có các bộ sửa đổi regex (bằng cách viết chúng trực tiếp sau dấu phân cách đóng): tio.run/##K0otycxLNPz/ trộm
Martin Ender

Trên thực tế, điều đó cho phép bạn loại bỏ hoàn toàn giai đoạn thứ hai: tio.run/##K0otycxLNPz/X1s/ mẹo (bằng cách nào đó không thể áp dụng mvới một nhóm ở đây, có vẻ như giai đoạn có điều kiện không truyền bá tùy chọn).
Martin Ender

Ah, tất nhiên, lặp một vòng có điều kiện thay vì vòng lặp có điều kiện, giải quyết lỗi vòng lặp vô hạn trong phiên bản đầu tiên của bạn. Rât gọn gang!
Neil

5

Haskell , 71 byte

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

Hãy thử trực tuyến!

BMO đã lưu 3 byte với any null xelem""x.

Ørjan Johansen đã lưu một byte bằng sum[1|b<-y,a==b]<2filter(==a)[y]==[a].

Giải trình

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.

Nếu ném lỗi ( Prelude.head: empty list) khi không có giải pháp nào ổn, |elem""x=""có thể xóa 61 byte .


1
Bài kiểm tra ngắn hơn:filter(==a)y==[a]
Ørjan Johansen

4

Ruby , 38 byte

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

Hãy thử trực tuyến!

Cảm ơn GB đã chỉ ra một lỗi.


Thất bại nếu không có kết quả khớp và chuỗi đầu tiên không phải là ngắn nhất.
GB

@GB Bạn có thể cung cấp một ví dụ, xin vui lòng? Tôi đã sửa đổi bài kiểm tra cuối cùng của tôi theo mô tả của bạn, và nó đã hoạt động.
Kirill L.

Hãy thử ["abc", "ac", "acd"]
GB

Bây giờ tôi hiểu rồi, bạn nói đúng. Nên sửa.
Kirill L.

4

Bình thường , 6 byte

>1{I#C

Bộ thử nghiệm.

Đầu ra là một danh sách đơn, theo mặc định cho phép ; danh sách [] (danh sách trống, giả mạo) được trả về trong trường hợp chuỗi không thể được kích hoạt .

Giải trình

> 1 {I # C - Chương trình đầy đủ.
     C - Chuyển đổi đầu vào, cắt xén vắng mặt.
    # - Lọc bởi:
  {I - Bất biến dưới sự trùng lặp.
> 1 - Cắt thành 1. danh sách [: 1] trong Python.

Bình thường , 5 byte

Điều này sẽ hợp lệ nếu sự cố sẽ được tính là giá trị giả.

h{I#C

Bộ thử nghiệm.


3

Haskell , 76 74 byte

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

Hãy thử trực tuyến! Trả về chuỗi tra cứu hợp lệ cuối cùng hoặc một chuỗi trống nếu không có chuỗi đó tồn tại.


71 69 byte

Nếu ném một ngoại lệ nhất quán là giá trị giả được cho phép:

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

Hãy thử trực tuyến! Ném một empty listngoại lệ nếu không tìm thấy chuỗi nào, trả về chuỗi hợp lệ đầu tiên nếu không.

-2 byte nhờ Ørjan Johansen


1
notElem x có thể rút ngắn thành all(/=x).
Ørjan Johansen

2

Thạch , 7 byte

z0Q€fZḢ

Trả về số nguyên 0 nếu các chuỗi không thể được enklactified.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Stax , 9 8 byte

åτIⁿs↓µg

Chạy và gỡ lỗi nó

Giải thích (giải nén):

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 byte

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

Hãy thử trực tuyến!

sapplythường trả về a matrixkhi tất cả length(FUN(X[[i]]))đều bằng nhau, trừ khi length(FUN(X[[i]]))==1, trong trường hợp đó, nó trả về a vector. Sau đó, để sử dụng các hoạt động ma trận, chúng ta phải đi substringxa hơn một lần nữa chúng ta cần đảm bảo a matrix, đó là lý do tại sao xkéo dài đến max(nchar(S)+1).

Sau đó chúng tôi lọc các hàng không có trùng lặp và không có chuỗi trống. Vì chúng tôi chỉ có thể trả về một chuỗi duy nhất, chúng tôi lấy chuỗi đầu tiên, ngoại trừ khi không có hàng nào đáp ứng tiêu chí, chúng tôi sẽ đưa ra một lỗi, vì vậy chúng tôi sẽ thêm một hàng bổ sung ""vào cuối.

Sau đó, chúng tôi in ra enklactchuỗi ified hoặc chuỗi trống.


2

R , 116 107 95 byte

R + pryr

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

Hãy thử trực tuyến!

cơ sở R

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

Hãy thử trực tuyến!

Hai biến thể này tiết kiệm 9 byte nhờ Giuseppe .

Giải trình:

Điều này có hiệu quả cắt tất cả các stings trong vector vtheo chiều dài ngắn nhất và lặp lại thông qua các chỉ mục tiếp theo. Sau đó kiểm tra xem có bất kỳ bản sao nào trong các chữ cái đã chọn hay không và dán chúng lại với nhau và in với cat. Nếu tất cả các chỉ mục trả về kết quả trùng lặp, điều này sẽ in chuỗi trống.
Tất cả được bao bọc trong một pryrhàm ẩn danh breakđể tạm dừng vòng lặp hoặc hàm R cơ sở tạo ra vectơ để phá vỡ vòng lặp.


1
Đẹp quá Điều này có thể được đánh tới 107 byte trong R+pryrhoặc 107 byte trong cơ sở R.
Giuseppe

2

Japt, 9 byte

Lấy đầu vào dưới dạng một mảng các mảng ký tự, trả về một mảng các ký tự hoặc undefined

y æ_f eZâ

Hãy thử nó (Thêm một dòng mới khi bắt đầu chương trình với mã qR mqđể lấy đầu vào dưới dạng một chuỗi tách biệt dòng mới, để tiết kiệm cho bạn những rắc rối khi tạo các mảng.)


Giải trình

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

Tôi đã thử thách trước khi đọc giải pháp của bạn và nhận được một giải pháp gần như giống hệt nhau:z æ_¬eZ¬â
Nit

Chính xác giống hệt nhau, khác với định dạng đầu vào.
Xù xì


1

Python 3 , 75 byte

def f(t):c=[s.pop(0)for s in t];return all(t)and(f(t),c)[len(t)==len({*c})]

Hoạt động trên danh sách nhân vật thay vì chuỗi. Trả về Sai nếu không tồn tại chuỗi enklaction hợp lệ.

Hãy thử trực tuyến!


Tôi nghĩ rằng điều này đệ quy, điều này sẽ làm cho nó không hợp lệ trừ khi f=được bao gồm trong số byte.
LyricLy

@LyricLy Đã sửa :)
Musicman523

1

C (gcc) , 161 byte

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

Hãy thử trực tuyến!

Mỗi vị trí ký tự được kiểm tra trùng lặp và bỏ qua nếu phát hiện trùng lặp; điều này được tiếp tục cho đến khi chuỗi ngắn nhất kết thúc. Đáng buồn thay, chỉ có ASCII: chuỗi DBCS / UTF-8 phá vỡ chức năng này một cách tồi tệ!



1

Japt , 12 byte

Trả về undefinedcho các chuỗi không enklactic.

y ·æ_¬n ä¦ e

Hãy thử trực tuyến!

Giải trình:

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)

Bạn sẽ có thể lưu 2 byte bằng cách lấy đầu vào là một mảng các mảng ký tự và bỏ qua hai splits.
Xù xì

1

Ngôn ngữ Wolfram (Mathicala) , 54 byte

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

Hãy thử trực tuyến!

Lấy danh sách các danh sách các ký tự làm đầu vào, trả về một danh sách các ký tự. Chứa U + F3C7, tương ứng với toán tử "Transpose".

Trả về #1và ném một loạt các lỗi không thể biết được khi không có chuỗi phù hợp.

Giải trình:

PadRight@#

Di chuyển đầu vào sao cho mỗi "chuỗi" (danh sách các ký tự) có cùng độ dài. Điều này nối thêm số nguyên 0s (không phải chuỗi "0"s). Sau đó chuyển vị.

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

Chọn các chuỗi không có số nguyên 0s trong chúng và có tất cả các ký tự duy nhất.

#&@@

Lấy cái đầu tiên


1

JavaScript (ES6), 66 byte

Trả về một chuỗi hoặc undefinednếu không có giải pháp tồn tại.

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

Hãy thử trực tuyến!

Đã bình luận

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

Than , 23 21 byte

-2 byte nhờ @Neil !

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

Hãy thử trực tuyến!


Huh, khi nào a) qdừng luôn là một chuỗi b) StringMap bắt đầu hoạt động trên các chuỗi không? Dù sao, của bạn Rangelà không cần thiết, tiết kiệm cho bạn 2 byte.
Neil

@Neil a) Khi tôi thêm đầu vào mảng / đối tượng b)> _> Tôi không chắc chắn. có lẽ là khoảng thời gian khi tôi sửa vòng lặp while (xin lỗi, đã quên đề cập đến một trong hai vòng lặp đó)
ASCII - chỉ

1

Husk , 9 byte

ḟS=UḞz:∞ø

Hãy thử trực tuyến!

Giải trình

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

Sử dụng ←ġLThơn Ḟz:∞ønên tiết kiệm một byte.
17/05/18

1

Võng mạc , 81 56 byte

m`$
$.=*£¢
N$`.
$.%`
¶

~`(.*?¢)+
L`.{$#1}
A`(.).*\1|£|¢

Hãy thử trực tuyến!

-25 byte nhờ @Neil


Chuyển văn bản hình chữ nhật trong Retina là khó khăn đáng ngạc nhiên.


Tôi ước tôi biết một cách tốt hơn để thực hiện chuyển vị hình chữ nhật, nhưng trong thời gian đó, tiết kiệm 25 byte .
Neil

@Neil Ahh ... sân khấu eval. Tôi luôn quên retina 1.0 có tất cả các tính năng mới thú vị này
TwiNight

1

Perl 6 , 27 byte

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

Hãy thử trực tuyến!

Sau khi thấy rằng phiên bản ruby ​​đã được nâng cấp, tôi đã sao chép cách tiếp cận và sử dụng danh sách nhân vật, thay vì chuỗi. Tôi không thích nó.

Trình cũ hơn và chính xác hơn của tôi là như sau:

Perl 6 , 38 byte

Chia, zip, kiểm tra tính độc đáo, tham gia.

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

Hãy thử trực tuyến!


1

C (gcc) , 121 113 110 byte

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

Hãy thử trực tuyến!

Bị đánh cắp

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 nhờ trần

Điều này lạm dụng khả năng chỉ cần thêm 1 vào một con trỏ chuỗi trong C để lấy 'đuôi' của chuỗi. Các trình tiết kiệm byte chính là:

  • d+=x[y[i++]=*(*_)++]++nối thêm ký tự đầu tiên của chuỗi đầu tiên _vào y, tiến lên chuỗi đầu tiên _để loại bỏ ký tự đầu tiên, thêm xmục nhập vào ký tự đó dvà tăng xmục nhập cho biết
  • q=d?*x:puts(y)mà in ynếu dkhác không trong khi đặt thành qgiá trị khác không hoặc đặt qthành khác không nếu phần tử đầu tiên xlà khác không (nếu chúng ta ở cuối một trong các chuỗi thì phần tử đã nói sẽ không khác số không)

Chỉnh sửa: Cạo byte bằng cách chuyển từ vòng lặp while sang lệnh gọi đệ quy và xóa dấu ngoặc khỏi vòng lặp for.


Đề xuất for(d=i=0;*_;)thay vì for(d=0,i=0;*_;++_)*(*_++)++]++;d=d?!*x*f(s)thay vì*(*_)++]++;d=d?*x?0:f(s)
trần mèo

0

Bình thường, 13 byte

e+kf{IT@.TQ.t

Hãy thử nó ở đây

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
Có vẻ như việc trả về một danh sách tất cả các chuỗi hợp lệ là không hợp lệ.
LyricLy

@LyricLy Đã sửa.
Mnemonic

0

Màu đỏ , 139 byte

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]]]

Hãy thử trực tuyến!

Giải trình:

Lấy đầu vào là một khối (danh sách) của chuỗi. Trả về chuỗi enklaction hoặc nonecách khác.

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

Röda , 80 77 byte

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

Hãy thử trực tuyến!

-1 byte nhờ quẻ bò

Giải trình:

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 */
  }
}

Các trytừ khóa được sử dụng để bỏ lỗi xảy ra nếu ilớn hơn độ dài của chuỗi nhỏ trong a, hoặc không có câu trả lời và headgây ra một lỗi.


Bạn có thể xóa các dấu ngoặc seqđể lưu một byte
Kritixi Lithos

@Cowsquack Cảm ơn!
fergusq

0

Java 10, 106 byte

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

Sẽ đưa ra lỗi thay vì trả về một Chuỗi trống nếu không tìm thấy giải pháp nào. Đầu vào là một ma trận ký tự.

Hãy thử trực tuyến.

Giải trình:

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 dường như không muốn cho phép sai sót, mặc dù phải thừa nhận rằng không bao giờ đưa nó vào bài viết.
Ørjan Johansen

0

Clojure, 59 byte

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

Trả về một danh sách các danh sách các nhân vật.


0

APL + THẮNG, 35 33 byte

2 byte được lưu nhờ Adám

Nhắc các dòng văn bản dưới dạng ma trận ký tự:

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

Hãy thử trực tuyến! Lịch sự của Dyalog Classic

Giải trình:

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 

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.