Índice de finalización del alfabeto

32

Introducción

¿Qué parte del alfabeto inglés usa una cadena dada? La oración anterior usa 77%. Tiene 20 letras únicas (howmucftenglisapbdvr) y 20/26 ≃ 0.77.

Reto

Para una cadena de entrada, devuelva el porcentaje de letras del alfabeto inglés presente en la cadena.

  • La respuesta puede ser en porcentaje o en forma decimal.

  • La cadena de entrada puede tener mayúsculas y minúsculas, así como signos de puntuación. Sin embargo, puede suponer que no tienen signos diacríticos o caracteres acentuados.

Casos de prueba

Entrada

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

Algunas salidas válidas

77%, 76.9, 0.7692

Entrada:

The quick brown fox jumps over the lazy dog

Todas las salidas válidas:

100%, 100, 1

La salida esperada para "@#$%^&*?!"y ""es 0.

Cabra Teletransportadora
fuente
3
Casos de prueba sugeridas: "@#$%^&*?!",""
Adám
44
Si 77%y 76.9se acepta, ¿se 77acepta también?
Grzegorz Oledzki
Los porcentajes también pueden tener partes decimales ...
Jo King
2
@Shaggy La última edición para OP fue hace 16 horas, tu respuesta fue a las 15 y tu comentario a las 14. Quiero decir, tienes razón, pero ???
Veskah
66
Si 20/26 se puede redondear a 0.7692, 0.769 o 0.77, ¿también puedo redondearlo a 0.8, 1 o 0? ;-)
Noiralef

Respuestas:

18

Python 3 , 42 bytes

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

Pruébalo en línea!

Filtramos todos los caracteres no alfabéticos fuera de la cadena tomando la diferencia (establecida) de las representaciones en mayúsculas y minúsculas. Luego, tomamos la longitud y la dividimos por 26.

Python 3 , 46 bytes

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

Pruébalo en línea!

Cuente los caracteres alfabéticos únicos (minúsculas) y divídalos entre 26. En Python 2, necesitaría 3 caracteres más; dos para cambiar {*...}a set(...), y uno para hacer un flotador 26., para evitar la división del piso.

Python 3 , 46 bytes

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

Pruébalo en línea!

Misma longitud, esencialmente la misma que la anterior, pero sin el método de cadena "incorporado".

ArBo
fuente
¿Por qué regresa el segundo 1.0y no 1? (No quería deshabilitarlo específicamente para que no perjudicara idiomas específicos, pero tengo curiosidad)
Teletransportando la cabra el
10
@TeleportingGoat Division con una barra inclinada siempre da flotantes en Python 3, incluso si los operandos son enteros. Para la división de enteros, usaría //, pero siempre sería una división de enteros, que obviamente no es lo que queremos aquí. Tiene sentido que no hicieran que el tipo de datos de la salida dependiera de los valores específicos de los operandos, lo que significa que siempre flota, incluso si se trata de un número entero.
ArBo
11

MATL , 8 bytes

2Y2jkmYm

Pruébalo en MATL Online

Explicación

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
fuente
8

Octava / MATLAB, 33 bytes

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

Pruébalo en línea!

Explicación

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

05AB1E , 8 7 6 bytes

lASåÅA

-1 byte gracias a @LuisMendo .

Pruébelo en línea o verifique algunos casos de prueba más .

Alternativa de 6 bytes proporcionada por @Grimy :

láÙg₂/

Pruébelo en línea o verifique algunos casos de prueba más .

Ambos programas salen como decimales.

Explicación:

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
fuente
@LuisMendo alternativamente, láêg₂/también es un 6-byter.
Grimmy
1
@LuisMendo ¡Gracias (y tú también Grimy )! :)
Kevin Cruijssen
7

C # (compilador interactivo de Visual C #) , 56 49 bytes

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

Pruébalo en línea!

-6 bytes gracias a innat3

Datos caducados
fuente
1
puede guardar 6 bytes al comparar los valores decimales de los caracteres de 50 bytes ( códigos de caracteres )
Innat3
@ Innat3 49 bytes cambiando el &&a &.
Kevin Cruijssen
@KevinCruijssen ~ 2 minutos para obtener el crédito de -1 byte, ya lo hizo y estaba editando
Datos
@ExpiredData Np, era un golf obvio. Principalmente lo dirigía a Innat :)
Kevin Cruijssen
6

APL (Dyalog Extended) , SBCS de 10 bytes

Función de prefijo tácito anónimo. Devuelve la fracción decimal.

26÷⍨∘≢⎕A∩⌈

Pruébalo en línea!

 mayúscula

⎕A∩ intersección con el alfabeto mayúscula A

 longitud de cuenta

 luego

26÷⍨ dividir entre veintiséis

Adán
fuente
⌹∘≤⍨⎕A∊⌈­­­­­
ngn
@ngn Eso es muy inteligente, pero completamente diferente. Anímate y publica eso tú mismo. Estaré encantado de insertar la explicación si quieres.
Adám
6

Perl 6 , 27 24 bytes

-3 bytes gracias a nwellnhof

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

Pruébalo en línea!

Jo King
fuente
1
+1 Además, aunque esto funciona bien (y .lcfuncionaría también), desde un punto de vista de "corrección", .fcpodría ser mejor (particularmente si el desafío tenía letras que no estaban en inglés)
user0721090601
6

Utilidades Bash y Gnu ( 81 78 68 60 42 bytes)

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

-8 bytes gracias a @wastl

-18 bytes gracias a Nahuel usando algunos trucos que no sabía:

  • sort -fe grep -iignorar caso
  • sort -u es un reemplazo para | uniq
Grzegorz Oledzki
fuente
1
60 bytes :echo $(tr A-Z a-z|tr -cd a-z|fold -1|sort -u|wc -l)/26|bc -l
Wastĺ
Correcto. La variable es un recordatorio después de otro intento. ¡Gracias!
Grzegorz Oledzki
3
42 bytes
Nahuel Fouilleul
¿No se puede acortar "grep -io [az]" a "grep -o [Az]"?
Gnudiff
@Gnudiff Suponiendo ASCII, eso también coincidiría con todos [\ ^ _ `].
jnfnt
6

K (oK) , 19 15 bytes

Solución:

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

Pruébalo en línea!

Explicación:

Convierta la entrada a minúsculas, módulo 97 ("az" es 97-122 en ASCII, el módulo 97 da 0-25), tome resultados únicos, resuman que sean inferiores a 26 y convierta al porcentaje 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 ...

Notas:

  • -1 bytes gracias a ngn, 1-%[;26]=>1-1%26%
  • -3 bytes inspirados en ngn #(!26)^=>+/26>?
callejero
fuente
1
Estoy esperando la explicación! No tengo idea de lo que 97está haciendo aquí
teletransportando cabra el
Otra alternativa de 19 bytes
StreetSter
1
%[;26]->1%26%
ngn
1
1%26%+/26>?97!_para el 15
callejero
6

PowerShell , 55 52 bytes

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

Pruébalo en línea!

Primer intento, aún intentando ideas aleatorias

EDITAR: @Veskah señaló que ToUpper guarda un byte debido al rango de números, también se eliminó ()un espacio adicional

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

Cambia la cadena a todas las mayúsculas y minúsculas, se expande a una matriz, ordena los elementos y selecciona las letras únicas (gu necesita una entrada ordenada), mantiene solo caracteres de valor ASCII 97 a 122 (de la a a la z) 65 a 90 (de la A a la Z), cuenta el total y divide entre 26 para la salida decimal

Sinusoide
fuente
1
oh, acabo de notar que tienes un espacio extra después de -in.
Veskah
6

R , 47 bytes

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

Pruébalo en línea!

Convierte a mayúsculas y luego a puntos de código ASCII, y comprueba los valores 65:90 correspondientes a A: Z.

Robin Ryder
fuente
1
Esto falla cuando hay comillas en la entrada.
C. Braun
1
@ C.Braun No en mis pruebas ... Por ejemplo, el primer caso de prueba en TIO incluye citas y da el resultado correcto. ¿Podrías dar un ejemplo?
Robin Ryder
1
No entiendo muy bien lo que ha hecho en la parte del encabezado en TIO, pero ejecutar solo el código anterior en un intérprete de R no funciona. Parece que está redefiniendo scanpara no dividirse entre comillas, como lo hace el valor predeterminado?
C. Braun
1
@ C.Braun Lo tengo, gracias! Lo he convertido explícitamente en una función (a un costo de 3 bytes) y creo que ahora está bien.
Robin Ryder
4

Retina 0.8.2 , 45 bytes

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

Pruébalo en línea! El enlace incluye casos de prueba. Explicación:

T`Llp`ll_

Letras minúsculas y eliminar puntuación.

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

Deduplicar

.
100$*

Multiplica por 100.

^
13$*

Añadir 13.

.{26}

Entero dividir por 26 y convertir a decimal.

Neil
fuente
¡Creo que la retina es el único idioma aquí que usa porcentajes para la salida!
Teletransportando cabra
¡Oh, buen truco para agregar 13 unarios antes de dividir! ¿Por qué no pensé en eso?>.> Haría que mi respuesta fuera de 44 bytes . Sin embargo, aún dejaré mi versión anterior.
Kevin Cruijssen
@TeleportingGoat Probablemente porque Retina es también el único idioma de los publicados hasta ahora que no tiene división decimal disponible. Solo es posible la división entera (unaria).
Kevin Cruijssen
4

APL (Dyalog Extended) , 8 bytes

⌹∘≤⍨⎕A∊⌈

Pruébalo en línea!

basado libremente en la respuesta de Adám

 mayúscula

⎕A∊vector booleano (0 o 1) de longitud 26 que indica qué letras del alfabeto inglés A están en la cadena

⌹∘≤⍨ media aritmética, es decir, división matricial del argumento y un vector todo-1 de la misma longitud

ngn
fuente
3

Carbón , 11 bytes

I∕LΦβ№↧θι²⁶

Pruébalo en línea! El enlace es a la versión detallada del código. La salida es como un decimal (o 1para pangramas). Explicación:

  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
fuente
3

Lote, 197 bytes

@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

Toma entrada en STDIN y genera un porcentaje redondeado. Explicación:

@set/ps=

Ingrese la cadena.

@set s=%s:"=%

Elimine las citas, porque son un dolor de cabeza para tratar en Batch.

@set n=13

Comience con media letra para redondear.

@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

Eliminar cada letra a su vez de la cadena. Invoque la subrutina para verificar si algo cambió, debido a la forma en que Batch analiza las variables.

@cmd/cset/an/26

Calcule el resultado como un porcentaje.

@exit/b
:c

Inicio de subrutina.

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

Si eliminar una letra cambió la cadena, incremente el recuento de letras.

Neil
fuente
3

Pepe , 155 138 bytes

rEeEeeeeeEREeEeEEeEeREERrEEEEErEEEeReeReRrEeeEeeeeerEEEEREEeRERrErEErerREEEEEeREEeeRrEreerererEEEEeeerERrEeeeREEEERREeeeEEeEerRrEEEEeereEE

Pruébalo en línea!La salida está en forma decimal.

Explicación:

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
u_ndefined
fuente
Dado que Pepe es solo un lenguaje de 4 comandos, realmente es como 34.5 bytes si lo codifica como 2 bits por re RE?
Datos
3

K (oK) , 19 bytes

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

Pruébalo en línea!

J , 30 bytes

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

Pruébalo en línea!

Galen Ivanov
fuente
1
32!es demasiado amplio - que hace que el resto de la golosina expresión algunos caracteres de puntuación como cartas, por ejemplo, trate de añadir: en la entrada de ejemplo
NGN
@ngn No probé con puntuación al principio. Gracias por recordarme.!
Galen Ivanov
3

Retina , 57 46 35 bytes

.
$L
[^a-z]

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

-11 bytes inspirados en el truco de @Neil de agregar 13 unarios antes de dividir .
Otros -11 bytes gracias a @Neil directamente.
Redondea (correctamente) a un entero entero.

Pruébalo en línea.

57 46 Versión de 40 bytes que funciona con salida decimal:

.
$L
[^a-z]

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

Mismos -11 bytes, así como -6 bytes adicionales gracias a @Neil .

0.15384 42615.315.41000×letras_unicas26

Pruébalo en línea.

Explicación:

Convierta todas las letras a minúsculas:

.
$L

Eliminar todas las no letras:

[^a-z]

Uniquificar todas las letras:

D`.

Reemplace cada letra única con 1000 guiones bajos:

.
1000*

Cuente la cantidad de veces que caben 26 guiones bajos adyacentes:

C`_{26}

Inserte un punto en el lugar correcto:

-1`\B
.
Kevin Cruijssen
fuente
1
¡ .*Podría ser solo .un ahorro de 1 byte, pero puede guardar otros 10 bytes usando Deduplicate en lugar de hacerlo manualmente!
Neil
@Neil Ah, no sabía sobre el D-builtin, ¡gracias! Y no estoy seguro de por qué lo usé en .*lugar de .... ¡Gracias por -11 bytes en ambas versiones! :)
Kevin Cruijssen
1
Para su información, tuve un enfoque ligeramente diferente para el mismo número de bytes: ¡ Pruébelo en línea!
Neil
1
Para la versión decimal, encontré que -1`\Bcoincide directamente con la posición de inserción deseada.
Neil
@Neil Gracias de nuevo.
Kevin Cruijssen
3

Java 8, 62 59 bytes

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

-3 bytes gracias a @ OlivierGrégoire .

Pruébalo en línea.

Explicación:

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
fuente
1
59 bytes
Olivier Grégoire
@ OlivierGrégoire Gracias! Siempre me olvido c&95en combinación con c%91>64por alguna razón. Creo que ya me has sugerido ese golf varias veces.
Kevin Cruijssen
Sí, ya sugerí eso, pero está bien, no te preocupes ;-)
Olivier Grégoire
Mucho más, pero más divertido: 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 bytes

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

Utiliza el vectorizado versión del operador ∈, verificando la contención en la cadena de todos los caracteres en el rango de a a z Luego suma el BitArray resultante y lo divide por el número total de letras posibles.

Pruébalo en línea!

TimD
fuente
Bienvenido y excelente primera respuesta!
mbomb007
2

C, 96 bytes

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

Pruébalo en línea!

Steadybox
fuente
2

Stax , 9 bytes

░║üy$}╙+C

Ejecutar y depurarlo

recursivo
fuente
1
Puede quitar un byte de la versión desempacada al soltarla uy usarla |b, pero los ahorros desaparecen con el embalaje. Puede que tenga un 8-byter, pero el intérprete en línea es raro y tiene errores.
Khuldraeseth na'Barya
@ Khuldraesethna'Barya: Buen hallazgo. Creo que el error es probablemente una mutación de matriz. Estoy viendo algo de ese comportamiento ahora. Trabajando en una reproducción mínima ...
recursiva el
Aquí hay una réplica del problema que supongo que estás teniendo |b. Muta incorrectamente su operando en lugar de hacer una copia. He creado un problema de github para el error. github.com/tomtheisen/stax/issues/29 Como solución alternativa, |bfuncionará correctamente la primera vez. Después de eso, es posible que deba volver a cargar la página. Si encuentra un error diferente, si puede proporcionar una reproducción, probablemente pueda solucionarlo.
recursivo el
Stax 1.1.4, 8 bytes. Instrucciones: desempaquetar, insertar val inicio, insertar |bdespués Va, ejecutar, quitar el primero v, quitar |b, volver a embalar. Sí, ese es el error que encontré.
Khuldraeseth na'Barya
@ Khuldraesethna'Barya: He lanzado 1.1.5, y creo que este error ya está solucionado. Puedes avisarme si aún tienes problemas. Gracias.
recursivo
2

Jalea , 8 bytes

ŒuØAe€Æm

Pruébalo en línea!

Explicación

Œ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
fuente
2

Python 3 , 51 49 bytes

51 -> 49 bytes, gracias a alexz02

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

Pruébalo en línea!

ruohola
fuente
49 byteslambda s:len({*filter(str.isalpha,s.lower())})/26
alexz02
@ alexz02 ¡Gracias! :)
ruohola
1

Japt , 9 bytes

;CoU Ê/26

Intentalo

;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
Lanudo
fuente
1

rubí -n , 38 34 bytes

-4 bytes de @historcrat!

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

Pruébalo en línea!

Tinta de valor
fuente
@histocrat tienes razón
Value Ink
1

C, 95 bytes

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

(nota: redondea hacia abajo)

Versión alternativa de retorno decimal (95 bytes):

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

Esto toma prestado algo de la respuesta de @Steadybox.

Anónimo
fuente
1
¡Bienvenido! Buena primera respuesta. Puede ser útil para las personas que leen su respuesta si proporciona una breve explicación de su código o una versión no protegida. También puede ser útil proporcionar un enlace a un intérprete en línea con su código ejecutable (consulte algunas otras respuestas para ver ejemplos). Muchos usan TIO, y aquí está el intérprete de gcc
mbomb007