Ambil huruf pertama dari setiap kata, beri spasi dan tanda baca

8

Kecilkan setiap kata dalam serangkaian string menjadi satu huruf yang digambarkan dengan spasi atau tanda baca.

Contoh

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. 

menjadi

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. 

Edit - jika ada banyak ruang, pertahankan hanya satu ruang. Semua tanda baca harus dilestarikan, saya merindukan tanda kutip. Ya ini kode golf :-).

Cthanatos
sumber
1
Bisakah ada beberapa spasi di antara kata-kata? Apakah kita harus melestarikannya?
Dennis
8
Juga, karakter mana yang secara tepat dihitung sebagai tanda baca?
Dennis
1
Apa perilaku yang diperlukan untuk angka atau karakter lain selain tanda baca ( +dll.)
grovesNL
1
Akankah ada lebih dari satu tanda baca dalam satu kata? O'Leary-Clarence-DeVoisAkan seperti apa jadinya O'--?
hmatt1
8
Anda dapat menerima jawaban kapan pun Anda suka, tetapi lebih baik meninggalkan waktu (hari) sebelum menutup tantangan.
edc65

Jawaban:

5

CJam, 13 byte

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

Bekerja jika saya hanya dapat mempertimbangkan karakter tanda baca yang umum, dan hasilnya dapat memiliki spasi tambahan. (Terima kasih kepada Dennis.)

Pertanyaan ini membutuhkan lebih banyak klarifikasi ...

CJam, 17 16 byte

r{(\eu_elf&Sr}h&

Cobalah online .

Penjelasan

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
sumber
Bisakah Anda menambahkan tautan untuk mengujinya? Saya di ponsel.
Cthanatos
@Cthanatos Ditambahkan.
jimmy23013
1
rmendorong string kosong pada EOF, jadi ini juga berfungsi:r{(\eu_elf&Sr}h;
Dennis
1
@ Dennis Saya yakin saya telah melihat kode seperti itu berkali-kali, tetapi masih tidak ingat ... Terima kasih. Tapi itu ;tidak masuk akal.
jimmy23013
1
Jika diperlukan, Anda masih bisa menyingkirkannya &. Juga, tergantung pada apa yang secara tepat dianggap sebagai tanda baca, '@,akan menjadi alternatif yang lebih pendek eu_el.
Dennis
4

Pyth, 14 byte

jdm+hd-rtd0Gcz

Cobalah online: Peragaan

Penjelasan:

                 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
sumber
Apakah ini tanda hubung duplikat?
Cthanatos
@Cthanatos Harusnya bekerja sekarang.
Jakube
@grovesNL dapatkah Anda memikirkan sebuah kalimat yang mungkin dijumpai dalam tulisan biasa yaitu sebuah buku, artikel berita di mana angka-angka dalam sebuah kalimat mungkin menjadi masalah atau muncul?
Cthanatos
@Cthanatos: Ada banyak kasus di mana angka digunakan dalam buku atau artikel berita. " Lebih dari 200 responden ... " "
Lotnya
Sentuh ... Poin bagus.
Cthanatos
2

Python 3.4, 94 92 82 77 byte

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

Saya baru mengenal golf kode, tetapi saya pikir saya akan mencobanya! Yang ini bukan pemenang, tapi itu menyenangkan.

Ini hanya membagi string, mengambil karakter pertama dari setiap kata bersama dengan tanda baca apa pun di seluruh kata.

* diedit dengan perubahan oleh FryAmTheEggman, DLosc

Robotato
sumber
Anda dapat menggunakan argumen berbintang python yang lewat untuk menyimpan beberapa byte, dan membalikkan kondisi tampaknya menghemat 1 byte (meskipun masih terlihat mencurigakan golfable). Inilah yang saya dapatkan:print(*[w[0]+''.join([c for c in w[1:]if 1-c.isalpha()])for w in input().split()])
FryAmTheEggman
@FryAmTheEggman Ah, terima kasih! Saya lupa tentang lewatnya argumen berbintang.
Robotato
2
Tidak perlu kawat gigi persegi di sekitar pemahaman batin - joindapat mengambil generator telanjang sebagai argumen. Juga, inilah cara string mengiris dari melakukan "jika tidak isalpha" logika: c[c.isalpha():]for c in w. Harus membuat Anda turun ke 77 byte. : ^)
DLosc
@DLosc Trik mengiris string itu pintar, terima kasih! Saya harus ingat yang itu.
Robotato
1

sed (39 karakter)

Hanya beberapa ekspresi reguler:

sed 's+\<\(.\)[A-Za-z]*+\1+g;s+  *+ +g'
joeytwiddle
sumber
2
Kami biasanya tidak menghitung nama juru bahasa dan sintaks tambahan yang diperlukan oleh shell untuk meneruskan kode atau data dengan benar ke juru bahasa. Kode Sed Anda yang sebenarnya hanya memiliki 32 karakter.
manatwork
1

Lua - 126 karakter

Lua tidak banyak bahasa kode golf, tapi saya mencobanya:

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 )

Ini mengasumsikan bahwa itu cadalah string.

Di sini dibersihkan untuk dibaca:

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 )

Anda dapat mengujinya di sini (salin dan tempel. Untuk yang pertama Anda juga harus melakukannya c = "I'm a little ....) Untuk beberapa alasan demo online Lua tidak akan membiarkan Anda memasukkan variabel menggunakan io.read...

Davis Bung
sumber
1

PowerShell, 56 byte

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

Javascript ( ES6 ) 72 68 byte

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>

Berkomentar:

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

C99 - 170 169 byte

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

Tidak Disatukan:

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

Pemakaian:

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

Keluaran:

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

Java 8, 87 byte

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

Penjelasan:

Coba di sini.

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

Penjelasan regex:

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)

Jadi pada dasarnya menghapus semua huruf kecil dari suatu String, kecuali yang pertama.

Kevin Cruijssen
sumber
0

R, 46 45 byte

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

Ini membaca garis dari STDIN dan mencetak ke STDOUT. Ini menggunakan ekspresi reguler untuk menghapus semua karakter setelah huruf pertama diikuti oleh sejumlah tanda baca.

Penjelasan + tidak dikumpulkan:

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

Contoh:

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

05AB1E , 13 byte

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

Cobalah online!

Penjelasan:

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

VBA (Excel), 141 133 Bytes

Menggunakan VBA Immediate Window, [A1] sebagai String yang Dimasukkan.

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
sumber