Introdução
De acordo com o post de Rand Al'Thor no Puzzling SE, uma palavra muito unida é qualquer palavra que contenha três letras alfabeticamente consecutivas (em qualquer ordem).
Palavras como educação , foghorn e cabaré são consideradas palavras muito unidas, enquanto palavras como aprender , klaxon e performance não são palavras muito unidas.
Desafio
O desafio é codificar golfe um programa capaz de receber uma única palavra como entrada (em minúscula assumida, para todos os efeitos) e retornar a saída que (se disponível) lista todos os conjuntos de letras consecutivos (também em minúscula) se é uma palavra unida e saída vazia se não for uma palavra unida.
Exemplos
Input: education
Output: cde
Input: foghorn
Output: fgh
Input: cabaret
Output: abc
Input: hijacking
Output: ghi, hij, ijk
Input: pneumonia
Output: mno, nop
Input: klaxon
Output: <<no output>>
Input: perform
Output: <<no output>>
Input: learning
Output: <<no output>>
Regras
- Enquanto a entrada deve ser assumida como uma única palavra em minúscula e a saída em minúscula, a natureza da saída varia de acordo com a escolha do idioma de codificação. Selecione uma forma de saída que melhor se adapte à natureza do desafio, seja STDOUT, saída de arquivo, matriz, etc.
- Por se tratar de código-golfe, será o caso do menor número de bytes que será o vencedor.
- Sem brechas tolas .
- Não aceitarei respostas que tenham as letras consecutivas em ordem não alfabética ... Portanto
cab
, não será considerado uma saída adequadacabaret
, por exemplo. - Nota especial, enquanto os "trigêmeos" não precisam necessariamente estar em ordem alfabética, mas os caracteres contidos nos trigêmeos devem estar ... portanto, no caso da palavra "desempenho", por exemplo, a saída
mno,nop
será aceita, como vontadenop,mno
. No caso da palavra "seqüestro", há seis maneiras que os trigêmeos deghi
,hij
eijk
podem ser organizados em uma lista, e todas as seis permutações são aceitáveis como saída.
Fora isso, em suas marcas, prepare-se, golfe!
!
E com outra palavra, como a atual dá o mesmo resultado :-)pneumonia
pode ser[('m','n','o'),('n','o','p')])
?Respostas:
05AB1E ,
765 bytesCódigo:
Explicação:
Usa a codificação CP-1252 . Experimente online!
fonte
Python 3.5, 68 bytes
Imprime as seqüências de saída e termina com erro quando o valor do caractere fica muito grande.
Gera todas as seqüências de três consecutivas e imprime aquelas que são um subconjunto da palavra de entrada.
fonte
Pitão -
111087 bytesMétodo de força bruta super.
Conjunto de Teste .
fonte
Geléia , 7 bytes
Este é um link monádico. Experimente online!
Como funciona
fonte
JavaScript (ES6),
9590 bytesValores ausentes concatenam como
undefined
, portanto, a sequência resultante contém mais de 3 caracteres. Peguei emprestado o!c[3]
truque do @ETHproductions para economizar 5 bytes.fonte
undefined
é uma palavra muito unida;)parseInt(c,36)
invés dec.charCodeAt()
?parseInt
no código de golfe.Python 3.5, 78 bytes
fonte
PHP, 100 bytes
recebe entrada como argumento de linha de comando; imprime uma vírgula à direita. corra com
-r
.fonte
for($s=join(range(Z,z));$a=substr($s,++$i,3);)
é uma maneira mais curta de criar $ a. É certo que verifica um monte de pontuação e também algumas séries de 2 caracteres, mas como a entrada é apenas em letras minúsculas e requer que encontre 3 caracteres, o que é bom.for($a="
ab ", $ i = 98; $ i <123;)! strstr (count_chars ($ argv [1], 3), $ a = substr ($ a, 1) .chr (++ $ i)) ?: print "$ a,"; `economiza 2 bytes. Maneira muito legal, tentei outras maneiras em PHP, mas não consigo acessar os bytes do seu código. Não sei se você precisa de um espaço após a vírgulaC,
175174 bytesrecuado:
Ao fazer a classificação, substitui valores duplicados por 0s, esses 0s são classificados no início da palavra. Procurar os valores consecutivos é então trivial.
fonte
MATL , 13 bytes
Experimente online!
fonte
Haskell, 48 bytes
Gera todos os triplos de três caracteres consecutivos, pega aqueles que usam apenas letras na entrada.
53 bytes:
A lista
['c'..]
contém todos os caracteres unicode a partir de então'c'
. A compreensão da lista os[[pred$pred c..c]|c<-['c'..]]
transforma em todas as seqüências de caracteres de 3 caracteres consecutivos a partir de então"abc"
. Retrocedemos com em[pred$pred c..c]
vez de avançar com[c..succ$succ c]
para evitar um erro ao assumir o sucessor do caractere unicode mais alto.Esses triplos são filtrados para aqueles que usam apenas letras na entrada.
fonte
Perl, 36 bytes
Inclui +1 para
-n
Dê entrada no STDIN:
Apenas o código:
fonte
T-SQL, 153 bytes
Tive que reagir ao comentário do WallyWest, já que fazia muito tempo desde a última resposta do TSQL. A resposta foi parcialmente inspirada na resposta de Brian J
Golfe:
Violino
Ungolfed:
fonte
Haskell,
636052 bytesExemplo de uso:
f "hijacking"
->["ghi","hij","ijk"]
.scanr(:)"_"['a'..]
cria uma lista com as caudas da lista de todos os caracteres unicode começando com'a'
e deixa terminar com a'_'
, ie["abcde...\1114111_", "bcde...\1114111_", "cde...\1114111_", ..., "\1114109\1114110\1114111_", "\1114110\1114111_", "\1114111_", "_"]
. Em seguida, pegamos até três caracteres de cada string e o vinculamosx
. Mantenha tudox
onde todas as letras estão no parâmetro de entradaw
.Edit: @xnor salvou
37 bytes. Obrigado!fonte
a:b:c:_
com um padrão @?'z'
limite superior e deixá-lo tentar todos os caracteres.take
e remover a string vazia:f w=[x|x<-init$take 3<$>scanr(:)""['a'..],all(`elem`w)x]
scanr
com "." em vez de""
e omita oinit$
.T-SQL (SQL Server 2014), 217 bytes
Golfe
Uso
Primeiro, declare a variável @a como um caractere de algum tipo e atribua a entrada da seguinte maneira
Não contei a declaração como parte do meu código, mas não encontrei um padrão sql para entrada, por isso estou disposto a alterar minha contagem
A saída será uma linha para cada triplo ou nenhuma linha se a palavra não estiver unida
Ungolfed
fonte
R, 220 bytes
Minha solução é bem direta. Ele percorre as três combinações possíveis de letras, percorre e verifica os caracteres da sequência inserida nas três letras consecutivas e as adiciona a uma sequência. A sequência é impressa apenas quando três letras são encontradas (c == 4).
entrada / saída
fonte
Python 3.5,
114111888079 bytes:Uma função lambda anônima. Recebe a entrada como uma sequência maiúscula e gera uma matriz de tuplas, com as preenchidas com três caracteres maiúsculos representando todos os conjuntos de
3
letras consecutivas que aparecem na entrada. Por exemplo,seria a saída para entrada
HIJACKING
. Este formato de saída foi confirmado como bom pelo OP. Então, tem o único formato de entrada em maiúsculas. No entanto, se você quiser inserir apenas letras minúsculas, substitua-asrange(65,91)
porrange(97,123)
, adicionando mais um byte.Repl.it com todos os casos de teste!
Explicação:
Basicamente, o que está acontecendo aqui é:
Uma lista,
W
é criada usandoW=[*map(chr,range(65,91))]
, que contém todas as letras maiúsculas no alfabeto inglês. Por esse motivo, sempre é necessária uma entrada em maiúscula .Para cada tupla,
i
em uma lista que chamaremosU
, contendo as três tuplas de letras consecutivas, ou seja:criado por
zip(W,W[1:],W[2:])
, cada umi
é totalmente adicionado à lista de saída, desde que todos os elementos na versão definida dei
({*i}
) estejam na versão definida de inputX
({*X}
), ou seja{*X}>={*i}
, sejaX
um superconjunto dei
. Caso contrário, a versão vazia dei
(()
) será adicionada à lista.Depois que todas as tuplas forem concluídas com as correspondências totalmente adicionadas, a lista será retornada como saída final.
fonte
Scala, 59 bytes
Ungolfed:
Explicação:
fonte
Na verdade, 13 bytes
Sugestões de golfe são bem-vindas. Experimente online!
Ungolfing
fonte
Java 7, 230 bytes
Provavelmente isso pode ser jogado, mas o desafio foi muito mais difícil do que eu pensava em Java ..
Casos não testados e de teste:
Experimente aqui.
Saída:
fonte
PowerShell v2 +, 93 bytes
Parece muito mais tempo do que o necessário, mas não consigo jogar mais.
Recebe entrada
$n
. Loops de97
a120
, construindo cadeias de três letras contíguas - ou seja, até o|?
, teremosabc
,bcd
,cde
, etc. no pipeline. Então, isso é alimentado por umWhere-Object
(the|?
) para retirar apenas os itens em que a cláusula é verdadeira. Aqui, a cláusula é 1) a string de entrada$n
, convertida emchar
-array,sort
ed eselect -u
nique'd, depois-join
ed de volta em uma string, 2)-match
ed contra as strings de três letras (ou seja, correspondência de expressões regulares). Se for uma correspondência, a sequência de três letras estará na palavra e será filtrada através do|?
. Os resultados são deixados no pipeline e a saída está implícita.Exemplos
(Observe que aqui a saída é separada por espaço, pois estamos restringindo a saída por concatenação.)
fonte
Retina,
10656 bytesDesduplicar, Classificar. Adicionar
abc
. Descubra se a substring foi encontrada e, se houver, acrescente. Traduzir para a próxima substring. Repetir. Em seguida, remova as duas primeiras linhas.Experimente online
Solução ingênua:
Desduplicar, Classificar e gerar correspondências sobrepostas de 3 letras seqüenciais.
Experimente online
fonte
JavaScript (Firefox 48), 93 bytes
Isso se presta a uma versão ES6 de 96 bytes :
Como funciona
O primeiro pedaço principal da função é este:
new Set(string)
cria um objeto Set que contém um de cada caractere exclusivo na string. Por exemplo,new Set("foghorn")
retornaráSet ["f", "o", "g", "h", "r", "n"]
. Podemos converter isso em um array com[... ]
, e depois classificá-lo com o incorporado.sort()
. Isso se"foghorn"
transforma["f", "g", "h", "n", "o", "r"]
.O próximo passo é este:
Isso mapeia cada personagem
c
noa
raio para o personagem concatenado com os dois itens depois. Por exemplo["f", "g", "h", "n", "o", "r"] => ["fgh", "ghn", "hno", "nor", "orundefined", "rundefinedundefined"]
,. (Elesundefined
aparecem quando você tenta acessar um membro inexistente da matriz.A etapa final é filtrar:
Primeiro,
!c[3]&
é excluir todas as strings que contêmundefined
. Isso é necessário porque um bug faz com que o seguinte algoritmo conte, por exemplo,gmundefined
como um trigêmeo consecutivo.Todas as seqüências de caracteres de três caracteres consecutivos, quando interpretadas como números de base 36, são 38 módulo 1333. Descobri isso pelo seguinte cálculo:
Portanto, se uma sequência de três caracteres for 38 mod 1333 na base 36, os três caracteres serão consecutivos no alfabeto.
Snippet de teste
Mostrar snippet de código
fonte
gem
emage
.!c[3]
truque que reduziu minha resposta ES6 ao tamanho da sua resposta anterior, então agora estou superando a sua resposta do Firefox 30+. Me desculpe por isso.Raquete 237 bytes
Teste:
Saída:
Versão detalhada:
fonte
Ruby , 50 bytes
each_cons(3)
obtém todas as sublistas consecutivas de comprimento 3 do alfabeto e?a..?z
, em seguida, usee&s.chars==e
para selecionar apenas aquelas que possuem todos os caracteres na sequência de destino usando a interseção setwise. Retorna uma lista de listas.Experimente online!
fonte
[R], 110 bytes
Tenho certeza que ainda é jogável
fonte
Japonês ,
109 bytesExperimente ou execute todos os casos de teste
fonte