Objaśnij te ciągi


42

Zainspirowany łańcuchem komentarzy ...

Chcę enklactwyjść z tego wyzwania, ale nie mogę ...

@ETHproductions to enklact (v): aby zaimplementować tabelę wyszukiwania za pomocą podsekcji składającej się z unikalnych elementów.


Enklacting to bardzo przydatny sposób kompresji tabeli odnośników. Załóżmy na przykład, że masz następującą listę kolorów:

red
green
blue
yellow
purple
orange

Jeśli chcesz mieć kolor jako dane wejściowe i zwrócić jego indeks na tej liście, jest oczywiście prosty sposób:

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

Ale jest sposób, abyśmy mogli to zrobić w sposób mniej bajtowy:

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

Działa to, ponieważ pierwszy (lub 0-ty) indeks każdego łańcucha jest unikalny. Ten przykład jest oczywisty, ale czasem jest trochę trudniejszy. Co jeśli chcielibyśmy stworzyć tabelę odnośników dla tej listy?

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

W takim przypadku nie możemy tego zrobić:

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

ponieważ istnieją dwa różne dane wejściowe rozpoczynające się od 'T', a mianowicie „Tuńczyk” i „Turcja”. Musimy spojrzeć na inny indeks. Jeśli spojrzysz na czwarty indeks każdego łańcucha, zauważysz, że wszystkie są unikalne. Więc możemy to zrobić ...

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

W tym przypadku „ciąg enklaction” to „enklact”.

To prowadzi nas do dzisiejszego wyzwania ...

Biorąc pod uwagę listę ciągów, zwróć dowolny prawidłowy ciąg enklaction. Innymi słowy, biorąc pod uwagę listę ciągów, zwróć dowolny nowy ciąg, w którym każda litera jest unikalna, a ciąg jest tworzony przez połączenie i-tej litery każdego ciągu.

Jeśli nie ma prawidłowego ciągu enklaction, zgłoszenie musi zwrócić pusty ciąg lub spójną wartość falsy. Jak zwykle dozwolone są zarówno funkcje, jak i pełne programy, a formaty wejścia / wyjścia są dozwolone (z uzasadnionego powodu).

Każdy ciąg będzie zawierał tylko ASCII do wydruku, a w tym wyzwaniu rozróżniana jest wielkość liter.

To jest , więc spróbuj napisać najkrótszy możliwy program w wybranym przez siebie języku!

Przypadki testowe

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

Czy możemy zwrócić listę prawidłowych ciągów?
LyricLy,

@LyricLy Hmm, teraz, gdy o tym myślę, miałoby to większy sens. Ale ponieważ są już odpowiedzi i nie jest zbyt wiele, aby zwrócić pierwszą, powiem nie, powinien to być dowolny prawidłowy ciąg.
DJMcMayhem

Czy możemy zagwarantować, że żaden z wprowadzonych ciągów nie jest pusty?
musicman523

6
Czy spójna wartość falsy może być błędem spójnego typu?
Stewie Griffin,

2
Przepraszam, ale myślę, że poprawny czasownik jest skomplikowany .
Erik the Outgolfer

Odpowiedzi:


8

Python3, 59 bajtów

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

Zwraca ciąg z enklactem, w przeciwnym razie None


8

Python 2 , 68 67 61 bajtów

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

Wypróbuj online!

Ulepszenia

  • Od 68 bajtów do 67 bajtów autorstwa Jo Kinga
  • Od 66 do 65 bajtów według Lynn

Jeśli wyjście nie musi być ciągiem:

Python 3 , 49 bajtów

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

Wypróbuj online!



@JoKing Elegancki i wdrożony.
Neil

Myślę, że max(`j`[2::5]for j in[""]+zip(*a)if len(set(j))==len(j))działa, aby uratować bajt.
Lynn

@Lynn dzięki i zaktualizowane.
Neil

7

Retina , 43 32 bajty

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

|""Lm`^.

Wypróbuj online! Edycja: Zapisano 11 bajtów dzięki @MartinEnder. Wyjaśnienie:

+

Powtarzaj, gdy zmienia się wejście ...

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

... tylko jeśli jedna linia jest pusta lub dwie linie zaczynają się od tego samego znaku ...

m`^.

... usuń pierwszy znak każdej linii. Powtórzenie kończy się, jeśli albo a) wszystkie wiersze zaczynają się od różnych znaków, w takim przypadku warunek nie powiedzie się, a dane wejściowe nie ulegną zmianie, lub b) co najmniej jedna linia stanie się pusta, w którym to przypadku wszystkie znaki zostaną ostatecznie usunięte, w tym momencie sygnał wejściowy przestaje się zmieniać.

|""L`^.

Zbierz pierwszy znak z każdej linii. (Jeśli nie było rozwiązania, powyższa pętla usunie wszystko i nie będzie nic do zebrania.)


Opcje wyrażenia regularnego przyjmują także modyfikatory wyrażenia regularnego (pisząc je bezpośrednio za ogranicznikiem zamykającym): tio.run/##K0otycxLNPz/…
Martin Ender

W rzeczywistości pozwala to całkowicie pozbyć się drugiego etapu: tio.run/##K0otycxLNPz/X1s/… (jakoś nie można go zastosować mz grupą tutaj, wygląda na to, że etap warunkowy nie propaguje opcji).
Martin Ender

Ach, oczywiście, zapętlić pętlę warunkową zamiast pętli warunkowej, która rozwiązuje błąd nieskończonej pętli w pierwszej wersji. Bardzo schludny!
Neil

5

Haskell , 71 bajtów

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

Wypróbuj online!

BMO zapisało 3 bajty za pomocą any null xelem""x.

Ørjan Johansen zapisał bajt za pomocą sum[1|b<-y,a==b]<2filter(==a)[y]==[a].

Wyjaśnienie

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.

Jeśli zgłoszenie błędu ( Prelude.head: empty list), gdy nie ma rozwiązania jest w porządku, |elem""x=""można je usunąć dla 61 bajtów .


1
Krótszy test:filter(==a)y==[a]
Ørjan Johansen

4

Rubinowy , 38 bajtów

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

Wypróbuj online!

Dzięki GB za wskazanie błędu.


Nie powiedzie się, jeśli nie ma dopasowania, a pierwszy ciąg nie jest najkrótszy.
GB

@GB Czy możesz podać przykład? Zmodyfikowałem mój ostatni test zgodnie z twoim opisem i zadziałało.
Kirill L.,

Spróbuj [„abc”, „ac”, „acd”]
GB

Teraz rozumiem, masz rację. Powinien zostać naprawiony.
Kirill L.,

4

Pyth , 6 bajtów

>1{I#C

Zestaw testowy.

Dane wyjściowe to lista singletonów, domyślnie dozwolona ; lista [] (pusta lista, fałsz) jest zwracana na wypadek, gdyby napis nie mógł zostać zaktywizowany .

Wyjaśnienie

> 1 {I # C - Pełny program.
     C - Transponuj dane wejściowe, przycinanie nieobecności.
    # - Filtruj według:
  {I - Niezmiennik w ramach deduplikacji.
> 1 - Wytnij na 1. listę [: 1] w Pythonie.

Pyth , 5 bajtów

Byłoby to ważne, gdyby zawieszenie się liczyło jako wartość fałszowania.

h{I#C

Zestaw testowy.


3

Haskell , 76 74 bajtów

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

Wypróbuj online! Zwraca ostatni prawidłowy ciąg wyszukiwania lub pusty ciąg, jeśli taki ciąg nie istnieje.


71 69 bajtów

Jeśli dozwolone jest zgłaszanie spójnego wyjątku jako wartości fałszowania:

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

Wypróbuj online! Zgłasza empty listwyjątek, jeśli nie znaleziono łańcucha, w przeciwnym razie zwraca pierwszy prawidłowy ciąg.

-2 bajty dzięki Ørjan Johansen


1
notElem x można skrócić do all(/=x).
Ørjan Johansen,

2

Galaretka , 7 bajtów

z0Q€fZḢ

Zwraca liczbę całkowitą 0, jeśli ciągi nie mogą zostać zaklinowane.

Wypróbuj online!

Jak to działa

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 bajtów

åτIⁿs↓µg

Uruchom i debuguj

Objaśnienie (rozpakowane):

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 bajtów

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

Wypróbuj online!

sapplyzwykle zwraca a, matrixgdy wszystkie length(FUN(X[[i]]))są równe, z wyjątkiem kiedy length(FUN(X[[i]]))==1, w którym to przypadku zwraca a vector. Aby skorzystać z operacji macierzowych, musimy przejść o substringjeden krok dalej niż musimy zagwarantować a matrix, i dlatego xrozszerza się na max(nchar(S)+1).

Następnie filtrujemy wiersze, które nie mają duplikatów i pustych ciągów. Ponieważ możemy zwrócić tylko jeden ciąg, bierzemy pierwszy, z wyjątkiem tego, że gdy nie ma wierszy spełniających kryteria, wyrzucilibyśmy błąd, więc dołączamy dodatkowy wiersz ""na końcu.

Następnie wypisujemy enklactciąg ified lub pusty ciąg.


2

R , 116 107 95 bajtów

R + pryr

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

Wypróbuj online!

baza R

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

Wypróbuj online!

Te dwa warianty oszczędzają 9 bajtów dzięki Giuseppe .

Wyjaśnienie:

To skutecznie obcina wszystkie użądlenia w wektorze vdo długości najkrótszego i iteruje kolejne indeksy. Następnie sprawdza, czy w wybranych literach są jakieś duplikaty, a jeśli nie, wkleja je ze sobą i drukuje cat. Jeśli wszystkie indeksy zwracają zduplikowane wyniki, drukuje pusty ciąg.
Wszystko zawinięte w anonimową pryrfunkcję z, breakaby zatrzymać pętlę, lub podstawowa funkcja R zerująca wektor, aby przerwać pętlę.


1
Niezłe! Można to zrobić w golfa do 107 bajtów w R+pryrlub 107 bajtów w bazie R.
Giuseppe

2

Japt, 9 bajtów

Pobiera dane wejściowe jako tablicę tablic znaków, zwraca tablicę znaków lub undefined

y æ_f eZâ

Wypróbuj (Dodaj nowy wiersz na początku programu z kodem, qR mqaby pobierać dane wejściowe jako oddzielny ciąg nowego wiersza, aby zaoszczędzić kłopotów z tworzeniem tablic.)


Wyjaśnienie

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

Wypróbowałem to wyzwanie, zanim przeczytałem twoje rozwiązanie i otrzymałem prawie identyczne rozwiązanie:z æ_¬eZ¬â
Nit

Dokładnie identyczny, inny niż format wejściowy.
Kudłaty

2

05AB1E , 7 bajtów

øʒDÙQ}н

Wypróbuj online!

Wyjaśnienie

ø        # Zip the input array
 ʒ   }   # Filter by ...
  DÙQ    # ... an entry is equal to itself deduplicated
      н  # Take the first element

1

Python 3 , 75 bajtów

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

Działa na listach znaków zamiast ciągów znaków. Zwraca False, jeśli nie istnieje prawidłowy ciąg enklaction.

Wypróbuj online!


Myślę, że to się powtarza, co spowodowałoby, że byłaby nieważna, chyba że f=jest uwzględniona w liczbie bajtów.
LyricLy,

@LyricLy Naprawiono :)
musicman523

1

C (gcc) , 161 bajtów

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

Wypróbuj online!

Każda pozycja znaku jest testowana pod kątem duplikacji i pomijana, jeśli zostanie wykryty duplikat; jest to kontynuowane aż do zakończenia najkrótszego ciągu. Niestety, tylko ASCII: ciągi DBCS / UTF-8 źle psują tę funkcję!



1

Japt , 12 bajtów

Zwraca undefinedłańcuchy niekliniczne.

y ·æ_¬n ä¦ e

Wypróbuj online!

Wyjaśnienie:

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)

Powinieneś być w stanie zaoszczędzić 2 bajty, przyjmując dane wejściowe jako tablicę tablic znaków i porzucając dwa splits.
Kudłaty

1

Wolfram Language (Mathematica) , 54 bajty

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

Wypróbuj online!

Pobiera na liście listę znaków, zwraca listę znaków. Zawiera U + F3C7, co odpowiada operatorowi „Transponuj”.

Zwraca #1i generuje wiele błędów, które można pominąć, gdy nie ma odpowiedniego ciągu.

Wyjaśnienie:

PadRight@#

Wprowadź dane wejściowe, aby każdy „ciąg” (lista znaków) miał tę samą długość. Dołącza liczby całkowite 0(nie ciągi "0"). Następnie dokonaj transpozycji.

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

Wybierz ciągi, które nie zawierają liczb całkowitych 0i wszystkie unikalne znaki.

#&@@

Zdobądź pierwszy.


1

JavaScript (ES6), 66 bajtów

Zwraca ciąg znaków lub undefinedjeśli nie ma rozwiązania.

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

Wypróbuj online!

Skomentował

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

Węgiel , 23 21 bajtów

-2 bajty dzięki @Neil !

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

Wypróbuj online!


Huh, kiedy a) qprzestał być ciągiem b) StringMap zaczął działać na nie-ciągach? W każdym razie twój Rangejest niepotrzebny, oszczędzając ci 2 bajty.
Neil

@ Nee a) Kiedy dodałem tablicę / obiekt wejściowy b)> _> nie jestem pewien. prawdopodobnie w czasie, kiedy naprawiłem pętlę while (przepraszam, zapomniałem wspomnieć o jednym z nich)
tylko ASCII

1

Łuska , 9 bajtów

ḟS=UḞz:∞ø

Wypróbuj online!

Wyjaśnienie

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

Użycie ←ġLTover Ḟz:∞øpowinno zaoszczędzić bajt.
ბიმო

1

Siatkówka , 81 56 bajtów

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

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

Wypróbuj online!

-25 bajtów dzięki @Neil


Transpozycja prostokątnego tekstu w siatkówce jest zaskakująco trudna.


Chciałbym znać lepszy sposób wykonywania prostokątnej transpozycji, ale w międzyczasie oszczędzam 25 bajtów .
Neil

@Neil Ahh ... etap ewaluacyjny. Zawsze zapominam, że Retina 1.0 ma te wszystkie fajne nowe funkcje
TwiNight

1

Perl 6 , 27 bajtów

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

Wypróbuj online!

Po zobaczeniu, że wersja ruby ​​została oceniona, skopiowałem podejście i użyłem list znaków zamiast ciągów znaków. Nie podoba mi się to

Moje starsze i bardziej poprawne zgłoszenie jest następujące:

Perl 6 , 38 bajtów

Podziel, rozpakuj, sprawdź niepowtarzalność, dołącz.

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

Wypróbuj online!


1

C (gcc) , 121 113 110 bajtów

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

Wypróbuj online!

Nie golfił

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 dzięki pułapce cat

Nadużywa to możliwości dodania 1 do wskaźnika łańcucha w C, aby uzyskać „ogon” łańcucha. Głównymi oszczędzającymi bajty są:

  • d+=x[y[i++]=*(*_)++]++który dołącza pierwszego znaku pierwszego ciąg _do y, postęp pierwszy ciąg _, aby usunąć swój pierwszy znak, dodaje się xwpis w tym charakterze do di przyrosty powiedział xwpis
  • q=d?*x:puts(y)który wypisuje, yjeśli djest niezerowy podczas ustawiania qwartości niezerowej, lub ustawia qna niezerowy, jeśli pierwszy element xjest niezerowy (gdybyśmy byli na końcu jednego z ciągów, wówczas wspomniany element byłby niezerowy zero)

Edycja: Ogolone bajty poprzez przełączenie z pętli while na rekurencyjne wywołanie ogona i usunięcie nawiasów z pętli for.


Zaproponuj for(d=i=0;*_;)zamiast for(d=0,i=0;*_;++_)i *(*_++)++]++;d=d?!*x*f(s)zamiast*(*_)++]++;d=d?*x?0:f(s)
ceilingcat

0

Pyth, 13 bajtów

e+kf{IT@.TQ.t

Wypróbuj tutaj

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
Wygląda na to, że zwrócenie listy wszystkich poprawnych ciągów znaków jest nieprawidłowe.
LyricLy,

@LyricLy Naprawiono.
Mnemoniczny

0

Czerwony , 139 bajtów

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

Wypróbuj online!

Wyjaśnienie:

Pobiera dane wejściowe jako blok (listę) ciągów znaków. Zwraca ciąg enklaction lub w noneinny sposób.

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 bajtów

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

Wypróbuj online!

-1 bajt dzięki kwakowi Krowy

Wyjaśnienie:

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

Słowo trykluczowe służy do odrzucania błędów, które występują, jeślii jest większy niż długość najmniejszego ciągu w alub brak odpowiedzi i headpowoduje błąd.


Możesz usunąć pareny, seqaby uratować bajt
Kritixi Lithos

@Cowsquack Thanks!
fergusq

0

Java 10, 106 bajtów

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

Daje błąd zamiast zwracania pustego ciągu, jeśli nie można znaleźć rozwiązania. Dane wejściowe są matrycą znaków.

Wypróbuj online.

Wyjaśnienie:

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

Wydawało się, że OP nie chce dopuszczać błędów, chociaż co prawda nigdy nie umieszcza go w samym poście.
Ørjan Johansen

0

Clojure, 59 bajtów

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

Zwraca listę list znaków.


0

APL + WIN, 35 33 bajtów

2 bajty zapisane dzięki Adámowi

Monity o wiersze tekstu jako macierz znaków:

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

Wypróbuj online! Dzięki uprzejmości Dyalog Classic

Wyjaśnienie:

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 

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.