Pangram checker
You are encouraged to solve this task according to the task description, using any language you may know.
Write a function or method to check a sentence to see if it is a pangram or not and show its use.
A pangram is a sentence that contains all the letters of the English alphabet at least once, for example: The quick brown fox jumps over the lazy dog.
C
<lang C>#include <stdio.h>
- include <stdlib.h>
- include <string.h>
int isPangram( char *string ) {
static char *alphabet="abcdefghijklmnopqrstuvwxyz"; char wasused[26], *sp, *ap; int j;
for (j=0; j<26; j++) wasused[j]=0; for (sp=string;*sp; sp++) { ap = strchr(alphabet, tolower(*sp)); if (ap != NULL) { wasused[ap-alphabet] = 1; } } for (j=0; (j<26) && wasused[j]; j++);
// if (j<26) printf("Missing character %c\n", alphabet[j]);
return (j==26);
}
main( int argc, char *argv[]) {
char *pangramTxt; if (argc < 2) { printf("usage %s (text to check for pangram)\n", argv[0]); exit(1); } pangramTxt = argv[1];
printf("%s\n",pangramTxt);
printf("Is pangram? %s\n", (isPangram(pangramTxt)?"Yes":"No")); return 0;
}</lang> Usage:
>pangram "The quick brown fox jumps over lazy dogs." Is Pangram? Yes
E
<lang e>def isPangram(sentence :String) {
return ("abcdefghijklmnopqrstuvwxyz".asSet() &! sentence.toLowerCase().asSet()).size() == 0
}</lang>
&!
is the “but-not” or set difference operator.
Factor
<lang factor>: pangram? ( str -- ? )
[ "abcdefghijklmnopqrstuvwxyz" ] dip >lower diff length 0 = ;
"How razorback-jumping frogs can level six piqued gymnasts!" pangram? .</lang>
Forth
<lang forth>: pangram? ( addr len -- ? )
0 -rot bounds do i c@ 32 or [char] a - dup 0 26 within if 1 swap lshift or else drop then loop 1 26 lshift 1- = ;
s" The five boxing wizards jump quickly." pangram? . \ -1</lang>
Fortran
<lang fortran>module pangram
implicit none private public :: is_pangram character (*), parameter :: lower_case = 'abcdefghijklmnopqrstuvwxyz' character (*), parameter :: upper_case = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
contains
function to_lower_case (input) result (output)
implicit none character (*), intent (in) :: input character (len (input)) :: output integer :: i integer :: j
output = input do i = 1, len (output) j = index (upper_case, output (i : i)) if (j /= 0) then output (i : i) = lower_case (j : j) end if end do
end function to_lower_case
function is_pangram (input) result (output)
implicit none character (*), intent (in) :: input character (len (input)) :: lower_case_input logical :: output integer :: i
lower_case_input = to_lower_case (input) output = .true. do i = 1, len (lower_case) if (index (lower_case_input, lower_case (i : i)) == 0) then output = .false. exit end if end do
end function is_pangram
end module pangram</lang> Example: <lang fortran>program test
use pangram, only: is_pangram
implicit none character (256) :: string
string = 'This is a sentence.' write (*, '(a)') trim (string) write (*, '(l1)') is_pangram (string) string = 'The five boxing wizards jumped quickly.' write (*, '(a)') trim (string) write (*, '(l1)') is_pangram (string)
end program test</lang> Output: <lang>This is a sentence. F The five boxing wizards jumped quickly. T</lang>
Haskell
<lang haskell>import Data.Char (toLower) import Data.List ((\\))
pangram :: String -> Bool pangram = null . (['a' .. 'z'] \\) . map toLower
main = print $ pangram "How razorback-jumping frogs can level six piqued gymnasts!"</lang>
J
Solution: <lang j>require 'strings' isPangram=: (a. {~ 97+i.26) */@e. tolower</lang>
Example use: <lang j> isPangram 'The quick brown fox jumps over the lazy dog.' 1
isPangram 'The quick brown fox falls over the lazy dog.'
0</lang>
Java
<lang java>public class Pangram {
public static boolean isPangram(String test){ boolean pangram = true; String lcTest = test.toLowerCase(); for(char a = 'a'; a <= 'z'; a++){ pangram &= lcTest.contains("" + a); } return pangram; }
public static void main(String[] args){ System.out.println(isPangram("the quick brown fox jumps over the lazy dog"));//true System.out.println(isPangram("the quick brown fox jumped over the lazy dog"));//false, no s System.out.println(isPangram("ABCDEFGHIJKLMNOPQRSTUVWXYZ"));//true System.out.println(isPangram("ABCDEFGHIJKLMNOPQSTUVWXYZ"));//false, no r System.out.println(isPangram("ABCDEFGHIJKL.NOPQRSTUVWXYZ"));//false, no m System.out.println(isPangram("ABC.D.E.FGHI*J/KL-M+NO*PQ R\nSTUVWXYZ"));//true System.out.println(isPangram(""));//false }
}</lang> Output:
true false true false false true false
JavaScript
<lang javascript>function is_pangram(str) {
var s = str.toLowerCase(); // sorted by frequency ascending (http://en.wikipedia.org/wiki/Letter_frequency) var letters = "zqxjkvbpygfwmucldrhsnioate"; for (var i = 0; i < 26; i++) if (s.indexOf(letters.charAt(i)) == -1) return false; return true;
}
print(is_pangram("is this a pangram")); // false print(is_pangram("The quick brown fox jumps over the lazy dog")); // true</lang>
Logo
<lang logo>to remove.all :s :set
if empty? :s [output :set] if word? :s [output remove.all butfirst :s remove first :s :set] output remove.all butfirst :s remove.all first :s :set
end to pangram? :s
output empty? remove.all :s "abcdefghijklmnopqrstuvwxyz
end
show pangram? [The five boxing wizards jump quickly.] ; true</lang>
Lua
<lang lua>require"lpeg" S, C = lpeg.S, lpeg.C function ispangram(s)
return #(C(S(s)^0):match"abcdefghijklmnopqrstuvwxyz") == 26
end
print(ispangram"waltz, bad nymph, for quick jigs vex") print(ispangram"bobby") print(ispangram"long sentence")</lang>
OCaml
<lang ocaml>let pangram str =
let ar = Array.make 26 false in String.iter (function | 'a'..'z' as c -> ar.(Char.code c - Char.code 'a') <- true | _ -> () ) (String.lowercase str); Array.fold_left ( && ) true ar</lang>
<lang ocaml>let check str =
Printf.printf " %b -- %s\n" (pangram str) str
let () =
check "this is a sentence"; check "The quick brown fox jumps over the lazy dog.";
- </lang>
outputs:
false -- this is a sentence true -- The quick brown fox jumps over the lazy dog.
Oz
<lang oz>declare
fun {IsPangram Xs} {List.sub {List.number &a &z 1} {Sort {Map Xs Char.toLower} Value.'<'}} end
in
{Show {IsPangram "The quick brown fox jumps over the lazy dog."}}</lang>
Perl
<lang perl>use List::MoreUtils 'all';
sub pangram {all {$_[0] =~ /$_/i} 'a' .. 'z';}
print "Yes.\n" if pangram 'Cozy lummox gives smart squid who asks for job pen.';</lang>
PL/I
<lang PL/I> test_pangram: procedure options (main);
is_pangram: procedure() returns (bit(1) aligned);
declare text character (200) varying; declare c character (1);
get edit (text) (L); put skip list (text);
text = lowercase(text);
do c = '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'; if index(text, c) = 0 then return ('0'b); end; return ('1'b);
end is_pangram;
put skip list ('Please type a sentence');
if is_pangram() then put skip list ('The sentence is a pangram.'); else put skip list ('The sentence is not a pangram.');
end test_pangram; </lang>
Output:
<lang> Please type a sentence
the quick brown fox jumps over the lazy dog The sentence is a pangram. </lang>
PureBasic
<lang PureBasic>Procedure IsPangram_fast(String$)
String$ = LCase(string$) char_a=Asc("a") ; sets bits in a variable if a letter is found, reads string only once For a = 1 To Len(string$) char$ = Mid(String$, a, 1) pos = Asc(char$) - char_a check.l | 1 << pos Next If check & $3FFFFFF = $3FFFFFF ProcedureReturn 1 EndIf ProcedureReturn 0
EndProcedure
Procedure IsPangram_simple(String$)
String$ = LCase(string$) found = 1 For a = Asc("a") To Asc("z") ; searches for every letter in whole string If FindString(String$, Chr(a), 0) = 0 found = 0 EndIf Next ProcedureReturn found
EndProcedure
Debug IsPangram_fast("The quick brown fox jumps over lazy dogs.") Debug IsPangram_simple("The quick brown fox jumps over lazy dogs.") Debug IsPangram_fast("No pangram") Debug IsPangram_simple("No pangram")</lang>
Python
Using set arithmetic: <lang python>import string, sys if sys.version_info[0] < 3:
input = raw_input
def ispangram(sentence, alphabet=string.ascii_lowercase):
alphaset = set(alphabet) return not alphaset - set(sentence.lower())
print ( ispangram(input('Sentence: ')) )</lang>
Sample output:
Sentence: The quick brown fox jumps over the lazy dog True
Ruby
<lang ruby>def pangram?(sentence)
unused_letters = ('a'..'z').to_a - str.downcase.chars.to_a unused_letters.empty?
end
p pangram?('this is a sentence') # ==> false p pangram?('The quick brown fox jumps over the lazy dog.') # ==> true</lang>
Scala
<lang scala>def is_pangram(sentence: String) = sentence.toLowerCase.filter(c => c >= 'a' && c <= 'z').toSet.size == 26 </lang>
<lang scala> scala> is_pangram("This is a sentence") res0: Boolean = false
scala> is_pangram("The quick brown fox jumps over the lazy dog") res1: Boolean = true </lang>
Tcl
<lang tcl>proc pangram? {sentence} {
set letters [regexp -all -inline {[a-z]} [string tolower $sentence]] expr { [llength [lsort -unique $letters]] == 26 }
}
puts [pangram? "This is a sentence"]; # ==> false puts [pangram? "The quick brown fox jumps over the lazy dog."]; # ==> true</lang>
Ursala
<lang Ursala>
- import std
is_pangram = ^jZ^(!@l,*+ @rlp -:~&) ~=`A-~ letters </lang> example usage: <lang Ursala>
- cast %bL
test =
is_pangram* <
'The quick brown fox jumps over the lazy dog', 'this is not a pangram'>
</lang> output:
<true,false>
VBScript
Implementation
<lang vb>function pangram( s ) dim i dim sKey dim sChar dim nOffset sKey = "abcdefghijklmnopqrstuvwxyz" for i = 1 to len( s ) sChar = lcase(mid(s,i,1)) if sChar <> " " then if instr(sKey, sChar) then nOffset = asc( sChar ) - asc("a") + 1 if nOffset > 1 then sKey = left(sKey, nOffset - 1) & " " & mid( sKey, nOffset + 1) else sKey = " " & mid( sKey, nOffset + 1) end if end if end if next pangram = ( ltrim(sKey) = vbnullstring ) end function
function eef( bCond, exp1, exp2 ) if bCond then eef = exp1 else eef = exp2 end if end function</lang>
Invocation
<lang vb>wscript.echo eef(pangram("a quick brown fox jumps over the lazy dog"), "is a pangram", "is not a pangram") wscript.echo eef(pangram(""), "is a pangram", "is not a pangram")"</lang>