Pangram checker

From Rosetta Code
Revision as of 06:31, 26 April 2010 by rosettacode>Paddy3118 (→‎{{header|F#}}: What about punctuation/spaces in the given sentence? (This should be ignored).)
Task
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>

  1. include <stdlib.h>
  2. 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

C++

<lang cpp>#include <algorithm>

  1. include <cctype>
  2. include <string>

using namespace std;

const string kAlphabet("abcdefghijklmnopqrstuvwxyz");

bool is_pangram(string s) {

 // Convert to lower case.
 transform(s.begin(), s.end(), s.begin(), (int(*)(int))tolower);
 // Convert to a sorted sequence of unique characters.
 sort(s.begin(), s.end());
 s.erase(
     unique(s.begin(), s.end()),
     s.end());
 // Remove non-alphabetic characters.
 s.erase(
     set_intersection(
         s.begin(), s.end(),
         kAlphabet.begin(), kAlphabet.end(),
         s.begin()),
     s.end());
 // For a pangram, we're left with a..z.
 return s == kAlphabet;

}</lang>

D

There are several ways to write this function, this is a low-level one. <lang D>/*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

}</lang>

Clojure

<lang lisp>(defn pangram? [s]

 (let [letters (into #{} "abcdefghijklmnopqrstuvwxyz")]
   (= (->> s .toLowerCase (filter letters) (into #{})) letters)))</lang>

E

<lang e>def isPangram(sentence :String) {

   return ("abcdefghijklmnopqrstuvwxyz".asSet() &! sentence.toLowerCase().asSet()).size() == 0

}</lang>

&! is the “but-not” or set difference operator.

F#

This example is incorrect. Please fix the code and remove this message.

Details: What about punctuation/spaces?

If the difference between the set of letters in the alphabet and the set of letters in the given string (after conversion to lower case) is the empty set then every letter appears somewhere in the given string: <lang fsharp>let isPangram (str: string) = (set['a'..'z'] - set(str.ToLower())).IsEmpty</lang>

Factor

Translation of: E

<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

Works with: Fortran version 90 and later

<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>

Icon and Unicon

Icon

A panagram procedure: <lang Icon>procedure panagram(s) #: return s if s is a panagram and fail otherwise if (map(s) ** &lcase) === &lcase then return s end</lang>

And a main to drive it: <lang Icon>procedure main(arglist)

if *arglist > 0 then

  every ( s := "" ) ||:= !arglist || " " 

else

  s := "The quick brown fox jumps over the lazy dog."

writes(image(s), " -- is") writes(if not panagram(s) then "n't") write(" a panagram.") end</lang>

Unicon

This Icon solution works in Unicon.

Ioke

<lang ioke>Text isPangram? = method(

 letters = "abcdefghijklmnopqrstuvwxyz" chars
 text = self lower chars
 letters map(x, text include?(x)) reduce(&&)

)</lang>

Here is an example of it's use in the Ioke REPL:

<lang ioke> iik> "The quick brown fox jumps over the lazy dog" isPangram? "The quick brown fox jumps over the lazy dog" isPangram? +> true

iik> "The quick brown fox jumps over the" isPangram? "The quick brown fox jumps over the" isPangram? +> false</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

Works with: Java version 1.5+

<lang java5>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

Translation of: Java

<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>

<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>

PicoLisp

<lang PicoLisp>(de isPangram (Str)

  (not
     (diff
        '`(chop "abcdefghijklmnopqrstuvwxyz")
        (chop (lowc Str)) ) ) )</lang>

PHP

<lang php>function pangram($str){ $alphabet = Array("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"); foreach($alphabet as $val){ if(stripos($str,$val) === false){ return false; } } return true; }

echo pangram("The quick brown fox jumps over the lazy dog"); // 1 echo pangram("Am I a pangram?"); // 0</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>

  1. import std

is_pangram = ^jZ^(!@l,*+ @rlp -:~&) ~=`A-~ letters </lang> example usage: <lang Ursala>

  1. 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>