Tingkat penyelesaian alfabet

32

pengantar

Seberapa banyak alfabet bahasa Inggris yang digunakan string? Kalimat sebelumnya menggunakan 77%. Ini memiliki 20 huruf unik (howmucftenglisapbdvr), dan 20/26 ≃ 0,77.

Tantangan

Untuk string input, kembalikan persentase huruf alfabet Inggris yang ada dalam string.

  • Jawabannya bisa dalam bentuk persentase atau dalam bentuk desimal.

  • String input dapat memiliki huruf besar dan kecil, serta tanda baca. Namun Anda dapat menganggap mereka tidak memiliki karakter diakritik atau aksentuasi.

Uji kasus

Memasukkan

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

Beberapa output yang valid

77%, 76.9, 0.7692

Memasukkan:

The quick brown fox jumps over the lazy dog

Semua output yang valid:

100%, 100, 1

Output yang diharapkan untuk "@#$%^&*?!"dan ""adalah 0.

Teleporting Goat
sumber
3
Disarankan uji kasus: "@#$%^&*?!",""
Adam
4
Jika 77%dan 76.9diterima, apakah 77diterima juga?
Grzegorz Oledzki
Persentase dapat memiliki bagian desimal juga ...
Jo King
2
@Shaggy Sunting terakhir untuk OP adalah 16 jam yang lalu, jawaban Anda di 15 dan komentar Anda di 14. Maksud saya, Anda benar tapi ???
Veskah
6
Jika 20/26 dapat dibulatkan ke 0,7692, 0,769 atau 0,77, dapatkah saya juga membulatkannya menjadi 0,8, 1 atau 0? ;-)
Noiralef

Jawaban:

18

Python 3 , 42 byte

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

Cobalah online!

Kami memfilter semua karakter non-alfabet dari string dengan mengambil (set) perbedaan representasi huruf besar dan huruf kecil. Kemudian, kami mengambil panjangnya dan membaginya dengan 26.

Python 3 , 46 byte

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

Cobalah online!

Hitung karakter alfabet (huruf kecil) yang unik, dan bagi dengan 26. Dalam Python 2 dibutuhkan 3 karakter lagi; dua untuk mengubah {*...}menjadi set(...), dan satu untuk membuat 26 float:, 26.untuk menghindari pembagian lantai.

Python 3 , 46 byte

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

Cobalah online!

Panjang yang sama, pada dasarnya sama dengan yang sebelumnya, tetapi tanpa metode string "bawaan".

ArBo
sumber
Mengapa yang kedua kembali 1.0dan tidak 1? (Saya tidak ingin secara khusus melarangnya sehingga tidak akan merugikan bahasa tertentu, tapi saya penasaran)
Teleporting Goat
10
@TeleportingGoat Division dengan slash tunggal selalu memberikan floats di Python 3, bahkan jika operan adalah bilangan bulat. Untuk divisi integer, Anda akan menggunakan //, tetapi kemudian akan selalu divisi integer, yang jelas bukan yang kita inginkan di sini. Masuk akal bahwa mereka tidak membuat tipe data output tergantung pada nilai spesifik operan, yang berarti selalu mengapung, bahkan jika itu bilangan bulat.
ArBo
11

MATL , 8 byte

2Y2jkmYm

Cobalah di MATL Online

Penjelasan

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
Suever
sumber
8

Oktaf / MATLAB, 33 byte

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

Cobalah online!

Penjelasan

@(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
Luis Mendo
sumber
7

05AB1E , 8 7 6 byte

lASåÅA

-1 byte terima kasih kepada @LuisMendo .

Cobalah secara online atau verifikasi beberapa kasus uji lagi .

6 byte alternatif yang disediakan oleh @Grimy :

láÙg₂/

Cobalah secara online atau verifikasi beberapa kasus uji lagi .

Output kedua program sebagai desimal.

Penjelasan:

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)
Kevin Cruijssen
sumber
@LuisMendo sebagai alternatif, láêg₂/juga 6-byter.
Grimmy
1
@LuisMendo Terima kasih (dan Anda juga Grimy )! :)
Kevin Cruijssen
7

C # (Visual C # Interactive Compiler) , 56 49 byte

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

Cobalah online!

-6 byte terima kasih untuk innat3

Data Kedaluwarsa
sumber
1
Anda dapat menyimpan 6 byte dengan membandingkan nilai desimal karakter 50 byte ( Kode karakter )
Innat3
@ Innat3 49 byte dengan mengubah &&ke &.
Kevin Cruijssen
@KevinCruijssen ~ 2 menit untuk mendapatkan kredit -1 byte, sudah melakukan itu dan sedang mengedit
Expired Data
@ExpiredData Np, itu golf yang jelas. Terutama mengarahkannya ke Innat :)
Kevin Cruijssen
6

APL (Dyalog Extended) , 10 byte SBCS

Fungsi awalan diam-diam anonim. Mengembalikan pecahan desimal.

26÷⍨∘≢⎕A∩⌈

Cobalah online!

 huruf besar

⎕A∩ persimpangan dengan huruf besar A lphabet

 jumlah penghitungan

 kemudian

26÷⍨ bagi dengan dua puluh enam

Adm
sumber
⌹∘≤⍨⎕A∊⌈­­­­­
ngn
@ Ngn Itu sangat pintar, tetapi sangat berbeda. Silakan dan kirim itu sendiri. Saya akan dengan senang hati memasukkan penjelasannya jika Anda menginginkannya.
Adám
6

Perl 6 , 27 24 byte

-3 byte terima kasih kepada nwellnhof

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

Cobalah online!

Jo King
sumber
1
+1 Juga, sementara ini bekerja dengan baik (dan .lcakan bekerja juga), dari sudut pandang "benar", .fcmungkin lebih baik (terutama jika tantangannya memiliki huruf non-Inggris)
user0721090601
6

Bash and Gnu utils ( 81 78 68 60 42 bytes)

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

-8 byte terima kasih kepada @wastl

-18 byte terima kasih kepada Nahuel menggunakan beberapa trik yang saya tidak tahu:

  • sort -fdan grep -iabaikan case
  • sort -u adalah pengganti untuk | uniq
Grzegorz Oledzki
sumber
1
60 byte :echo $(tr A-Z a-z|tr -cd a-z|fold -1|sort -u|wc -l)/26|bc -l
wastl
Kanan. Variabel adalah pengingat setelah upaya lain. Terima kasih!
Grzegorz Oledzki
3
42 byte
Nahuel Fouilleul
Tidak bisakah "grep -io [az]" disingkat menjadi "grep -o [Az]"?
Gnudiff
@ Gnudiff Dengan asumsi ASCII, itu juga akan cocok dengan semua [\ ^ _ `].
jnfnt
6

K (oK) , 19 15 byte

Larutan:

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

Cobalah online!

Penjelasan:

Ubah input menjadi huruf kecil, modulo 97 ("az" adalah 97-122 di ASCII, modulo 97 memberi 0-25), ambil unik, jumlahkan hasil yang lebih rendah dari 26, dan konversikan ke persentase 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 ...

Catatan:

  • -1 byte, terima kasih kepada ngn, 1-%[;26]=>1-1%26%
  • -3 byte terinspirasi oleh ngn #(!26)^=>+/26>?
streetster
sumber
1
Saya menantikan penjelasannya! Saya tidak tahu apa yang 97dilakukan di sini
Teleporting Goat
Lain 19 byte alternatif
streetster
1
%[;26]->1%26%
ngn
1
1%26%+/26>?97!_untuk 15
streetster
6

PowerShell , 55 52 byte

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

Cobalah online!

Upaya pertama, masih mencoba ide-ide acak

EDIT: @Veskah menunjukkan ToUpper menyimpan byte karena rentang nomor, juga menghapus ekstra ()dan spasi

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

Perubahan string untuk semua yang lebih rendah huruf besar, memperluas ke array, macam elemen dan memilih huruf yang unik (gu membutuhkan masukan diurutkan), tetap hanya karakter dari nilai ascii 97-122 (a sampai z) 65-90 (A ke Z), hitung total dan bagi dengan 26 untuk output desimal

Sinusoid
sumber
1
oh, baru saja perhatikan kamu memiliki ruang ekstra setelah -in.
Veskah
6

R , 47 byte

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

Cobalah online!

Konversi ke huruf besar kemudian ke titik kode ASCII, dan periksa nilai 65:90 yang sesuai dengan A: Z.

Robin Ryder
sumber
1
Ini gagal ketika ada tanda kutip di input.
C. Braun
1
@ C.Braun Tidak dalam pengujian saya ... Misalnya, test case pertama di TIO menyertakan kutipan dan memberikan hasil yang benar. Bisakah Anda memberi contoh?
Robin Ryder
1
Saya tidak begitu mengerti apa yang telah Anda lakukan di bagian header pada TIO, tetapi menjalankan hanya kode di atas dalam sebuah interpreter R tidak berfungsi. Anda tampaknya mendefinisikan ulang scanuntuk tidak terpecah pada tanda kutip, seperti default?
C. Braun
1
@ C.Braun Mengerti, terima kasih! Saya sudah secara eksplisit membuatnya menjadi fungsi (dengan biaya 3 byte) dan saya pikir tidak apa-apa sekarang.
Robin Ryder
4

Retina 0.8.2 , 45 byte

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

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

T`Llp`ll_

Huruf kecil dan hapus tanda baca.

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

Deduplicate.

.
100$*

Kalikan dengan 100.

^
13$*

Tambahkan 13.

.{26}

Bilangan integer sebesar 26 dan dikonversi ke desimal.

Neil
sumber
Saya pikir retina adalah satu-satunya bahasa di sini yang menggunakan persentase untuk hasilnya!
Teleporting Goat
Oh, trik yang bagus dengan menambahkan 13 unary sebelum membaginya! Mengapa saya tidak memikirkan itu ..>.> Itu akan membuat jawaban saya 44 byte . Saya masih akan meninggalkan versi saya sebelumnya.
Kevin Cruijssen
@TeleportingGoat Mungkin karena Retina juga satu-satunya bahasa dari yang diposting sejauh ini yang tidak memiliki pembagian desimal. Hanya divisi integer (tidak terarah) yang dimungkinkan.
Kevin Cruijssen
4

APL (Dyalog Extended) , 8 byte

⌹∘≤⍨⎕A∊⌈

Cobalah online!

longgar berdasarkan jawaban Adm

 huruf besar

⎕A∊boolean (0 atau 1) vektor dengan panjang 26 yang menunjukkan huruf dari bahasa Inggris A lphabet berada dalam string

⌹∘≤⍨ rata-rata aritmatika, yaitu pembagian matriks dari argumen dan vektor semua-1 dengan panjang yang sama

ngn
sumber
3

Arang , 11 byte

I∕LΦβ№↧θι²⁶

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Output adalah sebagai desimal (atau 1untuk pangrams). Penjelasan:

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

Batch, 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

Mengambil input pada STDIN dan menghasilkan persentase bulat. Penjelasan:

@set/ps=

Masukkan string.

@set s=%s:"=%

Hapus kutipan, karena mereka sakit kepala untuk berurusan dengan di Batch.

@set n=13

Mulailah dengan setengah huruf untuk tujuan pembulatan.

@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

Hapus setiap huruf pada gilirannya dari string. Aktifkan subrutin untuk memeriksa apakah ada yang berubah, karena cara Batch mem-parsing variabel.

@cmd/cset/an/26

Hitung hasilnya sebagai persentase.

@exit/b
:c

Mulai dari subrutin.

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

Jika menghapus surat, mengubah string maka menambah jumlah surat.

Neil
sumber
3

Pepe , 155 138 byte

rEeEeeeeeEREeEeEEeEeREERrEEEEErEEEeReeReRrEeeEeeeeerEEEEREEeRERrErEErerREEEEEeREEeeRrEreerererEEEEeeerERrEeeeREEEERREeeeEEeEerRrEEEEeereEE

Cobalah online! Output dalam bentuk desimal.

Penjelasan:

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
tidak terdefinisi
sumber
Karena Pepe hanya 4 bahasa perintah sebenarnya itu seperti 34,5 byte jika Anda menyandikannya sebagai 2 bit per re RE?
Data Kedaluwarsa
3

K (oK) , 19 byte

1%26%26-#(!26)^97!_

Cobalah online!

J , 30 byte

26%~26-u:@(97+i.26)#@-.tolower

Cobalah online!

Galen Ivanov
sumber
1
32!terlalu luas - itu membuat sisa ekspresi memperlakukan beberapa tanda baca sebagai huruf, misalnya coba tambahkan: dalam contoh input
ngn
@ Ngn Saya tidak menguji dengan tanda baca pada awalnya. Terima kasih telah mengingatkan saya.!
Galen Ivanov
3

Retina , 57 46 35 byte

.
$L
[^a-z]

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

-11 bytes mengambil inspirasi dari @ Neil trik 's menambahkan unary 13 sebelum membagi .
Lain -11 byte berkat @Neil secara langsung.
Rounds (benar) ke seluruh bilangan bulat.

Cobalah online.

57 46 40 byte versi yang bekerja dengan output desimal:

.
$L
[^a-z]

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

Sama-11 byte serta tambahan -6 byte berkat @Neil .

0,153842615.315.41000×unik_letters26

Cobalah online.

Penjelasan:

Ubah semua huruf menjadi huruf kecil:

.
$L

Hapus semua bukan huruf:

[^a-z]

Uniquify all letters:

D`.

Ganti setiap huruf unik dengan 1000 garis bawah:

.
1000*

Hitung jumlah kali 26 garis bawah yang berdekatan masuk ke dalamnya:

C`_{26}

Masukkan titik di tempat yang benar:

-1`\B
.
Kevin Cruijssen
sumber
1
The .*hanya bisa .untuk penghematan 1 byte, tetapi Anda dapat menyimpan lain 10 byte dengan menggunakanD eduplicate bukannya melakukan secara manual!
Neil
@ Neil Ah, tidak tahu tentang D-builtin, terima kasih! Dan tidak yakin mengapa saya menggunakan .*bukan ... Terima kasih untuk -11 byte di kedua versi! :)
Kevin Cruijssen
1
FYI Saya punya pendekatan yang sedikit berbeda untuk jumlah byte yang sama: Coba online!
Neil
1
Untuk versi desimal saya menemukan yang -1`\Bcocok dengan posisi penyisipan yang diinginkan secara langsung.
Neil
@Neil Terima kasih lagi.
Kevin Cruijssen
3

Java 8, 62 59 byte

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

-3 byte terima kasih kepada @ OlivierGrégoire .

Cobalah online.

Penjelasan:

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
Kevin Cruijssen
sumber
1
59 byte
Olivier Grégoire
@ OlivierGrégoire Terima kasih! Saya selalu lupa c&95dalam kombinasi dengan c%91>64beberapa alasan. Saya pikir Anda sudah menyarankan golf itu beberapa kali sebelumnya kepada saya.
Kevin Cruijssen
Ya, saya sudah menyarankan itu, tapi tidak apa-apa, jangan khawatir ;-)
Olivier Grégoire
Jauh lebih lama, tetapi lebih menyenangkan: 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

Menggunakan versi vektor dari operator ∈, memeriksa isi dalam string untuk semua karakter dalam rentang dari a hingga z. Kemudian jumlahkan BitArray yang dihasilkan dan bagi dengan jumlah total huruf yang mungkin.

Cobalah online!

TimD
sumber
Selamat datang dan jawaban pertama yang bagus!
mbomb007
2

C, 96 byte

float f(char*s){int i=66,l[256]={};for(;*s;)l[1+*s++&~32]=1;for(;i<92;*l+=l[i++]);return*l/26.;}

Cobalah online!

Steadybox
sumber
2

Perl 5 -MList::Util=uniq -p , 24 byte

$_=uniq(lc=~/[a-z]/g)/26

Cobalah online!

Xcali
sumber
2

Stax , 9 byte

░║üy$}╙+C

Jalankan dan debug itu

rekursif
sumber
1
Anda dapat melepaskan satu byte dari versi yang sudah dibongkar dengan menjatuhkan udan menggunakan |b, tetapi penghematannya hilang saat dikemas. Saya mungkin memiliki 8-byter, tetapi penerjemah online menjadi aneh dan buggy.
Khuldraeseth na'Barya
@ Khuldraesethna'Barya: Nice find. Saya pikir bug tersebut mungkin merupakan mutasi array. Saya melihat beberapa perilaku itu sekarang. Bekerja dengan repro minimal ...
rekursif
Berikut adalah repro dari masalah yang saya rasa Anda alami |b. Itu salah mengubah operan daripada membuat salinan. Saya telah membuat masalah github untuk bug tersebut. github.com/tomtheisen/stax/issues/29 Sebagai solusinya, |bakan berfungsi dengan benar pertama kali. Setelah itu, Anda mungkin harus memuat ulang halaman tersebut. Jika Anda menemukan bug yang berbeda, jika Anda dapat memberikan reproduksi, saya mungkin akan dapat memperbaikinya.
Rekursif
Stax 1.1.4, 8 byte. Instruksi: membongkar, masukkan vdi awal, masukkan |bsetelah Va, jalankan, hapus yang pertama v, hapus |b, bungkus ulang. Yap, itulah bug yang saya temukan.
Khuldraeseth na'Barya
@ Khuldraesethna'Barya: Saya sudah merilis 1.1.5, dan saya yakin bug ini sudah diperbaiki sekarang. Anda dapat memberi tahu saya jika Anda masih memiliki masalah. Terima kasih.
Rekursif
2

Jelly , 8 byte

ŒuØAe€Æm

Cobalah online!

Penjelasan

Œu       | Convert to upper case
  ØAe€   | Check whether each capital letter is present, returning a list of 26 0s and 1s
      Æm | Mean
Nick Kennedy
sumber
2

Python 3 , 51 49 byte

51 -> 49 byte, terima kasih kepada alexz02

lambda s:len({*filter(str.isalpha,s.lower())})/26

Cobalah online!

ruohola
sumber
49 byteslambda s:len({*filter(str.isalpha,s.lower())})/26
alexz02
@ alexz02 Terima kasih! :)
ruohola
1

Japt , 9 byte

;CoU Ê/26

Cobalah

;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
Shaggy
sumber
1

Ruby -n , 38 34 byte

-4 byte dari @historcrat!

p (?A..?Z).count{|c|~/#{c}/i}/26.0

Cobalah online!

Nilai Tinta
sumber
@ histokrat Anda benar
Value Ink
1

C, 95 byte

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

(catatan: bulat ke bawah)

Versi pengembalian-desimal alternatif (95 byte):

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

Ini meminjam sebagian dari jawaban @Steadybox '.

Anonim
sumber
1
Selamat datang! Jawaban pertama yang bagus. Mungkin bermanfaat bagi orang yang membaca jawaban Anda jika Anda memberikan penjelasan singkat tentang kode Anda atau versi yang tidak diklik. Mungkin juga bermanfaat untuk menyediakan tautan ke juru bahasa online dengan kode Anda yang dapat dijalankan (lihat beberapa jawaban lain sebagai contoh). Banyak yang menggunakan TIO, dan inilah interpreter gcc
mbomb007