Objetivo:
Dada uma matriz de cadeias, crie versões abreviadas de cada cadeia.
Especificação:
Para esse desafio, uma abreviação é os primeiros N caracteres de uma sequência. Para a cadeia abc
: a
, ab
, e abc
são todas as abreviaturas válidas, enquanto bc
, e ac
não são.
Dada uma matriz de cadeias, queremos encontrar o menor conjunto de abreviações, de modo que, dada a entrada e qualquer abreviação, você possa determinar a qual item da entrada a referência se refere.
Exemplo:
Entrada: ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
Trabalhamos o nosso caminho através das cordas, começando pela primeira.
Monday é apenas a sequência de itens com um
M
, portanto, a menor abreviação possível éM
.Terça começa com
T
, mas quinta-feira também. Isso significa que tentamos a stringTU
. Como nenhuma outra string começa com isso, usamosTU
.Quarta é
W
, quinta éTh
e sexta éF
.
Mais exemplos:
Input: "one,two,three,four,five,six,seven"
Output: "o,tw,th,fo,fi,si,se"
Input: "red,orange,yellow,green,blue,purple"
Output: "r,o,y,g,b,p"
Input: "a,ab,abc"
Output: Not valid! No abbreviation for `a` that doesn't apply to the other items.
Notas:
Você faz entrada e saída de qualquer maneira razoável.
Você pode assumir que a entrada sempre será uma matriz válida de strings.
Você pode assumir que sempre haverá uma solução, diferente do último caso de teste.
As strings consistem apenas em ASCII imprimível (ou nos caracteres imprimíveis na sua codificação)
Isso é código de golfe, e o menor número de bytes ganha!
U
para terça-feira, mas uma minúsculah
para quinta-feira.Respostas:
Retina , 29 bytes
Entrada e saída são listas de sequências separadas por avanço de linha.
Experimente online! (Conjunto de testes com separação por vírgula por conveniência.)
Explicação
Isso simplesmente combina todos os prefixos com um único regex e os imprime (
!
).m
es
são os modificadores de regex comuns para fazer o^
início da linha de.
correspondência e os feeds de linha.fonte
Python 2 ,
8786 bytesExperimente online!
fonte
lambda a:[[b[:i]for i in range(len(b))if sum(s[:i]==b[:i]for s in a)<2][0]for b in a]
para 85 byteslen(b)
com4**8
poupa mais 2 bytes, assumindo que as cordas não será mais do que 65536 caracteresJavaScript (ES6),
81787470 bytesRecebe entrada como uma matriz de seqüências de caracteres.
Formatado e comentado
Casos de teste
Mostrar snippet de código
fonte
reduce
.Gelatina , 14 bytes
Experimente online!
Como funciona
fonte
Haskell , 48 bytes
Experimente online!
f
é a função principal, pegando uma lista de seString
retornando aString
. Sua definição é um atalho monádico paraf a=map (a#) a
.a#x
examina a cadeia de caracteresx
e a listaa
e tenta encontrar o prefixo mais curto dox
qual é únicoa
. Sea
tiver um único elemento, basta usar a string vazia. Sea
ainda não é um elemento único, retire o primeiro caractere dex
, filtre e remova os elementos dea
começar com o mesmo caractere, e recorra novamente.fonte
Mathematica, 64 bytes
fonte
Geléia ,
1412 bytesExperimente online!
Como funciona
fonte
C ++ 11 (MinGW), 198 bytes
Ligue para:
Adicionar
void
identificador antes da função também deve compilar em outros compiladores, adicionando assim 5 bytes ao comprimento.fonte
void f...
, não funciona de outra forma ... + 5 bytes, infelizmente. Funções, tanto quanto eu sei, precisa digitar especificadores em C ++Javascript ES6, 70 caracteres
fonte
PHP,
131 120 119118 bytesObrigado @ Jörg por
preg_grep
.recebe entrada de argumentos de linha de comando; imprime os resultados uma linha cada.
Corra com
-nr
ou experimente online .-
.+15 bytes para corrigir: substitua o segundo
$argv
porarray_slice($argv,1)
.a&
por""<
(+1 byte) para corrigir.insira
&($t.=$c)
antes&&
e substitua". preg_quote($t.=$c)."
por$t
.demolir
versão não regex,
131130 bytesSubstitua o primeiro e o último
a&
por""<
(+2 bytes) para corrigir o PHP 7.1.demolir
nota completamente desinteressante:
strstr($u,$t)==$u
e0===strpos($u,$t)
tem o mesmo comprimento e o mesmo resultado.fonte
0x0A
) em vez de\n
, ele salvará um byte;).PHP, 127 bytes
não funciona com matrizes inválidas
PHP, 132 bytes
Versão Online
151 bytes suporta caracteres especiais
PHP, 140 bytes
fonte
preg_quote
fazer apenas 10 Bytes mais0
. Mas você pode salvar um byte com$i=+$s=""
.count()-count()
material: a entrada é garantida como válida (-21 bytes). Eu acho que eu poderia consertar e jogar golfe com até 120 bytes.$_GET
foi uma boa ideia!Clojure, 118 bytes
Isso funciona em prefixos até o comprimento,
1e2
mas a mesma contagem de bytes pode suportar até1e9
.i
loops comprimentos de prefixos,S
é a sequência de substrings de comprimentoi
. O últimofor
substitui as substrings pelasnil
quais ocorrem mais frequentemente do que uma vez. A redução mantém o primeiro valor não nulo para cada sequência, uma pena queor
não é uma função, então tive que envolvê-la.Na verdade, isso retorna listas de listas de caracteres como
((\M) (\T \u) (\W) (\T \h) (\F))
, mas acho que é aceitável. Clojure é bastante detalhado com strings esubs
jogariaStringIndexOutOfBoundsException
diferentetake
.Exemplos completos:
fonte
SQL (sabor PostgreSQL 9.4), 219 bytes
Agora, a resposta mais longa :) Eu não acho que isso possa superar o Java. Vou tentar economizar um pouco mais disso. Esperando me livrar de uma das consultas aninhadas, mas não gostei das minhas chances.
Isso pressupõe que há uma tabela que contém as seqüências de caracteres a serem trabalhadas. Como se trata de SQL, não é garantido que a ordem do retorno seja igual à ordem da tabela e, nesse caso, improvável. Se este for um problema, eu excluirei.
Explicação do SQL Fiddle
A consulta mais interna usa
generate_series
e umaLATERAL
junção para criar linhas para a sequência dividida em comprimentos crescentes, para que 'one' se torne 'o', 'on', 'one'. O número de caracteres no retorno também é mantido.Em seguida, adicionamos o número de registros que têm o mesmo resultado. Por exemplo, 'f' de quatro e cinco tem 2, mas 'fo' e 'fi' têm cada um. A
OVER
declaração no SQL pode ser bastante poderosa.COUNT(*)
seria a maneira usual, masSUM(1)
dá o mesmo resultado.Em seguida, classificamos os resultados para cada entrada com base no mínimo de repetições e caracteres.
ROW_NUMBER
funcionaria aqui também, mas é mais longo.Finalmente, selecionamos o número mais baixo para cada palavra.
fonte
Pure Bash , 146 bytes
Experimente online!
fonte
APL (Dyalog) , 27 bytes
Experimente online!
{
uma função anônima, onde ⍵ representa o argumento ...∘.(
uma tabela de funções em que a função é⊃
o primeiro elemento de⍷
a lista booleana "argumento esquerdo começa aqui no argumento certo?")
onde os argumentos certos são⍵
os argumentadores(
e o argumento da esquerda é↑
uma tabela com linhas consistindo em,/
prefixos de¨
cada um⍵
os argumentos+/
soma entre (conta quantos dos argumentos estão com esse prefixo)↓
dividir tabela em lista de linhas⍳⍨¨
em cada um, encontre a localização do primeiro1
um (ou seja, o primeiro prefixo que apenas encabeça um argumento)↑¨⍨
para cada local, leva muitos caracteres do elemento correspondente de⍵
o argumento}
fim da função anônimafonte
PowerShell,
151139 bytesInteressado se existe uma maneira melhor de fazer isso. Tinha que usar um
foreach
(sobre um|%
) para poder executar umbreak
no loop aninhado sem rotulá-lo.Edit: 2 golfe no AdmBorkBork
fonte
-notin
em vez de-not$x.contains($a)
e!($w...
em vez de-not($w...
salvar alguns bytes, sim?APL, 26 bytes
Explicação:
↓↑⍵
: insira cada sequência⍵
para corresponder ao comprimento da sequência mais longa∘.(
...)⍨
: para cada par possível de strings, encontre o prefixo compartilhado:≢
: desigualdade de matriz∧
: e=
: igualdade item a item∧\
: and-scan (mantenha apenas as correspondências principais)+/¨
: soma cada vetor na tabela, fornecendo o comprimento dos prefixos compartilhados⌈/
: encontre o valor máximo em cada coluna1+
: adicione um, fornecendo a quantidade de caracteres necessária para manter cada sequência única⍵↑¨⍨
: pegue tantos caracteres de cada stringTeste:
fonte
Q, 93 bytes
Resolvido recursivamente, recebe a string como entrada, obtém os primeiros n elementos de cada string com cada recursão. Se algum desses elementos não for exclusivo, ele será substituído pelos primeiros n + 1 elementos.
fonte