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

Jump to: navigation, search
Pangram checker is a programming task. Visitors like you are encouraged to solve it according to the task description, using any language they may happen to know.
Add to BlogMarksAdd to del.icio.usAdd to diggAdd to NewsvineAdd to redditAdd to Slashdot

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")"
Personal tools
Google AdSense