Inspirado por esta cadeia de comentários ...
Quero
enklact
sair deste desafio, mas não posso ...@ETHproductions para enklact (v): para implementar uma tabela de pesquisa usando uma subseção que consiste em elementos exclusivos.
Enklacting é uma maneira muito útil de compactar uma tabela de pesquisa. Por exemplo, digamos que você tenha a seguinte lista de cores:
red
green
blue
yellow
purple
orange
Se você deseja pegar uma cor como entrada e retornar seu índice nesta lista, obviamente existe a maneira mais direta:
["red", "green", "blue", "yellow", "purple", "orange"].index(input())
Mas há uma maneira de fazer isso com menos bytes:
"rgbypo".index(input()[0])
Isso funciona porque o primeiro (ou 0'th) índice de cada seqüência de caracteres é exclusivo. Este exemplo é óbvio, mas às vezes é um pouco mais difícil. E se quiséssemos criar uma tabela de pesquisa para esta lista?
Sweet Onion Chicken Teriyaki
Oven Roasted Chicken
Turkey Breast
Italian BMT
Tuna
Black Forest Ham
Meatball Marinara
Nesse caso, não podemos fazer isso:
"SOTITBM".index(input()[0])
porque existem duas entradas diferentes que começam com a 'T'
, a saber "Atum" e "Turquia". Devemos olhar para um índice diferente. Se você olhar para o quarto índice de cada string, notará que eles são todos únicos. Para que possamos fazer isso ...
"enklact".index(input()[3])
Nesse caso, a "cadeia de caracteres de enklaction" é "enklact".
Isso nos leva ao desafio de hoje ...
Dada uma lista de cadeias, retorne qualquer cadeia de enklaction válida. Ou, em outras palavras, dada uma lista de cadeias, retorne qualquer nova cadeia em que cada letra seja única e a cadeia seja formada juntando a i-ésima letra de cada cadeia.
Se não houver uma sequência de enklaction válida, seu envio deverá retornar uma sequência vazia ou um valor de falsy consistente. Como de costume, funções ou programas completos são permitidos e os formatos de entrada / saída são permissivos (dentro do motivo).
Cada sequência conterá apenas ASCII imprimível e esse desafio diferencia maiúsculas de minúsculas.
Isso é código-golfe , então tente escrever o programa mais curto possível no seu idioma preferido!
Casos de teste
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:
""
Respostas:
Python3, 59 bytes
Retorna uma string com o enklact, None caso contrário
fonte
Python 2 ,
686761 bytesExperimente online!
Melhorias
Se a saída não tivesse que ser uma sequência:
Python 3 , 49 bytes
Experimente online!
fonte
max(`j`[2::5]for j in[""]+zip(*a)if len(set(j))==len(j))
funciona, para salvar um byte.Retina ,
4332 bytesExperimente online! Editar: salvou 11 bytes graças a @MartinEnder. Explicação:
Repita enquanto a entrada muda ...
... somente se uma linha estiver vazia ou duas linhas começarem com o mesmo caractere ...
... exclua o primeiro caractere de cada linha. Portanto, a repetição para se: a) todas as linhas começam com caracteres diferentes; nesse caso, a condição falha e a entrada não é alterada; ou b) pelo menos uma linha fica vazia; nesse caso, todos os caracteres são excluídos, Nesse ponto, a entrada para de mudar.
Colete o primeiro caractere de cada linha. (Se não houver solução, o loop acima terá excluído tudo e não haverá nada para coletar.)
fonte
m
a um grupo aqui, parece que o estágio condicional não propaga a opção).Haskell , 71 bytes
Experimente online!
O BMO salvou 3 bytes com
any null x
→elem""x
.Ørjan Johansen salvou um byte com
sum[1|b<-y,a==b]<2
→filter(==a)[y]==[a]
.Explicação
Se lançar um erro (
Prelude.head: empty list
) quando não houver solução estiver OK,|elem""x=""
pode ser apagado por 61 bytes .fonte
filter(==a)y==[a]
Ruby , 38 bytes
Experimente online!
Obrigado ao GB por apontar um bug.
fonte
Pitão , 6 bytes
Suíte de teste.
A saída é uma lista única, conforme permitido por padrão ; a lista [] (lista vazia, falsy) é retornada caso a sequência não possa ser enclatificada .
Explicação
Pitão , 5 bytes
Isso seria válido se a falha contasse como um valor falso.
Suíte de teste.
fonte
Haskell ,
7674 bytesExperimente online! Retorna a última sequência de pesquisa válida ou uma sequência vazia, caso não exista.
7169 bytesSe lançar uma exceção consistente como valor falso, é permitido:
Experimente online! Lança uma
empty list
exceção se nenhuma string for encontrada, retorna a primeira string válida caso contrário.-2 bytes graças a Ørjan Johansen
fonte
notElem x
pode ser reduzido paraall(/=x)
.Geléia , 7 bytes
Retorna o número inteiro 0 se as seqüências não puderem ser enklactificadas.
Experimente online!
Como funciona
fonte
Perl 5 , 61 bytes
Experimente online!
fonte
Stax ,
98 bytesExecute e depure
Explicação (sem embalagem):
fonte
R , 127 bytes
Experimente online!
sapply
normalmente retorna amatrix
quando todoslength(FUN(X[[i]]))
são iguais, exceto quandolength(FUN(X[[i]]))==1
, nesse caso, retorna avector
. Para usar as operações da matriz, precisamos desubstring
mais uma do que precisamos para garantir amatrix
, razão pela qual elax
se estendemax(nchar(S)+1)
.Em seguida, filtramos as linhas que não têm duplicatas nem seqüências de caracteres vazias. Como só podemos retornar uma única string, pegamos a primeira, exceto que, quando não houver linhas que atendam aos critérios, lançaríamos um erro; portanto, acrescentamos uma linha extra
""
ao final.Em seguida, imprimimos a
enklact
string ified ou a string vazia.fonte
R ,
11610795 bytesR + pryr
Experimente online!
base R
Experimente online!
Essas duas variantes economizam 9 bytes graças a Giuseppe .
Explicação:
Isso efetivamente trunca todas as picadas do vetor
v
no comprimento mais curto e itera pelos índices subsequentes. Em seguida, verifica se há duplicatas nas letras escolhidas e, se não, as cola e as imprimecat
. Se todos os índices retornarem resultados duplicados, isso imprimirá uma sequência vazia.Todos agrupados em uma
pryr
função anônima combreak
para interromper o loop ou a função R básica zera o vetor para interromper o loop.fonte
R+pryr
ou 107 bytes em base de R.Japonês, 9 bytes
Recebe a entrada como uma matriz de matrizes de caracteres, retorna uma matriz de caracteres ou
undefined
Experimente (adicione uma nova linha no início do programa com o código
qR mq
para receber a entrada como uma sequência separada de nova linha, para economizar o trabalho de criar as matrizes.)Explicação
fonte
z æ_¬eZ¬â
05AB1E , 7 bytes
Experimente online!
Explicação
fonte
Python 3 , 75 bytes
Opera em listas de caracteres em vez de cadeias. Retorna False se não houver uma sequência de enklaction válida.
Experimente online!
fonte
f=
esteja incluído na contagem de bytes.C (gcc) , 161 bytes
Experimente online!
Cada posição de caractere é testada para duplicação e pulada se uma duplicata for detectada; isso continua até que a corda mais curta termine. Infelizmente, é apenas ASCII: seqüências de caracteres DBCS / UTF-8 quebram muito essa função!
fonte
Japonês , 12 bytes
Retorna
undefined
para cadeias não enklactic.Experimente online!
Explicação:
fonte
split
s.Wolfram Language (Mathematica) , 54 bytes
Experimente online!
Pega uma lista da lista de caracteres como entrada, retorna uma lista de caracteres. Contém U + F3C7, correspondente ao operador "Transpose".
Retorna
#1
e gera um monte de erros ignoráveis quando não há uma string adequada.Explicação:
Coloque a entrada de forma que cada "sequência" (lista de caracteres) tenha o mesmo comprimento. Isso acrescenta o número inteiro
0
s (não a sequência"0"
s). Então transponha.Selecione as strings que não possuem um número inteiro
0
s e possuem todos os caracteres exclusivos.Pegue o primeiro.
fonte
JavaScript (ES6), 66 bytes
Retorna uma string ou
undefined
se não existe solução.Experimente online!
Comentado
fonte
Carvão ,
2321 bytes-2 bytes graças a @Neil !
Experimente online!
fonte
q
deixou de ser sempre uma string b) O StringMap começou a trabalhar em não-strings? De qualquer forma, vocêRange
é desnecessário, economizando 2 bytes.Casca , 9 bytes
Experimente online!
Explicação
fonte
←ġLT
overḞz:∞ø
deve salvar um byte.Retina ,
8156 bytesExperimente online!
-25 bytes graças a @Neil
Transpor texto retangular na Retina é surpreendentemente difícil.
fonte
Perl 6 , 27 bytes
Experimente online!
Depois de ver que a versão ruby foi votada, copiei a abordagem e usei listas de caracteres, em vez de strings. Eu não gosto disso
Meu envio mais antigo e mais correto é o seguinte:
Perl 6 , 38 bytes
Divida, feche, verifique a exclusividade, entre.
Experimente online!
fonte
C (gcc) ,
121113110 bytesExperimente online!
Ungolfed
-3 graças a ceilingcat
Isso abusa da capacidade de adicionar apenas 1 a um ponteiro de string em C para obter o 'rabo' da string. Os principais economizadores de bytes são:
d+=x[y[i++]=*(*_)++]++
que acrescenta o primeiro caractere da primeira sequência de_
ay
, avança a primeira sequência de_
para remover seu primeiro caractere, adiciona ax
entrada nesse caractere ad
e incrementa a referidax
entradaq=d?*x:puts(y)
que imprimey
sed
for diferente de zero ao definirq
um valor diferente de zero ou defineq
como diferente de zero se o primeiro elemento dex
for diferente de zero (se estivéssemos no final de uma das cadeias de caracteres, o referido elemento seria diferente de zero zero)Editar: bytes raspados alternando do loop while para a chamada de recursividade e removendo os colchetes do loop for.
fonte
for(d=i=0;*_;)
vez defor(d=0,i=0;*_;++_)
e em*(*_++)++]++;d=d?!*x*f(s)
vez de*(*_)++]++;d=d?*x?0:f(s)
Pitão, 13 bytes
Experimente aqui
fonte
Vermelho , 139 bytes
Experimente online!
Explicação:
Toma a entrada como um bloco (lista) de strings. Retorna a sequência de enklaction ou
none
outra.fonte
Röda ,
8077 bytesExperimente online!
-1 byte graças ao vacas charlatão
Explicação:
A
try
palavra-chave é usada para descartar erros que ocorrem sei
for maior que o comprimento da menor stringa
ou se não houver resposta ehead
causar um erro.fonte
seq
para salvar um byteJava 10, 106 bytes
Irá gerar um erro em vez de retornar uma String vazia se nenhuma solução puder ser encontrada. Entrada é uma matriz de caracteres.
Experimente online.
Explicação:
fonte
Clojure, 59 bytes
Retorna uma lista de listas de caracteres.
fonte
APL + WIN,
3533 bytes2 bytes salvos graças a Adám
Solicita as linhas de texto como uma matriz de caracteres:
Experimente online! Cortesia de Dyalog Classic
Explicação:
fonte
⊂[1]
→,⌿