Autogram checker

From Rosetta Code
Revision as of 10:55, 20 June 2022 by Thundergnat (talk | contribs) (→‎{{header|Raku}}: style tweaks)
Autogram checker is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.
Definition

An autogram is a sentence that describes itself in the sense of providing an inventory of its own characters. An essential feature is the use of full cardinal number names such as "one", "two", etc., in recording character counts.

Autograms are also called 'self-enumerating' or 'self-documenting' sentences. Whilst they usually just count letters of the alphabet, they can also count punctuation symbols as well.


Example

If punctuation is ignored, the following sentence is an autogram:

This sentence employs two a's, two c's, two d's, twenty-eight e's, five f's, three g's, eight h's, eleven i's, three l's, two m's, thirteen n's, nine o's, two p's, five r's, twenty-five s's, twenty-three t's, six v's, ten w's, two x's, five y's, and one z.


Task

Write a routine in your language to check whether or not a given sentence is an autogram and use it to test the above example (Sentence 1.) and also the following sentences:

2. This sentence employs two a's, two c's, two d's, twenty eight e's, five f's, three g's, eight h's, eleven i's, three l's, two m's, thirteen n's, nine o's, two p's, five r's, twenty five s's, twenty three t's, six v's, ten w's, two x's, five y's, and one z.

3. Only the fool would take trouble to verify that his sentence was composed of ten a's, three b's, four c's, four d's, forty-six e's, sixteen f's, four g's, thirteen h's, fifteen i's, two k's, nine l's, four m's, twenty-five n's, twenty-four o's, five p's, sixteen r's, forty-one s's, thirty-seven t's, ten u's, eight v's, eight w's, four x's, eleven y's, twenty-seven commas, twenty-three apostrophes, seven hyphens and, last but not least, a single !

4. This pangram contains four as, one b, two cs, one d, thirty es, six fs, five gs, seven hs, eleven is, one j, one k, two ls, two ms, eighteen ns, fifteen os, two ps, one q, five rs, twenty-seven ss, eighteen ts, two us, seven vs, eight ws, two xs, three ys, & one z.

5. This sentence contains one hundred and ninety-seven letters: four a's, one b, three c's, five d's, thirty-four e's, seven f's, one g, six h's, twelve i's, three l's, twenty-six n's, ten o's, ten r's, twenty-nine s's, nineteen t's, six u's, seven v's, four w's, four x's, five y's, and one z.

6. Thirteen e's, five f's, two g's, five h's, eight i's, two l's, three n's, six o's, six r's, twenty s's, twelve t's, three u's, four v's, six w's, four x's, two y's.

7. Fifteen e's, seven f's, four g's, six h's, eight i's, four n's, five o's, six r's, eighteen s's, eight t's, four u's, three v's, two w's, three x's.

8. Sixteen e's, five f's, three g's, six h's, nine i's, five n's, four o's, six r's, eighteen s's, eight t's, three u's, three v's, two w's, four z's.

Punctuation should be ignored in all cases except for sentences number 3. and 7.

Note that the only difference between sentences 1. and 2. is that there are no hyphens in the latter.


Assumptions
  • Ignore capitalization.
  • Never count spaces or full stops.


If it helps you may also make the following simplifying assumptions:

  • No sentence will be such that there are more than 99 instances of any countable character.
  • If punctuation is to be allowed for, only commas, hyphens, apostrophes and exclamation marks need be counted.


Reference


Other tasks related to string operations:
Metrics
Counting
Remove/replace
Anagrams/Derangements/shuffling
Find/Search/Determine
Formatting
Song lyrics/poems/Mad Libs/phrases
Tokenize
Sequences


Raku

Slightly fragile, especially for non-letter character counts, but good enough for here.

Using Text::Wrap from the ecosystem. Install command: zef install -v git://github.com/jkramer/p6-Text-Wrap.git.

<lang perl6>my %nums = :0zero, :1one, :2two, :3three, :4four, :5five, :6six, :7seven, :8eight, :9nine, :10ten, :11eleven,

   :12twelve, :13thirteen, :14fourteen, :15fifteen, :16sixteen, :17seventeen, :18eighteen, :19nineteen,
   :20twenty, :30thirty, :40forty, :50fifty, :60sixty, :70seventy, :80eighty, :90ninety, :100hundred, :1single;

sub whitespace { $^a.subst(:g, /\s|'.'/, ) } sub non-letters { $^a.subst(:g, /\W/, ) }

my @tests =

   (&non-letters, "This sentence employs two a's, two c's, two d's, twenty-eight e's, five f's, three g's, eight h's, eleven i's, three l's, two m's, thirteen n's, nine o's, two p's, five r's, twenty-five s's, twenty-three t's, six v's, ten w's, two x's, five y's, and one z."),
   (&non-letters, "This sentence employs two a's, two c's, two d's, twenty eight e's, five f's, three g's, eight h's, eleven i's, three l's, two m's, thirteen n's, nine o's, two p's, five r's, twenty five s's, twenty three t's, six v's, ten w's, two x's, five y's, and one z."),
   (&whitespace,  "Only the fool would take trouble to verify that his sentence was composed of ten a's, three b's, four c's, four d's, forty-six e's, sixteen f's, four g's, thirteen h's, fifteen i's, two k's, nine l's, four m's, twenty-five n's, twenty-four o's, five p's, sixteen r's, forty-one s's, thirty-seven t's, ten u's, eight v's, eight w's, four x's, eleven y's, twenty-seven commas, twenty-three apostrophes, seven hyphens and, last but not least, a single !"),
   (&non-letters, "This pangram contains four as, one b, two cs, one d, thirty es, six fs, five gs, seven hs, eleven is, one j, one k, two ls, two ms, eighteen ns, fifteen os, two ps, one q, five rs, twenty-seven ss, eighteen ts, two us, seven vs, eight ws, two xs, three ys, & one z."),
   (&non-letters, "This sentence contains one hundred and ninety-seven letters: four a's, one b, three c's, five d's, thirty-four e's, seven f's, one g, six h's, twelve i's, three l's, twenty-six n's, ten o's, ten r's, twenty-nine s's, nineteen t's, six u's, seven v's, four w's, four x's, five y's, and one z."),
   (&non-letters, "Thirteen e's, five f's, two g's, five h's, eight i's, two l's, three n's, six o's, six r's, twenty s's, twelve t's, three u's, four v's, six w's, four x's, two y's."),
   (&whitespace,  "Fifteen e's, seven f's, four g's, six h's, eight i's, four n's, five o's, six r's, eighteen s's, eight t's, four u's, three v's, two w's, three x's."),
   (&non-letters, "Sixteen e's, five f's, three g's, six h's, nine i's, five n's, four o's, six r's, eighteen s's, eight t's, three u's, three v's, two w's, four z's.")

use Text::Wrap;

say '=' x 100;

for @tests -> (&filter, $text) {

   # Original
   say wrap-text :100width, $text;
   say "\nFiltering out " ~ &filter.name ~ ':';
   # Semi-bogus and somewhat fragile names to numbers conversion.
   my $str = $text.lc;
   for %nums.kv -> $word, $number { $str ~~ s:g/ <|w> $word <|w> /$number/ }
   $str ~~ s:g/ (\d)<ws>['and'|'-']<ws>(\d)  /$0 $1/;
   $str ~~ s:g/ <|w>(\d ** 2)<ws>(\d ** 2) <|w> /{ $0 × 100 + $1}/;
   $str ~~ s:g/ ( [\d+<ws>]* \d+ ) /{[+] $0.split: ' '}/;
   # Build a hash of claimed characters.
   my %claim = flat $str.lc.match(:g, /\d+ <:ws> ['comma'|'apostrophe'|'hyphen'|.]/)».split(' ')»[1,0]».pairup;
   for <comma , hyphen - apostrophe '> #`['] -> $word, $symbol { %claim{$symbol} = %claim{$word}:delete if %claim{$word} }
   say "\nClaimed character counts:\n" ~ wrap-text :100width, %claim.sort( ~*.key ).map( { sprintf "%s\(%d)", .key, .value } ).join: ' ';
   # And of the actual character counts.
   my %count = &filter($text).lc.comb.Bag.hash;
   say "\nActual:\n" ~ wrap-text :100width, %count.sort( ~*.key ).map( { sprintf "%s\(%d)", .key, .value } ).join: ' ';
   # And compare them
   say "\nAutogram? " ~
   quietly (so all %count.map: { .value == %claim{.key} }) && (so all %claim.map: { .value == %count{.key} });
   say '=' x 100;

}</lang>

Output:
====================================================================================================
This sentence employs two a's, two c's, two d's, twenty-eight e's, five f's, three g's, eight h's,
eleven i's, three l's, two m's, thirteen n's, nine o's, two p's, five r's, twenty-five s's,
twenty-three t's, six v's, ten w's, two x's, five y's, and one z.

Filtering out non-letters:

Claimed character counts:
a(2) c(2) d(2) e(28) f(5) g(3) h(8) i(11) l(3) m(2) n(13) o(9) p(2) r(5) s(25) t(23) v(6) w(10) x(2)
y(5) z(1)

Actual:
a(2) c(2) d(2) e(28) f(5) g(3) h(8) i(11) l(3) m(2) n(13) o(9) p(2) r(5) s(25) t(23) v(6) w(10) x(2)
y(5) z(1)

Autogram? True
====================================================================================================
This sentence employs two a's, two c's, two d's, twenty eight e's, five f's, three g's, eight h's,
eleven i's, three l's, two m's, thirteen n's, nine o's, two p's, five r's, twenty five s's, twenty
three t's, six v's, ten w's, two x's, five y's, and one z.

Filtering out non-letters:

Claimed character counts:
a(2) c(2) d(2) e(28) f(5) g(3) h(8) i(11) l(3) m(2) n(13) o(9) p(2) r(5) s(25) t(23) v(6) w(10) x(2)
y(5) z(1)

Actual:
a(2) c(2) d(2) e(28) f(5) g(3) h(8) i(11) l(3) m(2) n(13) o(9) p(2) r(5) s(25) t(23) v(6) w(10) x(2)
y(5) z(1)

Autogram? True
====================================================================================================
Only the fool would take trouble to verify that his sentence was composed of ten a's, three b's,
four c's, four d's, forty-six e's, sixteen f's, four g's, thirteen h's, fifteen i's, two k's, nine
l's, four m's, twenty-five n's, twenty-four o's, five p's, sixteen r's, forty-one s's, thirty-seven
t's, ten u's, eight v's, eight w's, four x's, eleven y's, twenty-seven commas, twenty-three
apostrophes, seven hyphens and, last but not least, a single !

Filtering out whitespace:

Claimed character counts:
!(1) '(23) ,(27) -(7) a(10) b(3) c(4) d(4) e(46) f(16) g(4) h(13) i(15) k(2) l(9) m(4) n(25) o(24)
p(5) r(16) s(41) t(37) u(10) v(8) w(8) x(4) y(11)

Actual:
!(1) '(23) ,(27) -(7) a(10) b(3) c(4) d(4) e(46) f(16) g(4) h(13) i(15) k(2) l(9) m(4) n(25) o(24)
p(5) r(16) s(41) t(37) u(10) v(8) w(8) x(4) y(11)

Autogram? True
====================================================================================================
This pangram contains four as, one b, two cs, one d, thirty es, six fs, five gs, seven hs, eleven
is, one j, one k, two ls, two ms, eighteen ns, fifteen os, two ps, one q, five rs, twenty-seven ss,
eighteen ts, two us, seven vs, eight ws, two xs, three ys, & one z.

Filtering out non-letters:

Claimed character counts:
a(4) b(1) c(2) d(1) e(30) f(6) g(5) h(7) i(11) j(1) k(1) l(2) m(2) n(18) o(15) p(2) q(1) r(5) s(27)
t(18) u(2) v(7) w(8) x(2) y(3) z(1)

Actual:
a(4) b(1) c(2) d(1) e(30) f(6) g(5) h(7) i(11) j(1) k(1) l(2) m(2) n(18) o(15) p(2) q(1) r(5) s(27)
t(18) u(2) v(7) w(8) x(2) y(3) z(1)

Autogram? True
====================================================================================================
This sentence contains one hundred and ninety-seven letters: four a's, one b, three c's, five d's,
thirty-four e's, seven f's, one g, six h's, twelve i's, three l's, twenty-six n's, ten o's, ten r's,
twenty-nine s's, nineteen t's, six u's, seven v's, four w's, four x's, five y's, and one z.

Filtering out non-letters:

Claimed character counts:
a(4) b(1) c(3) d(5) e(34) f(7) g(1) h(6) i(12) l(3) n(26) o(10) r(10) s(29) t(19) u(6) v(7) w(4)
x(4) y(5) z(1)

Actual:
a(4) b(1) c(3) d(5) e(34) f(7) g(1) h(6) i(12) l(3) n(26) o(10) r(10) s(29) t(19) u(6) v(7) w(4)
x(4) y(5) z(1)

Autogram? True
====================================================================================================
Thirteen e's, five f's, two g's, five h's, eight i's, two l's, three n's, six o's, six r's, twenty
s's, twelve t's, three u's, four v's, six w's, four x's, two y's.

Filtering out non-letters:

Claimed character counts:
e(13) f(5) g(2) h(5) i(8) l(2) n(3) o(6) r(6) s(20) t(12) u(3) v(4) w(6) x(4) y(2)

Actual:
e(13) f(5) g(2) h(5) i(8) l(2) n(3) o(6) r(6) s(20) t(12) u(3) v(4) w(6) x(4) y(2)

Autogram? True
====================================================================================================
Fifteen e's, seven f's, four g's, six h's, eight i's, four n's, five o's, six r's, eighteen s's,
eight t's, four u's, three v's, two w's, three x's.

Filtering out whitespace:

Claimed character counts:
e(15) f(7) g(4) h(6) i(8) n(4) o(5) r(6) s(18) t(8) u(4) v(3) w(2) x(3)

Actual:
'(14) ,(13) e(15) f(7) g(4) h(6) i(8) n(4) o(5) r(6) s(18) t(8) u(4) v(3) w(2) x(3)

Autogram? False
====================================================================================================
Sixteen e's, five f's, three g's, six h's, nine i's, five n's, four o's, six r's, eighteen s's,
eight t's, three u's, three v's, two w's, four z's.

Filtering out non-letters:

Claimed character counts:
e(16) f(5) g(3) h(6) i(9) n(5) o(4) r(6) s(18) t(8) u(3) v(3) w(2) z(4)

Actual:
e(16) f(5) g(3) h(6) i(9) n(5) o(4) r(6) s(18) t(8) u(3) v(3) w(2) x(3) z(1)

Autogram? False
====================================================================================================

Wren

Library: Wren-str

Frankly, not a bullet-proof solution but good enough to check the required sentences. <lang ecmascript>import "./str" for Str

var numbers = [

   ["fourteen", "14"],
   ["sixteen", "16"],
   ["seventeen", "17"],
   ["eighteen", "18"],
   ["nineteen", "19"],
   ["sixty", "60"],
   ["seventy", "70"],
   ["eighty", "80"],
   ["ninety", "90"],
   ["one", "1"],
   ["two", "2"],
   ["three", "3"],
   ["four", "4"],
   ["five", "5"],
   ["six", "6"],
   ["seven", "7"],
   ["eight", "8"],
   ["nine", "9"],
   ["ten", "10"],
   ["eleven", "11"],
   ["twelve", "12"],
   ["thirteen", "13"],
   ["fifteen", "15"],
   ["twenty", "20"],
   ["thirty", "30"],
   ["forty", "40"],
   ["fifty", "50"],
   ["single", "1"],

]

var punctuation = [

   ["comma", ","],
   ["hyphen", "-"],
   ["apostrophe", "'"],
   ["exclamation", "!"]

] var letters = "abcdefghijklmnopqrstuvwxyz" var symbols = ",-'!"

var autogram = Fn.new { |sentence, ignorePunct|

   System.print("Sentence:\n%(sentence)")
   System.print("Ignore punctuation: %(ignorePunct ? "yes" : "no")")
   var s = Str.lower(sentence)
   // get actual character counts
   var countable = ignorePunct ? letters : letters + symbols
   var map = {}
   for (c in s) {
       if (!countable.contains(c)) continue
       if (map.containsKey(c)) {
           map[c] = map[c] + 1
       } else {
           map[c] = 1
       }
   }
   var keys = map.keys.toList.sort{ |i, j| Str.le(i, j) } // sort into lexicographical order
   var charCounts = keys.map { |k| [k, map[k]] }.join(" ")
   System.print("\nActual character counts:")
   System.print(charCounts)
   var map2 = {}
   for (number in numbers) s = s.replace(number[0], number[1])
   if (!ignorePunct) {
       for (punct in punctuation) s = s.replace(punct[0], punct[1])
   }
   var words = Str.splitNoEmpty(s, " ")
   var i = 0
   var wc = words.count
   while (i < wc - 1) {
       if (Str.allDigits(words[i])) {
           if (Str.allDigits(words[i+1]) && i + 2 < wc) {
               var count = Num.fromString(words[i]) + Num.fromString(words[i+1])
               var char = words[i + 2][0]
               map2[char] = count
               i = i + 3
           } else if (i + 1 < wc) {
               var count = Num.fromString(words[i])
               var char = words[i + 1][0]
               map2[char] = count
               i = i + 2
           }
       } else if (words[i].contains("-")) {
           var split = words[i].split("-")
           if (Str.allDigits(split[0]) && Str.allDigits(split[1]) && i + 1 < wc) {
               var count = Num.fromString(split[0]) + Num.fromString(split[1])
               var char = words[i + 1][0]
               map2[char] = count
               i = i + 2
           }
       } else {
           i = i + 1
       }
   }
   var keys2 = map2.keys.toList.sort{ |i, j| Str.le(i, j) }
   var charCounts2 = keys2.map { |k| [k, map2[k]] }.join(" ")
   System.print("\nPurported character counts:")
   System.print(charCounts2)
   System.print("\nIs autogram? %(charCounts == charCounts2)")

}

var tests = [

   ["This sentence employs two a's, two c's, two d's, twenty-eight e's, five f's, three g's, eight h's, eleven i's, three l's, two m's, thirteen n's, nine o's, two p's, five r's, twenty-five s's, twenty-three t's, six v's, ten w's, two x's, five y's, and one z.", true],
   ["This sentence employs two a's, two c's, two d's, twenty eight e's, five f's, three g's, eight h's, eleven i's, three l's, two m's, thirteen n's, nine o's, two p's, five r's, twenty five s's, twenty three t's, six v's, ten w's, two x's, five y's, and one z.", true],
   ["Only the fool would take trouble to verify that his sentence was composed of ten a's, three b's, four c's, four d's, forty-six e's, sixteen f's, four g's, thirteen h's, fifteen i's, two k's, nine l's, four m's, twenty-five n's, twenty-four o's, five p's, sixteen r's, forty-one s's, thirty-seven t's, ten u's, eight v's, eight w's, four x's, eleven y's, twenty-seven commas, twenty-three apostrophes, seven hyphens and, last but not least, a single !", false],
   ["This pangram contains four as, one b, two cs, one d, thirty es, six fs, five gs, seven hs, eleven is, one j, one k, two ls, two ms, eighteen ns, fifteen os, two ps, one q, five rs, twenty-seven ss, eighteen ts, two us, seven vs, eight ws, two xs, three ys, & one z.", true],
   ["This sentence contains one hundred and ninety-seven letters: four a's, one b, three c's, five d's, thirty-four e's, seven f's, one g, six h's, twelve i's, three l's, twenty-six n's, ten o's, ten r's, twenty-nine s's, nineteen t's, six u's, seven v's, four w's, four x's, five y's, and one z.", true],
   ["Thirteen e's, five f's, two g's, five h's, eight i's, two l's, three n's, six o's, six r's, twenty s's, twelve t's, three u's, four v's, six w's, four x's, two y's.", true],
   ["Fifteen e's, seven f's, four g's, six h's, eight i's, four n's, five o's, six r's, eighteen s's, eight t's, four u's, three v's, two w's, three x's.", false],
   ["Sixteen e's, five f's, three g's, six h's, nine i's, five n's, four o's, six r's, eighteen s's, eight t's, three u's, three v's, two w's, four z's.", true]

]

for (t in tests) {

   autogram.call(t[0], t[1])
   System.print("=" * 80)

}</lang>

Output:
Sentence:
This sentence employs two a's, two c's, two d's, twenty-eight e's, five f's, three g's, eight h's, eleven i's, three l's, two m's, thirteen n's, nine o's, two p's, five r's, twenty-five s's, twenty-three t's, six v's, ten w's, two x's, five y's, and one z.
Ignore punctuation: yes

Actual character counts:
[a, 2] [c, 2] [d, 2] [e, 28] [f, 5] [g, 3] [h, 8] [i, 11] [l, 3] [m, 2] [n, 13] [o, 9] [p, 2] [r, 5] [s, 25] [t, 23] [v, 6] [w, 10] [x, 2] [y, 5] [z, 1]

Purported character counts:
[a, 2] [c, 2] [d, 2] [e, 28] [f, 5] [g, 3] [h, 8] [i, 11] [l, 3] [m, 2] [n, 13] [o, 9] [p, 2] [r, 5] [s, 25] [t, 23] [v, 6] [w, 10] [x, 2] [y, 5] [z, 1]

Is autogram? true
================================================================================
Sentence:
This sentence employs two a's, two c's, two d's, twenty eight e's, five f's, three g's, eight h's, eleven i's, three l's, two m's, thirteen n's, nine o's, two p's, five r's, twenty five s's, twenty three t's, six v's, ten w's, two x's, five y's, and one z.
Ignore punctuation: yes

Actual character counts:
[a, 2] [c, 2] [d, 2] [e, 28] [f, 5] [g, 3] [h, 8] [i, 11] [l, 3] [m, 2] [n, 13] [o, 9] [p, 2] [r, 5] [s, 25] [t, 23] [v, 6] [w, 10] [x, 2] [y, 5] [z, 1]

Purported character counts:
[a, 2] [c, 2] [d, 2] [e, 28] [f, 5] [g, 3] [h, 8] [i, 11] [l, 3] [m, 2] [n, 13] [o, 9] [p, 2] [r, 5] [s, 25] [t, 23] [v, 6] [w, 10] [x, 2] [y, 5] [z, 1]

Is autogram? true
================================================================================
Sentence:
Only the fool would take trouble to verify that his sentence was composed of ten a's, three b's, four c's, four d's, forty-six e's, sixteen f's, four g's, thirteen h's, fifteen i's, two k's, nine l's, four m's, twenty-five n's, twenty-four o's, five p's, sixteen r's, forty-one s's, thirty-seven t's, ten u's, eight v's, eight w's, four x's, eleven y's, twenty-seven commas, twenty-three apostrophes, seven hyphens and, last but not least, a single !
Ignore punctuation: no

Actual character counts:
[!, 1] [', 23] [,, 27] [-, 7] [a, 10] [b, 3] [c, 4] [d, 4] [e, 46] [f, 16] [g, 4] [h, 13] [i, 15] [k, 2] [l, 9] [m, 4] [n, 25] [o, 24] [p, 5] [r, 16] [s, 41] [t, 37] [u, 10] [v, 8] [w, 8] [x, 4] [y, 11]

Purported character counts:
[!, 1] [', 23] [,, 27] [-, 7] [a, 10] [b, 3] [c, 4] [d, 4] [e, 46] [f, 16] [g, 4] [h, 13] [i, 15] [k, 2] [l, 9] [m, 4] [n, 25] [o, 24] [p, 5] [r, 16] [s, 41] [t, 37] [u, 10] [v, 8] [w, 8] [x, 4] [y, 11]

Is autogram? true
================================================================================
Sentence:
This pangram contains four as, one b, two cs, one d, thirty es, six fs, five gs, seven hs, eleven is, one j, one k, two ls, two ms, eighteen ns, fifteen os, two ps, one q, five rs, twenty-seven ss, eighteen ts, two us, seven vs, eight ws, two xs, three ys, & one z.
Ignore punctuation: yes

Actual character counts:
[a, 4] [b, 1] [c, 2] [d, 1] [e, 30] [f, 6] [g, 5] [h, 7] [i, 11] [j, 1] [k, 1] [l, 2] [m, 2] [n, 18] [o, 15] [p, 2] [q, 1] [r, 5] [s, 27] [t, 18] [u, 2] [v, 7] [w, 8] [x, 2] [y, 3] [z, 1]

Purported character counts:
[a, 4] [b, 1] [c, 2] [d, 1] [e, 30] [f, 6] [g, 5] [h, 7] [i, 11] [j, 1] [k, 1] [l, 2] [m, 2] [n, 18] [o, 15] [p, 2] [q, 1] [r, 5] [s, 27] [t, 18] [u, 2] [v, 7] [w, 8] [x, 2] [y, 3] [z, 1]

Is autogram? true
================================================================================
Sentence:
This sentence contains one hundred and ninety-seven letters: four a's, one b, three c's, five d's, thirty-four e's, seven f's, one g, six h's, twelve i's, three l's, twenty-six n's, ten o's, ten r's, twenty-nine s's, nineteen t's, six u's, seven v's, four w's, four x's, five y's, and one z.
Ignore punctuation: yes

Actual character counts:
[a, 4] [b, 1] [c, 3] [d, 5] [e, 34] [f, 7] [g, 1] [h, 6] [i, 12] [l, 3] [n, 26] [o, 10] [r, 10] [s, 29] [t, 19] [u, 6] [v, 7] [w, 4] [x, 4] [y, 5] [z, 1]

Purported character counts:
[a, 4] [b, 1] [c, 3] [d, 5] [e, 34] [f, 7] [g, 1] [h, 6] [i, 12] [l, 3] [n, 26] [o, 10] [r, 10] [s, 29] [t, 19] [u, 6] [v, 7] [w, 4] [x, 4] [y, 5] [z, 1]

Is autogram? true
================================================================================
Sentence:
Thirteen e's, five f's, two g's, five h's, eight i's, two l's, three n's, six o's, six r's, twenty s's, twelve t's, three u's, four v's, six w's, four x's, two y's.
Ignore punctuation: yes

Actual character counts:
[e, 13] [f, 5] [g, 2] [h, 5] [i, 8] [l, 2] [n, 3] [o, 6] [r, 6] [s, 20] [t, 12] [u, 3] [v, 4] [w, 6] [x, 4] [y, 2]

Purported character counts:
[e, 13] [f, 5] [g, 2] [h, 5] [i, 8] [l, 2] [n, 3] [o, 6] [r, 6] [s, 20] [t, 12] [u, 3] [v, 4] [w, 6] [x, 4] [y, 2]

Is autogram? true
================================================================================
Sentence:
Fifteen e's, seven f's, four g's, six h's, eight i's, four n's, five o's, six r's, eighteen s's, eight t's, four u's, three v's, two w's, three x's.
Ignore punctuation: no

Actual character counts:
[', 14] [,, 13] [e, 15] [f, 7] [g, 4] [h, 6] [i, 8] [n, 4] [o, 5] [r, 6] [s, 18] [t, 8] [u, 4] [v, 3] [w, 2] [x, 3]

Purported character counts:
[e, 15] [f, 7] [g, 4] [h, 6] [i, 8] [n, 4] [o, 5] [r, 6] [s, 18] [t, 8] [u, 4] [v, 3] [w, 2] [x, 3]

Is autogram? false
================================================================================
Sentence:
Sixteen e's, five f's, three g's, six h's, nine i's, five n's, four o's, six r's, eighteen s's, eight t's, three u's, three v's, two w's, four z's.
Ignore punctuation: yes

Actual character counts:
[e, 16] [f, 5] [g, 3] [h, 6] [i, 9] [n, 5] [o, 4] [r, 6] [s, 18] [t, 8] [u, 3] [v, 3] [w, 2] [x, 3] [z, 1]

Purported character counts:
[e, 16] [f, 5] [g, 3] [h, 6] [i, 9] [n, 5] [o, 4] [r, 6] [s, 18] [t, 8] [u, 3] [v, 3] [w, 2] [z, 4]

Is autogram? false
================================================================================