Taux d'achèvement de l'alphabet

32

introduction

Quelle proportion de l'alphabet anglais une chaîne donnée utilise-t-elle? La phrase précédente utilise 77%. Il a 20 lettres uniques (howmucftenglisapbdvr) et 20/26 ≃ 0,77.

Défi

Pour une chaîne d'entrée, renvoyez le pourcentage de lettres de l'alphabet anglais présentes dans la chaîne.

  • La réponse peut être en pourcentage ou sous forme décimale.

  • La chaîne d'entrée peut avoir des majuscules et des minuscules, ainsi que des signes de ponctuation. Cependant, vous pouvez supposer qu'ils n'ont pas de signes diacritiques ou accentués.

Cas de test

Contribution

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

Quelques sorties valides

77%, 76.9, 0.7692

Contribution:

The quick brown fox jumps over the lazy dog

Toutes les sorties valides:

100%, 100, 1

La sortie attendue pour "@#$%^&*?!"et ""est 0.

Téléportation de chèvre
la source
3
Cas de test proposées: "@#$%^&*?!",""
Adám
4
Si 77%et 76.9est accepté, est-il 77accepté aussi?
Grzegorz Oledzki
Les pourcentages peuvent aussi avoir des parties décimales ...
Jo King
2
@Shaggy La dernière modification pour OP a eu lieu il y a 16 heures, votre réponse était à 15 et votre commentaire à 14. Je veux dire, vous avez raison mais ???
Veskah
6
Si 20/26 peut être arrondi à 0,7692, 0,769 ou 0,77, puis-je également l'arrondir à 0,8, 1 ou 0? ;-)
Noiralef

Réponses:

18

Python 3 , 42 octets

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

Essayez-le en ligne!

Nous filtrons tous les caractères non alphabétiques de la chaîne en prenant la différence (définie) des représentations majuscules et minuscules. Ensuite, nous prenons la longueur et divisons par 26.

Python 3 , 46 octets

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

Essayez-le en ligne!

Comptez les caractères alphabétiques uniques (minuscules) et divisez par 26. En Python 2, il faudrait 3 caractères supplémentaires; deux pour changer {*...}en set(...), et un pour faire 26 un flotteur:, 26.pour éviter la division du plancher.

Python 3 , 46 octets

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

Essayez-le en ligne!

Même longueur, essentiellement la même que la précédente, mais sans méthode de chaîne "intégrée".

ArBo
la source
Pourquoi le second revient-il 1.0et non 1? (Je ne voulais pas spécifiquement l'interdire pour ne pas désavantager des langues spécifiques, mais je suis curieux)
Teleporting Goat
10
@TeleportingGoat Division avec une seule barre oblique donne toujours des flottants en Python 3, même si les opérandes sont des entiers. Pour la division entière, vous utiliseriez //, mais ce serait toujours une division entière, ce qui n'est évidemment pas ce que nous voulons ici. Il est logique qu'ils n'aient pas fait dépendre le type de données de la sortie des valeurs spécifiques des opérandes, ce qui signifie toujours flotte, même s'il s'agit d'un nombre entier.
ArBo
11

MATL , 8 octets

2Y2jkmYm

Essayez-le sur MATL Online

Explication

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
la source
8

Octave / MATLAB, 33 octets

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

Essayez-le en ligne!

Explication

@(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
la source
7

05AB1E , 8 7 6 octets

lASåÅA

-1 octet grâce à @LuisMendo .

Essayez-le en ligne ou vérifiez quelques cas de test supplémentaires .

Alternative de 6 octets fournie par @Grimy :

láÙg₂/

Essayez-le en ligne ou vérifiez quelques cas de test supplémentaires .

Les deux programmes sortent en décimal.

Explication:

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
la source
@LuisMendo láêg₂/est également un 6 octets.
Grimmy
1
@LuisMendo Merci (et vous aussi Grimy )! :)
Kevin Cruijssen
7

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

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

Essayez-le en ligne!

-6 octets grâce à innat3

Données expirées
la source
1
vous pouvez économiser 6 octets en comparant les valeurs décimales des caractères 50 octets ( codes de caractères )
Innat3
@ Innat3 49 octets en changeant le &&en &.
Kevin Cruijssen
@KevinCruijssen ~ 2 minutes avant d'obtenir le crédit de -1 octet, l'a déjà fait et était en cours d'édition
Expired Data
@ExpiredData Np, c'était un golf évident. Le dirigeait principalement vers Innat :)
Kevin Cruijssen
6

APL (Dyalog Extended) , 10 octets SBCS

Fonction de préfixe tacite anonyme. Renvoie la fraction décimale.

26÷⍨∘≢⎕A∩⌈

Essayez-le en ligne!

 majuscule

⎕A∩ intersection avec l' alphabet majuscule A

 longueur du décompte

 puis

26÷⍨ diviser par vingt-six

Adam
la source
⌹∘≤⍨⎕A∊⌈­­­­­
ngn
@ngn C'est très intelligent, mais complètement différent. Allez-y et postez-le vous-même. Je serai heureux d'insérer l'explication si vous le souhaitez.
Adám
6

Perl 6 , 27 24 octets

-3 octets grâce à nwellnhof

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

Essayez-le en ligne!

Jo King
la source
1
+1 De plus, même si cela fonctionne très bien (et .lcfonctionnerait aussi), d'un point de vue "correct", il .fcpourrait être préférable (en particulier si le défi avait des lettres non anglaises)
user0721090601
6

Utilitaires Bash et Gnu ( 81 78 68 60 42 octets)

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

-8 octets grâce à @wastl

-18 octets grâce à Nahuel utilisant des astuces que je ne connaissais pas:

  • sort -f et grep -i ignorer la casse
  • sort -u est un remplacement pour | uniq
Grzegorz Oledzki
la source
1
60 octets :echo $(tr A-Z a-z|tr -cd a-z|fold -1|sort -u|wc -l)/26|bc -l
wastl
Droite. La variable est un rappel après une autre tentative. Merci!
Grzegorz Oledzki
3
42 octets
Nahuel Fouilleul
"Grep -io [az]" ne peut-il pas être raccourci en "grep -o [Az]"?
Gnudiff
@Gnudiff En supposant ASCII, cela correspondrait également à tous les \ \ _ _ \].
jnfnt
6

K (oK) , 19 15 octets

Solution:

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

Essayez-le en ligne!

Explication:

Convertissez les entrées en minuscules, modulo 97 ("az" est 97-122 en ASCII, modulo 97 donne 0-25), prenez des résultats uniques, résumez qui sont inférieurs à 26 et convertissez-les en pourcentage de 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 ...

Remarques:

  • -1 octets grâce à ngn, 1-%[;26]=>1-1%26%
  • -3 octets inspirés de ngn #(!26)^=>+/26>?
streetster
la source
1
J'attends avec impatience l'explication! Je n'ai aucune idée de ce que cela 97fait ici
Teleporting Goat
Une autre alternative de 19 octets
streetster
1
%[;26]->1%26%
ngn
1
1%26%+/26>?97!_pour 15
streetster
6

PowerShell , 55 52 octets

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

Essayez-le en ligne!

Première tentative, toujours essayer des idées aléatoires

EDIT: @Veskah a souligné que ToUpper enregistre un octet en raison de la plage de numéros, également supprimé supplémentaire () et un espace

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

Modifie la chaîne en majuscules inférieures , se développe en un tableau, trie les éléments et sélectionne les lettres uniques (gu a besoin d'une entrée triée), ne conserve que les caractères de valeur ascii 97 à 122 (a à z) 65 à 90 (A à Z), compter le total et diviser par 26 pour la sortie décimale

Sinusoïde
la source
1
oh, je viens de remarquer que vous avez un espace supplémentaire après -in.
Veskah
6

R , 47 octets

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

Essayez-le en ligne!

Convertit en majuscules puis en points de code ASCII et vérifie les valeurs 65:90 correspondant à A: Z.

Robin Ryder
la source
1
Cela échoue lorsqu'il y a des guillemets dans l'entrée.
C. Braun
1
@ C.Braun Pas dans mes tests ... Par exemple, le premier cas de test sur TIO comprend des guillemets et donne le résultat correct. Pouvez-vous donner un exemple?
Robin Ryder
1
Je ne comprends pas très bien ce que vous avez fait dans la partie en-tête sur TIO, mais exécuter uniquement le code ci-dessus dans un interpréteur R ne fonctionne pas. Vous semblez redéfinir scanpour ne pas diviser les guillemets, comme le fait par défaut?
C. Braun
1
@ C.Braun J'ai compris, merci! Je l'ai explicitement transformé en fonction (au coût de 3 octets) et je pense que c'est OK maintenant.
Robin Ryder
4

Retina 0.8.2 , 45 octets

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

Essayez-le en ligne! Le lien inclut des cas de test. Explication:

T`Llp`ll_

Lettres minuscules et suppression de la ponctuation.

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

Dédupliquer.

.
100$*

Multipliez par 100.

^
13$*

Ajoutez 13.

.{26}

Entier diviser par 26 et convertir en décimal.

Neil
la source
Je pense que la rétine est la seule langue ici à utiliser des pourcentages pour la sortie!
Teleporting Goat
Oh, belle astuce avec l'ajout d'unaire 13 avant de diviser! Pourquoi n'y ai-je pas pensé ...>.> Cela ferait de ma réponse 44 octets . Je laisserai quand même ma version précédente.
Kevin Cruijssen
@TeleportingGoat Probablement parce que Retina est également la seule langue parmi celles publiées jusqu'à présent qui n'a pas de division décimale disponible. Seule la division entière (unaire) est possible.
Kevin Cruijssen
4

APL (Dyalog Extended) , 8 octets

⌹∘≤⍨⎕A∊⌈

Essayez-le en ligne!

vaguement basé sur la réponse d'Adám

 majuscule

⎕A∊booléen (0 ou 1) vecteur de longueur 26 indiquant quelles lettres de l' alphabet anglais A sont dans la chaîne

⌹∘≤⍨ moyenne arithmétique, c'est-à-dire division matricielle de l'argument et vecteur tout-1 de même longueur

ngn
la source
3

charbon , 11 octets

I∕LΦβ№↧θι²⁶

Essayez-le en ligne! Le lien est vers la version verbeuse du code. La sortie est sous forme décimale (ou 1pour les pangrammes). Explication:

  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
la source
3

Lot, 197 octets

@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

Prend l'entrée sur STDIN et sort un pourcentage arrondi. Explication:

@set/ps=

Saisissez la chaîne.

@set s=%s:"=%

Supprimez les citations, car elles sont un casse-tête à gérer dans Batch.

@set n=13

Commencez par une demi-lettre à des fins d'arrondi.

@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

Supprimez tour à tour chaque lettre de la chaîne. Appelez le sous-programme pour vérifier si quelque chose a changé, en raison de la façon dont Batch analyse les variables.

@cmd/cset/an/26

Calculez le résultat en pourcentage.

@exit/b
:c

Début du sous-programme.

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

Si la suppression d'une lettre modifie la chaîne, incrémentez le nombre de lettres.

Neil
la source
3

Pepe , 155 138 bytes

rEeEeeeeeEREeEeEEeEeREERrEEEEErEEEeReeReRrEeeEeeeeerEEEEREEeRERrErEErerREEEEEeREEeeRrEreerererEEEEeeerERrEeeeREEEERREeeeEEeEerRrEEEEeereEE

Essayez-le en ligne! La sortie est sous forme décimale.

Explication:

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
indéfini
la source
Puisque Pepe n'est qu'un langage de commande à 4, c'est vraiment comme 34,5 octets si vous le codez en 2 bits par re RE?
Données expirées le
3

K (oK) , 19 octets

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

Essayez-le en ligne!

J , 30 octets

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

Essayez-le en ligne!

Galen Ivanov
la source
1
32!est trop large - il fait que le reste de l'expression traite certains caractères de ponctuation comme des lettres, par exemple essayez d'ajouter: dans l'exemple d'entrée
ngn
@ngn Je n'ai pas testé avec la ponctuation au début. Merci de me le rappeler.!
Galen Ivanov
3

Rétine , 57 46 35 octets

.
$L
[^a-z]

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

-11 octets s'inspirant de l' astuce de @Neil d'ajouter 13 unaires avant de diviser .
Encore -11 octets grâce à @Neil directement.
Arrondit (correctement) à un entier entier.

Essayez-le en ligne.

57 46 Version 40 octets qui fonctionne avec une sortie décimale:

.
$L
[^a-z]

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

Même -11 octets ainsi que -6 octets supplémentaires grâce à @Neil .

0,153842615.315.41000×lettres_uniques26

Essayez-le en ligne.

Explication:

Convertissez toutes les lettres en minuscules:

.
$L

Supprimer toutes les non-lettres:

[^a-z]

Uniquify toutes les lettres:

D`.

Remplacez chaque lettre unique par 1 000 soulignements:

.
1000*

Comptez le nombre de fois où 26 traits de soulignement adjacents s'y insèrent:

C`_{26}

Insérez un point au bon endroit:

-1`\B
.
Kevin Cruijssen
la source
1
Le .*pourrait être juste .pour une sauvegarde de 1 octet, mais vous pouvez enregistrer 10 autres octets en utilisant Deduplicate au lieu de le faire manuellement!
Neil
@Neil Ah, je ne connaissais pas le D-builtin, merci! Et je ne sais pas pourquoi j'ai utilisé à la .*place de ... Merci pour -11 octets dans les deux versions! :)
Kevin Cruijssen
1
Pour info j'ai eu une approche légèrement différente pour le même nombre d'octets: Essayez-le en ligne!
Neil
1
Pour la version décimale, j'ai trouvé qui -1`\Bcorrespond directement à la position d'insertion souhaitée.
Neil
@Neil Merci encore.
Kevin Cruijssen
3

Java 8, 62 59 octets

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

-3 octets grâce à @ OlivierGrégoire .

Essayez-le en ligne.

Explication:

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
la source
1
59 octets
Olivier Grégoire
@ OlivierGrégoire Merci! J'oublie toujours c&95en combinaison avec c%91>64pour une raison quelconque. Je pense que vous m'avez déjà proposé ce golf à quelques reprises.
Kevin Cruijssen
Oui, je les ai déjà suggérées, mais ça va, pas de soucis ;-)
Olivier Grégoire
Beaucoup plus long, mais plus amusant: s->{int r=0,b=0;for(var c:s)if((c&95)%91>64&&b<(b|=1<<c))r++;return r/26.;}(75 octets)
Olivier Grégoire
3

Julia 1.0 , 34 octets

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

Utilise le vectorisé version de l'opérateur ∈, vérifiant le confinement dans la chaîne pour tous les caractères compris entre a et z. Additionne ensuite le BitArray résultant et divise par le nombre total de lettres possibles.

Essayez-le en ligne!

TimD
la source
Bienvenue et bonne première réponse!
mbomb007
2

C, 96 octets

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

Essayez-le en ligne!

Steadybox
la source
2

Stax , 9 octets

░║üy$}╙+C

Exécuter et déboguer

récursif
la source
1
Vous pouvez retirer un octet de la version décompressée en la déposant uet en l'utilisant |b, mais les économies disparaissent sous l'emballage. Je pourrais avoir un 8 octets, mais l'interprète en ligne est bizarre et bogué.
Khuldraeseth na'Barya
@ Khuldraesethna'Barya: Belle trouvaille. Je pense que le bug est probablement une mutation de tableau. Je vois maintenant certains de ces comportements. Travailler sur une repro minimale ...
récursif
Voici une repro du problème que je suppose que vous rencontrez |b. Il mute incorrectement son opérande plutôt que de faire une copie. J'ai créé un problème github pour le bogue. github.com/tomtheisen/stax/issues/29 Comme solution de contournement, |bfonctionnera correctement la première fois. Après cela, vous devrez peut-être recharger la page. Si vous avez trouvé un bug différent, si vous pouvez fournir une reproduction, je serai probablement en mesure de le corriger.
récursive le
Stax 1.1.4, 8 octets. Instructions: déballer, insérer vau début, insérer |baprès Va, courir, retirer le premier v, retirer |b, remballer. Oui, c'est le bug que j'ai trouvé.
Khuldraeseth na'Barya
@ Khuldraesethna'Barya: J'ai publié la version 1.1.5, et je crois que ce bogue est maintenant corrigé. Vous pouvez me faire savoir si vous avez toujours des problèmes. Merci.
récursif
2

Gelée , 8 octets

ŒuØAe€Æm

Essayez-le en ligne!

Explication

Œ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
la source
2

Python 3 , 51 49 octets

51 -> 49 octets, grâce à alexz02

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

Essayez-le en ligne!

ruohola
la source
49 octetslambda s:len({*filter(str.isalpha,s.lower())})/26
alexz02
@ alexz02 Merci! :)
ruohola
1

Japt , 9 octets

;CoU Ê/26

L'essayer

;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
Hirsute
la source
1

Rubis -n , 38 34 octets

-4 octets de @historcrat!

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

Essayez-le en ligne!

Valeur d'encre
la source
@histocrat vous avez raison
Value Ink
1

C, 95 octets

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

(remarque: arrondi vers le bas)

Version alternative à retour décimal (95 octets):

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

Cela emprunte à la réponse de @Steadybox.

Anonyme
la source
1
Bienvenue! Bonne première réponse. Il pourrait être utile pour les personnes lisant votre réponse si vous fournissez une courte explication de votre code ou une version non golfée. Il peut également être utile de fournir un lien vers un interpréteur en ligne avec votre code exécutable (voir d'autres réponses pour des exemples). Beaucoup utilisent TIO, et voici l' interpréteur gcc
mbomb007