Dada una cadena, encuentre la primera palabra que comienza con cada letra (sin distinción entre mayúsculas y minúsculas).
Muestra
Utilizando 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`
Entonces, el resultado de esta muestra debe ser las palabras coincidentes unidas por un solo espacio:
"Ferulas in gorgeous"
Reto
Tanto la entrada como la salida deben ser una representación de cadena o la alternativa más cercana en su idioma.
Programa o función permitida.
Se puede considerar una palabra siendo al menos uno de: lowercase or uppercase letters, digits, underscore
.
Este es el código de golf , la respuesta más corta en bytes gana.
Otras muestras:
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"
Respuestas:
Retina , 28 bytes:
M!
- Unir cada trabajo e imprimir todas las palabras separadas por nuevas líneas.i
- Ignorar caso.\b(\w)
- Capture la primera letra de cada palabra(?<!\b\1.+)
- Después de hacer coincidir la letra, verifique si no había una palabra anterior que comenzara con la misma letra.\1.+
asegura al menos dos caracteres, por lo que estamos omitiendo la palabra actual.\w*
- coincide con el resto de la palabra.Lo anterior solo coincide con las palabras: todos los demás caracteres se eliminan.
¶\n
- Reemplazar nuevas líneas con espacios.Pruébalo en línea!
fuente
Retina , 45 bytes
Simplemente usa una única expresión regular para eliminar palabras posteriores que comienzan con el mismo
\w
carácter (no distingue entre mayúsculas y minúsculas con lai
opción), convierte las ejecuciones\W
en un solo espacio, luego elimina cualquier espacio inicial / final del resultado.Pruébalo en línea!
Editar: Vea la respuesta de @ Kobi para una versión más corta usando
M!`
fuente
i` \b((\w)\w*)\b(?<=\b\2\w*\b.+)
(un espacio antes del primero\b
) ¿Son innecesarias las líneas posteriores?a...a -> a
JavaScript (ES6),
7371 bytes¡Ahorré 2 bytes gracias a @ edc65!
Prueba
fuente
parseInt("_",36) = NaN
? ¡Blasfemia!s=>s.match(u=/\w+/g).filter(w=>u[w=parseInt(w[0],36)]?0:u[w]=1).join' '
Pyth, 23 bytes
Pruébelo en línea: Demostración o conjunto de pruebas
J:z"\w+"1
encuentra todas las palabras en la entrada usando la expresión regular\w+
y las almacenaJ
..grhk0J
agrupa las palabras por su primera letra minúscula,hM
toma la primera de cada grupo,xDJ
clasifica estas palabras por su índice en la cadena de entrada yjd
coloca espacios entre ellas.fuente
Perl 6, 39 bytes
fuente
\w+
y juega golf en lasubstr
parteC,
142132122 bytes¡10 bytes más ligero gracias a @tucuxi!
Imprime un espacio final después de la última palabra de salida.fuente
c>47
yc<58
usarlos enisalnum
lugar deisalpha
MATL , 23 bytes
Esto toma prestada la idea de Jakube de usar una expresión regular para eliminar caracteres no deseados y dividirlos al mismo tiempo.
La entrada es una cadena entre comillas simples.
Pruébalo en línea!
Explicación
fuente
Vim 57 pulsaciones de teclas
Explicación:
Estoy realmente decepcionado por lo largo que es este. Los caracteres "no válido" (todo pero
a-z
,A-Z
,_
y el espacio) realmente me tiró fuera. Estoy seguro de que hay una mejor manera de hacer esto:Dado que
\h
coincide con todo lo que se espera para el espacio, pero no puedo entender cómo poner el metachar en un rango. Si alguien tiene consejos, me encantaría escucharlos.fuente
a-zA-Z_
no\w
? los dígitos son válidosJulia,
165155151129102 bytesEsta es una función que acepta una cadena y devuelve una cadena.
Sin golf:
¡Ahorró 53 bytes con ayuda de Sp3000!
fuente
Jalea,
3231 bytesPruébalo en línea!
fuente
C # (LINQPad) -
136128 bytesfuente
05AB1E , 40 bytes
Código:
Pruébalo en línea!
Explicación:
Primero generamos todos los caracteres que deben eliminarse de la cadena de entrada usando
94L32+ç
( Probar aquí ). Unimos esta cadena usandoJ
y[a-zA-Z0-9_]
eliminamos el que está almacenado en žj ( Pruébelo aquí ). Eliminamos todos los caracteres que están en la segunda cadena de la primera cadena, lo que nos dejará:Eso también se puede probar aquí . Lo
D
duplicamos y lo almacenamosX
con elU
comando. Luego eliminamos todos los caracteres que están en esta cadena de la entrada. Luego nos dividimos en espacios en blanco usandoð¡
y eliminamos todas las cadenas vacías (usando""K
). Ahora tenemos esto .Esta es la versión limpia de la entrada, con la que trabajaremos. Mapeamos cada elemento usando
v
. Esto se usay
como la variable de cadena. Tomamos el primer carácter de la cadena usando¬
y pushX
, que contiene una cadena con todos los caracteres prohibidos (!"#$%&'()*+,-./:;<=>?@[\]^`{|}~
). Verificamos si lal
versión en minúscula del primer carácter (que también se©
optará al registro) está en esta cadena usandoå
. Cubierto por esta parte:ï>i
si la primera letra no existe en la cadena de caracteres prohibidos (X
), agregamos esta letra a la lista de caracteres prohibidos (hecho conX®«U
) y presionamosy
en la parte superior de la pila.Finalmente, cuando las cadenas se filtran, unimos la pila por espacios con
ðý
.fuente
PHP
Inspirado por el uso de expresiones regulares en la mayoría de las respuestas, originalmente intenté hacer esto sin usar expresiones regulares solo para mostrar una variación ordenada, pero el problema de no tener cadenas limpias como entrada arruinó esa idea. Triste.
Con contenedor de funciones, 89 bytes
Sin envoltorio de función (que necesita $ s pre-declarado), 73 bytes
Explicación:
Lo único que lamento es que no pude encontrar una forma más rápida de verificar / convertir mayúsculas y minúsculas.
fuente
Python, 103 bytes
fuente
Lua, 172 bytes
Terminó mucho más tiempo de lo que quería ...
Sin golf
fuente
En serio, 43 bytes
Pruébalo en línea!
La falta de capacidades de expresiones regulares hizo que esto fuera mucho más difícil de lo necesario.
Explicación:
fuente
Ruby 76 Bytes
O con la definición del método 88 bytes
Sin golf y con prueba unitaria:
fuente
\w
incluye caracteres numéricos, por lo que[\w\d]
se puede reemplazar con\w
. Además, si losnil
valores están en una matriz cuando llamajoin' '
(o mejor aún,*' '
es una abreviatura que puede usar para guardar más bytes), desaparecen, por lo que la llamada acompact
es innecesaria.\w\d
es vergonzoso para mí. Pero si elimino elcompact
, obtengo espacios adicionales, (ver['x',nil,'x']*'y' == 'xyyx'
). ¿O me perdí algo?(list-[p])
guarda los byteslist.compact
. Además,/\w/
es equivalente a/[\w]/
. Finalmente, puede reemplazar sunil
conp
y su!p
con1
(ya que su hash solo necesita valores verdaderos)nil
conp
no funciona. Si lo uso dentro de mi código me sale un error de sintaxis. Tengo que encapsular como(p)
, pero luego vuelvo a tener 3 caracteres.!f[j=i.upcase]?(f[j]=1;h):p
. También pensé en esto, pero debido a la indexación de cadenas, también usamoss.scan(/\w+/)
y eliminamos los trabajos ai
favorh[0]
.grep y awk,
6856 bytesLa secuencia de comandos:
Explicación:
grep -o
coincide con las palabras legales, imprimiendo cada una en su propia línea.awk
toma la primera letra de cada línea consubstr
, la pone en minúscula y luego incrementa una entrada de tabla hash con esa tecla. Si el valor no se estableció antes del incremento, se imprime la línea.echo ...
convierte las líneas de nuevo en palabrasMe previamente tratado de crear una solución sin
awk
, conuniq
,sort
,grep
ybash
aunque se quedó corto. Historia en las ediciones.Gracias a Dennis por algunas mejoras que perdí.
fuente
Python 3.5, 138 bytes:
Básicamente, lo que está sucediendo es ...
fuente
PHP 120bytes
Esto genera un montón de advertencias, pero está bien.
fuente
function
necesario?Javascript ES6,
108107 caracteres107 caracteres, la cadena de resultado se recorta
Prueba:
fuente
f=
no cuenta .Tcl , 150 bytes
Pruébalo en línea!
fuente