Qual é a maneira mais curta de ver se uma entrada é um wordinian usando alguma linguagem de programação?
Um wordinian é uma palavra que contém palavras com o comprimento 1 em relação ao comprimento da palavra original. Por exemplo,
bin
'I' é uma palavra
'in' é uma palavra
'bin' é uma palavra
Ou,
palco
'a' é uma palavra
'ta' é uma palavra ( sim é )
'age' é uma palavra
'stag' é uma palavra
'stage' é uma palavra
Entrada
Seu código deve incluir uma palavra e um dicionário como entradas, em qualquer formato razoável.
Saída
A saída deve ser um valor para indicar verdadeiro ou falso, para nos dizer se a palavra é um wordinian.
Para mais informações sobre wordinians clique aqui .
Aqui está uma lista de palavras que usarei como entradas e subpalavras. Além disso, em resposta ao @xnor, ele deve conter subpalavras de cada tamanho, não uma cadeia de subpalavras. Observe que apenas uma palavra será usada como entrada.
fonte
Respostas:
Pitão,
2016151311 bytesAgradecimentos a Leaky Nun por salvar 4 bytes! Infelizmente, mudei todo o método depois, mas ainda ajudou.
Espera entrada como dicionário seguido por palavra. Saídas True ou False.
Experimente aqui!
Explicação:
Isso não funciona se a sequência vazia
""
for uma palavra válida.fonte
.E
pode ser substituído pors
m}kH
pode ser substituído por}RH
Python, 52 bytes
Uma função anônima que leva uma palavra
w
e dicionáriod
. Ele pega as palavras emd
que são substrings dew
, forma um conjunto de seus comprimentos e depois verifica se há tantos comprimentos distintos quanto as letrasw
.fonte
[
vez de{
.{...}
é uma compreensão de conjunto (o mesmo queset([...])
).Python 3, 108 bytes
Uma função anônima que recebe entrada, via argumento, de uma palavra
w
como uma sequência e um dicionáriod
como uma lista de sequências e retornosTrue
ouFalse
.Como funciona
O primeiro passo é uma compreensão de lista que gera uma lista de listas de todas as substrings de
w
exclusãow
, agrupadas por comprimento. Por exemplo, para'stage'
, a lista[['s', 't', 'a', 'g', 'e'], ['st', 'ta', 'ag', 'ge'], ['sta', 'tag', 'age'], ['stag', 'tage']]
é gerada. Isso é obtido fazendo um loop sobre todos os índices de início válidosi
para cada comprimento de substrings
e dividindo cadas
substring de comprimento usandow[i:i+s]
. Para cada lista nesta lista, a presença de cada substring no dicionário é verificada; chamandoany
retorna um acerto se pelo menos uma correspondência para um determinado comprimento for encontrada. Por fim, a chamadaall
verifica se uma correspondência foi encontrada para todos os comprimentos de substring e o resultado disso é retornado.Experimente no Ideone
fonte
Ruby, 44 bytes
w[x]&.size
:)É uma função anônima que leva uma palavra
w
e um dicionário (matriz de palavras)d
. Cria duas matrizes: a primeira contendo os números 1 até e incluindo o comprimento dew
; A segunda matriz éd
com cada palavra mapeada para seu tamanho, se for uma substringw
, caso contrárionil
. Em seguida, define a subtração para verificar se a segunda matriz contém todos os elementos da primeira matriz.fonte
w[x]&.size==i
vez dex.size==i&&w[x]
.uniq
e-[p]
e usando o conjunto subtração vez:[*1..w.size]-d.map{...}==[]
PowerShell
v3 +v2 +,1271107065 bytes(Vejo agora que minha abordagem é semelhante à @ xnor, embora eu a tenha desenvolvido independentemente)
Leva a palavra
$a
e o dicionário de entrada$d
, esperando$d
como uma matriz (veja exemplos abaixo).$d
Faz um loop na totalidade e executa aWhere-Object
para extrair as entradas em que a palavra atual$_
é uma expressão regular em-match
relação à palavra de entrada$a
(ou seja, a palavra atual é uma subcadeia da palavra de entrada).Coletamos todas essas palavras de substring e as colocamos
Select-Object
nolength
parâmetro e na-U
restrição nique. Isso extrairá os comprimentos exclusivos de cada substring. Por exemplo, para a palavra de entradacomb
, será uma matriz de(4,2)
para('comb','om')
.Pegamos a
.count
matriz resultante e a comparamos com a palavra de entrada.length
. Se for igual a, significa que todo comprimento de substring está no dicionário; caso$TRUE
contrário, estamos perdendo pelo menos um$FALSE
. Esse valor booleano é deixado no pipeline e a saída é implícita.NB - Isso deve funcionar na v2 +, pois o
-in
operador não está mais presente, mas eu não testei essa versão.Exemplos
fonte
Perl, 86 bytes
Requer
-E
sem custo extra.Aceita todas as entradas via STDIN. A primeira entrada é a palavra alvo, o restante da entrada é o dicionário. Imprime
1
com sucesso, seqüência vazia em caso de falha.Uso
fonte
Mathematica, 90 bytes
Usa o built-in do Mathematica
DictionaryWordQ
.Receber a entrada
d
como dicionário é 5 bytes mais curto, mas muito mais lento para listas longas:fonte
MATL , 15 bytes
1 byte salvo usando uma ideia da resposta do @ xnor .
Saídas
1
ou0
para verdade ou falsidade.Experimente online!
fonte
Perl,
42bytesInclui +2 para
-p0
Dê a palavra seguida pelo dicionário no STDIN:
(Ao testar no unix, verifique se o dictionary.txt usa
\n
como terminador de linha, não\r\n
)wordinian.pl
:fonte
JavaScript (Firefox 30-57), 68 bytes
O uso de uma compreensão de gerador evita a criação de uma matriz intermediária. Versão ES6 de 73 bytes:
fonte
05AB1E , 8 bytes
Word como primeira entrada, lista de dicionário como segunda entrada.
Experimente online ou verifique mais alguns casos de teste .
Explicação:
fonte
Kotlin , 51 bytes
Experimente online!
fonte
SQF , 147 bytes
Usando o formato de função como um arquivo:
Ligue como:
["WORD", DICTIONARY] call NAME_OF_COMPILED_FUNCTION
Ungolfed:
fonte