Tome la primera letra de cada palabra, deje espacios y signos de puntuación.

8

Reduzca cada palabra en una cadena de grupo de cadenas a letras individuales delimitadas por espacios o signos de puntuación.

Ejemplo

I'm a little teapot,  short and stout. Here is my handle, here is my spout. When I get all steamed up - hear me shout!   Tip me over and pour me out. 

se convierte

I' a l t, s a s. H i m h, h i m s. W I g a s u - h m s! T m o a p m o. 

Editar: si hay varios espacios, conserve solo un espacio. Toda puntuación debe ser preservada, me perdí el apóstrofe. Sí, este es el código de golf :-).

Chanatos
fuente
1
¿Puede haber múltiples espacios entre las palabras? ¿Tenemos que preservarlos?
Dennis
8
Además, ¿qué caracteres cuentan exactamente como puntuación?
Dennis
1
¿Cuál es el comportamiento requerido para números u otros caracteres además de la puntuación ( +etc.)
GrovesNL
1
¿Alguna vez habrá más de una puntuación dentro de una palabra? ¿Algo así O'Leary-Clarence-DeVoisse convertiría O'--?
hmatt1
8
Puede aceptar una respuesta cuando lo desee, pero es mejor dejar algo de tiempo (días) antes de cerrar un desafío.
edc65

Respuestas:

5

CJam, 13 bytes

r{(\'A,f&Sr}h

Funciona si solo puedo considerar los caracteres de puntuación comunes, y la salida puede tener espacios finales. (Gracias a Dennis)

Esta pregunta necesita mucha más aclaración ...

CJam, 17 16 bytes

r{(\eu_elf&Sr}h&

Pruébalo en línea .

Explicación

r          e# Read one word from input.
{          e# While it is not EOF:
    (\     e# Extract the first character.
    eu     e# Convert the rest to uppercase.
    _el    e# And lowercase.
    f&     e# Delete characters in the first string if not in the second string.
    S      e# Append a space.
    r      e# Read the next word.
}h
&          e# Discard the last space by intersecting with empty string.
jimmy23013
fuente
¿Puedes agregar un enlace para probarlo por favor? Estoy en el móvil
Cthanatos
@Cthanatos Añadido.
jimmy23013
1
rempuja una cadena vacía en EOF, por lo que esto también funciona:r{(\eu_elf&Sr}h;
Dennis
1
@ Dennis Estoy seguro de que he visto código así muchas veces, pero aún no lo recuerdo ... Gracias. Pero ;no tiene sentido entonces.
jimmy23013
1
Si es necesario, aún puede deshacerse de él &. Además, dependiendo de lo que cuente exactamente como puntuación, '@,sería una alternativa más corta a eu_el.
Dennis
4

Pyth, 14 bytes

jdm+hd-rtd0Gcz

Pruébelo en línea: demostración

Explicación:

                 implicit: z = input string
            cz   split z by spaces
  m              map each word d to:
    hd              first letter of d
   +                +
       rtd0         (lowercase of d[1:]
      -    G         but remove all chars of "abc...xyz")
jd               join resulting list by spaces and print
Jakube
fuente
¿Es esto guiones duplicados?
Cthanatos
@Cthanatos debería funcionar ahora.
Jakube
@grovesNL ¿Puedes pensar en una oración que se pueda encontrar en la escritura regular, es decir, un libro, un artículo de noticias donde los números dentro de una oración pueden ser un problema o aparecer?
Cthanatos
@Cthanatos: Hay muchos casos en los que se usan números en libros o artículos de noticias. " Más de 200 encuestados ... " " El lote es de 50 acres ... " " Es capaz de contener aproximadamente 20 litros ... "
grovesNL
Touché ... Buen punto.
Cthanatos
2

Python 3.4, 94 92 82 77 bytes

print(*[w[0]+''.join(c[c.isalpha():]for c in w[1:])for w in input().split()])

¡Soy nuevo en el código de golf pero pensé en probarlo! Este no es un ganador, pero fue divertido.

Esto simplemente divide la cadena, tomando el primer carácter de cada palabra junto con cualquier puntuación en el resto de la palabra.

* editado con cambios por FryAmTheEggman, DLosc

Robotato
fuente
Puede usar el paso de argumento con estrella de Python para guardar algunos bytes, e invertir la condición parece guardar 1 byte (aunque todavía parece sospechosamente golfable). Esto es lo que obtuve:print(*[w[0]+''.join([c for c in w[1:]if 1-c.isalpha()])for w in input().split()])
FryAmTheEggman
@FryAmTheEggman Ah, gracias! Me olvidé de pasar argumentos discutidos.
Robotato
2
No hay necesidad de los corchetes alrededor de la comprensión interna; joinpuede tomar un generador desnudo como argumento. Además, aquí es una forma de cadena sobre el tramo de hacer la lógica "si no isalpha": c[c.isalpha():]for c in w. Debería bajarlo a 77 bytes. : ^)
DLosc
@DLosc Ese truco para cortar cuerdas es inteligente, ¡gracias! Tendré que recordar eso.
Robotato
1

sed (39 caracteres)

Solo un par de expresiones regulares:

sed 's+\<\(.\)[A-Za-z]*+\1+g;s+  *+ +g'
joeytwiddle
fuente
2
Usualmente no contamos el nombre del intérprete y la sintaxis adicional requerida por el shell para pasar el código o los datos correctamente al intérprete. Su código Sed real tiene solo 32 caracteres.
manatwork
1

Lua - 126 caracteres

Lua no es un gran lenguaje de golf de código, pero lo probé:

a=''for b in string.gmatch( c, '%S+%s?' )do d=(b:match('%w')or''):sub(1,1)e=b:match('[^%s%w]')or''a=a..d..e..' 'end print( a )

Esto supone que ces la cadena.

Aquí se limpia para facilitar la lectura:

local string = [[I'm a little teapot,  short and stout. Here is my handle, here is my 
spout. When I get all steamed up - hear me shout!   Tip me over and pour me out.]]

local final = ''
for word in string.gmatch( string, '%S+%s?' ) do 
    local first = ( word:match( '%w' ) or '' ):sub( 1, 1 )
    local second = word:match( '[^%s%w]' ) or ''
    final = final .. first .. second .. ' '
end
print( final )

Puede probarlo aquí (copiar y pegar. Por primera vez, también tiene que hacerlo c = "I'm a little ...). Por alguna razón, la demostración en línea de Lua no le permitirá ingresar variables usando io.read...

DavisDude
fuente
1

PowerShell, 56 bytes

%{($_-split' '|%{$_[0]+($_-replace'[a-z]','')})-join' '}
Nacht - Restablece a Monica
fuente
1

Javascript ( ES6 ) 72 68 bytes

f=x=>x.split(/\s+/).map(x=>x.replace(/^(.)|[a-z]/gi,'$1')).join(' ')
<input id="input" value="I'm a little teapot,  short and stout. Here is my handle, here is my spout. When I get all steamed up - hear me shout!   Tip me over and pour me out. " />
<button onclick="output.innerHTML=f(input.value)">Run</button>
<br /><pre id="output"></pre>

Comentado:

f=x=>
    x.split(/\s+/). // split input string by 1 or more spaces
    map(x=> // map function to resulting array
        x.replace(/^(.)|[a-z]/gi, '$1') // capture group to get the first character
                                        // replace all other letters with empty string
    ).
    join(' ') // join array with single spaces
nderscore
fuente
1

C99 - 170 169 bytes

main(_,a)char**a;{for(char*b=a[1],*c=b,*e,*d;*c++=*b;){for(e=b;*++b&&*b-32;);for(*b=0,d=strpbrk(e,"!',-."),d&&d-e?*c++=*d:0;b[1]==32;++b);++b;*c++=32;*c=0;}puts(a[1]);}

Sin golf:

main(int argc, char**a) {
    char*b=a[1],*c=b,*e,*d;
    while(*c++=*b){
        for(e=b;*++b&&*b-32;); //scan for first space or end of word
        *b=0; //mark end of word
        for(;b[1]==32;++b); //skip following spaces
        d=strpbrk(e,"!',-."); //find punctuation
        if(d&&d-e) //append punctuation if any, and it's not the word itself
            *c++=*d;
        *c++=32; //append space
        b++;
    }
    *c=0; //mark end of line
    puts(a[1]);
}

Uso:

gcc -std=c99 test.c -o test
./test "I'm a little teapot,  short and stout. Here is my handle, here is my spout. When I get all steamed up - hear me shout!   Tip me over and pour me out."

Salida:

I' a l t, s a s. H i m h, h i m s. W I g a s u - h m s! T m o a p m o.
rr-
fuente
1

Java 8, 87 bytes

s->{for(String x:s.split(" +"))System.out.print(x.replaceAll("^(.)|[a-z]+","$1")+" ");}

Explicación:

Pruébalo aquí

s->{                                  // Method with String parameter and no return-type
  for(String x:s.split(" +"))         //  Split the input on one or multiple spaces
                                      //  And loop over the substrings
    System.out.print(                 //   Print:
      x.replaceAll("^(.)|[a-z]+","$1")//    Regex to get the first letter + all non-letters
      +" ");                          //    + a space delimiter
                                      //  End of loop (implicit / single-line body)
}                                     // End of method

Explicación de expresiones regulares:

x.replaceAll("^(.)|[a-z]+","$1")
x.replaceAll("           ","  ") # Replace the match of String1 with String2, in String `x`
             "           "       # Regex to match:
              ^(.)               #  The first character of String `x`
                  |[a-z]+        #  Or any one or multiple lowercase letters
                           "  "  # Replace with:
                            $1   #  The match of the capture group (the first character)

Por lo tanto, básicamente elimina todas las letras minúsculas de una cadena, excepto la primera.

Kevin Cruijssen
fuente
0

R, 46 45 bytes

cat(gsub("^\\w\\W*\\K\\w*","",scan(,""),T,T))

Esto lee una línea de STDIN e imprime en STDOUT. Utiliza una expresión regular para eliminar todos los caracteres después de la primera letra seguidos de cualquier cantidad de puntuación.

Ungolfed + explicación:

# Read a string from STDIN and convert it to a character vector,
# splitting at spaces

input <- scan(what = "")

# Replace stuff with nothing using a regex.
# ^ start position anchor
# \w single "word" character
# \W* any amount of non-word (i.e. punctuation) characters
# \K move the match position forward
# \w* any number of word characters

replaced <- gsub("^\\w\\W*\\K\\w*", "", input, ignore.case = TRUE, perl = TRUE)

# Print the vector elements to STDOUT, separated by a space

cat(replaced, sep = " ")

Ejemplo:

> cat(gsub("^\\w\\W*\\K\\w*","",scan(,""),T,T))
1: I'm a little teapot,  short and stout. Here is my handle, here is my spout. When I get all steamed up - hear me shout!   Tip me over and pour me out. 

I' a l t, s a s. H i m h, h i m s. W I g a s u - h m s! T m o a p m o.
Alex A.
fuente
0

05AB1E , 13 bytes

#õKεćsDáмJ}ðý

Pruébalo en línea!

Explicación:

#õKεćsDáмJ}ðý  Full program
#              Split on spaces
 õK            Remove empty strings from the list
   ε           For each...
    ć             push a[1:], a[0]
     s            Swap
      D           Duplicate
       á          Push only letters of a
        м         pop a,b => push a.remove(all elements of b)
         J        Join
          }    End for each
           ðý  Join with spaces
scottinet
fuente
0

VBA (Excel), 141 133 Bytes

Usando la Ventana Inmediata de VBA, [A1] como Cadenas Ingresadas.

z=" "&[A1]:for a=2 to len(z):c=mid(z,a,1):[A2]=[A2]&IIF(mid(z,a-1,1)=" ",c,IIF(asc(lcase(c))>96 and asc(lcase(c))<123,"",c)):next:?[TRIM(A2)]

z=" "&[a1]:for a=2 to len(z):c=mid(z,a,1):e=asc(lcase(c)):[a2]=[a2]&iif(mid(z,a-1,1)=" ",c,IIF((e>96)*(e<123),"",c)):next:?[TRIM(A2)]
remodelar
fuente