Lấy chữ cái đầu tiên của mỗi từ, để lại dấu cách và dấu chấm câu


8

Thu nhỏ từng từ trong một chuỗi các chuỗi thành các chữ cái đơn được phân định bằng dấu cách hoặc dấu chấm câu.

Thí dụ

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. 

trở thành

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. 

Chỉnh sửa - nếu có nhiều khoảng trắng, chỉ giữ lại một khoảng trắng. Tất cả các dấu câu nên được bảo tồn, tôi đã bỏ lỡ dấu nháy đơn. Vâng, đây là mã golf :-).


1
Có thể có nhiều khoảng trống giữa các từ? Chúng ta có phải bảo tồn chúng không?
Dennis

8
Ngoài ra, những ký tự chính xác được tính là dấu chấm câu?
Dennis

1
Hành vi cần thiết cho các số hoặc các ký tự khác ngoài dấu chấm câu ( +v.v.)
grovesNL

1
Sẽ có nhiều hơn một dấu câu trong một từ? Một cái gì đó như O'Leary-Clarence-DeVoissẽ trở thành O'--?
hmatt1

8
Bạn có thể chấp nhận câu trả lời bất cứ khi nào bạn muốn, nhưng tốt hơn là nên để lại một chút thời gian (ngày) trước khi kết thúc một thử thách.
edc65

Câu trả lời:


5

CJam, 13 byte

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

Hoạt động nếu tôi chỉ có thể xem xét các ký tự dấu chấm câu phổ biến và đầu ra có thể có dấu cách. (Cảm ơn Dennis.)

Câu hỏi này cần làm rõ hơn nhiều ...

CJam, 17 16 byte

r{(\eu_elf&Sr}h&

Hãy thử trực tuyến .

Giải trình

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.

Bạn có thể thêm một liên kết để kiểm tra nó xin vui lòng? Tôi đang sử dụng điện thoại di động.
Cthanatos

@Cthanatos Đã thêm.
jimmy23013

1
rđẩy một chuỗi trống trên EOF, do đó, chuỗi này cũng hoạt động:r{(\eu_elf&Sr}h;
Dennis

1
@Dennis Tôi chắc chắn rằng tôi đã thấy mã như vậy nhiều lần, nhưng vẫn không nhớ ... Cảm ơn. Nhưng ;không có ý nghĩa sau đó.
jimmy23013

1
Nếu được yêu cầu, bạn vẫn có thể thoát khỏi nó với &. Ngoài ra, tùy thuộc vào chính xác những gì được tính là dấu chấm câu, '@,sẽ là một cách thay thế ngắn hơn eu_el.
Dennis

4

Bình thường, 14 byte

jdm+hd-rtd0Gcz

Dùng thử trực tuyến: Trình diễn

Giải trình:

                 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

Đây có phải là dấu gạch nối trùng lặp?
Cthanatos

@Cthanatos Nên làm việc ngay.
Jakube

@grovesNL bạn có thể nghĩ ra một câu mà người ta có thể bắt gặp bằng văn bản thông thường tức là một cuốn sách, bài báo trong đó các số trong một câu có thể là một vấn đề hoặc xuất hiện không?
Cthanatos

@Cthanatos: Có rất nhiều trường hợp số được sử dụng trong sách hoặc tin tức. " Hơn 200 người được hỏi ... " "

Touché ... Điểm tốt.
Cthanatos

2

Con trăn 3,4, 94 92 82 77 byte

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

Tôi chưa quen với môn đánh gôn nhưng tôi nghĩ tôi sẽ thử! Đây không phải là một người chiến thắng, nhưng nó rất vui.

Điều này chỉ cần tách chuỗi, lấy ký tự đầu tiên của mỗi từ cùng với bất kỳ dấu câu nào trong phần còn lại của từ.

* được chỉnh sửa với các thay đổi của FryAmTheEggman, DLosc


Bạn có thể sử dụng đối số được gắn dấu sao của python để lưu một số byte và đảo ngược điều kiện dường như tiết kiệm 1 byte (mặc dù nó vẫn có vẻ đáng ngờ khi chơi golf). Đây là những gì tôi nhận được:print(*[w[0]+''.join([c for c in w[1:]if 1-c.isalpha()])for w in input().split()])
FryAmTheEggman

@FryAmTheEggman À, cảm ơn! Tôi quên mất cuộc tranh cãi được gắn sao.
Robotato

2
Không cần các dấu ngoặc vuông xung quanh sự hiểu biết bên trong-- joincó thể lấy một máy phát điện trần làm đối số. Ngoài ra, đây là một cách cắt chuỗi để thực hiện logic "nếu không phải là isalpha" : c[c.isalpha():]for c in w. Sẽ giúp bạn xuống tới 77 byte. : ^)
DLosc

@DLosc Thủ thuật xâu chuỗi đó thật thông minh, cảm ơn! Tôi sẽ phải nhớ điều đó.
Robotato


1

sed (39 ký tự)

Chỉ cần một vài biểu thức thông thường:

sed 's+\<\(.\)[A-Za-z]*+\1+g;s+  *+ +g'

2
Chúng tôi thường không tính tên của trình thông dịch và cú pháp bổ sung được yêu cầu bởi shell để truyền mã hoặc dữ liệu chính xác cho trình thông dịch. Mã Sed thực tế của bạn chỉ có 32 ký tự.
thao tác

1

Lua - 126 ký tự

Lua không phải là một ngôn ngữ chơi gôn mã, nhưng tôi đã cho nó một cú đánh:

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 )

Giả định đó clà chuỗi.

Ở đây nó được dọn sạch để dễ đọc:

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 )

Bạn có thể kiểm tra nó ở đây (sao chép và dán nó. Lần đầu tiên bạn cũng phải làm c = "I'm a little ....) Vì một số lý do, bản demo trực tuyến của Lua sẽ không cho phép bạn nhập các biến bằng io.read...



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>

Đã bình luận:

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

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

Ung dung:

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

Sử dụng:

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

Đầu ra:

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.

1

Java 8, 87 byte

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

Giải trình:

Hãy thử nó ở đây.

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 giải thích:

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)

Vì vậy, về cơ bản, nó loại bỏ tất cả các chữ cái viết thường của Chuỗi, ngoại trừ chữ cái đầu tiên.



0

R, 46 45 byte

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

Điều này đọc một dòng từ STDIN và in sang STDOUT. Nó sử dụng một biểu thức chính quy để loại bỏ tất cả các ký tự sau chữ cái đầu tiên theo sau bởi bất kỳ dấu chấm câu nào.

Ungolfed + giải thích:

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

Thí dụ:

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

0

05AB1E , 13 byte

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

Hãy thử trực tuyến!

Giải trình:

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

0

VBA (Excel), 141 133 byte

Sử dụng Cửa sổ ngay lập tức VBA, [A1] làm Chuỗi nhập.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.