Wskaźnik ukończenia alfabetu


32

Wprowadzenie

Ile alfabetu angielskiego używa dany ciąg? Poprzednie zdanie używa 77%. Ma 20 unikalnych liter (howmucftenglisapbdvr) i 20/26 ≃ 0,77.

Wyzwanie

W przypadku ciągu wejściowego zwróć procent liter alfabetu angielskiego obecnych w ciągu.

  • Odpowiedź może być procentowa lub dziesiętna.

  • Łańcuch wejściowy może zawierać wielkie i małe litery, a także znaki interpunkcyjne. Można jednak założyć, że nie mają znaków diakrytycznych ani znaków akcentowanych.

Przypadki testowe

Wkład

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

Niektóre prawidłowe dane wyjściowe

77%, 76.9, 0.7692

Wkład:

The quick brown fox jumps over the lazy dog

Wszystkie ważne dane wyjściowe:

100%, 100, 1

Oczekiwany wynik dla "@#$%^&*?!"i ""wynosi 0.


3
Sugerowane przypadki testowe: "@#$%^&*?!",""
Adam

4
Jeśli 77%i 76.9zostanie zaakceptowane, to 77również zostanie zaakceptowane?
Grzegorz Oledzki

Wartości procentowe mogą również zawierać części dziesiętne ...
Jo King

2
@Shaggy Ostatnia edycja OP była 16 godzin temu, twoja odpowiedź była na 15, a twój komentarz na 14. To znaczy, masz rację, ale ???
Veskah

6
Jeśli 20/26 można zaokrąglić do 0,7692, 0,769 lub 0,77, czy mogę również zaokrąglić do 0,8, 1 lub 0? ;-)
Noiralef

Odpowiedzi:


18

Python 3 , 42 bajty

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

Wypróbuj online!

Filtrujemy wszystkie znaki niealfabetyczne z ciągu, biorąc (ustawioną) różnicę reprezentacji wielkich i małych liter. Następnie bierzemy długość i dzielimy przez 26.

Python 3 , 46 bajtów

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

Wypróbuj online!

Policz unikalne znaki alfabetyczne (małe litery) i podziel przez 26. W Pythonie 2 wymagałoby to 3 dodatkowych znaków; dwa do zmiany {*...}na set(...)i jeden do uczynienia 26 pływakiem:, 26.aby uniknąć podziału podłogi.

Python 3 , 46 bajtów

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

Wypróbuj online!

Ta sama długość, zasadniczo taka sama jak poprzednia, ale bez „wbudowanej” metody łańcuchowej.


Dlaczego drugi powraca, 1.0a nie 1? (Nie chciałem tego specjalnie zabraniać, żeby nie szkodziło to konkretnym językom, ale jestem ciekawy)
Teleportacja Kozła

10
@TeleportingGoat Division z pojedynczym ukośnikiem zawsze daje liczby zmiennoprzecinkowe w Pythonie 3, nawet jeśli operandy są liczbami całkowitymi. W przypadku podziału na liczby całkowite użyłbyś //, ale wtedy zawsze byłby to podział na liczby całkowite, co oczywiście nie jest tym, czego chcemy tutaj. Ma to sens, że nie uzależniali typu danych wyjściowych od konkretnych wartości argumentów, co oznacza, że ​​zawsze jest zmiennoprzecinkowe, nawet jeśli jest to liczba całkowita.
ArBo

11

MATL , 8 bajtów

2Y2jkmYm

Wypróbuj w MATL Online

Wyjaśnienie

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 bajty

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

Wypróbuj online!

Wyjaśnienie

@(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 bajtów

lASåÅA

-1 bajt dzięki @LuisMendo .

Wypróbuj online lub sprawdź kilka innych przypadków testowych .

6 bajtów alternatywnych dostarczonych przez @Grimy :

láÙg₂/

Wypróbuj online lub sprawdź kilka innych przypadków testowych .

Oba programy wyświetlają dane w postaci dziesiętnej.

Wyjaśnienie:

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 alternatywnie láêg₂/jest również 6-bajtowy.
Grimmy

1
@LuisMendo Dzięki (i ty także Grimy )! :)
Kevin Cruijssen

7

C # (interaktywny kompilator Visual C #) , 56 49 bajtów

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

Wypróbuj online!

-6 bajtów dzięki innat3


1
można zapisać 6 bajtów, porównując wartości dziesiętne znaków 50 bajtów ( kody znaków )
Innat3

@ Innat3 49 bajtów, zmieniając &&się &.
Kevin Cruijssen

@KevinCruijssen ~ 2 minuty od uzyskania -1 bajtu kredytu, już to zrobiłem i edytowałem
Data

@ExpiredData Np, to był oczywisty golf. Kierował to głównie do Innat :)
Kevin Cruijssen

6

APL (Dyalog Extended) , 10 bajtów SBCS

Anonimowa ukryta funkcja prefiksu. Zwraca ułamek dziesiętny.

26÷⍨∘≢⎕A∩⌈

Wypróbuj online!

 duże litery

⎕A∩ skrzyżowanie z dużych liter A lphabet

 długość całkowita

 następnie

26÷⍨ podzielić przez dwadzieścia sześć


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

@ngn To bardzo sprytne, ale zupełnie inne. Śmiało i opublikuj to sam. Z przyjemnością wstawię wyjaśnienie, jeśli chcesz.
Adám


6

Perl 6 , 27 24 bajtów

-3 bajty dzięki nwellnhof

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

Wypróbuj online!


1
+1 Ponadto, chociaż działa to dobrze (i .lcdziałałoby również), z punktu widzenia „poprawności” .fcmoże być lepsze (szczególnie jeśli wyzwanie zawiera litery nieangielskie)
user0721090601

6

Narzędzia Bash i Gnu ( 81 78 68 60 42 bajtów)

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

-8 bajtów dzięki @wastl

-18 bajtów dzięki Nahuelowi, który wykorzystał kilka sztuczek, których nie znałem:

  • sort -fi grep -izignoruj ​​wielkość liter
  • sort -u jest zamiennikiem dla | uniq

1
60 bajtów :echo $(tr A-Z a-z|tr -cd a-z|fold -1|sort -u|wc -l)/26|bc -l
odpady

Dobrze. Zmienna jest przypomnieniem po kolejnej próbie. Dzięki!
Grzegorz Oledzki


Czy „grep -io [az]” nie może być skrócony do „grep -o [Az]”?
Gnudiff

@Gnudiff Zakładając ASCII, to również pasuje do wszystkich [\ ^ _ `].
jnfnt

6

K (oK) , 19 15 bajtów

Rozwiązanie:

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

Wypróbuj online!

Wyjaśnienie:

Konwertuj dane wejściowe na małe litery, modulo 97 („az” to 97-122 w ASCII, modulo 97 daje 0-25), weź unikalne, sumujące wyniki, które są mniejsze niż 26, i konwertuj na procent 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 ...

Uwagi:

  • -1 bajtów dzięki ngn, 1-%[;26]=>1-1%26%
  • -3 bajty inspirowane przez ngn #(!26)^=>+/26>?

1
Nie mogę się doczekać wyjaśnienia! Nie mam pojęcia, co 97tu się dzieje
Teleportacja Kozła


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



6

PowerShell , 55 52 bajtów

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

Wypróbuj online!

Pierwsza próba, wciąż próbowanie przypadkowych pomysłów

EDYCJA: @Veskah wskazał, że ToUpper zapisuje bajt ze względu na zakres liczb, również usunął dodatkowe ()i spację

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

Zmienia ciąg na wszystkie małe litery, rozwija się do tablicy, sortuje elementy i wybiera unikalne litery (gu wymaga posortowanych danych wejściowych), zachowuje tylko znaki o wartości ascii od 97 do 122 (od a do z) od 65 do 90 (od A do Z), policz sumę i podziel przez 26 dla wyniku dziesiętnego



1
och, właśnie zauważyłem, że masz dodatkowe miejsce po -w.
Veskah

6

R , 47 bajtów

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

Wypróbuj online!

Konwertuje na wielkie litery, a następnie na punkty kodowe ASCII i sprawdza wartości 65:90 odpowiadające A: Z.


1
Nie udaje się to, gdy na wejściu są cudzysłowy.
C. Braun

1
@ C.Braun Nie w moich testach ... Na przykład pierwszy przypadek testowy w TIO zawiera cytaty i daje poprawny wynik. Czy możesz podać przykład?
Robin Ryder

1
Nie do końca rozumiem, co zrobiłeś w części nagłówkowej w TIO, ale uruchomienie tylko powyższego kodu w interpreterie R. nie działa. Wygląda na to, że zmieniasz definicję, scanaby nie dzielić znaków cudzysłowu, tak jak domyślna?
C. Braun

1
@ C.Braun Rozumiem, dziękuję! Jawnie przekształciłem ją w funkcję (kosztem 3 bajtów) i myślę, że teraz jest OK.
Robin Ryder

4

Retina 0.8.2 , 45 bajtów

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

Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:

T`Llp`ll_

Małe litery i usuń znaki interpunkcyjne.

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

Deduplikacja.

.
100$*

Pomnóż przez 100.

^
13$*

Dodaj 13.

.{26}

Liczba całkowita dzieli przez 26 i przelicza na dziesiętne.


Myślę, że siatkówka jest tutaj jedynym językiem, w którym dane wyjściowe są podawane w procentach!
Teleportacja Kozła

Och, niezła sztuczka z dodaniem pojedynczej 13 przed podzieleniem! Dlaczego nie pomyślałem o tym ...>.> To dałoby moją odpowiedź 44 bajty . Nadal jednak opuszczę moją poprzednią wersję.
Kevin Cruijssen

@TeleportingGoat Prawdopodobnie dlatego, że Retina jest również jedynym językiem spośród opublikowanych do tej pory, który nie ma dostępnego podziału dziesiętnego. Możliwy jest tylko (jednoargumentowy) podział na liczby całkowite.
Kevin Cruijssen

4

APL (Dyalog Extended) , 8 bajtów

⌹∘≤⍨⎕A∊⌈

Wypróbuj online!

luźno oparty na odpowiedzi Adáma

 duże litery

⎕A∊wektor boolowski (0 lub 1) o długości 26 wskazujący, które litery alfabetu angielskiego A znajdują się w ciągu

⌹∘≤⍨ średnia arytmetyczna, tj. podział macierzy argumentu i wektor all-1 o tej samej długości


3

Węgiel drzewny , 11 bajtów

I∕LΦβ№↧θι²⁶

Wypróbuj online! Link jest do pełnej wersji kodu. Dane wyjściowe są w postaci dziesiętnej (lub w 1przypadku pangrams). Wyjaśnienie:

  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

Partia, 197 bajtów

@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

Pobiera dane wejściowe na STDIN i generuje zaokrąglony procent. Wyjaśnienie:

@set/ps=

Wpisz ciąg.

@set s=%s:"=%

Rozwiń cytaty, ponieważ są to bóle głowy w Batch.

@set n=13

Zacznij od połowy litery do celów zaokrąglania.

@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

Usuń kolejno każdą literę z ciągu. Wywołaj podprogram, aby sprawdzić, czy coś się zmieniło, ze względu na sposób, w jaki Batch analizuje zmienne.

@cmd/cset/an/26

Oblicz wynik jako procent.

@exit/b
:c

Rozpoczęcie podprogramu.

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

Jeśli usunięcie litery zmieniło ciąg, zwiększ liczbę liter.


3

Pepe , 155 138 bajtów

rEeEeeeeeEREeEeEEeEeREERrEEEEErEEEeReeReRrEeeEeeeeerEEEEREEeRERrErEErerREEEEEeREEeeRrEreerererEEEEeeerERrEeeeREEEERREeeeEEeEerRrEEEEeereEE

Wypróbuj online! Dane wyjściowe są w postaci dziesiętnej.

Wyjaśnienie:

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

Ponieważ Pepe jest tylko 4 językiem poleceń, tak naprawdę ma 34,5 bajtów, jeśli kodujesz go jako 2 bity na RE?
Data wygasła


3

Retina , 57 46 35 bajtów

.
$L
[^a-z]

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

-11 bajtów inspirowanych sztuczką @Neil polegającą na dodaniu jednych 13 przed podzieleniem .
Kolejne -11 bajtów dzięki @Neil bezpośrednio.
Zaokrągla (poprawnie) do całej liczby całkowitej.

Wypróbuj online.

57 46 40 bajtowa wersja, która działa z wyjściem dziesiętnym:

.
$L
[^a-z]

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

Same -11 bajtów, a także dodatkowe -6 bajtów dzięki @Neil .

0.153842615.315.41000×unique_letters26

Wypróbuj online.

Wyjaśnienie:

Konwertuj wszystkie litery na małe:

.
$L

Usuń wszystkie nie-litery:

[^a-z]

Ujednolic wszystkie litery:

D`.

Zastąp każdą unikalną literę 1000 podkreślnikami:

.
1000*

Policz, ile razy pasuje do niego 26 sąsiadujących podkreślników:

C`_{26}

Wstaw kropkę we właściwym miejscu:

-1`\B
.

1
.*Może być tylko .na oszczędność 1 bajt, ale można zaoszczędzić kolejne 10 bajtów za pomocą Deduplicate zamiast robić to ręcznie!
Neil

@Neil Ah, nie wiedziałem o D-budcie, dzięki! I nie jestem pewien, dlaczego użyłem .*zamiast .… Dzięki za -11 bajtów w obu wersjach! :)
Kevin Cruijssen

1
Do waszej informacji miałem nieco inne podejście do tej samej liczby bajtów: Wypróbuj online!
Neil

1
Dla wersji dziesiętnej znalazłem, że -1`\Bpasuje ona bezpośrednio do żądanej pozycji wstawiania.
Neil

@Neil Jeszcze raz dziękuję.
Kevin Cruijssen

3

Java 8, 62 59 bajtów

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

-3 bajty dzięki @ OlivierGrégoire .

Wypróbuj online.

Wyjaśnienie:

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 Thanks! Z jakiegoś powodu zawsze zapominam o c&95połączeniu c%91>64. Myślę, że już kilka razy zasugerowałeś mi golfa.
Kevin Cruijssen

Tak, już je zasugerowałem, ale to OK, nie martw się ;-)
Olivier Grégoire

O wiele dłuższy, ale bardziej zabawny: s->{int r=0,b=0;for(var c:s)if((c&95)%91>64&&b<(b|=1<<c))r++;return r/26.;}(75 bajtów)
Olivier Grégoire

3

Julia 1.0 , 34 bajty

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

Używa wektoryzowanej wersji operatora ∈, sprawdzając zawartość ciągu w przypadku wszystkich znaków z zakresu od a do z. Następnie sumuje wynikowy BitArray i dzieli przez całkowitą liczbę możliwych liter.

Wypróbuj online!


Witamy i świetna pierwsza odpowiedź!
mbomb007



2

Stax , 9 bajtów

░║üy$}╙+C

Uruchom i debuguj


1
Możesz zdjąć bajt z rozpakowanej wersji, upuszczając ją ui używając |b, ale oszczędności znikają podczas pakowania. Mogę mieć 8 bajtów, ale tłumacz online jest dziwny i zawiera błędy.
Khuldraeseth na'Barya

@ Khuldraesethna'Barya: Ładne znalezisko. Myślę, że błąd jest prawdopodobnie mutacją tablicową. Widzę teraz niektóre z tych zachowań. Praca nad minimalnym repro ...
rekurencyjny

Oto reprodukcja problemu, z którym chyba masz problem |b. Niepoprawnie mutuje swój operand, zamiast robić kopię. Utworzyłem błąd github dla tego błędu. github.com/tomtheisen/stax/issues/29 Jako obejście tego problemu |bbędzie działać poprawnie za pierwszym razem. Następnie może być konieczne ponowne załadowanie strony. Jeśli znalazłeś inny błąd, jeśli możesz zapewnić reprodukcję, prawdopodobnie będę w stanie go naprawić.
rekurencyjny

Stax 1.1.4, 8 bajtów. Instrukcje: rozpakuj, włóż vna początku, włóż |bpo Va, uruchom, usuń pierwszy v, usuń |b, przepakuj. Tak, to jest błąd, który znalazłem.
Khuldraeseth na'Barya

@ Khuldraesethna'Barya: Wydałem 1.1.5 i uważam, że ten błąd został już naprawiony. Możesz dać mi znać, jeśli nadal masz problemy. Dzięki.
rekurencyjny




1

Japt , 9 bajtów

;CoU Ê/26

Spróbuj

;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 bajtów

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

(uwaga: zaokrągla w dół)

Alternatywna wersja ze znakiem dziesiętnym (95 bajtów):

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

Pożycza to część odpowiedzi @Steadybox.


1
Witamy! Dobra pierwsza odpowiedź. Może być pomocne dla osób czytających twoją odpowiedź, jeśli podasz krótkie wyjaśnienie swojego kodu lub wersji bez golfisty. Pomocne może być również podanie linku do tłumacza online z kodem, który można uruchomić (przykłady można znaleźć w innych odpowiedziach). Wielu używa TIO, a tutaj jest interpreter gcc
mbomb007
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.