Nehmen Sie den ersten Buchstaben jedes Wortes, lassen Sie Leerzeichen und Satzzeichen

8

Verkleinern Sie jedes Wort in einer Folge von Zeichenketten auf einzelne Buchstaben, die durch Leerzeichen oder Satzzeichen gekennzeichnet sind.

Beispiel

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. 

wird

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. 

Bearbeiten - Wenn mehrere Leerzeichen vorhanden sind, behalten Sie nur ein Leerzeichen bei. Alle Interpunktion sollte erhalten bleiben, ich habe den Apostroph verpasst. Ja das ist Code Golf :-).

Cthanatos
quelle
1
Kann es zwischen den Wörtern mehrere Leerzeichen geben? Müssen wir sie bewahren?
Dennis
8
Welche Zeichen zählen genau als Interpunktion?
Dennis
1
Was ist das erforderliche Verhalten für Zahlen oder andere Zeichen außer Interpunktion ( +usw.)
grovesNL
1
Wird es jemals mehr als eine Interpunktion innerhalb eines Wortes geben? So etwas O'Leary-Clarence-DeVoiswürde werden O'--?
hmatt1
8
Sie können eine Antwort jederzeit akzeptieren, aber es ist besser, einige Zeit (Tage) zu lassen, bevor Sie eine Herausforderung abschließen.
edc65

Antworten:

5

CJam, 13 Bytes

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

Funktioniert, wenn ich nur die allgemeinen Satzzeichen berücksichtigen kann und die Ausgabe nachgestellte Leerzeichen enthalten kann. (Danke an Dennis.)

Diese Frage muss noch viel geklärt werden ...

CJam, 17 16 Bytes

r{(\eu_elf&Sr}h&

Probieren Sie es online aus .

Erläuterung

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
quelle
Können Sie bitte einen Link hinzufügen, um es zu testen? Ich bin auf dem Handy.
Cthanatos
@Cthanatos hinzugefügt.
Jimmy23013
1
rschiebt eine leere Zeichenfolge auf EOF, so funktioniert dies auch:r{(\eu_elf&Sr}h;
Dennis
1
@ Tennis Ich bin mir sicher, dass ich so einen Code schon oft gesehen habe, aber ich habe mich immer noch nicht daran erinnert ... Danke. Aber das ;macht dann keinen Sinn.
Jimmy23013
1
Bei Bedarf können Sie es trotzdem mit loswerden &. Je nachdem, was genau als Interpunktion zählt, '@,wäre dies auch eine kürzere Alternative zu eu_el.
Dennis
4

Pyth, 14 Bytes

jdm+hd-rtd0Gcz

Probieren Sie es online aus: Demonstration

Erläuterung:

                 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
quelle
Dupliziert das Bindestriche?
Cthanatos
@Cthanatos Sollte jetzt funktionieren.
Jakube
@grovesNL Kannst du dir einen Satz vorstellen, auf den man beim normalen Schreiben stoßen könnte, z. B. ein Buch, einen Nachrichtenartikel, in dem Zahlen innerhalb eines Satzes ein Problem darstellen oder auftauchen könnten?
Cthanatos
@Cthanatos: Es gibt viele Fälle, in denen Zahlen in Büchern oder Nachrichtenartikeln verwendet werden. " Über 200 Befragte ... " " Das Grundstück ist 50 Morgen
groß
Touché ... Guter Punkt.
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()])

Ich bin neu im Code-Golf, aber ich dachte, ich würde es versuchen! Dies ist kein Gewinner, aber es hat Spaß gemacht.

Dadurch wird nur die Zeichenfolge aufgeteilt, wobei das erste Zeichen jedes Wortes zusammen mit etwaigen Satzzeichen im Rest des Wortes verwendet wird.

* bearbeitet mit Änderungen von FryAmTheEggman, DLosc

Robotato
quelle
Sie können das mit einem Stern versehene Argument von Python verwenden, um einige Bytes zu speichern, und das Invertieren der Bedingung scheint 1 Byte zu sparen (obwohl es immer noch verdächtig golffähig aussieht). print(*[w[0]+''.join([c for c in w[1:]if 1-c.isalpha()])for w in input().split()])
Folgendes habe
@FryAmTheEggman Ah, danke! Ich habe vergessen, dass Argumente mit Sternen übergangen wurden.
Robotato
2
Keine Notwendigkeit für die eckigen Klammern um das innere Verständnis - joinkann einen bloßen Generator als Argument nehmen. Hier ist auch eine Methode zum Schneiden von Zeichenfolgen, um die "wenn nicht isalpha" -Logik auszuführen : c[c.isalpha():]for c in w. Sollte Sie auf 77 Bytes reduzieren. : ^)
DLosc
@DLosc Dieser String-Slicing-Trick ist clever, danke! Ich muss mich daran erinnern.
Robotato
1

sed (39 Zeichen)

Nur ein paar reguläre Ausdrücke:

sed 's+\<\(.\)[A-Za-z]*+\1+g;s+  *+ +g'
joeytwiddle
quelle
2
Normalerweise zählen wir den Namen des Interpreters und die zusätzliche Syntax, die die Shell benötigt, um den Code oder die Daten korrekt an den Interpreter zu übergeben, nicht. Ihr tatsächlicher Sed-Code besteht nur aus 32 Zeichen.
Manatwork
1

Lua - 126 Zeichen

Lua ist keine gute Code-Golfsprache, aber ich habe es ausprobiert:

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 )

Dies setzt voraus, dass dies cdie Zeichenfolge ist.

Hier wird es zur besseren Lesbarkeit aufgeräumt:

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 )

Sie können es hier testen (kopieren und einfügen. Zum ersten müssen Sie es auch tun c = "I'm a little ....) Aus irgendeinem Grund können Sie in der Online-Demo von Lua keine Variablen mit io.read...

DavisDude
quelle
1

PowerShell, 56 Byte

%{($_-split' '|%{$_[0]+($_-replace'[a-z]','')})-join' '}
Nacht - Monica wieder einsetzen
quelle
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>

Kommentiert:

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
quelle
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]);}

Ungolfed:

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

Verwendungszweck:

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

Ausgabe:

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-
quelle
1

Java 8, 87 Bytes

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

Erläuterung:

Probieren Sie es hier aus.

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

Regex Erklärung:

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)

Es werden also im Grunde alle Kleinbuchstaben eines Strings entfernt, mit Ausnahme des allerersten.

Kevin Cruijssen
quelle
0

R, 46 45 Bytes

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

Dies liest eine Zeile von STDIN und druckt nach STDOUT. Es wird ein regulärer Ausdruck verwendet, um alle Zeichen nach dem ersten Buchstaben zu entfernen, gefolgt von einer beliebigen Interpunktion.

Ungolfed + Erklärung:

# 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 = " ")

Beispiel:

> 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.
quelle
0

05AB1E , 13 Bytes

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

Probieren Sie es online aus!

Erläuterung:

#õ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
quelle
0

VBA (Excel), 141 133 Bytes

Verwenden des VBA-Sofortfensters [A1] als eingegebene Zeichenfolgen.

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)]
remoel
quelle