Some of Sunday's edits have been lost. The edits from Saturday that were reverted have been restored. Site is now hosted on prgmr.com. Thank you for your patience. This notice will be removed one week from posting. --Michael Mol 18:12, 7 March 2010 (UTC)
Pangram checker
From Rosetta Code
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.
Contents |
[edit] 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;
}
Usage:
>pangram "The quick brown fox jumps over lazy dogs." Is Pangram? Yes
[edit] D
There are several ways to write this function, this is a low-level one.
/*pure*/ nothrow bool isPangram(string txt) {
pure nothrow static uint fullBitSet() { // compile-time function
uint result;
foreach (c; "abcdefghijklmnopqrstuvwxyz")
result |= (1u << (c - 'a'));
return result;
}
enum uint FULL_BIT_SET = fullBitSet(); // 67_108_863;
uint charset;
foreach (c; txt) {
if (c >= 'a' && c <= 'z')
charset |= (1u << (c - 'a'));
else if (c >= 'A' && c <= 'Z')
charset |= (1u << (c - 'A'));
}
return charset == FULL_BIT_SET;
}
void main() {
assert(isPangram("the quick brown fox jumps over the lazy dog")); // true
assert(!isPangram("the quick brown fox jumped over the lazy dog")); // false, no s
assert(isPangram("ABCDEFGHIJKLMNOPQRSTUVWXYZ")); // true
assert(!isPangram("ABCDEFGHIJKLMNOPQSTUVWXYZ")); // false, no r
assert(!isPangram("ABCDEFGHIJKL.NOPQRSTUVWXYZ")); // false, no m
assert(isPangram("ABC.D.E.FGHI*J/KL-M+NO*PQ R\nSTUVWXYZ")); // true
assert(!isPangram("")); // false
}
[edit] E
def isPangram(sentence :String) {
return ("abcdefghijklmnopqrstuvwxyz".asSet() &! sentence.toLowerCase().asSet()).size() == 0
}
&! is the “but-not” or set difference operator.
[edit] Factor
Translation of: E
: pangram? ( str -- ? )
[ "abcdefghijklmnopqrstuvwxyz" ] dip >lower diff length 0 = ;
"How razorback-jumping frogs can level six piqued gymnasts!" pangram? .
[edit] 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
[edit] Fortran
Works with: Fortran version 90 and later
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
Example:
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
Output:
This is a sentence.
F
The five boxing wizards jumped quickly.
T
[edit] 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!"
[edit] J
Solution:
require 'strings'
isPangram=: (a. {~ 97+i.26) */@e. tolower
Example use:
isPangram 'The quick brown fox jumps over the lazy dog.'
1
isPangram 'The quick brown fox falls over the lazy dog.'
0
[edit] 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
}
}
Output:
true false true false false true false
[edit] JavaScript
Translation of: Java
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
[edit] 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
[edit] 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")
[edit] 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
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.";
;;
outputs:
false -- this is a sentence true -- The quick brown fox jumps over the lazy dog.
[edit] 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."}}
[edit] 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.';
[edit] 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;
Output:
Please type a sentence
the quick brown fox jumps over the lazy dog
The sentence is a pangram.
[edit] 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")
[edit] Python
Using set arithmetic:
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: ')) )
Sample output:
Sentence: The quick brown fox jumps over the lazy dog True
[edit] 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
[edit] Scala
def is_pangram(sentence: String) = sentence.toLowerCase.filter(c => c >= 'a' && c <= 'z').toSet.size == 26
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
[edit] 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
[edit] Ursala
#import std
is_pangram = ^jZ^(!@l,*+ @rlp -:~&) ~=`A-~ letters
example usage:
#cast %bL
test =
is_pangram* <
'The quick brown fox jumps over the lazy dog',
'this is not a pangram'>
output:
<true,false>
[edit] VBScript
[edit] Implementation
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
[edit] Invocation
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")"







