Czy to pangram?

42

Napisz funkcję lub program, który pobiera ciąg znaków i wypisuje prawdziwą wartość, jeśli ciąg znaków jest pangramem (ciąg liter zawierający co najmniej jedną z każdej litery alfabetu angielskiego), a w przeciwnym razie wartość falsey.

Przypadki liter należy zignorować; Jeśli ciąg jest abcdefghijklmnopqrstuvwXYZ, funkcja powinna nadal zwracać prawdziwą wartość. Zauważ, że ciąg może zawierać dowolne inne znaki, więc 123abcdefghijklm NOPQRSTUVWXYZ321zwróci prawdziwą wartość. Puste wejście powinno zwrócić wartość falsey.


Przypadki testowe

AbCdEfGhIjKlMnOpQrStUvWxYz

==> True


ACEGIKMOQSUWY
BDFHJLNPRTVXZ

==> True


public static void main(String[] args)

==> False


The quick brown fox jumped over the lazy dogs. BOING BOING BOING

==> True

To jest kod golfowy. Obowiązują standardowe zasady. Najkrótszy kod w bajtach wygrywa.

Arktur
źródło
3
Plus punkty, jeśli Twój kod może sprawdzić, czy dane wejściowe to Pungram.
timmyRS
4
Pytanie o nazwę pytania: Czy szybki brązowy lis przeskoczył nad leniwym psem?

Odpowiedzi:

25

Pyth, 7 bajtów

L!-Grb0

Wyjaśnienie:

L             lambda (implicit b:)
    rb0       Convert b to lowercase
   G          Lowercase alphabet, "abcd...z"
  -           Set difference, all elts of first that aren't in second
 !            Logical NOT (The empty string is falsey)

Wypróbuj pełną program, wersja jednowierszowa tutaj .

lirtosiast
źródło
Myślę, że najkrótsza droga naprawić to dla nowej linii na wejściu jest, aby funkcję: L!-Grb0. !-Grs.z0też by działał, ale jest dłuższy.
FryAmTheEggman,
Och, nie widziałem, żeby pytanie zostało zaktualizowane i zawierało \ n ciąg. Dzięki.
lirtosiast
6 bajtów: pyth.herokuapp.com/…
Maltysen
@Maltysen Chociaż istnieje (słaby) konsensus w sprawie dopuszczania, aby ciągi znaków wejściowych były rozdzielane cudzysłowami , nie jestem tego pewien, ponieważ wymaga to dalszej składni napisów w języku Python.
lirtosiast
Nigdy bym nie pomyślał, że wbudowany alfabet byłby przydatny ...
Cyoce,
16

Perl 6 , 20 bajtów

'a'..'z'⊆*.lc.comb

stosowanie:

my &code = 'a'..'z'⊆*.lc.comb;
#  the parameter is ^ there

say code '123abcdefghijklm NOPQRSTUVWXYZ321' # True
say code '123abcdefghijklm NOPQRSTUVWXY'     # False

Użyłem 3-bajtowej „francuskiej” wersji ( ) U+2286 SUBSET OF OR EQUAL TOoperatora zamiast 4-bajtowej wersji „texas” ( (<=)), która również wymagałaby dodatkowego miejsca przed nią.

Brad Gilbert b2gills
źródło
12

GS2, 11 9 bajtów

☺ 6ΘàB1."

Dzięki @MitchSchwartz za grę w golfa z 2 bajtów!

Kod źródłowy używa kodowania CP437. Wypróbuj online!

Jak to działa

☺              Push 32 (code point of space).
  6            Bitwise OR.
   Θ           Make a block of these two instructions and map it over the input.
               This turns uppercase letters into their lowercase counterparts.
      à        Push the lowercase alphabet.
       B1      Swap and apply set difference.
         ."    Push the logical NOT of the length of the result.
Dennis
źródło
quick block m2( \xe9) zapisuje 2 bajty.
Mitch Schwartz,
@MitchSchwartz Och, więc w ten sposób ich używasz. Dzięki!
Dennis,
11

JavaScript ES6, 51 57

Edytuj 6 bajtów, zapisz thx @ user81655

a=>new Set(a.toUpperCase().match(/[A-Z]/g)).size>25

Testowy fragment kodu

F=a=>new Set(a.toUpperCase().match(/[A-Z]/g)).size>25

function update() {  O.innerHTML=F(I.value) }
I.value='qwertyuiopasdfghjklzxcvbnm';update()
input { width: 70% }
<input id=I oninput='update()'>
<pre id=O></pre>

edc65
źródło
Czy a.replace(/[^A-Z]|[^a-z]/g,'')czy a.replace(/[^A-Z]/gi,'')zadziała?
ev3commander
2
@ ev3commander no. Ai amusi stać się tą samą postacią, inaczej zestaw zachowa je jako odrębne, a rozmiar będzie> 26
edc65
Co się stanie, jeśli użyjesz operatora spreadu [...a.toUpperCase().replace(/[^A-Z]/g,'')].length>25?
Scott,
@ ScottKaye oczywiście nie. Wypróbuj z „AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA”
edc65
1
@ user81655 racja, działa, świetnie. Dzięki. Nie powinienem odpowiadać na komentarze podczas snu
edc65,
9

R 50 , 46 39 bajtów

all(sapply(letters,grepl,readline(),T))

Edycja usuwa potrzebę tolowerdodając ignore.case=TRUE( T)

mnel
źródło
Niezbyt obeznany z R, ale nie powinien ignore.case=TRUE (T)być również uwzględniany w obliczeniach?
Ruslan,
2
@Ruslan It is! Jest to Tkoniec, dzięki dopasowaniu umiejscowienia argumentów nie trzeba tak naprawdę określać nazwy argumentu (i Tjest to domyślny alias dla TRUE). Napisany tutaj kod wykonuje niezbędną akcję bez potrzeby dodawania czegokolwiek.
plannapus,
9

O, 11 bajtów

GQ_s{n-}dS=

Wypróbuj online.

Niestety O nie ma ustawionej różnicy: /

Wyjaśnienie

G            Pushes the alphabet to the stack
 Q           Pushes input to the stack
  _          Converts the string to lowercase
   s         Split string into char array
    {  }d    Iterate through array
     n       Pushes current element to the stack
      -      String subtraction
         S   Pushes a blank string to the stack
          =  Equals
spaghetto
źródło
6

Julia, 38 bajtów

s->endof(∩('a':'z',lowercase(s)))>25

To proste - lowercasedotyczy problemu wielkich / małych liter, 'a':'z'przechowuje wszystkie małe litery, jest przecięciem, usuwa dowolny znak, który nie jest literą, a ponieważ 'a':'z'jest pierwszy, będzie zawierała tylko jedną z każdej litery, która się pojawi s. endofjest najkrótszym sposobem uzyskania długości wynikowej tablicy, a jeśli jest to 26, to jest to pangram (nie może być większy niż 26 i >25zapisuje bajt względem ==26).

Glen O
źródło
6

Python 2, 53 51 bajtów

f=lambda s,c=65:c>90or(chr(c)in s.upper())*f(s,c+1)

Alternatywne rozwiązania:

lambda s:all(chr(c)in s.upper()for c in range(65,91))

lambda s:not set(range(65,91))-set(map(ord,s.upper()))

Dzięki xnor za wskazanie, że zestawy mają <=operator, dla alternatywnego 51:

lambda s:set(range(65,91))<=set(map(ord,s.upper()))
Mitch Schwartz
źródło
1
Jeśli się nie mylę, ostatnie wyrażenie jest takie samo, jak lambda s:set(range(65,91))<=set(map(ord,s.upper()))dla 51.
xnor
Python 3.5 może zapisywać bajty tutaj: p=lambda s:{*range(65,91)}<={*map(ord,s.upper())}. Nawiasem mówiąc, nie mogę znaleźć żadnych zasad określających, czy lambdanależy przypisać (jak w twoim pierwszym przypadku), czy nie (jak w późniejszych). Wsparcie?
Tim Pederick,
@TimPederick Nazywanie lambda nie jest konieczne, chyba że musisz użyć funkcji w innym miejscu, na przykład w pierwszym rozwiązaniu rekurencyjnym.
FryAmTheEggman,
@TimPederick Dzięki za zwrócenie na to uwagi. Zmieniłem nazwę mojej odpowiedzi na Python 2 zamiast tylko na Python. Masz moje błogosławieństwo, aby opublikować to jako nową odpowiedź, jeśli chcesz, co według mnie byłoby w porządku według norm społeczności, chociaż nie jestem pewien.
Mitch Schwartz,
@FryAmTheEggman: Dzięki za wyjaśnienie. To rozróżnienie nie przyszło mi do głowy! Znalazłem też meta post wyjaśniający regułę. Są dwa bajty z kilku rzeczy, które napisałem ...
Tim Pederick,
5

Siatkówka , 22 bajty

Msi`([a-z])(?!.*\1)
26

Wypróbuj online.

Pierwszy wiersz pasuje do dowolnej litery, która nie pojawia się ponownie w ciągu ciągu. To gwarantuje, że nie dopasujemy każdej litery maksymalnie raz, bez względu na to, jak często występuje. Tryb dopasowania domyślnie zamienia ciąg znaków na liczbę znalezionych dopasowań. Tak więc w drugim etapie dopasowujemy 26do wyniku pierwszego wkładu, który da albo 0albo 1, w zależności od tego, czy znaleźliśmy maksymalnie 26 dopasowań, czy nie.

Martin Ender
źródło
4

Minkolang 0,14 , 18 bajtów

$o7$ZsrlZ'26'$ZN.

Wypróbuj tutaj.

Wyjaśnienie

$o                    Read in whole input as characters
  7$Z                 Uppercase every letter
     s                Sort
      r               Reverse
       lZ             Alphabet - uppercase and lowercase
         '26'         Pushes 26 on the stack
             0$Z      Count how often the top 26 numbers of the stack appear in the stack
                N.    Output as number and stop.
El'endia Starman
źródło
4

Python 3.5, 47 bajtów

lambda s:{*map(chr,range(65,91))}<={*s.upper()}

Ta sama zasada, co odpowiedź Mitcha Schwartza , ale przy użyciu ulepszeń PEP 0448 do *rozpakowywania, po raz pierwszy wprowadzona w Pythonie 3.5.

Ta wersja różni się nieznacznie od tego, co napisałem w moim komentarzu do postu Mitcha, tym, że zamieniam liczby na litery, a nie odwrotnie. To dlatego, że tak napisałem moje oryginalne próby rozwiązania, zanim odkryłem, że nie mogę prześcignąć Mitcha bez wyraźnego skopiowania jego podejścia. Zastanów się więc, czy ulepszyć mój jedyny strzęp oryginalności!

Tim Pederick
źródło
4

Ruby, 41 33

->s{(?a..?z).all?{|c|s[/#{c}/i]}}

Stosowanie

p=->s{(?a..?z).all?{|c|s[/#{c}/i]}}
p["AbCdEfGhIjKlMnOpQrStUvWxYz"] 
  #=> true
p["ACEGIKMOQSUWY
BDFHJLNPRTVXZ"]
  #=> true
p["public static void main(String[] args)"]
  #=> false
p["The quick brown fox jumped over the lazy dogs. BOING BOING BOING"]
  #=> true

Dzięki Vasu Adari za uratowanie mi 8 bajtów

Alexis Andersen
źródło
2
Możesz zapisać 8 bajtów, powodując ignorowanie wyrażenia regularnego.
Vasu Adari,
4

R, 53 45 bajtów

all(97:122%in%utf8ToInt(tolower(readline())))

Stara wersja o 53 bajtach:

all(letters%in%strsplit(tolower(readline()),"")[[1]])

Stosowanie:

> all(97:122%in%utf8ToInt(tolower(readline())))
The quick brown fox jumps over the lazy dog
[1] TRUE
> all(97:122%in%utf8ToInt(tolower(readline())))
Write a function or program that takes as its input a string and prints a truthy value if the string is a pangram and a falsey value otherwise.
[1] FALSE
> all(97:122%in%utf8ToInt(tolower(readline())))
123abcdefghijklm NOPQRSTUVWXYZ321
[1] TRUE
> all(97:122%in%utf8ToInt(tolower(readline())))
Portez ce vieux whisky au juge blond qui fume
[1] TRUE
plannapus
źródło
4

MATLAB / Octave , 35 33 bajtów

@(x)~nnz(setdiff(65:90,upper(x)))

Wypróbuj online!


Funkcja anonimowa zwraca logiczną 1, jeśli wejściem xjest pangram, lub logiczną 0, jeśli nie jest.

Zasadniczo wykorzystuje to samo podejście, co rozwiązanie Pyth @ ThomasKwa. Ustawiona różnica między wszystkimi znakami z zakresu wielkich liter ( 65:91) i ciągu wejściowego (konwertowanego na wielkie litery). Wszelkie znaki, które są w alfabecie, ale nie w ciągu wejściowym, są zwracane przez setdiff. Tylko jeśli tablica zwrócona przez ustawioną różnicę jest pusta, łańcuch jest pangramem.

Użycie wielkich liter zamiast małych pozwala zaoszczędzić kilka bajtów w porównaniu z tym, 'a':'z'ponieważ zamiast tego można użyć wartości ASCII do utworzenia zakresu.

Tom Carpenter
źródło
Świetna odpowiedź! Mój był o 10 bajtów dłuższy
Luis Mendo,
4

Haskell , 59 56 53 51 bajtów

p s=and[any(`elem`map toEnum[a,a+32])s|a<-[65..90]]

Wypróbuj online!

Wyjaśnienie:

Podaj ciąg wejściowy s, dla każdego aw zakresie 65 do 90 (kody ASCII Ado Z) sprawdza, czy dowolny znak w sjest równa albo a(górna liter) lub a+32(dolnego znaku przypadek), przekształca się w postać przez toEnum. To generuje listę wartości logicznych. andsprawdza, czy wszystkie są wszystkie True.

Stara wersja:

import Data.Char
p s=and[any((==)a.toUpper)s|a<-['A'..'Z']]

Dla każdej dużej litery alfabetu sprawdź, czy jakaś litera z swielkich liter jest równa. any(==a)sjest taki sam, elem a sale pozwala modyfikować elementy sprzed porównaniem - w tym przypadku zakryj je wielkimi literami.

Laikoni
źródło
3

Japt , 14 bajtów

#ao#{ e@Uv fXd

Wypróbuj online!

Jak to działa

        // Implicit: U = input string
#ao#{   // Generate a range of integers from charCode("a") to charCode("{").
e@      // Check if every item X in this range returns truthily to:
Uv fXd  //  convert U to lowercase, and put all instances of X.toCharCode() in an array.
        // This returns false if U does not contain one of the characters.
        // Implicit: output last expression
ETHprodukcje
źródło
3

CJam, 11 bajtów

'[,65>qeu-!

To jest kompletny program. Wypróbuj online .

Wyjaśnienie:

'[,65>  Build upper case alphabet (see CJam tips thread).
q       Get input.
eu      Convert to all upper case.
-       Set difference between alphabet and upper cased input.
!       Negate.
Reto Koradi
źródło
3

JavaScript, 110 109 99 95 93 bajtów

a=prompt(b=0).toUpperCase();for(i=65;i++<91;)b+=!~a.indexOf(String.fromCharCode(i));alert(!b)

Zaoszczędzono 6 bajtów dzięki Thomasowi Kwa, a 10 częściowo dzięki ev3.

SuperJedi224
źródło
Czy b = 0 zadziała dla b = []?
ev3commander
Nie przy takim podejściu. Ale może uda mi się to zrobić.
SuperJedi224,
Nie znam Javascript, ale potrafisz for(i=65;i++<91;)b+=!~a.indexOf(String.fromCharCode(i));alert(!b)?
lirtosiast
Łał. To nawet krótsze niż to, co właśnie zrobiłem.
SuperJedi224,
3

05AB1E , 4 bajty (prawdopodobnie niekonkurencyjne )

lêAå

Wypróbuj online!

l    # Push lowercase input.
 ê   # Push sorted, uniquified lowercase input.
  A  # Push lowercase alphabet.
   å # Is lowercase alphabet in sorted, uniquified, lowercase input?
     # True if panagram, false if not.
Urna Magicznej Ośmiornicy
źródło
3

2sable , 6 5 bajtów

Wersja 6-bajtowa:

AIl-g_

Wypróbuj online!

Wyjaśnienie:

A        Push alphabet
 Il      Push lowercase input
   -     Remove all chars of input from alphabet
    g    Get length of the remainder
     _   Print negative bool, where length < 1 = 1 (true), length > 0 = 0 (false)

Wersja 5-bajtowa, zainspirowana odpowiedzią 05AB1E firmy carusocomputing :

lÙ{Aå

Wypróbuj online!

Wyjaśnienie:

l        Push lowercase input
 Ù{      Push sorted uniquified input
   A     Push alphabet
    å    Is alphabet in sorted, uniquified input?
driima
źródło
2

TeaScript , 12 bajtów

Sz.e»xL.I(l©

Pierwszy post od TeaScript, odkąd zabiłem TeaScript: s

Wypróbuj online

Nie golfił

Sz.e(#xL.I(l))

Sz   // Lower case alphabet
.e(#   // Loop through alphabet, ensure
       // for every character, below returns true
    xL    // Input lowercased
    .I(l) // Checks if above contains current char
)
Downgoat
źródło
1
; -; Źle się teraz czuję. TBH Najbardziej podoba mi się TeaScript.
Conor O'Brien,
2

JavaScript ES6, 124 114 113 bajtów

Jestem pewien, że można więcej grać w golfa.

v=(Q,s=[...Array(26)].map((x,i)=>String.fromCharCode(i+97)))=>s.length-1?Q.search(RegExp(s.pop(),"i"))+1&&v(Q,s):1

Generuje anonimową funkcję.

v=(Q,s=[...Array(26)].map((x,i)=>String.fromCharCode(i+97)))=>s.length-1?Q.search(RegExp(s.pop(),"i"))+1&&v(Q,s):1

alert(v(prompt("Enter pangram:")));

Conor O'Brien
źródło
@apsillers Myślę, że znalazłem problem. Sprawdź to jeszcze raz (moja przeglądarka nie obsługuje bankomatu ES6)
Conor O'Brien,
Tak, teraz wygląda dobrze!
apsillers
2

C, 107 bajtów

#include<string.h>
int p(char*i){int a=64;while(++a<91)if(!strchr(i,a)&!strchr(i,a+32))return 0;return 1;}
RCB
źródło
2

ES6, 68 bajtów

s=>[..."abcdefghijklmnopqrstuvwxyz"].every(x=>RegExp(x,"i").test(s))

Ta struna wygląda okropnie marnotrawczo, ale nie znam lepszego sposobu.

Neil
źródło
Może używasz szeregu znaków?
Cyoce,
@Cyoce To mnie skłoniło do myślenia i spróbowałem zakresu podstawowych 36 cyfr, ale do tej pory nadal zajmuje 70 bajtów:s=>[...Array(x=9,26)].every(z=>RegExp((++x).toString(36),"i").test(s))
Neil
2

Scala, 59 48 46 bajtów

print(('a'to'z'diff(readLine.map(_|32)))==Nil)
Ruslan
źródło
Używanie 32 | zamiast _ | 32 (ostrzeżenie, ale) zgoli jeszcze jeden bajt
Jacob
2

Bash, 45 42 bajtów

Program 41 bajtów plus 1, ponieważ należy go wywołać za pomocą bash -e:

for i in {a..z}
{ [ ${1//[^$i${i^}]} ]
}

O dziwo, udało mi się odpowiedzieć na Bash bez znaków cudzysłowu! (tak, sprawdziłem z -fdanymi wejściowymi zaczynającymi się od i podobnymi).

Zakłada to lokalizację, w której małe litery angielskie są ciągłe od ado z. Dane wejściowe są przekazywane przez pierwszy argument programu.

Działa to w ten sposób, że dla każdej litery alfabetu $isprawdzamy, czy ciąg zawiera $ilub jego odpowiednik wielkich liter ${i^}, usuwając wszystkie pozostałe znaki. Jeśli wynikiem tego jest pusty ciąg, wówczas dane wejściowe nie zawierały tej litery, a my kończymy na 1(false). Jeśli otrzymamy niepusty wynik, zdamy test i przejdziemy do następnej litery. Jeśli ciąg wejściowy zawiera każdą literę angielską, dojdziemy do końca programu, kończąc tym samym na 0(prawda).

Toby Speight
źródło
2

Perl 5, 33 bajtów

$i=<>;map$=*=$i=~/$_/i,a..z;say$=
msh210
źródło
Dla perla <5.10 -pl61e '$i=$_;map$\*=$i=~/$_/i,a..z}{'.
Denis Ibaev
2

PlatyPar , 14 bajtów

'a'z_,X,F(x;l!

Objaśnienie (funkcja wizualizatora stosu już wkrótce!):

               ## Implicit: push the input (as a string) to the stack
'a'z_          ## Push the range of a-z (the alphabet) to the stack
     ,X        ## Invert stack, expand input string into individual characters
       ,       ## Invert again
        F  ;   ## Fold (While stack.length > 1)
         (      ## Rotate left, moving the first letter of the input string to the top
          x     ## remove any occurences of that letter from the alphabet array
            l! ## Negate the length of the array, so if there's nothing left
               ## output true, else output false

Gdybym miał niedorzeczną funkcję „pchnij wszystkie litery alfabetu”, byłoby to 10 ...

Wypróbuj online !

Cyoce
źródło
2

Pyke, 6 bajtów

l1GR-!

Wypróbuj tutaj!

l1     -   input().lower()
  G -  -  set_difference(alphabet,^)
     ! - not ^
niebieski
źródło