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.
"@#$%^&*?!"
,""
77%
i76.9
zostanie zaakceptowane, to77
również zostanie zaakceptowane?Odpowiedzi:
Python 3 , 42 bajty
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
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
{*...}
naset(...)
i jeden do uczynienia 26 pływakiem:,26.
aby uniknąć podziału podłogi.Python 3 , 46 bajtów
Wypróbuj online!
Ta sama długość, zasadniczo taka sama jak poprzednia, ale bez „wbudowanej” metody łańcuchowej.
źródło
1.0
a nie1
? (Nie chciałem tego specjalnie zabraniać, żeby nie szkodziło to konkretnym językom, ale jestem ciekawy)//
, 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.MATL , 8 bajtów
Wypróbuj w MATL Online
Wyjaśnienie
źródło
Octave / MATLAB, 33 bajty
Wypróbuj online!
Wyjaśnienie
źródło
05AB1E ,
876 bajtów-1 bajt dzięki @LuisMendo .
Wypróbuj online lub sprawdź kilka innych przypadków testowych .
6 bajtów alternatywnych dostarczonych przez @Grimy :
Wypróbuj online lub sprawdź kilka innych przypadków testowych .
Oba programy wyświetlają dane w postaci dziesiętnej.
Wyjaśnienie:
źródło
láêg₂/
jest również 6-bajtowy.C # (interaktywny kompilator Visual C #) ,
5649 bajtówWypróbuj online!
-6 bajtów dzięki innat3
źródło
&&
się&
.APL (Dyalog Extended) , 10 bajtów SBCS
Anonimowa ukryta funkcja prefiksu. Zwraca ułamek dziesiętny.
Wypróbuj online!
⌈
duże litery⎕A∩
skrzyżowanie z dużych liter A lphabet≢
długość całkowita∘
następnie26÷⍨
podzielić przez dwadzieścia sześćźródło
⌹∘≤⍨⎕A∊⌈
Perl 6 ,
2724 bajtów-3 bajty dzięki nwellnhof
Wypróbuj online!
źródło
.lc
działałoby również), z punktu widzenia „poprawności”.fc
może być lepsze (szczególnie jeśli wyzwanie zawiera litery nieangielskie)Narzędzia Bash i Gnu (
8178686042 bajtów)-8 bajtów dzięki @wastl
-18 bajtów dzięki Nahuelowi, który wykorzystał kilka sztuczek, których nie znałem:
sort -f
igrep -i
zignoruj wielkość litersort -u
jest zamiennikiem dla| uniq
źródło
echo $(tr A-Z a-z|tr -cd a-z|fold -1|sort -u|wc -l)/26|bc -l
K (oK) ,
1915 bajtówRozwiązanie:
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.
Uwagi:
1-%[;26]
=>1-1%26%
#(!26)^
=>+/26>?
źródło
97
tu się dzieje%[;26]
->1%26%
1%26%#?(26>)#97!_
1%26%+/26>?97!_
dla 15PowerShell ,
5552 bajtówWypró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łelitery, rozwija się do tablicy, sortuje elementy i wybiera unikalne litery (gu wymaga posortowanych danych wejściowych), zachowuje tylko znaki o wartości ascii od97 do 122 (od a do z) od65 do 90 (od A do Z), policz sumę i podziel przez 26 dla wyniku dziesiętnegoźródło
R , 47 bajtów
Wypróbuj online!
Konwertuje na wielkie litery, a następnie na punkty kodowe ASCII i sprawdza wartości 65:90 odpowiadające A: Z.
źródło
scan
aby nie dzielić znaków cudzysłowu, tak jak domyślna?Retina 0.8.2 , 45 bajtów
Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:
Małe litery i usuń znaki interpunkcyjne.
Deduplikacja.
Pomnóż przez 100.
Dodaj 13.
Liczba całkowita dzieli przez 26 i przelicza na dziesiętne.
źródło
APL (Dyalog Extended) , 8 bajtów
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źródło
Węgiel drzewny , 11 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Dane wyjściowe są w postaci dziesiętnej (lub w
1
przypadku pangrams). Wyjaśnienie:źródło
Partia, 197 bajtów
Pobiera dane wejściowe na STDIN i generuje zaokrąglony procent. Wyjaśnienie:
Wpisz ciąg.
Rozwiń cytaty, ponieważ są to bóle głowy w Batch.
Zacznij od połowy litery do celów zaokrąglania.
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.
Oblicz wynik jako procent.
Rozpoczęcie podprogramu.
Jeśli usunięcie litery zmieniło ciąg, zwiększ liczbę liter.
źródło
Pepe ,
155138 bajtówWypróbuj online! Dane wyjściowe są w postaci dziesiętnej.
Wyjaśnienie:
źródło
K (oK) , 19 bajtów
Wypróbuj online!
J , 30 bajtów
Wypróbuj online!
źródło
32!
jest zbyt szerokie - to sprawia, że resztę treat ekspresji niektórych znaków interpunkcyjnych jak litery, na przykład spróbuj dodać:
w przykładzie wejściaRetina ,
574635 bajtów-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.
574640 bajtowa wersja, która działa z wyjściem dziesiętnym:Same -11 bajtów, a także dodatkowe -6 bajtów dzięki @Neil .
15.3
15.4
Wypróbuj online.
Wyjaśnienie:
Konwertuj wszystkie litery na małe:
Usuń wszystkie nie-litery:
Ujednolic wszystkie litery:
Zastąp każdą unikalną literę 1000 podkreślnikami:
Policz, ile razy pasuje do niego 26 sąsiadujących podkreślników:
Wstaw kropkę we właściwym miejscu:
źródło
.*
Może być tylko.
na oszczędność 1 bajt, ale można zaoszczędzić kolejne 10 bajtów za pomocąD
eduplicate zamiast robić to ręcznie!D
-budcie, dzięki! I nie jestem pewien, dlaczego użyłem.*
zamiast.
… Dzięki za -11 bajtów w obu wersjach! :)-1`\B
pasuje ona bezpośrednio do żądanej pozycji wstawiania.Java 8,
6259 bajtów-3 bajty dzięki @ OlivierGrégoire .
Wypróbuj online.
Wyjaśnienie:
źródło
c&95
połączeniuc%91>64
. Myślę, że już kilka razy zasugerowałeś mi golfa.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)Julia 1.0 , 34 bajty
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!
źródło
C, 96 bajtów
Wypróbuj online!
źródło
Perl 5
-MList::Util=uniq -p
, 24 bajtówWypróbuj online!
źródło
Stax , 9 bajtów
Uruchom i debuguj
źródło
u
i 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.|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|b
bę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ć.v
na początku, włóż|b
poVa
, uruchom, usuń pierwszyv
, usuń|b
, przepakuj. Tak, to jest błąd, który znalazłem.Galaretka , 8 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
JavaScript (Node.js) , 45 bajtów
Wypróbuj online!
JavaScript (Node.js) , 47 bajtów
Wypróbuj online!
źródło
Python 3 ,
5149 bajtów51 -> 49 bajtów, dzięki alexz02
Wypróbuj online!
źródło
lambda s:len({*filter(str.isalpha,s.lower())})/26
Japt , 9 bajtów
Spróbuj
źródło
Python 2 , 57 bajtów
Wypróbuj online!
Trochę dłużej niż odpowiedź Python 3 z ArBo, ale opublikowana jako inne podejście w Pythonie 2.
źródło
Rubinowy
-n
,3834 bajtów-4 bajty od @historcrat!
Wypróbuj online!
źródło
C, 95 bajtów
(uwaga: zaokrągla w dół)
Alternatywna wersja ze znakiem dziesiętnym (95 bajtów):
Pożycza to część odpowiedzi @Steadybox.
źródło