Tạo từ viết tắt


19

Điều này tương tự như Tạo từ viết tắt , nhưng có một số khác biệt chính, bao gồm phương pháp tìm nạp từ viết tắt và thách thức này bao gồm đầu ra linh hoạt.

Bài tập

Cho một chuỗi (danh sách ký tự / độ dài 1 chuỗi được cho phép) chỉ chứa ASCII có thể in được, xuất tất cả các chữ in hoa trong đầu vào trước dấu cách hoặc dấu gạch ngang hoặc là ký tự đầu tiên trong đầu vào. Chuỗi rỗng là hành vi không xác định.

Các trường hợp thử nghiệm:

Đầu ra có thể là định dạng của "TEST", ["T","E","S","T"]hoặc bất cứ điều gì tác phẩm khác cho bạn.

Self-contained Underwater Breathing Apparatus
SUBA

a Programming Language
PL

NATO Atlantic TREATY Organization
NATO

DEFCON 2
D

hello, world!


light-Emitting dioDe
E

What Does the Fox Say?
WDFS


3D mov-Ies
I

laugh-Out Lou-D
OLD

Best friends FOREVE-r
BF

--


<space>


--  --a -  - --


--  -- -  - -- A
A

Step-Hen@Gmail-Mail Mail.CoM m
SHMM

Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.



Chúng ta có thể lấy đầu vào làm danh sách các Chuỗi (danh sách các ký tự) không?
Ông Xcoder

@ Mr.Xcoder có.
Stephen

Bạn có thể thêm trường hợp kiểm tra bao gồm một số chữ cái được phân tách bằng một hoặc nhiều ký tự không phải là chữ cái, số, dấu cách hoặc dấu gạch ngang. Một địa chỉ email, ví dụ : My-Name@Some-Domain.TLD.
Xù xì

1
@Shaggy thêm vào, cảm ơn.
Stephen

Câu trả lời:


8

V , 7 byte

ÍÕü¼À!õ

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

Đây là một hexdump để chứng minh số byte:

00000000: cdd5 fcbc c021 f5                        .....!.

Giải trình:

Í       " Search and replace all occurrences on all lines:
        " (Search for)
 Õ      "   A non-uppercase letter [^A-Z]
  ü     "   OR
      õ "   An uppercase letter
    À!  "   Not preceded by...
   ¼    "   A word-boundary
        " (implicitly) And replace it with:
        "   Nothing

Đây là ngắn tất cả nhờ vào tuyệt vời của V nén regex .


Đó là khá ngắn 0.o
Stephen

@StepHen Tại sao cảm ơn bạn! Tôi nghĩ rằng điều này là khá gần với tối ưu. :)
DJMcMayhem

2
Bạn có ý nghĩa gì bởi một ranh giới từ? Câu hỏi dường như gợi ý rằng chỉ có không gian và -được cho phép.
Neil

8

R , 66 63 byte

function(s)(s=substr(strsplit(s,' |-')[[1]],1,1))[s%in%LETTERS]

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

-3 byte nhờ Scarabee

Một chức năng ẩn danh; trả về từ viết tắt dưới dạng một vectơ c("N","A","T","O")được in ngầm.

Lần đầu tiên, điều này không quá tệ trong R! chia tách trên -hoặc (space), lấy phần tử đầu tiên của mỗi phần tử đó và sau đó trả về bất kỳ phần tử nào là chữ hoa ( LETTERSlà chữ R dựng sẵn với chữ in hoa), theo thứ tự.


Tôi nghĩ bạn có thể lưu một vài byte:function(s)(s=substr(strsplit(s,' |-')[[1]],1,1))[s%in%LETTERS]
Scarabee

1
@Scarabee cảm ơn bạn. Xin lỗi, phải mất 2 năm để cập nhật.
Giuseppe


5

Javascript 21 byte

Lấy một chuỗi đầu vào và đầu ra một chuỗi các chuỗi chứa các ký tự viết tắt

x=>x.match(/\b[A-Z]/g)

Giải trình

Nó chỉ là một trận đấu regex toàn cầu cho ranh giới từ theo sau là chữ in hoa.



4

APL Dyalog, 29 23 byte

Trường hợp kiểm tra tiền thưởng: Ngôn ngữ lập trình (APL).

'(?<=^| |-)[A-Z]'⎕S'&'⊢

Trả về một mảng ký tự (hiển thị dưới dạng không gian được phân tách trên TIO).

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


Bài cũ hơn, 29 byte

{(⎕AV~⎕A)~⍨'(\w)\w+'⎕R'\1'⊢⍵}

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

Làm sao?

'(\w)\w+'⎕R - thay thế từng cụm ký tự chữ cái

    '\1' - với ký tự đầu tiên

~⍨ - loại bỏ mọi char

    (⎕AV~⎕A) - đó không phải là chữ hoa ASCII


3

Python, 53 byte

import re
lambda s:re.findall("(?<=[ -])[A-Z]"," "+s)

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

Một biểu thức chính quy đơn giản với một cái nhìn cho không gian hoặc dấu gạch ngang. Thay vì khớp với bắt đầu, hãy đặt trước một khoảng trắng.


Được chỉnh sửa trong liên kết TIO với bộ thử nghiệm của MrXCoder's.
Stephen

Cảm ơn @StepHen - bạn đã đánh bại tôi và giúp tôi nỗ lực
Chris H


3

C #, 84 78 byte

using System.Linq;s=>s.Where((c,i)=>c>64&c<91&(i>0?s[i-1]==32|s[i-1]==45:1>0))

Đã lưu 6 byte nhờ @jkelm .

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

Phiên bản đầy đủ / định dạng:

using System.Collections.Generic;
using System.Linq;

class P
{
    static void Main()
    {
        System.Func<string, IEnumerable<char>> f = s => s.Where((c, i) => c > 64 & c < 91 & (i > 0 ? s[i-1] == 32 | s[i-1] == 45: 1 > 0));

        System.Console.WriteLine(string.Concat(f("Self-contained Underwater Breathing Apparatus")));
        System.Console.WriteLine(string.Concat(f("a Programming Language")));
        System.Console.WriteLine(string.Concat(f("NATO Atlantic TREATY Organization")));
        System.Console.WriteLine(string.Concat(f("DEFCON 2")));
        System.Console.WriteLine(string.Concat(f("hello, world!")));
        System.Console.WriteLine(string.Concat(f("light-Emitting dioDe")));
        System.Console.WriteLine(string.Concat(f("What Does the Fox Say?")));
        System.Console.WriteLine(string.Concat(f("3D mov-Ies")));
        System.Console.WriteLine(string.Concat(f("laugh-Out Lou-D")));
        System.Console.WriteLine(string.Concat(f("Best friends FOREVE-r")));
        System.Console.WriteLine(string.Concat(f(" ")));
        System.Console.WriteLine(string.Concat(f("--  --a -  - --")));
        System.Console.WriteLine(string.Concat(f("--  -- -  - -- A")));

        System.Console.ReadLine();
    }
}

Tại sao bạn phải đưa using System.Linqvào số byte nếu using System.Collections.Genericđược miễn? Có một số sự đồng thuận về cái nào usinglà có thể đếm được?

@DaveParsons using System.Linq;là cần thiết cho mã Linq trong câu trả lời của tôi. Tuy nhiên, IEnumerbale<char>không phải là một phần của câu trả lời và đó là một phần của mã cần using System.Collections.Generic;biên dịch.
TheLethalCoder

có ý nghĩa; cảm ơn đã làm rõ

Bạn có thể lưu một vài byte bằng cách kiểm tra chữ hoa bằng cách sử dụng ký tự dưới dạng ints. c> 64 & c <91 nên net bạn 6 byte.
jkelm

@jkelm Nice :) Tôi luôn quên về mánh khóe đó!
TheLethalCoder

3

Julia 0,6.0 (57 byte)

s=split(s,r" |-");for w∈s isupper(w[1])&&print(w[1])end

Giải thích: Đây là mã golf đầu tiên của tôi. Khá thẳng về phía trước. Tách các từ, in chữ cái đầu tiên của mỗi chữ cái.

Có lẽ dễ dàng để làm tốt hơn bằng cách sử dụng regex nhưng tôi chưa quen với điều này


1
Chào mừng đến với PPCG! Tôi đã hết phiếu ngay bây giờ, tôi sẽ nâng cấp điều này sau.
Stephen

2
@StepHen Tôi đã được bảo hiểm. : P
DJMcMayhem


2

C # (.NET Core) , 108 byte

n=>{var j="";n=' '+n;for(int i=0;++i<n.Length;)if(" -".IndexOf(n[i-1])>=0&n[i]>64&n[i]<91)j+=n[i];return j;}

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


Không được kiểm tra nhưng việc thay đổi ifthành một ternary có thể giúp bạn tiết kiệm byte. Tại chỉ số bắt đầu này 2thay vì 1, chỉ cần thay đổi int i=1để int i=0sửa chữa nó. Ngoài ra, tôi không nghĩ rằng bạn có thể làm nhiều hơn ở đây.
TheLethalCoder

Một ternary sẽ không giúp đỡ ở đây, vì nó sẽ có cùng số byte như một câu lệnh if. Tuy nhiên, bạn đúng ở chỗ tôi cần thay đổi giá trị i ban đầu
jkelm

Tôi không hoàn toàn chắc chắn nhưng chúng thường xuất hiện ngắn hơn nên luôn đáng để kiểm tra.
TheLethalCoder

2

Thạch ,  11  10 byte

-1 byte nhờ Erik the Outgolfer ( chia nhỏ tại khoảng trắng> _ <)

⁾- yḲḢ€fØA

Một liên kết đơn và lấy danh sách các ký tự.
Như một chương trình đầy đủ chấp nhận một chuỗi và in kết quả.

Hãy thử trực tuyến! hoặc xem một bộ thử nghiệm .

Làm sao?

⁾- yḲḢ€fØA - Link: list of characters, x       e.g. "Pro-Am Code-golf Association"
   y       - translate x with:
⁾-         -   literal list of characters ['-',' '] "Pro Am Code golf Association"
    Ḳ      - split at spaces               ["Pro","Am","Code","golf","Association"]
     Ḣ€    - head each (1st character of each)      "PACgA"
        ØA - yield uppercase alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
       f   - filter keep                            "PACA"
           - if running as a full program: implicit print

Umm, tại sao không sử dụng thay vì ṣ⁶?
Erik the Outgolfer 21/07/17

Heh, bởi vì tôi đã quên nó. Cảm ơn!
Jonathan Allan

2

Perl 5 , 25 byte

Mã 24 byte + 1 cho -n.

Làm phiền rằng grep -Phỗ trợ chiều dài thay đổi nhìn phía sau nhưng Perl không :(.

print/(?:^| |-)([A-Z])/g

-1 byte nhờ @Dada !

Hãy thử trực tuyến! - bao gồm -lđể chạy tất cả các bài kiểm tra cùng một lúc.


Bạn có thể làm cực kỳ tốt hơn rất nhiều: Hãy thử trực tuyến! ;-)
Dada

@Dada Hah! Tất nhiên ... Tôi hết ATM nhưng tôi sẽ cập nhật khi tôi quay lại. Cảm ơn! Tôi khá thất vọng Tôi không thể có được s///hoặc $_=phủ nhận print...
Dom Hastings

Vâng, tôi đang tìm kiếm một người duy nhất s///để giải quyết vấn đề này nhưng không rõ ràng ... Tôi đang làm việc, có lẽ tôi sẽ thử lại sau!
Dada


2

Brachylog , 25 23 22 byte

,Ṣ↻s₂ᶠ{h∈" -"&t.∧Ạụ∋}ˢ

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

(-2 byte nhờ vào @Firthize.)

,Ṣ↻                      % prepend a space to input
   s₂ᶠ                   % get all substrings of length 2 from that, to get prefix-character pairs
      {              }ˢ  % get the successful outputs from this predicate: 
       h∈" -"              % the prefix is - or space
               &t.∧        % then the character is the output of this predicate if:
                  Ạụ∋        % the alphabet uppercased contains the character

Bạn có thể sử dụng thay vì " "để lưu hai byte
Fatalize


2

Swift 5 , 110 byte

-5 cảm ơn Cœur

import UIKit
func f(s:[String]){for i in zip(s,[" "]+s){if i.0.isUppercase()&&"- ".contains(i.1){print(i.0)}}}

Giải thích chi tiết

  • import Foundation- Nhập mô-đun Foundationquan trọng cho zip(), phần chính của mã này.

  • func f(s:[String]){...}- Tạo một hàm với một tham số s, đó là danh sách các Chuỗi, đại diện cho các ký tự của đầu vào.

  • for i in zip(s,[" "]+s){...}- Lặp lại với ithông qua zip của đầu vào và đầu vào với một khoảng trắng được thêm vào lúc đầu, rất hữu ích để có được ký tự trước đó trong Chuỗi.

  • if - Kiểm tra xem:

    • i.0==i.0.uppercased() - Ký tự hiện tại là chữ hoa,

    • &&"- ".contains(i.1) - và Nếu ký tự trước là dấu cách hoặc dấu gạch ngang.

  • Nếu các điều kiện trên được đáp ứng, thì:

    • print(i.0) - Ký tự được in, vì nó là một phần của từ viết tắt.

-5 với import UIKitthay vì import Foundation.
Cœur



1

Python 3 , 73 70 byte

lambda n:[n[x]for x in range(len(n))if'@'<n[x]<'['and(' '+n)[x]in' -']

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


Giải trình

  • lambda n:- Tạo một hàm lambda ẩn danh với tham số String n.

  • n[x]- Có được đặc tính của nchỉ số x.

  • for x in range(len(n))- Lặp lại từ 0đến độ dài của n, đặt tên biến x.

  • if - Séc:

    • '@'<n[x]<'[' - Nếu ký tự là chữ hoa,

    • and(' '+n)[x]in' -'- Và nếu nó đi trước một khoảng trắng hoặc dấu gạch ngang trong Chuỗi được tạo bởi một khoảng trắng và n.


2
Có tệ không khi tôi đọc nó như vậy i supper, và tôi không biết tại sao?
TheLethalCoder

@TheLethalCoder Đó là .isupper(), tôi không biết bạn đã đọc gì: p
Ông Xcoder





1

Bash (grep), 29 28 byte

grep -oP'(?<=^| |-)[A-Z]' a

Một cổng của câu trả lời python của tôi nhưng vì pgrephỗ trợ các giao diện có chiều dài thay đổi nên nó ngắn hơn đáng kể (thậm chí chiếm cả chi phí của python). Dán các trường hợp thử nghiệm trong một tệp có tên a, đầu ra là 1 ký tự trên mỗi dòng.

-1 Cảm ơn Neil


^| |-có thể là một bài kiểm tra ngắn hơn?
Neil

@Neil mà làm việc ở đây, cảm ơn. Bỏ lỡ nó vì nó không hoạt động trong Python
Chris H

1

RProgN 2 , 18 byte

`-` rû#ùr.'[a-z]'-

Giải thích

`-` rû#ùr.'[a-z]'-
`-`                     # Push "-" literal, and " " literal.
    r                   # replace, Replaces all "-"s with " "s.
     û                  # Split, defaultly by spaces.
      #ù                # Push the head function literally.
        r               # Replace each element of the split string by the head function, which gets each first character.
         .              # Concatenate, which collapses the stack back to a string.
          '[a-z]'-      # Push the string "[a-z]" literally, then remove it from the string underneith, giving us our output. 

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


1

PHP, 62 byte

for(;~$c=$argn[$i++];$p=$c!="-"&$c!=" ")$c<A|$c>Z|$p?:print$c;

Chạy như ống với -nRhoặc thử trực tuyến .

giải pháp khác:

foreach(preg_split("#[ -]#",$argn)as$s)$s[0]>Z|$s<A?:print$s[0];  # 64 bytes
preg_match_all("#(?<=\s|-)[A-Z]#"," $argn",$m);echo join($m[0]);  # 64 bytes
preg_match_all("#(?<=\s|-)\p{Lu}#"," $argn",$m);echo join($m[0]); # 65 bytes

1

C ++, 168 byte

#include<string>
auto a=[](auto&s){auto r=s.substr(0,1);if(r[0]<65||r[0]>90)r="";for(int i=1;i<s.size();++i)if(s[i]>64&&s[i]<91&&(s[i-1]==32||s[i-1]==45))r+=s[i];s=r;};

Đầu ra được thực hiện thông qua tham số


Có thể loại bỏ hoàn toàn #include<string>và giả sử đối số slà một std::string?
Zacharý

1

Lua , 79 75 byte

for i=1,#t do for i in(" "..t[i]):gmatch"[%-| ]%u"do print(i:sub(2))end end

Thử nó!

Tôi đã in một bản in () trước khi kết thúc cuối cùng trong phiên bản dùng thử vì nếu không nó là một mớ hỗn độn. Chương trình này hoàn toàn tuân thủ các yêu cầu của I / O và kết hợp, nhưng không có dòng mới thêm đó, nó khá khó đọc.

Đầu vào được đưa ra dưới dạng một bảng số: chuỗi, tăng số 1 mỗi lần và bắt đầu từ 1.

Giải trình:

Nó cho các vòng lặp thông qua một gmatch của mỗi chuỗi đầu vào. Tìm kiếm gmatch như sau:

[% - | ] - Nhóm, tìm kiếm một - hoặc một khoảng trắng

% u - Tìm kiếm ký tự viết hoa

Sau đó, cho mỗi trận đấu, nó sẽ in ra trừ dấu gạch ngang hoặc dấu cách trước đó

Chỉnh sửa: Đánh gôn 4 byte bằng cách xóa khai báo 'a' và thêm khoảng trắng vào đầu vào bên trong vòng lặp for, cũng như thay đổi đầu vào phụ thành chỉ 2 thay vì 2,2 (tạo ra kết quả tương đương)


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.