Tỷ lệ hoàn thành bảng chữ cái


32

Giới thiệu

Bao nhiêu bảng chữ cái tiếng Anh mà một chuỗi nhất định sử dụng? Câu trước sử dụng 77%. Nó có 20 chữ cái duy nhất (howmucftenglisapbdvr) và 20/26 0,77.

Thử thách

Đối với một chuỗi đầu vào, trả về tỷ lệ phần trăm của các chữ cái trong bảng chữ cái tiếng Anh có trong chuỗi.

  • Câu trả lời có thể theo tỷ lệ phần trăm hoặc ở dạng thập phân.

  • Chuỗi đầu vào có thể có chữ hoa và chữ thường, cũng như dấu câu. Tuy nhiên, bạn có thể cho rằng họ không có dấu phụ hoặc ký tự có dấu.

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

Đầu vào

"Did you put your name in the Goblet of Fire, Harry?" he asked calmly.

Một số đầu ra hợp lệ

77%, 76.9, 0.7692

Đầu vào:

The quick brown fox jumps over the lazy dog

Tất cả các đầu ra hợp lệ:

100%, 100, 1

Đầu ra dự kiến ​​cho "@#$%^&*?!"""là 0.


3
Các trường hợp thử nghiệm được đề xuất : "@#$%^&*?!",""
Adám

4
Nếu 77%76.9được chấp nhận, cũng được 77chấp nhận?
Grzegorz Oledzki

Tỷ lệ phần trăm cũng có thể có phần thập phân ...
Jo King

2
@Shaggy Lần chỉnh sửa cuối cùng cho OP là 16 giờ trước, câu trả lời của bạn là 15 và nhận xét của bạn là 14. Ý tôi là, bạn có đúng không ???
Veskah

6
Nếu 20/26 có thể được làm tròn thành 0,7692, 0,769 hoặc 0,77, tôi cũng có thể làm tròn nó thành 0,8, 1 hoặc 0 không? ;-)
Noiralef

Câu trả lời:


18

Python 3 , 42 byte

lambda s:len({*s.upper()}-{*s.lower()})/26

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

Chúng tôi lọc tất cả các ký tự không phải là chữ cái ra khỏi chuỗi bằng cách lấy sự khác biệt (bộ) của các đại diện chữ hoa và chữ thường. Sau đó, chúng tôi lấy chiều dài và chia cho 26.

Python 3 , 46 byte

lambda s:sum(map(str.isalpha,{*s.lower()}))/26

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

Đếm các ký tự chữ cái (chữ thường) duy nhất và chia cho 26. Trong Python 2, nó sẽ cần thêm 3 ký tự; hai để thay đổi {*...}thành set(...)và một để tạo 26 phao: 26.để tránh phân chia sàn.

Python 3 , 46 byte

lambda s:sum('`'<c<'{'for c in{*s.lower()})/26

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

Cùng chiều dài, về cơ bản giống như trước, nhưng không có phương thức chuỗi "tích hợp".


Tại sao cái thứ hai trở lại 1.0và không 1? (Tôi không muốn không cho phép cụ thể vì vậy nó sẽ không gây bất lợi cho các ngôn ngữ cụ thể, nhưng tôi tò mò)
Dịch chuyển Dê

10
@TeleportingGoat Division với một dấu gạch chéo luôn tạo ra số float trong Python 3, ngay cả khi các toán hạng là số nguyên. Đối với phép chia số nguyên, bạn sẽ sử dụng //, nhưng sau đó sẽ luôn là phép chia số nguyên, đây rõ ràng không phải là điều chúng tôi muốn ở đây. Điều có nghĩa là họ đã không làm cho kiểu dữ liệu của đầu ra phụ thuộc vào các giá trị cụ thể của toán hạng, có nghĩa là luôn luôn trôi nổi, ngay cả khi đó là một số nguyên.
ArBo

11

MATL , 8 byte

2Y2jkmYm

Dùng thử tại MATL Online

Giải trình

2Y2    % Predefined literal for 'abcdefghijklmnopqrstuvwxyz'
j      % Explicitly grab input as a string
k      % Convert to lower-case
m      % Check for membership of the alphabet characters in the string. 
       % Results in a 26-element array with a 1 where a given character in 
       % the alphabet string was present in the input and a 0 otherwise
Ym     % Compute the mean of this array to yield the percentage as a decimal
       % Implicitly display the result

8

Octave / MATLAB, 33 byte

@(s)mean(any(65:90==upper(s)',1))

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

Giải trình

@(s)                               % Anonymous function with input s: row vector of chars
             65:90                 % Row vector with ASCII codes of uppercase letters
                    upper(s)       % Input converted to uppercase
                            '      % Transform into column vector
                  ==               % Equality test, element-wise with broadcast. Gives a
                                   % matrix containing true and false
         any(                ,1)   % Row vector containing true for columns that have at
                                   % least one entry with value true
    mean(                       )  % Mean

7

05AB1E , 8 7 6 byte

lASåÅA

-1 byte nhờ @LuisMendo .

Hãy thử trực tuyến hoặc xác minh một vài trường hợp thử nghiệm .

6 byte thay thế được cung cấp bởi @Grimy :

láÙg₂/

Hãy thử trực tuyến hoặc xác minh một vài trường hợp thử nghiệm .

Cả hai chương trình đầu ra dưới dạng thập phân.

Giải trình:

l       # Convert the (implicit) input-string to lowercase
 AS     # Push the lowercase alphabet as character-list
   å    # Check for each if it's in the lowercase input-string
        # (1 if truthy; 0 if falsey)
    ÅA  # Get the arithmetic mean of this list
        # (and output the result implicitly)

l       # Convert the (implicit) input-string to lowercase
 á      # Only leave the letters in this lowercase string
  Ù     # Uniquify it
   g    # Get the amount of the unique lowercase letters by taking the length
    ₂/  # Divide this by 26
        # (and output the result implicitly)

@LuisMendo thay thế, láêg₂/cũng là một 6 -ter.
Grimmy

1
@LuisMendo Cảm ơn (và bạn cũng như cáu bẩn )! :)
Kevin Cruijssen

7

C # (Trình biên dịch tương tác Visual C #) , 56 49 byte

a=>a.ToUpper().Distinct().Count(x=>x>64&x<91)/26f

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

-6 byte nhờ innat3


1
bạn có thể lưu 6 byte bằng cách so sánh các giá trị thập phân của các ký tự 50 byte ( Mã ký tự )
Innat3

@ Innat3 49 byte bằng cách thay đổi &&thành &.
Kevin Cruijssen

@KevinCruijssen mất 2 phút để nhận tín dụng -1 byte, đã làm điều đó và đang chỉnh sửa
Dữ liệu hết hạn

@ExpiredData Np, đó là một sân golf rõ ràng. Chủ yếu là hướng nó đến Innat :)
Kevin Cruijssen

6

APL (Dyalog Extended) , 10 byte SBCS

Chức năng tiền tố ẩn danh. Trả về phần thập phân.

26÷⍨∘≢⎕A∩⌈

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

 chữ hoa

⎕A∩ giao điểm với chữ hoa A lph.us

 chiều dài kiểm đếm

 sau đó

26÷⍨ chia cho hai mươi sáu


⌹∘≤⍨⎕A∊⌈­­­­­
ngn

@ngn Điều đó rất thông minh, nhưng hoàn toàn khác. Đi trước và gửi bài đó cho mình. Tôi sẽ vui lòng chèn lời giải thích nếu bạn muốn tôi.
Adám


6

Perl 6 , 27 24 byte

-3 byte nhờ nwellnhof

*.uc.comb(/<:L>/).Set/26

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


1
+1 Ngoài ra, trong khi điều này chỉ hoạt động tốt (và .lccũng sẽ hoạt động), từ quan điểm "chính xác", .fccó thể tốt hơn (đặc biệt nếu thử thách có các chữ cái không phải tiếng Anh)
user0721090601

6

Đồ dùng của Bash và Gnu ( 81 78 68 60 42 byte)

bc -l<<<`grep -io [a-z]|sort -fu|wc -l`/26

-8 byte nhờ @wastl

-18 byte nhờ Nahuel sử dụng một số thủ thuật mà tôi không biết:

  • sort -fgrep -ibỏ qua trường hợp
  • sort -u là một sự thay thế cho | uniq

1
60 byte :echo $(tr A-Z a-z|tr -cd a-z|fold -1|sort -u|wc -l)/26|bc -l
Wastel

Đúng. Biến là một lời nhắc nhở sau một nỗ lực khác. Cảm ơn!
Grzegorz Oledzki


Không thể rút ngắn "grep -io [az]" thành "grep -o [Az]"?
Gnudiff

@Gnudiff Giả sử ASCII, điều đó cũng sẽ phù hợp với tất cả [\ ^ _ `].
jnfnt

6

K (oK) , 19 15 byte

Dung dịch:

1%26%+/26>?97!_

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

Giải trình:

Chuyển đổi đầu vào thành chữ thường, modulo 97 ("az" là 97-122 trong ASCII, modulo 97 cho 0-25), lấy kết quả duy nhất, tổng hợp thấp hơn 26 và chuyển đổi thành tỷ lệ phần trăm 26.

1%26%+/26>?97!_ / the solution
              _ / lowercase
           97!  / modulo (!) 97
          ?     / distinct
       26>      / is 26 greater than this?
     +/         / sum (+) over (/)
  26%           / 26 divided by ...
1%              / 1 divided by ...

Ghi chú:

  • -1 byte nhờ ngn,1-%[;26] =>1-1%26%
  • -3 byte lấy cảm hứng từ ngn #(!26)^=>+/26>?

1
Tôi đang mong chờ lời giải thích! Tôi không biết điều đó 97đang làm gì ở đây
Dịch chuyển con dê


1
%[;26]->1%26%
ngn



6

PowerShell , 55 52 byte

($args|% *per|% t*y|sort|gu|?{$_-in65..90}).count/26

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

Nỗ lực đầu tiên, vẫn cố gắng những ý tưởng ngẫu nhiên

EDIT: @Veskah chỉ ra ToUpper lưu một byte do phạm vi số, cũng bị xóa thêm ()và một khoảng trắng

Sự bành trướng:
($args|% ToUpper|% ToCharArray|sort|get-unique|where{$_-in 65..90}).count/26

Changes string to all loweruppercase, expands to an array, sorts the elements and selects the unique letters (gu needs sorted input), keep only characters of ascii value 97 to 122 (a to z) 65 to 90 (A to Z), count the total and divide by 26 for the decimal output



1
oh, just noticed you have an extra space after -in.
Veskah

6

R, 47 bytes

function(x)mean(65:90%in%utf8ToInt(toupper(x)))

Try it online!

Converts to upper case then to ASCII code-points, and checks for values 65:90 corresponding to A:Z.


1
This fails when there are quotes in the input.
C. Braun

1
@C.Braun Not in my tests... For instance, the first test case on TIO includes quotes and gives the correct result. Could you give an example?
Robin Ryder

1
I do not quite understand what you have done in the header part on TIO, but running just the code above in an R interpreter does not work. You seem to be redefining scan to not split on quotation marks, like the default does?
C. Braun

1
@C.Braun Got it, thanks! I've explicitly made it into a function (at a cost of 3 bytes) and I think it's OK now.
Robin Ryder

4

Retina 0.8.2, 45 bytes

T`Llp`ll_
+`(.)(.*\1)
$2
.
100$*
^
13$*
.{26}

Try it online! Link includes test cases. Explanation:

T`Llp`ll_

Lowercase letters and delete punctuation.

+`(.)(.*\1)
$2

Deduplicate.

.
100$*

Multiply by 100.

^
13$*

Add 13.

.{26}

Integer divide by 26 and convert to decimal.


I think retina is the only language here using percentages for the output!
Teleporting Goat

Oh, nice trick with adding unary 13 before dividing! Why didn't I think of that.. >.> It would make my answer 44 bytes. I'll still leave my previous version, though.
Kevin Cruijssen

@TeleportingGoat Probably because Retina is also the only language from the ones posted thus far which doesn't have decimal division available. Only (unary) integer-division is possible.
Kevin Cruijssen

4

APL (Dyalog Extended), 8 bytes

⌹∘≤⍨⎕A∊⌈

Try it online!

loosely based on Adám's answer

 uppercase

⎕A∊ boolean (0 or 1) vector of length 26 indicating which letters of the English Alphabet are in the string

⌹∘≤⍨ trung bình số học, nghĩa là phân chia ma trận của đối số và vectơ all-1 có cùng độ dài


3

Than , 11 byte

I∕LΦβ№↧θι²⁶

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Đầu ra là một số thập phân (hoặc 1cho pangram). Giải trình:

  L         Length of
    β       Lowercase alphabet
   Φ        Filtered on
     №      Count of
        ι   Current letter in
      ↧     Lowercased
       θ    Input
 ∕          Divided by
         ²⁶ Literal 26
I           Cast to string
            Implicitly printed

3

Mẻ, 197 byte

@set/ps=
@set s=%s:"=%
@set n=13
@for %%c in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)do @call set t="%%s:%%c=%%"&call:c
@cmd/cset/an/26
@exit/b
:c
@if not "%s%"==%t% set/an+=100

Lấy đầu vào trên STDIN và xuất ra tỷ lệ phần trăm tròn. Giải trình:

@set/ps=

Nhập chuỗi.

@set s=%s:"=%

Tách trích dẫn, bởi vì họ đang đau đầu để giải quyết trong Batch.

@set n=13

Bắt đầu với một nửa chữ cái cho mục đích làm tròn.

@for %%c in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)do @call set t="%%s:%%c=%%"&call:c

Xóa lần lượt từng chữ cái từ chuỗi. Gọi chương trình con để kiểm tra xem có gì thay đổi hay không, vì cách Batch phân tích các biến.

@cmd/cset/an/26

Tính kết quả theo phần trăm.

@exit/b
:c

Bắt đầu chương trình con.

@if not "%s%"=="%t%" set/an+=100

Nếu xóa một chữ cái đã thay đổi chuỗi thì tăng số lượng chữ cái.


3

Pepe , 155 138 byte

rEeEeeeeeEREeEeEEeEeREERrEEEEErEEEeReeReRrEeeEeeeeerEEEEREEeRERrErEErerREEEEEeREEeeRrEreerererEEEEeeerERrEeeeREEEERREeeeEEeEerRrEEEEeereEE

Hãy thử trực tuyến!Đầu ra ở dạng thập phân.

Giải trình:

rEeEeeeeeE REeEeEEeEe # Push 65 -> (r), 90 -> (R)
REE # Create loop labeled 90 // creates [65,66,...,89,90]
  RrEEEEE # Increment (R flag: preserve the number) in (r)
  rEEEe # ...then move the pointer to the last
Ree # Do this while (r) != 90

Re # Pop 90 -> (R)
RrEeeEeeeee rEEEE # Push 32 and go to first item -> (r)
REEe # Push input -> (R)
RE RrE # Push 0 on both stacks, (r) prepend 0
rEE # Create loop labeled 0 // makes input minus 32, so the
    # lowercase can be accepted, since of rEEEEeee (below)
  re # Pop 0 -> (r)
  rREEEEEe REEee # Push item of (R) minus 32, then go to next item 
  RrE # Push 0 -> (R)
ree # Do while (R) != 0

rere # Pop 0 & 32 -> (r)
rEEEEeee # Remove items from (r) that don't occur in (R)
         # Remove everything from (r) except the unique letters
rE # Push 0 -> (r)
RrEeee # Push reverse pointer pos -> (r)
REEEE # Move pointer to first position -> (R)
RREeeeEEeEe # Push 26 -> (R)
rRrEEEEee reEE # Divide it and output it

Vì Pepe chỉ là ngôn ngữ lệnh 4, thực sự giống như 34,5 byte nếu bạn mã hóa nó thành 2 bit mỗi lần RE?
Dữ liệu hết hạn


3

Võng mạc , 57 46 35 byte

.
$L
[^a-z]

D`.
.
100*
^
13*
_{26}

-11 byte lấy cảm hứng từ thủ thuật của @Neil là thêm unary 13 trước khi chia .
Một -11 byte khác nhờ @Neil trực tiếp.
Làm tròn (chính xác) cho toàn bộ số nguyên.

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

57 46 Phiên bản 40 byte hoạt động với đầu ra thập phân:

.
$L
[^a-z]

D`.
.
1000*
C`_{26}
-1`\B
.

Cùng -11 byte cũng như -6 byte bổ sung nhờ @Neil .

Kết quả đầu ra với một cắt ngắn thập phân sau dấu phẩy ( tức0,1538 (426) là đầu ra 15.3thay vì 15.4). Điều này được thực hiện bằng cách tính toán1000×độc đáo26 và sau đó chèn dấu thập phân bằng tay.

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

Giải trình:

Chuyển đổi tất cả các chữ cái thành chữ thường:

.
$L

Xóa tất cả các chữ cái không:

[^a-z]

Xác định tất cả các chữ cái:

D`.

Thay thế mỗi chữ cái duy nhất bằng 1000 dấu gạch dưới:

.
1000*

Đếm số lần 26 dấu gạch dưới liền kề vừa với nó:

C`_{26}

Chèn một dấu chấm vào đúng chỗ:

-1`\B
.

1
Điều .*này chỉ có thể .để tiết kiệm 1 byte, nhưng bạn có thể lưu thêm 10 byte bằng cách sử dụng Dtrùng lặp thay vì thực hiện thủ công!
Neil

@Neil Ah, không biết về D-builtin, cảm ơn! Và không chắc tại sao tôi lại sử dụng .*thay vì ... Cảm ơn vì -11 byte trong cả hai phiên bản! :)
Kevin Cruijssen

1
FYI Tôi đã có một cách tiếp cận hơi khác nhau cho cùng một số byte: Hãy thử trực tuyến!
Neil

1
Đối với phiên bản thập phân tôi thấy -1`\Bphù hợp trực tiếp với vị trí chèn mong muốn.
Neil

@Neil Cảm ơn một lần nữa.
Kevin Cruijssen

3

Java 8, 62 59 byte

s->s.map(c->c&95).distinct().filter(c->c%91>64).count()/26.

-3 byte nhờ @ OlivierGrégoire .

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

Giải trình:

s->                     // Method with IntStream as parameter and double return-type
  s.map(c->c&95)        //  Convert all letters to uppercase
   .distinct()          //  Uniquify it
   .filter(c->c%91>64)  //  Only leave letters (unicode value range [65,90])
   .count()             //  Count the amount of unique letters left
    /26.                //  Divide it by 26.0


@ OlivierGrégoire Cảm ơn! Tôi luôn quên c&95kết hợp với c%91>64một số lý do. Tôi nghĩ rằng bạn đã đề nghị rằng chơi golf một vài lần trước đây với tôi.
Kevin Cruijssen

Vâng, tôi đã đề xuất những điều đó, nhưng không sao, không phải lo lắng ;-)
Olivier Grégoire

Cách lâu hơn, nhưng thú vị hơn: s->{int r=0,b=0;for(var c:s)if((c&95)%91>64&&b<(b|=1<<c))r++;return r/26.;}(75 byte)
Olivier Grégoire

3

Julia 1.0 , 34 byte

s->sum('a':'z'.∈lowercase(s))/26

Sử dụng phiên bản véc tơ của toán tử,, kiểm tra ngăn trong chuỗi cho tất cả các ký tự trong phạm vi từ a đến z. Sau đó tính tổng BitArray kết quả và chia cho tổng số chữ cái có thể.

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


Chào mừng và câu trả lời đầu tiên tuyệt vời!
mbomb007



2

Stax , 9 byte

░║üy$}╙+C

Chạy và gỡ lỗi nó


1
Bạn có thể lấy một byte ra khỏi phiên bản đã giải nén bằng cách thả uvà sử dụng |b, nhưng khoản tiết kiệm biến mất trong quá trình đóng gói. Tôi có thể có một 8 -ter, nhưng trình thông dịch trực tuyến là lạ và lỗi.
Khuldraeseth na'Barya

@ Khuldraesethna'Barya: Tìm thấy tốt đẹp. Tôi nghĩ rằng lỗi có thể là một đột biến mảng. Tôi đang thấy một số hành vi đó bây giờ. Làm việc trên một repro tối thiểu ...
đệ quy

Đây là một lời trách móc của vấn đề tôi đoán bạn đang gặp phải |b. Nó biến đổi không chính xác toán hạng của nó hơn là tạo một bản sao. Tôi đã tạo ra một vấn đề github cho lỗi. github.com/tomtheisen/stax/issues/29 Như một cách giải quyết, |bsẽ hoạt động chính xác ngay lần đầu tiên. Sau đó, bạn có thể phải tải lại trang. Nếu bạn tìm thấy một lỗi khác, nếu bạn có thể cung cấp một bản sao, có lẽ tôi sẽ có thể sửa nó.
đệ quy

Stax 1.1.4, 8 byte. Hướng dẫn: giải nén, chèn vlúc bắt đầu, chèn |bsau Va, chạy, xóa cái đầu tiên v, gỡ bỏ |b, đóng gói lại. Đúng, đó là lỗi tôi tìm thấy.
Khuldraeseth na'Barya

@ Khuldraesethna'Barya: Tôi đã phát hành 1.1.5 và tôi tin rằng lỗi này đã được sửa. Bạn có thể cho tôi biết nếu bạn vẫn gặp rắc rối. Cảm ơn.
đệ quy




1

Japt , 9 byte

;CoU Ê/26

Thử nó

;CoU Ê/26     :Implicit input of string U
;C            :Lowercase alphabet
  oU          :Remove the characters not included in U, case insensitive
     Ê        :Length
      /26     :Divide by 26



1

C, 95 bytes

f(char*s){int a[256]={},z;while(*s)a[*s++|32]=1;for(z=97;z<'z';*a+=a[z++]);return(*a*100)/26;}

(note: rounds down)

Alternate decimal-returning version (95 bytes):

float f(char*s){int a[256]={},z;while(*s&&a[*s++|32]=1);for(z=97;z<'z';*a+=a[z++]);return*a/26.;}

This borrows some from @Steadybox' answer.


1
Welcome! Good first answer. It might be helpful for people reading your answer if you provide a short explanation of your code or an ungolfed version. It may also be helpful to provide a link to an online interpreter with your runnable code (see some other answers for examples). Many use TIO, and here's the gcc interpreter
mbomb007
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.