Spogliare gli spazi extra da una stringa


12

Ti viene data una stringa. Emette la stringa con uno spazio per parole.

Sfida

L'input sarà una stringa (non nullo vuota), racchiusa tra virgolette ( ") inviate tramite stdin. Rimuovi gli spazi iniziali e finali da esso. Inoltre, se ci sono più di uno spazio tra due parole (o simboli o altro), taglialo in un solo spazio. Emette la stringa modificata con le virgolette.

Regole

  • La stringa non sarà più lunga di 100 caratteri e conterrà solo caratteri ASCII nell'intervallo (spazio) da ~(tilde) (codici carattere da 0x20 a 0x7E, inclusi) tranne ", ad esempio, la stringa non conterrà virgolette ( ") e altri caratteri al di fuori del intervallo sopra specificato. Vedere la tabella ASCII per riferimento.
  • Devi prendere input dalla stdin(o alternativa più vicina).
  • L'output deve contenere virgolette ( ").
  • È possibile scrivere un programma completo o una funzione che accetta input (da stdin) e genera la stringa finale

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

punteggio

Questo è il golf del codice, quindi vince l'invio più breve (in byte).


1
Dici must take input from stdin, e dopo dici ...or a function which takes input, and outputs the final string. Questo significa che anche la funzione deve ricevere input stdin?
Blutorange,

@blutorange, Sì. A cura di chiarirlo.
Spikatrix,

2
" "aa" "-> ""aa""(le virgolette sono valide all'interno della stringa di input?)
edc65

@ edc65, buon punto. La risposta è no. A cura di chiarirlo.
Spikatrix,

Si prega di vedere il commento di MickeyT sulla mia risposta. Ciò che propone è valido? In R, i risultati restituiti vengono stampati implicitamente, ma nella mia risposta ho esplicitamente stampato su stdout.
Alex A.

Risposte:


12

CJam, 7 byte

q~S%S*p

Spiegazione del codice

CJam ha riservato tutte le lettere maiuscole come variabili integrate. Quindi Sha un valore di uno spazio qui.

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.

Questo rimuove anche gli spazi iniziali e finali

Provalo online qui


10

/// : 18 caratteri

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

Esecuzione di esempio:

(Usando l'interprete di Faubiguy dalla sua risposta in Perl per Interpret /// (pronunciato 'barre') .)

bash-4.3$ ( echo -n '/  / //" /"// "/"/'; echo '"   foo  *  bar   "'; ) | slashes.pl
"foo * bar"


Tecnicamente non stai prendendo input però. ;) C'è questa lingua ma la lettura dell'input è ancora piuttosto un dolore, penso.
Martin Ender,

6

Perl, 22

(20 byte di codice, più 2 opzioni della riga di comando)

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

Deve essere eseguito con l' -npinterruttore in modo che $_venga automaticamente riempito tramite stdin e stampato su stdout. Presumo che questo aggiunge 2 al conteggio dei byte.


1
stessa soluzione:sed -E 's/ +/ /g;s/" | "/"/g'
izabera,

3
La stessa cosa è di 12 byte in Retina . :)
Martin Ender,

-pimplica -n, quindi devi solo prendere una penalità di +1 qui (supponendo che non passi solo a una lingua diversa, come suggeriscono gli altri commentatori).

4

Rubino, 31 29 25 23 byte

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

Spiegazione del codice:

  • pgenera una stringa tra virgolette doppie STDOUT( C'è di più però ...)
  • $*è un array di STDINinput, $*[0]prende il primo
  • strip rimuove gli spazi iniziali e finali
  • squeeze ' ' sostituisce> 1 caratteri spazio con un singolo spazio

Casi test:

inserisci qui la descrizione dell'immagine


1
È possibile sostituire ARGVcon il $*salvataggio di due byte. gsub /\s+/, ' 'può essere sostituito con squeeze ' 'altri 4 byte
DickieBoy,

@DickieBoy, grazie per $*, non lo sapevo. Ma non possiamo sostituirlo gsub /\s+/, ' 'con squeezequanto essi non sono la stessa cosa .
Sheharyar,

Cosa intendi con "non sono gli stessi"? Le uscite sono uguali.
DickieBoy,

1
squeeze ' 'comprime solo gli spazi. "yellow moon".squeeze "l" => "yelow moon"
DickieBoy,

2
Personalmente lo sono. E anche alcuni altri risponditori. Ma come vedo, né tu sei solo con la tua interpretazione ... Un chiarimento da parte del proprietario della domanda sarebbe il benvenuto. A proposito, sia lo spazio tra pe il suo parametro squeezeche il suo parametro non sono necessari.
arte

4

Pyth, 17 15 11 10 byte

(grazie a Ypnypn e FryAmTheEggman )

pjd-cQdkNN

Probabilmente potrebbe essere più giocato a golf.

Se l'output può essere utilizzato 'invece di "allora ho bisogno solo di 8 byte:

`jd-cQdk

Puoi usare Ninvece di\"
Ypnypn

Benvenuto in Pyth, Tylio. Il secondo programma potrebbe essere ostacolato dall'uso di d.
isaacg,

@isaacg non l'ho già usato dper tutto ciò per cui può essere utilizzato?
Tyilo,

@Tyilo Penso che tu abbia fatto una modifica più o meno nello stesso momento in cui ho commentato. Va tutto bene adesso.
isaacg,

È possibile utilizzare pper salvare alcuni byte sulla concatenazione di stringhe anziché su molti +es. pjd-cQdkNN
FryAmTheEggman,

3

Bash, 36 32 byte

Come funzione, programma o semplicemente in una pipe:

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

Spiegazione

Il primo xargsrimuove le virgolette.

Il secondo xargstaglia il lato sinistro e sostituisce più spazi adiacenti nel mezzo della stringa con uno spazio prendendo ogni "parola" e separandoli con uno spazio.

La xargs -i echo '"{}"'taglia il lato destro e riavvolge la stringa risultante tra virgolette.


2
Wow! È difficile. Purtroppo non gestisce il caso di test 4, ma comunque impressionante.
arte

Sì, questo codice soddisfa il quarto caso di test ed è più breve.
Deltik,

Puoi fare qualcosa del genere? x=xargs;$x|$x|$x -i echo '"{}"'
Cyoce,

@Cyoce: potresti davvero farlo per salvare un byte a costo di perdere la funzionalità della pipe. Ancora non così breve come questa soluzione e non soddisfa ancora il quarto caso di test.
Deltik,

3

Haskell, 31 25 byte

fmap(unwords.words)readLn

wordsdivide la stringa in un elenco di stringhe con spazi come delimitatori e unwordsunisce l'elenco di stringhe con un singolo spazio in mezzo. Le virgolette "vengono rimosse e ripristinate dalle funzioni di Haskell reade show(implicitamente tramite REPL) sulle stringhe.

L'output della funzione stessa è più lungo di tre byte, ovvero 28 byte:

print.unwords.words=<<readLn

Modifica: @Mauris ha indicato la readLnfunzione, che ha salvato alcuni byte.


Ricevo Parse error: naked expression at top levelquando ho testato entrambi i codici qui
Spikatrix,

@CoolGuy: rextester.com prevede programmi interi, non funzioni, quindi prova main=interact$show.unwords.words.read. C'è una REPL online sulla facciata di haskell.org (richiede i cookie abilitati) dove puoi provare fmap(unwords.words.read)getLine.
nimi,

1
fmap(unwords.words)readLne print.unwords.words=<<readLnsono un po 'più brevi.
Lynn,

@Mauris: grazie per aver indicato readLn.
nimi,

2

R, 45 byte

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

La readline()funzione legge da STDIN, eliminando automaticamente qualsiasi spazio bianco iniziale e finale. Lo spazio in eccesso tra le parole viene rimosso usando gsub(). Infine, le doppie virgolette vengono anteposte e aggiunte e il risultato viene stampato su STDOUT.

Esempi:

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

Non sono sicuro che sia totalmente conforme alle regole, ma il gatto potrebbe non essere totalmente richiesto, ma solo gsub. Il risultato è[1] "This is a string"
MickyT,

@MickyT: grazie per il suggerimento. La mia interpretazione basata sul commento del PO (prima sul post) era che doveva essere stampato su stdout. Chiederò chiarimenti.
Alex A.

Ahhh ... non ho visto quel commento o requisito
MickyT

2

Python2, 37

Ridotto di 1 byte grazie a @ygramul.

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

Versione originale:

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

Casi test:

Schermata dei casi di test


Volevo davvero usarlo print" ".join(raw_input().split()), ma avrebbe uno spazio finale all'interno dell'ultima virgoletta se ci fossero spazi dopo l'ultima parola ...
mbomb007

Puoi eliminare un byte in più usando la formattazione%: print '"% s"'% '' .join (input (). Split ())
ygramul

2

JavaScript (ES6), 49 52 58

Modifica 6 byte in meno, grazie a @Optimizer

Modifica 2-3, grazie a @nderscore

Ingresso / uscita tramite popup. Utilizzo della stringa di modello per tagliare 1 byte nella concatenazione di stringhe.

Esegui lo snippet per testare in Firefox.

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


alert(`"${eval(prompt()).match(/\S+/g).join(" ")}"`) - 52
Ottimizzatore,

@Optimizer thx. Nota che funziona solo dopo l'ultimo chiarimento sulle citazioni: eval ('"" "') andrebbe in crash.
edc65,

Quando ho testato il quarto caso di test (utilizzando Chrome), non viene visualizzato alcun popup (che mostra il risultato). Perché?
Spikatrix,

@CoolGuy forse perché Chrome non esegue ES6? Non ho mai testato ES6 con Chrome. Comunque l'ho provato ora nel mio Chrome (42.0.2311.152) e funziona per me.
edc65,

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


1

Mathematica, 75 byte

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

1

KDB (Q), 28 byte

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

Spiegazione

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

Test

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

1

Java 8, 43 byte

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

Spiegazione:

Provalo qui.

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)



1

Jq 1,5 , 42 byte

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

Esecuzione del campione

$ 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

Provalo online


Ho riscontrato il problema di output in precedenza (vedi modifica 5) ma non ho notato il problema di input. Il comando è stato risolto ora. Grazie!
jq170727,

1

Tcl , 69 byte

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

Provalo online!

Tcl , 79 byte

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

Provalo online!


@KevinCruijssen Risolto. purtroppo, a spese di molti byte. Tks per avermelo detto.
sergiol,


0

golfua, 42 byte

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

Semplice sostituzione della corrispondenza del modello: trova le doppie virgolette ( \") racchiuse tra 0 o più spazi ( %s*) e restituisce la virgoletta singola, quindi sostituisci tutti gli 1 o più spazi ( %s+) con un singolo spazio.

Un equivalente di Lua sarebbe

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

0

Cobra - 68

Come una funzione anonima:

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

0

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

Versione non compressa:

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

0

Bash, 14 byte

read f;echo $f       # assume f="this  is  a    string   "

1
Che dire di assumere "foo * bar" o qualsiasi altra cosa con un carattere jolly?
arte

0

Powershell, 40 byte

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

Abbastanza diretto e non molto impressionante.

Spiegazione

Prendi il parametro di input tramite args (predeterminato) variabile, sostituisci tutti gli spazi multipli con uno, taglia gli spazi iniziali e finali usando il metodo trim (), aggiungi virgolette. Powershell stamperà le stringhe per la console come comportamento predefinito.


0

k4, 23 byte

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

0

Zsh , 15 byte

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

Provalo online!

La stringa di input contiene virgolette incorporate. Rimuovi Qper 14 byte se la stringa di input non contiene virgolette incorporate, come avviene in alcune delle altre risposte qui.

QFlag di espansione dei parametri: dequote, quindi si zdivide in parole come fa la shell. Le parole sono quindi implicitamente unite da spazi.


0

Wren , 56 byte

Aspettare. La sostituzione lo fa solo una volta ? Ora devo usare la combinazione split-join.

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

Provalo online!

Spiegazione

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

0

GolfScript , 8 byte

' '%' '*

Provalo online!

Spiegazione

La logica è abbastanza semplice:

' '%     # Split on spaces, remove empty results
    ' '* # Join on spaces

-1

Python2, 28 byte

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

Spiegazione

lambda s

Funzione anonima che accetta come input s.

s.split()

Restituisce un elenco delle parole (che sono separate da stringhe arbitrarie di caratteri bianchi) della stringa s.

" ".join(...)

Elenco dei join in una stringa, con ogni parola separata da uno spazio ("").


2
Questo sembra dare risultati errati riguardo agli spazi iniziali e finali. Nota che nello stato di sfida dovresti prendere l'input con le virgolette doppie e anche output con le virgolette doppie. All'inizio ho anche avuto questo errore, fino a quando non ho riletto la sfida.
Kevin Cruijssen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.