알파벳 완성 률


32

소개

주어진 문자열이 얼마나 많은 영어 알파벳을 사용합니까? 이전 문장은 77 %를 사용합니다. 20 개의 고유 한 문자 (howmucftenglisapbdvr)와 20/26 ≃ 0.77이 있습니다.

도전

입력 문자열의 경우 문자열에있는 영어 알파벳 문자의 백분율을 반환합니다.

  • 답은 백분율 또는 10 진수 형식 일 수 있습니다.

  • 입력 문자열은 구두점뿐만 아니라 대소 문자를 포함 할 수 있습니다. 그러나 분음 부호 나 강조 문자가 없다고 가정 할 수 있습니다.

테스트 사례

입력

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

일부 유효한 출력

77%, 76.9, 0.7692

입력:

The quick brown fox jumps over the lazy dog

유효한 모든 출력 :

100%, 100, 1

예상되는 출력을 위해 "@#$%^&*?!"그리고 ""0이다.


3
권장 테스트 사례 : "@#$%^&*?!",""
Adám

4
경우 77%76.9접수,되고 77도 가능?
Grzegorz Oledzki

퍼센트도 소수 부분을 가질 수 있습니다 ...
Jo King

2
@Shaggy OP에 대한 마지막 편집은 16 시간 전에, 귀하의 답변은 15이고, 귀하의 의견은 14입니다.
Veskah

6
20/26이 0.7692, 0.769 또는 0.77로 반올림되는 경우 0.8, 1 또는 0으로 반올림 할 수 있습니까? ;-)
Noiralef

답변:


18

파이썬 3 , 42 바이트

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

온라인으로 사용해보십시오!

대문자와 소문자 표현의 (세트) 차이를 취하여 문자열에서 모든 비 알파벳 문자를 필터링합니다. 그런 다음 길이를 가져 와서 26으로 나눕니다.

파이썬 3 , 46 바이트

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

온라인으로 사용해보십시오!

고유 한 알파벳 (소문자) 문자 수를 세고 26으로 나눕니다. Python 2에서는 3 자 이상이 필요합니다. 두 변화 {*...}set(...)하고, 플로트 (26)를 만들기위한 하나 26.피 바닥 분할한다.

파이썬 3 , 46 바이트

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

온라인으로 사용해보십시오!

동일한 길이, 본질적으로 이전 길이와 동일하지만 "내장"문자열 방법이 없습니다.


두 번째가 왜 돌아 1.0오지 1않습니까? (특별한 언어에 불리하지 않기 때문에 특별히 허용하지 않기를 원했지만 궁금합니다)
텔레 포팅 염소

10
단일 슬래시가있는 @TeleportingGoat Division은 피연산자가 정수인 경우에도 항상 Python 3에서 float를 제공합니다. 정수 나누기의 //경우을 사용 하지만 항상 정수 나누기이므로 여기에서 원하는 것은 아닙니다. 피연산자의 특정 값에 따라 출력의 데이터 유형을 만들지 않았 음을 의미합니다. 이는 정수 일지라도 항상 부동 소수점을 의미합니다.
ArBo

11

MATL , 8 바이트

2Y2jkmYm

MATL Online 에서 사용해보십시오

설명

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

옥타브 / MATLAB, 33 바이트

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

온라인으로 사용해보십시오!

설명

@(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 바이트

lASåÅA

@LuisMendo 덕분에 -1 바이트 .

온라인으로 시도 하거나 몇 가지 테스트 사례를 확인하십시오 .

@Grimy가 제공하는 6 바이트 대안 :

láÙg₂/

온라인으로 시도 하거나 몇 가지 테스트 사례를 확인하십시오 .

두 프로그램 모두 10 진수로 출력됩니다.

설명:

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 láêg₂/는 6 바이트입니다.
그리미

1
@LuisMendo 감사 (당신뿐만 아니라 검댕으로 더럽혀진 )! :)
Kevin Cruijssen

7

C # (Visual C # 대화 형 컴파일러) , 56 49 바이트

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

온라인으로 사용해보십시오!

innat3 덕분에 -6 바이트


1
당신은 문자 50 바이트 의 10 진수 값을 비교하여 6 바이트를 절약 할 수 있습니다 ( 문자 코드 )
Innat3

@ Innat3을 변경하여 49 바이트 &&&.
케빈 크루이 ssen

@KevinCruijssen -1 바이트 크레딧을받는 데 약 2 분이 걸렸으며 이미 그렇게하고 편집 중입니다.
Expired Data

@ExpiredData Np, 그것은 명백한 골프였습니다. 주로 Innat에게 전달하고있었습니다 :)
Kevin Cruijssen

6

APL (Dyalog Extended) , 10 바이트 SBCS

익명의 암묵적 접두사 기능. 소수를 반환합니다.

26÷⍨∘≢⎕A∩⌈

온라인으로 사용해보십시오!

 대문자

⎕A∩ 대문자 A lphabet 과의 교차

 탈리 길이

 그때

26÷⍨ 26으로 나누다


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

@ngn 매우 영리하지만 완전히 다릅니다. 가서 직접 게시하십시오. 원하는 경우 설명을 삽입 해 드리겠습니다.
Adám



6

Bash 및 Gnu 유틸리티 ( 81 78 68 60 42 바이트)

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

@wastl 덕분에 -8 바이트

내가 알지 못했던 몇 가지 트릭을 사용 하는 Nahuel 덕분에 -18 바이트

  • sort -fgrep -i사례를 무시
  • sort -u 의 대체품입니다 | uniq

1
60 바이트 :echo $(tr A-Z a-z|tr -cd a-z|fold -1|sort -u|wc -l)/26|bc -l
wastl

권리. 변수는 다른 시도 후 알림입니다. 감사!
Grzegorz Oledzki


"grep -io [az]"를 "grep -o [Az]"로 단축 할 수 없습니까?
Gnudiff

@Gnudiff ASCII를 가정하면 [\ ^ _`]와 모두 일치합니다.
jnfnt

6

K (oK) , 19 15 바이트

해결책:

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

온라인으로 사용해보십시오!

설명:

입력을 소문자로 변환, 모듈로 97 ( "az"는 ASCII에서 97-122, 모듈로 97은 0-25를 나타냄), 26보다 낮은 고유 한 결과를 취하고 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 ...

노트:

  • ngn 덕분에 -1 바이트 , 1-%[;26]=>1-1%26%
  • ngn에서 영감을 얻은 -3 바이트#(!26)^ =>+/26>?

1
설명을 기대하고 있습니다! 나는 그것이 97여기서 무엇을 하고 있는지 전혀 모른다
염소 이동


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



6

PowerShell , 55 52 바이트

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

온라인으로 사용해보십시오!

첫 번째 시도, 여전히 임의의 아이디어를 시도

편집 : @Veskah 지적 ToUpper는 숫자 범위로 인해 바이트를 저장하고 여분 ()의 공백 도 제거 했습니다.

확장:
($args|% ToUpper|% ToCharArray|sort|get-unique|where{$_-in 65..90}).count/26

문자열을 모두 소문자로 변경 하고, 배열로 확장하고, 요소를 정렬하고 고유 문자를 선택하고 (구는 정렬 된 입력 필요) ASCII 값 97 ~ 122 (a ~ z) 65 ~ 90 (A ~ Z)의 문자 만 유지 , 10 진수 출력에 대해 총계를 세고 26으로 나눕니다.



1
아, 방금 후 추가 공간이 있음을 알았습니다.
Veskah

6

R , 47 바이트

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

온라인으로 사용해보십시오!

대문자로 변환 한 다음 ASCII 코드 포인트로 변환하고 A : Z에 해당하는 값 65:90을 확인합니다.


1
입력에 따옴표가 있으면 실패합니다.
C. 브라운

1
@ C.Braun 내 테스트에 없음 ... 예를 들어, TIO의 첫 번째 테스트 사례는 따옴표를 포함하고 올바른 결과를 제공합니다. 예를 들어 주시겠습니까?
로빈 라이더

1
TIO의 헤더 부분에서 수행 한 작업을 잘 이해하지 못하지만 R 인터프리터에서 위의 코드 만 실행하면 작동하지 않습니다. scan기본과 같이 따옴표로 나누지 않도록 재정의 하고 있습니까?
C. 브라운

1
@ C.Braun 감사합니다! 명시 적으로 함수 (3 바이트 비용)로 만들었고 지금은 괜찮다고 생각합니다.
로빈 라이더

4

레티 나 0.8.2 , 45 바이트

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

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 설명:

T`Llp`ll_

소문자와 문장 부호를 삭제하십시오.

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

중복 제거.

.
100$*

100을 곱하십시오.

^
13$*

추가 13.

.{26}

정수는 26으로 나누고 10 진수로 변환합니다.


나는 출력에 백분율을 사용하는 유일한 언어가 망막이라고 생각합니다!
텔레 포팅 염소

아, 나누기 전에 단항 13을 추가하는 좋은 트릭! 왜 그렇게 생각하지 않았습니까 ..>.> 내 대답을 44 바이트로 만들 것 입니다. 그래도 이전 버전은 그대로 둡니다.
케빈 크루이 ssen

@TeleportingGoat 아마도 Retina는 소수점 이하 자릿수가없는 지금까지 게시 된 언어 중 유일한 언어이기 때문일 것입니다. (단항) 정수 나누기 만 가능합니다.
케빈 크루이 ssen


3

, 11 바이트

I∕LΦβ№↧θι²⁶

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 출력은 10 진수 (또는 1팬 그램)입니다. 설명:

  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

배치, 197 바이트

@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

STDIN에서 입력을 받고 반올림 백분율을 출력합니다. 설명:

@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

문자를 삭제하면 문자열이 변경된 경우 문자 수가 증가합니다.


3

페페 , (155) 138 바이트

rEeEeeeeeEREeEeEEeEeREERrEEEEErEEEeReeReRrEeeEeeeeerEEEEREEeRERrErEErerREEEEEeREEeeRrEreerererEEEEeeerERrEeeeREEEERREeeeEEeEerRrEEEEeereEE

온라인으로 사용해보십시오! 출력은 10 진수 형식입니다.

설명:

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

Pepe는 4 개의 명령 언어 일 뿐이므로 RE 당 2 비트로 인코딩하면 34.5 바이트와 비슷합니까?
만료 된 데이터


3

망막 , 57 46 35 바이트

.
$L
[^a-z]

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

나누기 전에 단항 13을 추가하는 @Neil 의 트릭 에서 영감을 얻은 -11 바이트 . @Neil
덕분에 또 다른 -11 바이트 . 정수 전체로 올바로 반올림합니다.

온라인으로 사용해보십시오.

10 진수 출력으로 작동하는 57 46 40 바이트 버전 :

.
$L
[^a-z]

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

@Neil 덕분에 동일한 -11 바이트와 추가 -6 바이트가 있습니다.

0.153842615.315.41000×unique_letters26

온라인으로 사용해보십시오.

설명:

모든 문자를 소문자로 변환하십시오.

.
$L

비 레터를 모두 제거하십시오.

[^a-z]

모든 문자를 균등화하십시오.

D`.

모든 고유 문자를 1000 밑줄로 바꿉니다.

.
1000*

26 개의 인접한 밑줄이 그에 맞는 횟수를 세십시오.

C`_{26}

올바른 위치에 점을 삽입하십시오.

-1`\B
.

1
.*단지 수 .1 바이트 절약을 위해,하지만 당신은 사용하여 다른 10 바이트를 저장할 수 있습니다 Deduplicate을 대신 수동으로 그 일을!

@ DNeil Ah, 내장 에 대해 몰랐습니다. 감사합니다! 그리고 왜 내가 .*대신에 사용했는지 확실하지 않습니다 .. 두 버전 모두 -11 바이트에 감사드립니다! :)
Kevin Cruijssen

1
참고로 동일한 바이트 수에 대해 약간 다른 접근 방식 이 있습니다. 온라인으로 시도하십시오!

1
십진수 버전의 -1`\B경우 원하는 삽입 위치와 직접 일치하는 것으로 나타났습니다 .

@Neil 감사합니다.
케빈 크루이 ssen

3

자바 8, 62 59 바이트

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

덕분에 -3 바이트 @ OlivierGrégoire .

온라인으로 사용해보십시오.

설명:

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&95과 함께 c%91>64몇 가지 이유. 나는 당신이 이미 골프 몇 번 나에게 제안했다고 생각합니다.
Kevin Cruijssen

네, 이미 제안했지만 괜찮습니다. 걱정하지 마십시오 ;-)
Olivier Grégoire

더 길지만 더 재미 있음 : s->{int r=0,b=0;for(var c:s)if((c&95)%91>64&&b<(b|=1<<c))r++;return r/26.;}(75 bytes)
Olivier Grégoire




2

Stax , 9 바이트

░║üy$}╙+C

실행 및 디버깅


1
을 삭제 u하고 사용하여 압축을 푼 버전에서 바이트를 제거 할 수 |b있지만 비용은 절약됩니다. 8 바이트가있을 수 있지만 온라인 통역사는 이상하고 버그가 있습니다.
Khuldraeseth na'Barya

@ Khuldraesethna'Barya : 좋은 발견. 나는 버그가 아마도 배열 돌연변이라고 생각합니다. 나는 지금 그 행동 중 일부를보고 있습니다. 최소한의 재생산 작업
재귀

다음은 내가 겪고있는 문제에 대한 재현 입니다 |b. 복사하지 않고 피연산자를 잘못 변경합니다. 버그에 대한 github 문제를 만들었습니다. github.com/tomtheisen/stax/issues/29 해결 방법으로 |b처음으로 올바르게 작동합니다. 그런 다음 페이지를 다시로드해야 할 수도 있습니다. 다른 버그를 발견 한 경우 재생산을 제공 할 수 있으면 문제를 해결할 수 있습니다.
재귀

Stax 1.1.4, 8 바이트 지침 : 포장 풀기, v시작시 삽입, |b이후 삽입 Va, 실행, 첫 번째 v제거 |b, 제거 , 다시 포장. 네, 제가 찾은 버그입니다.
Khuldraeseth na'Barya

@ Khuldraesethna'Barya : 1.1.5를 출시 했으며이 버그가 수정되었습니다. 여전히 문제가 있으면 알려주세요. 감사.
재귀




1

Japt , 9 바이트

;CoU Ê/26

시도 해봐

;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 바이트

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

(참고 : 반올림)

다른 10 진수 리턴 버전 (95 바이트) :

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

이것은 @Steadybox의 답변에서 일부를 빌립니다.


1
환영! 좋은 첫 대답입니다. 코드에 대한 간단한 설명이나 골프화되지 않은 버전을 제공하면 답변을 읽는 사람들에게 도움이 될 수 있습니다. 실행 가능한 코드가있는 온라인 통역사와의 링크를 제공하는 것도 도움이 될 수 있습니다 (예제에 대한 다른 답변 참조). 많은 사람들이 TIO를 사용하고 있으며 여기 gcc 통역사가 있습니다
mbomb007
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.