Dada uma sequência, encontre a primeira palavra começando com cada letra (sem distinção entre maiúsculas e minúsculas).
Amostra
Usando Ferulas flourish in gorgeous gardens.
como entrada:
"Ferulas flourish in gorgeous gardens."
^^^^^^^ ^^ ^^^^^^^^
| | |
| | --> is the first word starting with `g`
| --> is the first word starting with `i`
--> is the first word starting with `f`
Em seguida, a saída para esta amostra deve ser as palavras correspondentes unidas por um único espaço:
"Ferulas in gorgeous"
Desafio
Tanto a entrada como a saída devem ser uma representação de sequência ou a alternativa mais próxima no seu idioma.
Programa ou função permitida.
Você pode considerar uma palavra sendo pelo menos um dos seguintes: lowercase or uppercase letters, digits, underscore
.
Este é o código-golfe , a resposta mais curta em bytes ganha.
Outras amostras:
input: "Take all first words for each letter... this is a test"
output: "Take all first words each letter is"
input: "Look ^_^ .... There are 3 little dogs :)"
output: "Look _ There are 3 dogs"
input: "...maybe some day 1 plus 2 plus 20 could result in 3"
output: "maybe some day 1 plus 2 could result in 3"
Respostas:
Retina , 28 bytes:
M!
- Combine cada trabalho e imprima todas as palavras separadas por novas linhas.i
- Ignorar caso.\b(\w)
- Capture a primeira letra de cada palavra(?<!\b\1.+)
- Depois de corresponder à letra, verifique se não havia uma palavra anterior começando com a mesma letra.\1.+
garante pelo menos dois caracteres, por isso estamos pulando a palavra atual.\w*
- combine o resto da palavra.O texto acima corresponde apenas às palavras - todos os outros caracteres são removidos.
¶\n
- Substitua novas linhas por espaços.Experimente online!
fonte
Retina , 45 bytes
Simplesmente usa uma única expressão regular para remover as palavras posteriores que começam com o mesmo
\w
caractere (sem distinção entre maiúsculas e minúsculas com ai
opção), converte execuções\W
em um único espaço e remove qualquer espaço inicial / final do resultado.Experimente online!
Edit: Veja a resposta de @ Kobi para uma versão mais curta usando
M!`
fonte
i` \b((\w)\w*)\b(?<=\b\2\w*\b.+)
(um espaço antes do primeiro\b
) As linhas depois são desnecessárias?a...a -> a
JavaScript (ES6),
7371 bytesEconomizou 2 bytes graças a @ edc65!
Teste
fonte
parseInt("_",36) = NaN
? Blasfêmia!s=>s.match(u=/\w+/g).filter(w=>u[w=parseInt(w[0],36)]?0:u[w]=1).join' '
Pitão, 23 bytes
Experimente on-line: Demonstration or Test Suite
J:z"\w+"1
localiza todas as palavras na entrada usando o regex\w+
e as armazenaJ
..grhk0J
agrupa as palavras pela primeira letra minúscula,hM
pega a primeira de cada grupo,xDJ
classifica essas palavras pelo índice na sequência de entrada ejd
coloca espaços entre elas.fonte
Perl 6, 39 bytes
fonte
\w+
e golfs asubstr
parteC,
142132122 bytes10 bytes mais leve, graças a @tucuxi!
Imprime um espaço à direita após a última palavra de saída.fonte
c>47
ec<58
usandoisalnum
em vez deisalpha
MATL , 23 bytes
Isso empresta a idéia de Jakube de usar um regexp para remover caracteres indesejados e dividir ao mesmo tempo.
Entrada é uma cadeia de caracteres entre aspas simples.
Experimente online!
Explicação
fonte
Teclas do Vim 57
Explicação:
Estou realmente desapontado com a duração deste. Os caracteres "inválidos" (tudo, mas
a-z
,A-Z
,_
e no espaço) realmente me jogou fora. Tenho certeza de que há uma maneira melhor de fazer isso:Desde que
\h
corresponde a tudo o que se espera do espaço, mas não consigo descobrir como colocar o metachar em um intervalo. Se alguém tiver dicas, eu adoraria ouvi-las.fonte
a-zA-Z_
e não\w
? dígitos são válidosJulia,
165155151129102 bytesEsta é uma função que aceita uma string e retorna uma string.
Ungolfed:
53 bytes salvos com a ajuda do Sp3000!
fonte
Geléia,
3231 bytesExperimente online!
fonte
C # (LINQPAD) -
136128 bytesfonte
05AB1E , 40 bytes
Código:
Experimente online!
Explicação:
Primeiro, geramos todos os caracteres que devem ser excluídos da string de entrada usando
94L32+ç
( Experimente aqui ). Juntamos essa string usandoJ
e removendo o[a-zA-Z0-9_]
que é armazenado em jj ( Tente aqui ). Removemos todos os caracteres que estão na segunda sequência da primeira, o que nos deixará:Isso também pode ser testado aqui . Nós
D
duplicamos isso e armazenamos noX
com oU
comando-. Em seguida, removemos todos os caracteres que estão nessa cadeia de caracteres da entrada. Em seguida, dividimos nos espaços em branco usandoð¡
e removendo todas as cadeias vazias (usando""K
). Agora temos isso .Esta é a versão limpa da entrada, com a qual trabalharemos. Mapeamos cada elemento usando
v
. Isso usay
como a variável string. Pegamos o primeiro caractere da string usando¬
e pushX
, que contém uma string com todos os caracteres proibidos (!"#$%&'()*+,-./:;<=>?@[\]^`{|}~
). Verificamos se al
versão owercase do primeiro caractere (que também será©
usado para o registro) está nessa string usandoå
. Abrangido por esta parte:ï>i
se a primeira letra não existir na sequência de caracteres proibidos (X
), anexamos esta carta à lista de caracteres proibidos (terminada comX®«U
) e empurramos oy
topo da pilha.Finalmente, quando as strings são filtradas, juntamos a pilha por espaços com
ðý
.fonte
PHP
Inspirado pelo uso de regex na maioria das respostas, originalmente tentei fazer isso sem usar regex, apenas para mostrar uma variação elegante, mas o ponto difícil de não ter strings limpas como entrada arruinou essa idéia. Triste.
Com wrapper de função, 89 bytes
Sem wrapper de função (que precisa de $ s pré-declarado), 73 bytes
Explicação:
Meu único arrependimento é que não consegui encontrar uma maneira mais rápida de verificar / converter letras maiúsculas.
fonte
Python, 103 bytes
fonte
Lua, 172 bytes
Acabou muito mais tempo que eu queria ...
Ungolfed
fonte
Sério, 43 bytes
Experimente online!
A falta de recursos de regex tornou isso muito mais difícil do que precisava ser.
Explicação:
fonte
Ruby 76 bytes
Ou com definição de método 88 bytes
Ungolfed e com teste de unidade:
fonte
\w
inclui caracteres numéricos, portanto,[\w\d]
pode ser substituído por\w
. Além disso, se osnil
valores estiverem em uma matriz quando você ligarjoin' '
(ou melhor ainda,*' '
for uma abreviação que você pode usar para salvar mais bytes), eles desaparecerão, portanto a chamada paracompact
é desnecessária.\w\d
é constrangedor para mim. Mas se eu remover ocompact
espaço, recebo mais espaços (consulte['x',nil,'x']*'y' == 'xyyx'
). Ou eu perdi alguma coisa?(list-[p])
salva bytes em excessolist.compact
. Além disso,/\w/
é equivalente a/[\w]/
. Finalmente, você pode substituir o seunil
comp
e seu!p
com1
(desde que seu hash somente precisa de valores truthy nele)nil
porp
não funciona. Se eu usá-lo dentro do meu código, recebo um erro de sintaxe. Eu tenho que encapsular como(p)
- mas então eu tenho novamente 3 caracteres.!f[j=i.upcase]?(f[j]=1;h):p
. Também pensei nisso, mas por causa da indexação de strings, usandos.scan(/\w+/)
e removendo oi
favor deh[0]
obras também.grep e awk,
6856 bytesO script:
Explicação:
grep -o
corresponde às palavras legais, imprimindo cada uma em sua própria linha.awk
pega a primeira letra de cada linhasubstr
, torna-a em minúscula e depois incrementa uma entrada de hashtable com essa chave. Se o valor não tiver sido definido antes do incremento, a linha será impressa.echo ...
transforma as linhas de volta em palavrasEu já tentei criar uma solução sem
awk
, usandouniq
,sort
,grep
ebash
mas caiu um pouco abaixo. História nas edições.Agradeço ao Dennis por algumas melhorias que perdi.
fonte
Python 3.5, 138 bytes:
Basicamente, o que está acontecendo é ..
fonte
PHP 120bytes
Isso gera vários avisos, mas tudo bem.
fonte
function
necessário?Javascript ES6,
108107 caracteres107 caracteres, a sequência de resultados é aparada
Teste:
fonte
f=
não conta .Tcl , 150 bytes
Experimente online!
fonte