Alfabe tamamlama oranı


32

Giriş

Belirli bir dize İngilizce alfabenin ne kadarını kullanıyor? Önceki cümle% 77 kullanır. 20 benzersiz harf (howmucftenglisapbdvr) ve 20/26 ≃ 0.77 vardır.

Meydan okuma

Bir giriş dizesi için dizede bulunan İngilizce alfabenin harflerinin yüzdesini döndürün.

  • Cevap yüzde veya ondalık biçimde olabilir.

  • Giriş dizesi büyük ve küçük harflerin yanı sıra noktalama işaretlerini de içerebilir. Ancak, onların hiçbir aksan veya vurgulanan karakterleri olmadığını varsayabilirsiniz.

Test durumları

Giriş

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

Bazı geçerli çıktılar

77%, 76.9, 0.7692

Giriş:

The quick brown fox jumps over the lazy dog

Tüm geçerli çıktılar:

100%, 100, 1

Beklenen çıktı "@#$%^&*?!"ve ""0'dır.


3
Önerilen test durumları: "@#$%^&*?!",""
Adam

4
Eğer 77%ve 76.9kabul edilir olduğu 77da kabul etti mi?
Grzegorz Oledzki

Yüzdeler de ondalık parçalara sahip olabilir ...
Jo King,

2
@Shaggy OP için son düzenleme 16 saat önceydi, cevabınız 15 ve yorumunuzu 14. oldu. Yani, haklısınız ama ???
Veskah

6
20/26, 0.7692, 0.769 veya 0.77'ye yuvarlanabilirse, onu da 0.8, 1 veya 0'a yuvarlayabilir miyim? ;-)
Noiralef

Yanıtlar:


18

Python 3 , 42 bayt

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

Çevrimiçi deneyin!

Alfabetik olmayan tüm karakterleri büyük ve küçük harf gösterimlerinin (set) farkını alarak dizgiden süzeriz. Sonra uzunluğu alırız ve 26'ya böleriz.

Python 3 , 46 bayt

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

Çevrimiçi deneyin!

Benzersiz alfabetik (küçük harf) karakterleri say ve 26 ile böl. Python 2'de 3 karakter daha gerekir; iki tanesini değiştirmek {*...}için set(...), diğeri 26'yı bir şamandıra haline getirmek için:, 26.zeminin bölünmesini önlemek için.

Python 3 , 46 bayt

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

Çevrimiçi deneyin!

Aynı uzunluk, esasen öncekiyle aynı, ancak "dahili" string yöntemi olmadan.


İkincisi neden geri dönüyor 1.0ve dönmüyor 1? (Belirli dilleri dezavantajlı olmayacak şekilde özellikle reddetmek istemedim, ama merak ediyorum)
Teleporting Goat

10
@TeleportingGoat Division tek bir eğik çizgiyle, operandlar tamsayı olsalar bile, daima Python 3'te float verir. Tamsayı bölme için kullanacaksınız //, ama o zaman her zaman tamsayı bölme olurdu, ki burada ne istediğimiz belli değil. Çıktının veri türünü, işlenenlerin belirli değerlerine bağlı kılmadıklarını ifade eder, bu tam sayı olsa bile her zaman yüzer anlamına gelir.
ArBo

11

MATL , 8 bayt

2Y2jkmYm

MATL Online'da deneyin

açıklama

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 bayt

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

Çevrimiçi deneyin!

açıklama

@(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 bayt

lASåÅA

@ LouisMendo sayesinde -1 bayt .

Çevrimiçi deneyin ya da birkaç test vakası daha doğrulayın .

@Grimy tarafından sağlanan 6 byte alternatif :

láÙg₂/

Çevrimiçi deneyin ya da birkaç test vakası daha doğrulayın .

Her iki program da ondalık olarak verilir.

Açıklama:

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 alternatif olarak, láêg₂/ayrıca bir 6-bayter.
Grimmy

1
@LuisMendo Teşekkürler (ve sen de Grimy )! :)
Kevin Cruijssen

7

C # (Visual C # Etkileşimli Derleyici) , 56 49 bayt

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

Çevrimiçi deneyin!

İnnat3 sayesinde -6 bayt


1
50 baytlık karakterlerin ondalık değerlerini karşılaştırarak 6 bayt tasarruf edebilirsiniz ( Karakter kodları )
Innat3

@ Değiştirerek Innat3 49 bayt &&için &.
Kevin Cruijssen

@KevinCruijssen ~ 2 dak. -1 baytlık kredisi almaktan hemen önce bunu yaptı ve düzenliyordu
Süresi dolmuş veri Tarih

@ExpiredData Np, bariz bir golf oldu. Esas olarak Innat'a yönlendiriyordu :)
Kevin Cruijssen

6

APL (Dyalog Genişletilmiş) , 10 bayt SBCS

Anonim zımni önek işlevi. Ondalık kesir döndürür.

26÷⍨∘≢⎕A∩⌈

Çevrimiçi deneyin!

 büyük harf

⎕A∩ Büyük A lphabet ile kesişme

 taksitli uzunluk

 sonra

26÷⍨ yirmi altıya bölmek


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

@ Bu çok akıllı, ama tamamen farklı. Devam et ve kendin postala. Benden istersen, açıklama ekleyeceğim için mutlu olacağım.
Adám


6

Perl 6 , 27 24 bayt

Nwellnhof sayesinde -3 bayt

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

Çevrimiçi deneyin!


1
+1 Ayrıca, bu sadece iyi çalışıyor .lcolsa da (ve aynı zamanda da çalışabilir), "doğruluk" açısından bakıldığında .fcdaha iyi olabilirdi (özellikle zorluk İngilizce olmayan harflere
sahipse

6

Bash ve Gnu yardımcı programları ( 81 78 68 60 42 bayt)

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

@Wastl sayesinde -8 bayt

-18 sayesinde bayt Nahuel bilmiyordum bazı hileler kullanılarak:

  • sort -fve grep -idavayı yoksay
  • sort -u yerine | uniq

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

Sağ. Değişken, başka bir denemeden sonra bir hatırlatmadır. Teşekkürler!
Grzegorz Oledzki


"Grep -io [az]", "grep -o [Az]" olarak kısaltılamaz mı?
Gnudiff

@Gnudiff ASCII varsayarak, [\ ^ _ `] ile de aynı olacaktır.
jnfnt

6

K (OK) , 19 15 bayt

Çözüm:

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

Çevrimiçi deneyin!

Açıklama:

Girişi küçük harfe dönüştürün, modulo 97 ("az" ASCII'de 97-122'dir, modulo 97 0-25 verir), benzersiz olsun, 26'dan düşük sonuçları toplayın ve 26 yüzdesine dönüştürün.

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

Notlar:

  • Ngn sayesinde -1 bayt , 1-%[;26]=>1-1%26%
  • Ngn #(!26)^=> esinlenerek -3 bayt+/26>?

1
Ben açıklama bekliyorum! 97Burada ne olduğu hakkında hiçbir fikrim yok
Teleporting Goat


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



6

PowerShell , 55 52 bayt

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

Çevrimiçi deneyin!

İlk deneme, hala rastgele fikirler denemek

EDIT: @Veskah, ToUpper'ın sayı aralığı nedeniyle fazladan ()ve bir boşluktan dolayı bir bayt tasarrufu yaptığını belirtti

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

Dizgiyi küçük harfe dönüştürür, diziye genişletir, öğeleri sıralar ve benzersiz harfleri seçer (gu'nin sıralı giriş yapması gerekir), yalnızca 97 - 122 ( a'dan z'ye) 65 - 90 (A'dan Z'ye) ascii değerindeki karakterleri tutar , toplamı sayın ve ondalık çıktının 26'ya bölün



1
Ah, sadece sonra-in fazladan bir boşluk olduğunu fark ettim.
Veskah

6

R , 47 bayt

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

Çevrimiçi deneyin!

Büyük harfe ve ardından ASCII kod noktalarına dönüştürür ve A: Z'ye karşılık gelen 65:90 değerlerini kontrol eder.


1
Girdide tırnak olduğunda bu başarısız olur.
C. Braun,

1
@ C.Braun Testlerimde yok ... Örneğin, TIO'daki ilk test durumu tırnak işaretleri içeriyor ve doğru sonucu veriyor. Bir örnek verebilir misiniz?
Robin Ryder

1
TIO’nın başlık kısmında ne yaptığınızı tam olarak anlamadım, ancak yukarıdaki kodu sadece bir R tercümanında çalıştırmak işe yaramıyor. scanVarsayılan değerlerde olduğu gibi, tırnak üzerinde bölünmemeyi yeniden tanımlıyor gibisiniz?
C. Braun

1
@ C.Braun Anladım, teşekkürler! Açıkça bir işleve (3 bayt pahasına) yaptım ve şimdi tamam olduğunu düşünüyorum.
Robin Ryder

4

Retina 0.8.2 , 45 bayt

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

Çevrimiçi deneyin! Link, test durumlarını içerir. Açıklama:

T`Llp`ll_

Küçük harfler ve noktalama işaretlerini silin.

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

Deduplicate.

.
100$*

100 ile çarp.

^
13$*

13'ü ekleyin.

.{26}

Tamsayı 26 ile bölmek ve ondalık dönüştürmek.


Bence çıktı için yüzdeleri kullanan tek dil retina burası!
Teleporting Goat

Oh, ayrılmadan önce unary 13 ekleyerek güzel hile! Neden bunu düşünmedim ..>.> Cevabımı 44 byte yapar . Yine de önceki sürümümü bırakacağım.
Kevin Cruijssen

@TeleportingGoat Muhtemelen, Retina aynı zamanda şu ana kadar yayınlanmış dillerden tek bir dil olduğundan, mevcut ondalık bölümü bulunmayan bir dildir. Sadece (unary) tamsayı bölme mümkündür.
Kevin Cruijssen


3

Kömür , 11 bayt

I∕LΦβ№↧θι²⁶

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Çıktı 1ondalıktır (veya pangramlar için). Açıklama:

  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

Toplu iş, 197 bayt

@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'e girdi alır ve yuvarlak bir yüzde verir. Açıklama:

@set/ps=

Dize girin.

@set s=%s:"=%

Alıntılar, çünkü Batch'le başa çıkmak için bir baş ağrısıdır.

@set n=13

Yuvarlama amaçlı yarım harf ile başlayı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

Her harfi sırasından sırayla silin. Batch değişkenlerini ayrıştırma biçimi nedeniyle herhangi bir şeyin değişip değişmediğini kontrol etmek için alt rutini çağırın.

@cmd/cset/an/26

Sonucu yüzde olarak hesaplayın.

@exit/b
:c

Alt yordamın başlangıcı.

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

Bir harfi silmek dizgeyi değiştirdiyse, harf sayısını arttırın.


3

Pepe , 155 138 bayt

rEeEeeeeeEREeEeEEeEeREERrEEEEErEEEeReeReRrEeeEeeeeerEEEEREEeRERrErEErerREEEEEeREEeeRrEreerererEEEEeeerERrEeeeREEEERREeeeEEeEerRrEEEEeereEE

Çevrimiçi deneyin! Çıktı ondalık biçimdedir.

Açıklama:

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 sadece 4 komut dili olduğundan, eğer RE başına 2 bit olarak kodlandıysanız, 34.5 bayt gibidir.
Süresi dolmuş veriler


3

Retina , 57 46 35 bayt

.
$L
[^a-z]

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

@Neil'den ayrılmadan önce, 13 unary ekleme hilesinden ilham alan -11 bayt . @Neil'e doğrudan
başka bir -11 bayt teşekkürler . Tam bir tamsayıya yuvarlar (doğru).

Çevrimiçi deneyin.

57 46 40 baytlık sürüm ile çalışan sürüm:

.
$L
[^a-z]

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

@Neil sayesinde aynı -11 bayt, ek bir -6 bayt .

0.153842615.315.41000×unique_letters26

Çevrimiçi deneyin.

Açıklama:

Tüm harfleri küçük harfe dönüştür:

.
$L

Tüm harfleri kaldır:

[^a-z]

Tüm harfleri benzersizleştir:

D`.

Her benzersiz harfi 1000 alt çizgi ile değiştirin:

.
1000*

26 bitişik alt çizgi içine sığdıran miktarları sayın:

C`_{26}

Doğru yere bir nokta ekleyin:

-1`\B
.

1
.*Sadece olabilir .bir 1 bayt tasarrufu için, ancak kullanarak başka 10 bayt kaydedebilir Deduplicate yerine elle yapıyor!
Neil,

@Neil Ah, -builtin hakkında hiçbir şey bilmiyordum D, teşekkürler! Ve emin kullandığım niçin .*yerine .iki sürümde de -11 bayt için teşekkür ..! :)
Kevin Cruijssen

1
Bilginize Aynı bayt sayısı için biraz farklı bir yaklaşımım oldu: Çevrimiçi deneyin!
Neil

1
Ondalık sürüm -1`\Biçin doğrudan istenen yerleştirme konumu ile eşleşen buldum .
Neil,

@Neil Tekrar teşekkürler.
Kevin Cruijssen

3

Java 8, 62 59 bayt

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

@ OlivierGrégoire sayesinde -3 bayt .

Çevrimiçi deneyin.

Açıklama:

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 Teşekkürler! Hep unutmak c&95birlikte c%91>64nedense. Sanırım bu golfü benden birkaç kez daha önce önerdin.
Kevin Cruijssen

Evet, bunları zaten önerdim, ama sorun değil, endişelenmeyin ;-)
Olivier Grégoire

Çok daha uzun, ama daha eğlenceli: 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

3

Julia 1.0 , 34 bayt

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

∈ operatörünün vectorized versiyonunu kullanır, a ile z arasındaki aralıktaki tüm karakterlerin dizgesindeki çevreyi kontrol eder. Ardından ortaya çıkan BitArray üzerinde toplanır ve toplam olası harf sayısına bölünür.

Çevrimiçi deneyin!


Hoş geldiniz ve ilk büyük cevap!
mbomb007



2

Stax , 9 bayt

░║üy$}╙+C

Koş ve hata ayıkla


1
Ambalajsız sürümden bırakarak uve kullanarak bir bayt alabilirsiniz |b, ancak tasarruf paketin altında kaybolur. 8 bayt olabilir, ancak çevrimiçi tercüman garip ve adamcağız.
Khuldraeseth na'Barya

@ Khuldraesethna'Barya: Güzel bul. Sanırım hata muhtemelen bir dizi mutasyonu. Şimdi bu davranıştan bazılarını görüyorum. Minimal reproda çalışmak ...
özyinelemede

İşte sanırım sorununun bir kopyası|b . Bir kopya çıkarmak yerine işlemcisini yanlış bir şekilde değiştiriyor. Hata için bir github sorunu yarattım. github.com/tomtheisen/stax/issues/29 Çözüm olarak, |bilk defa doğru çalışacaktır. Bundan sonra sayfayı yeniden yüklemeniz gerekebilir. Farklı bir hata bulduysanız, üreme sağlayabiliyorsanız, muhtemelen düzeltebilirim.
özyinelemeli

Stax 1.1.4, 8 bayt. Çalıştırma yönergeleri: Ambalajını açın, vbaşlangıçta takın, |bsonra yerleştirin Va, çalıştırın, ilk vçıkarın |b, çıkarın , yeniden paketleyin. Evet, bulduğum hataydı.
Khuldraeseth na'Barya

@ Khuldraesethna'Barya: 1.1.5'i yayımladım ve bu hatanın şimdi düzeltildiğine inanıyorum. Hala sorun yaşıyorsan bana haber ver. Teşekkürler.
özyinelemeli




1

Japt , 9 bayt

;CoU Ê/26

Dene

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

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

(not: aşağı yuvarlar)

Alternatif ondalık döndüren sürüm (95 bayt):

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

Bu @ Steadybox'ın cevabından biraz ödünç alır.


1
Hoşgeldiniz! İyi ilk cevap. Kodunuzu veya asılsız bir versiyonun kısa bir açıklamasını yaparsanız, cevabınızı okuyan insanlar için yararlı olabilir. Çalıştırılabilir kodunuzla çevrimiçi bir tercümana bağlantı sağlamak da yararlı olabilir (örnekler için diğer bazı cevaplara bakın). Pek çok kişi TIO kullanıyor ve işte burada gcc yorumlayıcısı
mbomb007
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.