알파벳 완성 률


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 -f및 grep -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.4⌊1000×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.