Supprimer les espaces supplémentaires d'une chaîne

12

On vous donne une chaîne. Sortez la chaîne avec un espace par mot.

Défi

L'entrée sera une chaîne (non nullou vide), entourée de guillemets ( ") envoyés via le stdin. Supprimez-y les espaces de début et de fin. De plus, s'il y a plus d'un espace entre deux mots (ou symboles ou autre), coupez-le à un seul espace. Sortez la chaîne modifiée avec les guillemets.

Règles

  • La chaîne ne dépassera pas 100 caractères et ne contiendra que des caractères ASCII dans la plage (espace) à ~(tilde) (codes de caractères 0x20 à 0x7E, inclus) sauf ", c'est-à-dire que la chaîne ne contiendra pas de guillemets ( ") et d'autres caractères en dehors de la plage spécifiée ci-dessus. Voir le tableau ASCII pour référence.
  • Vous devez prendre connaissance de stdin(ou de l'alternative la plus proche).
  • La sortie doit contenir des guillemets ( ").
  • Vous pouvez écrire un programme complet ou une fonction qui prend une entrée (de stdin) et produit la chaîne finale

Cas de test

"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 -" 

Notation

Il s'agit du code golf, donc la soumission la plus courte (en octets) l'emporte.

Spikatrix
la source
1
Vous dites must take input from stdin, et plus tard vous dites ...or a function which takes input, and outputs the final string. Cela signifie-t-il que la fonction doit également recevoir des informations stdin?
blutorange
@blutorange, oui. Édité pour le clarifier.
Spikatrix
2
" "aa" "-> ""aa""(les guillemets sont-ils valides dans la chaîne d'entrée?)
edc65
@ edc65, bon point. La réponse est non. Édité pour le clarifier.
Spikatrix
Veuillez voir le commentaire de MickeyT sur ma réponse. Ce qu'il propose est-il valable? Dans R, les résultats retournés sont implicitement imprimés, mais dans ma réponse, j'ai explicitement imprimé sur stdout.
Alex A.

Réponses:

12

CJam, 7 octets

q~S%S*p

Explication du code

CJam a réservé toutes les majuscules en tant que variables intégrées. A donc Sla valeur d'un espace ici.

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.

Cela supprime également les espaces de fin et de début

Essayez-le en ligne ici

Optimiseur
la source
10

/// : 18 caractères

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

Exemple d'exécution:

(Utilisation de l 'interprète de faubiguy à partir de sa réponse Perl pour Interpréter /// (prononcé «slashes») .)

bash-4.3$ ( echo -n '/  / //" /"// "/"/'; echo '"   foo  *  bar   "'; ) | slashes.pl
"foo * bar"
homme au travail
la source
Techniquement, vous n'acceptez pas de commentaires. ;) Il y a ce langage mais la lecture est encore assez pénible je pense.
Martin Ender
6

Perl, 22

(20 octets de code, plus 2 commutateurs de ligne de commande)

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

Doit être exécuté avec le -npcommutateur afin qu'il $_soit automatiquement rempli via stdin et imprimé sur stdout. Je vais supposer que cela ajoute 2 au nombre d'octets.

r3mainer
la source
1
même solution:sed -E 's/ +/ /g;s/" | "/"/g'
izabera
3
La même chose est de 12 octets en rétine . :)
Martin Ender
-pimplique -n, vous n'avez donc qu'à prendre une pénalité de +1 ici (en supposant que vous ne passez pas simplement à une autre langue, comme le suggèrent les autres commentateurs).
4

Rubis, 31 29 25 23 octets

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

Explication du code:

  • paffiche une chaîne entre guillemets doubles STDOUT(il y a plus que ça ...)
  • $*est un tableau d' STDINentrées, $*[0]prend la première
  • strip supprime les espaces de début et de fin
  • squeeze ' ' remplace> 1 espace par un seul espace

Cas de test:

entrez la description de l'image ici

Sheharyar
la source
1
Vous pouvez remplacer ARGVen $*économisant deux octets. gsub /\s+/, ' 'peut être remplacé par squeeze ' 'pour 4 autres octets
DickieBoy
@DickieBoy, merci pour $*, je ne le savais pas. Mais nous ne pouvons pas les remplacer gsub /\s+/, ' 'par squeezecar ce ne sont pas les mêmes .
Sheharyar
Que voulez-vous dire par «ne sont pas les mêmes»? Les sorties sont les mêmes.
DickieBoy
1
squeeze ' 'ne fera que serrer les espaces. "yellow moon".squeeze "l" => "yelow moon"
DickieBoy
2
Personnellement, je le suis. Et certains autres répondeurs aussi. Mais comme je vois, vous n'êtes pas non plus seul avec votre interprétation… Une clarification du propriétaire de la question serait la bienvenue. Soit dit en passant, l'espace entre pet son paramètre et squeezeet son paramètre sont inutiles.
manatwork
4

Pyth, 17 15 11 10 octets

(merci à Ypnypn et FryAmTheEggman )

pjd-cQdkNN

Pourrait probablement être plus joué au golf.

Si la sortie peut utiliser à la 'place, "je n'ai besoin que de 8 octets:

`jd-cQdk
Tyilo
la source
Vous pouvez utiliser Nau lieu de\"
Ypnypn
Bienvenue à Pyth, Tylio. Le deuxième programme pourrait être raccourci par l'utilisation de d.
isaacg
@isaacg n'ai-je pas déjà utilisé dtout ce pour quoi il peut être utilisé?
Tyilo
@Tyilo Je pense que vous avez fait un montage à peu près au même moment que je l'ai commenté. Tout va bien maintenant.
isaacg
Vous pouvez utiliser ppour enregistrer quelques octets sur la concaténation de chaînes au lieu de plusieurs +es. pjd-cQdkNN
FryAmTheEggman
3

Bash, 36 32 octets

En tant que fonction, programme ou simplement dans un tube:

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

Explication

Le premier xargssupprime les guillemets.

Le second xargscoupe le côté gauche et remplace plusieurs espaces adjacents au milieu de la chaîne par un espace en prenant chaque "mot" et en les séparant chacun par un espace.

Le xargs -i echo '"{}"'coupe le côté droit et rembobine la chaîne résultante entre guillemets.

Deltik
la source
2
Hou la la! C'est délicat. Malheureusement, ne gère pas le cas de test 4, mais reste impressionnant.
manatwork
Oui, ce code répond au quatrième cas de test et est plus court.
Deltik
Pouvez-vous faire quelque chose comme ça? x=xargs;$x|$x|$x -i echo '"{}"'
Cyoce
@Cyoce: Vous pourriez en effet le faire pour économiser un octet au prix de la perte de la fonctionnalité de canal. Toujours pas aussi court que cette solution et ne satisfait toujours pas le quatrième cas de test.
Deltik
3

Haskell, 31 25 octets

fmap(unwords.words)readLn

wordsdivise la chaîne en une liste de chaînes avec des espaces comme délimiteurs et unwordsjoint la liste des chaînes avec un seul espace entre les deux. Les guillemets "sont supprimés et remis par les fonctions de Haskell readet show(implicitement via le REPL) sur les chaînes.

La sortie par la fonction elle-même est plus longue de trois octets, soit 28 octets:

print.unwords.words=<<readLn

Edit: @Mauris a souligné la readLnfonction, qui a enregistré quelques octets.

nimi
la source
Je reçois Parse error: naked expression at top levelquand j'ai testé les deux codes ici
Spikatrix
@CoolGuy: rextester.com attend des programmes entiers, pas des fonctions, alors essayez main=interact$show.unwords.words.read. Il y a un REPL en ligne à la façade de haskell.org (nécessite les cookies activés) où vous pouvez essayer fmap(unwords.words.read)getLine.
nimi
1
fmap(unwords.words)readLnet print.unwords.words=<<readLnsont un peu plus courts.
Lynn
@Mauris: merci de pointer du doigt readLn.
nimi
2

R, 45 octets

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

La readline()fonction lit à partir de STDIN, supprimant automatiquement tous les espaces blancs de début et de fin. L'excès d'espace entre les mots est supprimé à l'aide de gsub(). Enfin, les guillemets doubles sont ajoutés et ajoutés avant et le résultat est imprimé dans STDOUT.

Exemples:

> 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.
la source
Je ne sais pas s'il est totalement conforme aux règles, mais le chat peut ne pas être totalement requis, juste le gsub. La sortie de cela est[1] "This is a string"
MickyT
@MickyT: Merci pour la suggestion. Mon interprétation basée sur le commentaire du PO (d'abord sur le post) était qu'il devait être imprimé sur stdout. Je vais demander des éclaircissements.
Alex A.
Ahhh ... n'a pas vu ce commentaire ou cette exigence
MickyT
2

Python2, 37

Réduit de 1 octet grâce à @ygramul.

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

Version originale:

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

Cas de test:

Capture d'écran des cas de test

user12205
la source
Je voulais vraiment l'utiliser print" ".join(raw_input().split()), mais il y aurait un espace de fin à l'intérieur du dernier guillemet s'il y avait des espaces après le dernier mot ...
mbomb007
Vous pouvez raser un octet supplémentaire en utilisant le formatage%: print '"% s"'% '' .join (input (). Split ())
ygramul
2

JavaScript (ES6), 49 52 58

Éditez 6 octets plus court, grâce à @Optimizer

Edit 2 -3, grâce à @nderscore

Entrée / sortie via popup. Utilisation d'une chaîne de modèle pour couper 1 octet dans la concaténation de chaînes.

Exécutez l'extrait de code pour tester dans Firefox.

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

edc65
la source
alert(`"${eval(prompt()).match(/\S+/g).join(" ")}"`) - 52
Optimizer
@Optimizer thx. Remarque, cela fonctionne juste après la dernière clarification sur les citations: eval ('"" "') planterait.
edc65
Lorsque j'ai testé le quatrième cas de test (en utilisant Chrome), aucune fenêtre contextuelle (qui montre le résultat) n'est visible. Pourquoi?
Spikatrix
@CoolGuy peut-être parce que Chrome n'exécute pas ES6? Je n'ai jamais testé ES6 avec Chrome. Quoi qu'il en soit, je l'ai essayé maintenant dans mon Chrome (42.0.2311.152) et fonctionne pour moi.
edc65
-3:alert(`"${prompt().match(/[^ "]+/g).join(" ")}"`)
nderscore
2

05AB1E , 9 octets

#õKðý'".ø

Essayez-le en ligne!


#         | Split on spaces.
 õK       | Remove empty Strings.
   ðý     | Join with spaces.
     '".ø | Surround with quotes.
Urne de poulpe magique
la source
1

Mathematica, 75 octets

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

KDB (Q), 28 octets

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

Explication

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

Tester

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

Java 8, 43 octets

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

Explication:

Essayez-le ici.

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
la source
1

Jq 1,5 , 42 octets

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

Sample Run

$ 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

Essayez-le en ligne

jq170727
la source
J'ai rencontré le problème de sortie plus tôt (voir la modification 5) mais je n'ai pas remarqué le problème d'entrée. La commande est maintenant corrigée. Merci!
jq170727
1

Tcl , 69 octets

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

Essayez-le en ligne!

Tcl , 79 octets

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

Essayez-le en ligne!

sergiol
la source
@KevinCruijssen Fixed. malheureusement, au détriment de nombreux octets. Tks pour me l'avoir dit.
sergiol
0

golfua, 42 octets

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

Remplacement de correspondance de modèle simple: recherchez les guillemets doubles ( \") entourés de 0 ou plusieurs espaces ( %s*) et renvoyez le guillemet simple, puis remplacez tous les 1 ou plusieurs espaces ( %s+) par un seul espace.

Un équivalent Lua serait

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

Cobra - 68

En tant que fonction anonyme:

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

Objectif-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];}

Version non compressée:

-(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
la source
0

Bash, 14 octets

read f;echo $f       # assume f="this  is  a    string   "
michael501
la source
1
Que diriez-vous de supposer "foo * bar" ou toute autre chose avec un caractère générique?
manatwork
0

Powershell, 40 octets

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

Assez simple et pas très impressionnant.

Explication

Prendre le paramètre d'entrée via la variable args (prédéfinie), remplacer tous les espaces multiples par un, couper les espaces de début et de fin en utilisant la méthode trim (), ajouter des guillemets. Powershell imprimera les chaînes sur la console comme comportement par défaut.

peu importe
la source
0

k4, 23 octets

" "/: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
griffonner
la source
0

Zsh , 15 octets

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

Essayez-le en ligne!

La chaîne d'entrée contient des guillemets incorporés. Supprimez le Qpour 14 octets si la chaîne d'entrée ne contient pas de guillemets incorporés, comme cela est fait dans certaines des autres réponses ici.

QIndicateurs d' expansion des paramètres: déquote, puis zse divise en mots comme le fait le shell. Les mots sont alors implicitement joints par des espaces.

GammaFunction
la source
0

Troglodyte , 56 octets

Attendez. Le remplacement ne fait-il qu'une seule fois ? Maintenant, je dois utiliser le combo split-join.

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

Essayez-le en ligne!

Explication

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

la source
-1

Python2, 28 octets

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

Explication

lambda s

Fonction anonyme qui prend en entrée s.

s.split()

Renvoie une liste des mots (qui sont séparés par des chaînes arbitraires de caractères blancs) de la chaîne s.

" ".join(...)

Rejoint la liste dans une chaîne, chaque mot étant séparé par un espace ("").

Triggernométrie
la source
2
Cela semble donner des résultats incorrects concernant les espaces de début et de fin. Notez que l'état de défi, vous devez prendre l'entrée avec les guillemets doubles, et également les sortir avec des guillemets doubles. J'ai également eu ce problème au début, jusqu'à ce que je relise le défi.
Kevin Cruijssen