Uma palavra portmanteau é uma combinação de duas palavras que participam de cada palavra e as transformam em uma única palavra nova. Por exemplo, leão + tigre => liger .
Vamos escrever um programa para gerar portmanteaus a partir de um par de palavras de entrada. Os computadores não são os melhores em inglês; portanto, precisamos estabelecer algumas regras para garantir que os portmanteaus de saída sejam agradáveis aos olhos e aos ouvidos.
(Os exemplos aqui são mostrados com um separador entre o prefixo e o sufixo para maior clareza:. li|ger
No entanto, as saídas reais do programa não devem ter um separador:. liger
)
- Cada portmanteau consistirá em um prefixo não vazio da primeira palavra concatenado em um sufixo não vazio da segunda palavra: sim para
li|ger
, não para|iger
. - Se o prefixo terminar com uma vogal, o sufixo deverá começar com uma consoante e vice-versa: sim para
lio|ger
oul|er
, não paralio|iger
oul|ger
. Você pode decidir se contay
como vogal ou consoante. Sua solução deve escolher uma opção e permanecer com ela, no entanto. - A palavra resultante não deve conter nenhuma das palavras originais na íntegra: sim para
lio|ger
, não paralion|iger
ouli|tiger
.- Essa regra é válida mesmo que a parte em questão seja formada por partes de ambas as palavras: com a entrada de
two
+words
, a saídatw|ords
ainda é ilegal porque contém a substringwords
. (A única saída válida para esse par seriat|ords
.)
- Essa regra é válida mesmo que a parte em questão seja formada por partes de ambas as palavras: com a entrada de
Seu programa ou função deve ter duas palavras e gerar / retornar uma lista de todos os portmanteaus agradáveis que podem ser formados a partir dessas palavras nessa ordem.
Detalhes
- Aplicam-se métodos de entrada e saída padrão . As brechas padrão são proibidas.
- As palavras consistirão apenas em letras minúsculas (ou, se preferir, apenas em letras maiúsculas).
- Você pode usar as duas palavras de entrada como uma lista, tupla, duas entradas separadas, uma única sequência de caracteres com um delimitador sem letra, etc.
- O formato de saída é igualmente flexível; se você retornar ou gerar uma string, ela deverá ser delimitada de forma que fique claro onde uma palavra do portmanteau termina e a seguinte começa.
- Não deve haver delimitadores dentro de uma palavra portmanteau.
- Tudo bem se sua lista de saída incluir resultados duplicados; também é bom remover duplicatas.
Casos de teste
> lion, tiger
< liger, ler, liger, lir, lioger, lior
> tiger, lion
< tion, ton, tin, tigion, tigon, tigen
> spoon, fork
< sork, spork, spork, spok, spoork, spook
> smoke, fog
< sog, smog, smog, smokog
> gallop, triumph
< giumph, gumph, gariumph, gamph, gaph, gah, galiumph, galumph, galliumph, gallumph, galloriumph, gallomph, galloh
> breakfast, lunch
< bunch, brunch, brench, brech, breh, breanch, breach, breah, breakunch, breakfunch, breakfanch, breakfach, breakfah, breakfasunch
> two, words
< tords
> harry, ginny (if y is treated as a consonant)
< hinny, hanny, hany, hay, harinny, harrinny
> harry, ginny (if y is treated as a vowel)
> hinny, hy, hanny, hany, harinny, hary, harrinny
Solução de referência
Aqui está uma solução de referência no Pip (trata y
como uma consoante).
Este é o código-golfe : a resposta mais curta em cada idioma vence!
fonte
Respostas:
05AB1E , 28 bytes
y
é uma vogal (mesmo número de bytes que consoante).Experimente online! ou como um conjunto de testes ligeiramente modificado
fonte
ʒs¢Z_
;ʒsåO_
;ʒsм__
; etc.Retina , 72 bytes
Experimente online!
fonte
Lw$`(?<=[aeiou])(.+),(.+)(?<!^\2\1,\2)(?!\1)(?=[^aeiou])|(?<=[^aeiou])(.+),(.+)(?<!^\4\3,\4)(?!\3)(?=[aeiou])
mas não conseguia me concentrar em jogar golfe por causa de uma dor de cabeça.(?=.(?<=[aeiou]\1[^aeiou]|[^aeiou]\1[aeiou]))
e precisando, provavelmente, de pelo menos seis iterações para chegar até onde está agora.^
s no meu comentário anterior são errôneos) Na verdade, eu nunca teria pensado nesse()|.()
truque, provavelmente teria paradoLw$`(?<=([aeiou])|.)((.+),(.+))(?<!\4\2)(?!\3)(?=(?(1)[^aeiou]|[aeiou]))
.Pitão , 38 bytes
Entrada é uma lista das duas palavras, e y não é tratado como uma consoante.
Experimente on-line aqui ou verifique todos os casos de teste de uma vez aqui .
fonte
Java 8,
228225215 bytesPega duas Strings na sintaxe de curry e retorna uma String. Trata
y
como uma consoante. Experimente online aqui .Graças ao DLosc por jogar 2 bytes.
Ungolfed:
fonte
Japonês , 32 bytes
Intérprete Japt
Economizou 10 bytes graças ao entendimento mais claro de Shaggy da sintaxe de Japt.
8 bytes salvos devido a um novo recurso de idioma
Economizou 2 bytes graças a algumas sugestões da ETHproductions
A versão mais recente do Japt introduziu a função Produto Cartesiano, que salvou alguns bytes e me permitiu restaurar a ordem das entradas (então "leão" "tigre" gera "liger" e outras). "y" ainda é tratado como uma consoante.
Explicação:
fonte
Python 3 ,
156150 bytesEu considerei
y
como uma consoante.-6 bytes graças a Jonathan Frech
Experimente online!
fonte
lambda x=0
para reduzi-lo e salvar ... 0 caracteres, irritantemente.lambda a,b,v='aeiou',r=range:{a[:i]+b[j:]for i in r(1,len(a))for j in r(1,len(b))if((a[i-1]in v)^(b[j]in v))*0**(a in a[:i]+b[j:]or b in a[:i]+b[j:])}
(Ainda 150)JavaScript (ES6), 124 bytes
Pega as 2 palavras na sintaxe de curry
(a)(b)
e imprime os resultados comalert()
. Supõe que y é uma consoante.Experimente online!
fonte
Gelatina , 27 bytes
Experimente online!
Yy é uma consoante. Ambos os casos são suportados. Retorna duplicados.
A saída foi pré-modificada pelo TIO. Remova
+/€
do rodapé para ver a saída real.fonte
C ++ 11,
217202 bytesFaz uso pesado de
std::string#find
. Tratay
como uma consoante. Experimente online aqui .Ungolfed:
fonte
Python 2 ,
179176166162 bytesExperimente online!
3 bytes de Jonathan Frech . E 10 bytes thx para o Matt .
No meu mundo,
y
não é uma vogal. (É uma uiva!)fonte
t) if
et) or []
.(s in w)<1>(t in w)
.Ruby ,
113 112 109104 bytesy
é uma consoanteIsso gera as mesmas duplicatas que os exemplos na pergunta, devo estar usando o mesmo loop
Experimente online!
fonte
Emacs Lisp , 306 + 13 = 319 bytes
+13 para
(require'seq)
Experimente Online!
Define uma função lambda anônima. Gera uma sequência de portmanteaus separados por nova linha com cada um entre aspas. Dicas de golfe são bem-vindas. A carta
y
é considerada uma consoante.Ungolfed
fonte