Eliminar espacios adicionales de una cadena

12

Te dan una cuerda. Salida de la cadena con un espacio por palabra.

Desafío

La entrada será una cadena (no nullo vacía), rodeada de comillas ( ") enviadas a través de stdin. Elimine los espacios iniciales y finales de él. Además, si hay más de un espacio entre dos palabras (o símbolos o lo que sea), recórtelo a un solo espacio. Salida de la cadena modificada con las comillas.

Reglas

  • La cadena no tendrá más de 100 caracteres y solo contendrá caracteres ASCII en el rango (espacio) a ~(tilde) (códigos de caracteres 0x20 a 0x7E, inclusive) excepto ", es decir, la cadena no contendrá comillas ( ") y otros caracteres fuera del rango especificado anteriormente. Consulte la tabla ASCII para referencia.
  • Debe tomar la entrada de stdin(o la alternativa más cercana).
  • La salida debe contener comillas ( ").
  • Puede escribir un programa completo, o una función que toma la entrada (desde stdin) y emite la cadena final

Casos de prueba

"this  is  a    string   "         --> "this is a string"

"  blah blah    blah "             --> "blah blah blah"

"abcdefg"                          --> "abcdefg"

"           "                      --> ""

"12 34  ~5 6   (7, 8) - 9 -  "     --> "12 34 ~5 6 (7, 8) - 9 -" 

Puntuación

Este es el código de golf, por lo que gana el envío más corto (en bytes).

Spikatrix
fuente
1
Tú dices must take input from stdin, y luego dices ...or a function which takes input, and outputs the final string. ¿Esto significa que la función también debe recibir información stdin?
blutorange
@blutorange, sí. Editado para aclararlo.
Spikatrix
2
" "aa" "-> ""aa""(¿son válidas las comillas dentro de la cadena de entrada?)
edc65
@ edc65, buen punto. La respuesta a eso es no. Editado para aclararlo.
Spikatrix
Por favor, vea el comentario de MickeyT sobre mi respuesta. ¿Es válido lo que propone? En R, los resultados devueltos se imprimen implícitamente, pero en mi respuesta lo imprimí explícitamente en stdout.
Alex A.

Respuestas:

12

CJam, 7 bytes

q~S%S*p

Explicación del código

CJam ha reservado todas las letras mayúsculas como variables incorporadas. Entonces Stiene un valor de un espacio aquí.

q~          e# Read the input (using q) and evaluate (~) to get the string
  S%        e# Split on running lengths (%) of space
    S*      e# Join (*) the splitted parts by single space
      p     e# Print the stringified form (p) of the string.

Esto elimina los espacios iniciales y finales también

Pruébalo en línea aquí

Optimizador
fuente
10

/// : 18 caracteres

/  / //" /"// "/"/

Ejecución de muestra:

(Usando el intérprete de faubiguy de su respuesta Perl para Interpretar /// (pronunciado 'barras') .)

bash-4.3$ ( echo -n '/  / //" /"// "/"/'; echo '"   foo  *  bar   "'; ) | slashes.pl
"foo * bar"
hombre trabajando
fuente
Sin embargo, técnicamente no estás recibiendo aportes. ;) Existe este lenguaje, pero la entrada de lectura sigue siendo bastante dolorosa, creo.
Martin Ender
6

Perl, 22

(20 bytes de código, más 2 interruptores de línea de comando)

s/ +/ /g;s/" | "/"/g

Debe ejecutarse con el -npinterruptor para que $_se llene automáticamente mediante stdin y se imprima en stdout. Voy a suponer que esto agrega 2 al recuento de bytes.

r3mainer
fuente
1
misma solución:sed -E 's/ +/ /g;s/" | "/"/g'
izabera
3
Lo mismo son 12 bytes en Retina . :)
Martin Ender
-pimplica -n, por lo que solo tienes que recibir una penalización de +1 aquí (suponiendo que no solo cambies a un idioma diferente, como sugieren los otros comentaristas).
4

Rubí, 31 29 25 23 Bytes

p$*[0].strip.squeeze' '

Explicación del código:

  • pemite una cadena entre comillas dobles para STDOUT( Sin embargo, hay más ...)
  • $*es una matriz de STDINentradas, $*[0]toma la primera
  • strip elimina espacios iniciales y finales
  • squeeze ' ' reemplaza> 1 espacio de caracteres con un solo espacio

Casos de prueba:

ingrese la descripción de la imagen aquí

Sheharyar
fuente
1
Puede reemplazar ARGVcon $*guardar dos bytes. gsub /\s+/, ' 'puede ser reemplazado squeeze ' 'por otros 4 bytes
DickieBoy
@DickieBoy, gracias por $*eso, no lo sabía. Pero no se puede sustituir gsub /\s+/, ' 'con squeeze, porque ellos no son los mismos .
Sheharyar
¿Qué quieres decir con "no son lo mismo"? Las salidas son iguales.
DickieBoy
1
squeeze ' 'solo exprimirá espacios. "yellow moon".squeeze "l" => "yelow moon"
DickieBoy
2
Personalmente lo soy. Y algunos de otros respondedores también. Pero como veo, tampoco está solo con su interpretación ... Una aclaración del propietario de la pregunta sería bienvenida. Por cierto, tanto el espacio entre py su parámetro squeezey su parámetro son innecesarios.
manatwork
4

Pyth, 17 15 11 10 bytes

(gracias a Ypnypn y FryAmTheEggman )

pjd-cQdkNN

Probablemente podría jugar más golf.

Si la salida puede usarse en 'lugar de "eso, solo necesito 8 bytes:

`jd-cQdk
Tyilo
fuente
Puede usar en Nlugar de\"
Ypnypn
Bienvenido a Pyth, Tylio. El segundo programa podría acortarse mediante el uso de d.
isaacg
@isaacg, ¿no lo he usado dpara todo para lo que se puede usar?
Tyilo
@Tyilo Creo que hiciste una edición aproximadamente al mismo tiempo que comenté. Todo está bien ahora.
isaacg
Puede usar ppara guardar algunos bytes en la concatenación de cadenas en lugar de muchos +es. pjd-cQdkNN
FryAmTheEggman
3

Bash, 36 32 bytes

Como una función, un programa o simplemente en una tubería:

xargs|xargs|xargs -i echo '"{}"'

Explicación

El primero xargselimina las comillas.

El segundo xargsrecorta el lado izquierdo y reemplaza múltiples espacios adyacentes en el medio de la cadena con un espacio tomando cada "palabra" y separando cada uno con un espacio.

El xargs -i echo '"{}"'recorta el lado derecho y rewraps la cadena resultante entre comillas dobles.

Deltik
fuente
2
¡Guauu! Eso es complicado Lamentablemente no maneja el caso de prueba 4, pero sigue siendo impresionante.
manatwork
Sí, este código cumple con el cuarto caso de prueba y es más corto.
Deltik
¿Puedes hacer algo como esto? x=xargs;$x|$x|$x -i echo '"{}"'
Cyoce
@Cyoce: De hecho, podría hacer eso para ahorrar un byte a costa de perder la funcionalidad de la tubería. Todavía no es tan corto como esta solución y todavía no satisface el cuarto caso de prueba.
Deltik
3

Haskell, 31 25 bytes

fmap(unwords.words)readLn

wordsdivide la cadena en una lista de cadenas con espacios como delimitadores y se unwordsune a la lista de cadenas con espacios individuales en el medio. Las comillas "son eliminadas y puestas de nuevo por las funciones de Haskell ready show(implícitamente a través de REPL) en las cadenas.

La salida de la función en sí es tres bytes más larga, es decir, 28 bytes:

print.unwords.words=<<readLn

Editar: @Mauris señaló la readLnfunción, que ahorró algunos bytes.

nimi
fuente
Estoy recibiendo Parse error: naked expression at top levelcuando probé tanto los códigos aquí
Spikatrix
@CoolGuy: rextester.com espera programas completos, no funciones, así que inténtalo main=interact$show.unwords.words.read. Hay un REPL en línea en la fachada de haskell.org (requiere cookies habilitadas) donde puede probar fmap(unwords.words.read)getLine.
nimi
1
fmap(unwords.words)readLny print.unwords.words=<<readLnson un poco más cortos
Lynn
@Mauris: gracias por señalar readLn.
nimi
2

R, 45 bytes

cat('"',gsub(" +"," ",readline()),'"',sep="")

La readline()función lee desde STDIN, eliminando automáticamente cualquier espacio en blanco inicial y final. El exceso de espacio entre palabras se elimina con gsub(). Finalmente, las comillas dobles se anteponen y anexan y el resultado se imprime en STDOUT.

Ejemplos:

> cat('"',gsub(" +"," ",readline()),'"',sep="")
    This   is     a   string  
"This is a string"

> cat('"',gsub(" +"," ",readline()),'"',sep="")
12 34  ~5 6   (7, 8) - 9 -  
"12 34 ~5 6 (7, 8) - 9 -"
Alex A.
fuente
No estoy seguro si cumple totalmente con las reglas, pero el gato puede no ser totalmente requerido, solo el gsub. El resultado de eso es[1] "This is a string"
MickyT
@MickyT: Gracias por la sugerencia. Mi interpretación basada en el comentario del OP (primero en la publicación) fue que tenía que imprimirse en stdout. Pediré una aclaración.
Alex A.
Ahhh ... no vi ese comentario o requisito
MickyT
2

Python2, 37

Reducido en 1 byte gracias a @ygramul.

print'"%s"'%' '.join(input().split())

Versión original:

print'"'+' '.join(input().split())+'"'

Casos de prueba:

Captura de pantalla de casos de prueba

usuario12205
fuente
Realmente quería usar print" ".join(raw_input().split()), pero tendría un espacio final dentro de la última comilla si hubiera espacios después de la última palabra ...
mbomb007
Puede eliminar un byte adicional utilizando el formato%: print '"% s"'% '' .join (input (). Split ())
ygramul
2

JavaScript (ES6), 49 52 58

Editar 6 bytes más cortos, gracias a @Optimizer

Editar 2 -3, gracias a @nderscore

Entrada / salida a través de una ventana emergente. Usando cadena de plantilla para cortar 1 byte en concatenación de cadena.

Ejecute el fragmento para probar en Firefox.

alert(`"${prompt().match(/[^ "]+/g).join(" ")}"`)

edc65
fuente
alert(`"${eval(prompt()).match(/\S+/g).join(" ")}"`) - 52
Optimizador
@Optimizer thx. Tenga en cuenta que eso solo funciona después de la última aclaración sobre las citas: eval ('"" "') se bloqueará.
edc65
Cuando probé el cuarto caso de prueba (usando Chrome), no se ve ninguna ventana emergente (que muestra el resultado). ¿Por qué?
Spikatrix
¿@CoolGuy quizás porque Chrome no ejecuta ES6? Nunca pruebo ES6 con Chrome. De todos modos, lo probé ahora en mi Chrome (42.0.2311.152) y funciona para mí.
edc65
-3:alert(`"${prompt().match(/[^ "]+/g).join(" ")}"`)
nderscore
2

05AB1E , 9 bytes

#õKðý'".ø

Pruébalo en línea!


#         | Split on spaces.
 õK       | Remove empty Strings.
   ðý     | Join with spaces.
     '".ø | Surround with quotes.
Urna de pulpo mágico
fuente
1

Mathematica, 75 bytes

a=" ";b=a...;Print[InputString[]~StringReplace~{b~~"\""~~b->"\"",a..->a}]
LegionMammal978
fuente
1

KDB (Q), 28 bytes

" "sv except[;enlist""]" "vs

Explicación

                       " "vs    / cut string by space
      except[;enlist""]         / clear empty strings
" "sv                           / join back with space

Prueba

q)" "sv except[;enlist""]" "vs"12 34  ~5 6   (7, 8) - 9 -  "
"12 34 ~5 6 (7, 8) - 9 -"
WooiKent Lee
fuente
1

Java 8, 43 bytes

s->'"'+s.replaceAll(" +|\""," ").trim()+'"'

Explicación:

Pruébalo aquí.

s->                           // Method with String as parameter and return-type
  '"'                         //  Return a leading quote
  +s.replaceAll(" +           //  + Replace all occurrences of multiple spaces
                   |\"",      //     and all quotes
                        " ")  //    with a single space
    .trim()                   //  And remove all leading and trailing spaces
  +'"'                        //  And add the trailing quote
                              // End of method (implicit / single-line return statement)
Kevin Cruijssen
fuente
1

Jq 1.5 , 42 bytes

split(" ")|map(select(length>0))|join(" ")

Ejecución de muestra

$ jq -M 'split(" ")|map(select(length>0))|join(" ")' < data
"this is a string"
"blah blah blah"
"abcdefg"
""
"12 34 ~5 6 (7, 8) - 9 -"

$ echo -n 'split(" ")|map(select(length>0))|join(" ")' | wc -c
  42

Pruébalo en línea

jq170727
fuente
Capté el problema de salida antes (ver edición 5) pero no noté el problema de entrada. El comando está arreglado ahora. ¡Gracias!
jq170727
1

Tcl , 69 bytes

puts [string map {{ "} \" {" } \"} [regsub -all \ + [gets stdin] \ ]]

Pruébalo en línea!

Tcl , 79 bytes

puts \"[string trim [regsub -all \ + [string range [gets stdin] 1 end-1] \ ]]\"

Pruébalo en línea!

sergiol
fuente
@KevinCruijssen Corregido. desafortunadamente, a expensas de muchos bytes. Gracias por decirme.
sergiol
0

golfua, 42 bytes

L=I.r():g('%s*\"%s*','"'):g('%s+',' ')w(L)

Reemplazo simple de coincidencia de patrones: encuentre comillas dobles (\" ) rodeadas por 0 o más espacios ( %s*) y devuelva la comilla simple, luego reemplace los 1 o más espacios ( %s+) con un solo espacio.

Un equivalente de Lua sería

Line = io.read()
NoSpaceQuotes = Line:gsub('%s*\"%s*', '"')
NoExtraSpaces = NoSpaceQuotes:gsub('%s+', ' ')
print(NoExtraSpaces)
Kyle Kanos
fuente
0

Cobra - 68

Como una función anónima:

do
    print'"[(for s in Console.readLine.split where''<s).join(' ')]"'
Οurous
fuente
0

Objetivo-C 215

-(NSString*)q:(NSString*)s{NSArray*a=[s componentsSeparatedByString:@" "];NSMutableString*m=[NSMutableString new];for(NSString*w in a){if(w.length){[m appendFormat:@"%@ ",w];}}return[m substringToIndex:m.length-1];}

Versión sin comprimir:

-(NSString*)q:(NSString*)s{
    NSArray *a=[s componentsSeparatedByString:@" "];
    NSMutableString *m=[NSMutableString new];
    for (NSString *w in a) {
        if (w.length) {
            [m appendFormat:@"%@ ",w];
        }
    }
    return[m substringToIndex:m.length-1];
}
Fennelouski
fuente
0

Bash, 14 bytes

read f;echo $f       # assume f="this  is  a    string   "
michael501
fuente
1
¿Qué pasa con asumir "foo * bar" o cualquier otra cosa con un carácter comodín?
manatwork
0

Powershell, 40 bytes

"`"$(($args-Replace' +'," ").trim())`""

Bastante sencillo y no muy impresionante.

Explicación

Tome el parámetro de entrada a través de la variable args (predefinida), reemplace todos los espacios múltiples con uno, recorte los espacios iniciales y finales utilizando el método trim (), agregue comillas. Powershell imprimirá cadenas a la consola como comportamiento predeterminado.

lo que sea
fuente
0

k4, 23 bytes

" "/:x@&~~#:'x:" "\:0:0

                    0:0  / read from stdin
             x:" "\:     / split string on spaces and assign to x
        ~~#:'            / boolean true where string len>0, bool false otherwise
     x@&                 / x at indices where true
" "/:                    / join with spaces
garabatear
fuente
0

Zsh , 15 bytes

<<<\"${(Qz)1}\"

Pruébalo en línea!

La cadena de entrada contiene comillas incrustadas. Elimine los Qde 14 bytes si la cadena de entrada no contiene comillas incrustadas, como se hace en algunas de las otras respuestas aquí.

QIndicadores de expansión de parámetros: se indican con comillas, luego se zdividen en palabras como lo hace el shell. Las palabras se unen implícitamente por espacios.

Función Gamma
fuente
0

Wren , 56 bytes

Espere. El reemplazo solo lo hace una vez ? Ahora tengo que usar el combo split-join.

Fn.new{|x|x.trim().split(" ").where{|i|i!=""}.join(" ")}

Pruébalo en línea!

Explicación

Fn.new{|x|                                             } // New anonymous function with the operand x
          x.trim()                                       // Trim out whitespace from both sides of the string
                  .split(" ")                            // Split the string into space-separated chunks
                             .where{|i|i!=""}            // Keep all of those that aren't the null string (due to two consecutive spaces)
                                             .join(" ")  // Join the replaced list together

fuente
-1

Python2, 28 bytes

lambda s:" ".join(s.split())

Explicación

lambda s

Función anónima que toma como entrada s.

s.split()

Devuelve una lista de las palabras (que están separadas por cadenas arbitrarias de caracteres de espacios en blanco) de la cadena s.

" ".join(...)

Une la lista nuevamente en una cadena, con cada palabra separada por un espacio ("").

Triggernometry
fuente
2
Esto parece dar resultados incorrectos con respecto a los espacios iniciales y finales. Tenga en cuenta que en el estado de desafío, debe tomar la entrada con comillas dobles y también generarlas con comillas dobles. También me equivoqué al principio, hasta que volví a leer el desafío.
Kevin Cruijssen