Autogram checker: Difference between revisions

From Rosetta Code
Content added Content deleted
m (→‎{{header|Wren}}: Changed to Wren S/H)
 
(20 intermediate revisions by 6 users not shown)
Line 1: Line 1:
{{draft task}}
[[Category: String manipulation]]
[[Category: String manipulation]]
[[Category:Strings]]
[[Category:Strings]]
{{draft task}}
;Definition
;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.
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.
Line 33: Line 33:
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.
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. For task 3 and 7, punctuation counts must be checked, and some ('comma', 'apostrophe', 'hyphen') punctuation may be represented in the autogram using the spelled out english names for the punctuation and the checker must respect the inconsistent use of apostrophes in the spellings of the counts (while still counting apostrophes accurately) and must accept 'single' as a synonym for 'one'.
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.
Note that the only difference between sentences 1. and 2. is that there are no hyphens in the latter.
Line 62: Line 62:


=={{header|J}}==
=={{header|J}}==

The task asks us for a rough check, so we rely on normalization to implement the stable core of the algorithm. Also, we use <tt>us</tt> and <tt>uk</tt> from [[Number_names#J|the Number names task]] and explicitly support autograms with character counts higher than 99 (though of course none appear in the task examples).
The task asks us for a rough check, so we rely on normalization to implement the stable core of the algorithm. Also, we use <tt>us</tt> and <tt>uk</tt> from [[Number_names#J|the Number names task]] and explicitly support autograms with character counts higher than 99 (though of course none appear in the task examples).


In other words, we explicitly ignore details which were not specified in the task description as requirements of all autograms.
In other words, we explicitly ignore details which were not specified in the task description as requirements of all autograms.


Implementation: <lang J>NB. requires uk and us from rosettacode Number_names#J
Implementation: <syntaxhighlight lang="j">NB. requires uk and us from rosettacode Number_names#J
normalize=: {{ tolower ' '(I.(tolower=toupper)y)}y }}
normalize=: {{ tolower ' '(I.(tolower=toupper)y)}y }}
normalize=: tolower@#~ tolower~:toupper
normalize=: tolower@#~ tolower~:toupper
Line 78: Line 77:
ukgrams=: letters (uk@],' ',[)each counts
ukgrams=: letters (uk@],' ',[)each counts
*/(+./@E.&normalize&y every usgrams) +. +./@E.&normalize&y every ukgrams
*/(+./@E.&normalize&y every usgrams) +. +./@E.&normalize&y every ukgrams
}}</lang>
}}


NB. we use a different autogram requirement for some cases
Task examples:<lang j> autogram {{)n 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.}}
normalizep=: tolower@#~ e.&(''',-!') +. tolower~:toupper
normalizep2=: rplc&('apostrophe';'''';'comma';',';'hyphen';'-';'exclamation point';'!')

autogramp=: {{
y=. normalizep y
counts=: #/.~ y
letters=: counts (], '''s'#~1<[)each~.y
usgrams=: letters (us@],' ',[)each counts
ukgrams=: letters (uk@],' ',[)each counts
grams=: (, rplc&('''s';'s')L:0) usgrams,:ukgrams
grams=: (, }.@rplc&('Zone';'Zsingle')@('Z'&,)L:0) grams
*/+./+./@E.&(normalizep2 Y) every grams
}}</syntaxhighlight>

Task examples:<syntaxhighlight lang="j"> autogram {{)n 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.}}
1
1
autogram {{)n 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.}}
autogram {{)n 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.}}
Line 86: Line 100:
autogram {{)n 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 !}}
autogram {{)n 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 !}}
1
1
autogram {{)n 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.}}
autogramp {{)n 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.}}
0
1
autogram {{)n 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.}}
autogram {{)n 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.}}
1
1
autogram {{)n 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.}}
autogram {{)n 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.}}
1
1
autogram {{)n 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.}}
autogramp {{)n 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.}}
0
1
autogram {{)n 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.}}
autogram {{)n 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.}}
0</lang>
0</syntaxhighlight>


As an aside, this illustrates that rosettacode's J syntax highlighter does not properly handle J's {{)n delimited character literals (a recent language feature, introduced in J903).
As an aside, this illustrates that rosettacode's J syntax highlighter does not properly handle J's {{)n delimited character literals (a recent language feature, introduced in J903).
Line 101: Line 115:
=={{header|Julia}}==
=={{header|Julia}}==
Validating the total letter count when used.
Validating the total letter count when used.
<lang ruby>""" Rosetta Code task rosettacode.org/mw/index.php?title=Autogram_checker """
<syntaxhighlight lang="julia">""" Rosetta Code task rosettacode.org/mw/index.php?title=Autogram_checker """


using DataStructures
using DataStructures
Line 135: Line 149:
charcounts = counter(s)
charcounts = counter(s)
stillneedmention = Dict(p[1] => isletter(p[1]) || p[1] != ' ' && countpunctuation ? p[2] : 0 for p in charcounts)
stillneedmention = Dict(p[1] => isletter(p[1]) || p[1] != ' ' && countpunctuation ? p[2] : 0 for p in charcounts)
len = length(s)
s = " " * replace(s, r"^\.(?:employs|composed|contains)" => "")
s = " " * replace(s, r"^\.(?:employs|composed|contains)" => "")
for mention in split(s, r"\s*,|:\s*")
for mention in split(s, r"\s*,|:\s*")
Line 143: Line 156:
numfromtext == 0 && continue
numfromtext == 0 && continue
c = mention[begin+spos:end]
c = mention[begin+spos:end]
if c == "letters" && numfromtext != len # verify a total letter count
if c == "letters"
verbose && println("The total letter count (should be $len) is incorrect.")
if numfromtext != count(isletter, txt) # verify a total letter count
verbose && println("The total letter count (should be $(count(isletter, txt))) is incorrect.")
return false
return false
end
continue
end
end
ch = contains(c, "comma") ? ',' : contains(c, "apostrophe") ? '\'' : contains(c, "hyphen") ? '-' : Char(c[1])
ch = contains(c, "comma") ? ',' : contains(c, "apostrophe") ? '\'' : contains(c, "hyphen") ? '-' : Char(c[1])
Line 176: Line 192:
println("Test phrase $i is", isautogram(t[1], t[2]) ? " " : " not ", "a valid autogram.\n")
println("Test phrase $i is", isautogram(t[1], t[2]) ? " " : " not ", "a valid autogram.\n")
end
end
</lang>{{out}}
</syntaxhighlight>{{out}}
<pre>
<pre>
Test phrase 1 is a valid autogram.
Test phrase 1 is a valid autogram.
Line 186: Line 202:
Test phrase 4 is a valid autogram.
Test phrase 4 is a valid autogram.


Test phrase 5 is a valid autogram.
The total letter count (should be 291) is incorrect.
Test phrase 5 is not a valid autogram.


Test phrase 6 is a valid autogram.
Test phrase 6 is a valid autogram.
Line 197: Line 212:
Test phrase 8 is not a valid autogram.
Test phrase 8 is not a valid autogram.
</pre>
</pre>

=={{header|Nim}}==
{{trans|Wren}}
<syntaxhighlight lang="Nim">import std/[algorithm, sequtils, strformat, strutils, tables]

const

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"}.toOrderedTable

Punctuation = {"comma": ",", "hyphen": "-", "apostrophe": "'", "exclamation": "!"}.toTable

LowerLetters = {'a'..'z'}
Symbols = {',', '-', '\'', '!'}

proc autogram(sentence: string; ignorePunct: bool) =
echo &"Sentence:\n{sentence}"
echo &"""Ignore punctuation: {["no", "yes"][ord(ignorePunct)]}"""
var s = sentence.toLowerAscii
# Get actual character counts.
let chars = if ignorePunct: LowerLetters else: LowerLetters + Symbols
var ctable1: CountTable[char]
for c in s:
if c in chars:
ctable1.inc(c)
let keys1 = sorted(ctable1.keys.toSeq) # Sort into lexicographical order.
let charCounts1 = keys1.mapIt((it, ctable1[it])).join(" ")
echo "\nActual character counts:"
echo charCounts1

for text, value in Numbers.pairs:
s = s.replace(text, value)
if not ignorePunct:
for punct in Punctuation.pairs:
s = s.replace(punct[0], punct[1])
let words = s.split(' ')
var ctable2: CountTable[char]
let wc = words.len
var i = 0
while i < wc - 1:
if words[i].all(isDigit):
if words[i+1].all(isDigit) and i + 2 < wc:
let count = words[i].parseInt() + words[i+1].parseInt()
let ch = words[i + 2][0]
ctable2[ch] = count
inc i, 3
else:
let count = words[i].parseInt()
let ch = words[i + 1][0]
ctable2[ch] = count
inc i, 2
elif '-' in words[i]:
let split = words[i].split('-')
if split[0].all(isDigit) and split[1].all(isDigit):
let count = split[0].parseInt() + split[1].parseInt()
let ch = words[i + 1][0]
ctable2[ch] = count
inc i, 2
else:
inc i
else:
inc i

let keys2 = sorted(ctable2.keys.toSeq)
let charCounts2 = keys2.mapIt((it, ctable2[it])).join(" ")
echo "\nPurported character counts:"
echo charCounts2
echo &"\nIs autogram? {charCounts1 == charCounts2}"

const 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(t[0], t[1])
echo repeat('=', 80)
</syntaxhighlight>

{{out}}
<pre>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
================================================================================
</pre>

=={{header|Perl}}==
<syntaxhighlight lang="perl">use v5.36;
use experimental <builtin for_list>;
use Sub::Util 'subname';
use List::Util 'sum';

my %nums = (
'zero' => 0, 'single' => 1, '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,
'fourteen' => 14, 'fifteen' => 15, 'sixteen' => 16, 'seventeen' => 17, 'eighteen' => 18, 'nineteen' => 19,
'twenty' => 20, 'thirty' => 30, 'forty' => 40, 'fifty' => 50, 'sixty' => 60, 'seventy' => 70, 'eighty' => 80,
'ninety' => 90, 'hundred' => 100,
);

my @tests = (
\&punctuation, "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.",
\&punctuation, "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.",
'', "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 !",
\&punctuation, "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.",
\&punctuation, "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.",
\&punctuation, "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.",
'', "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.",
\&punctuation, "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."
);

sub punctuation ($text) { $text =~ s/\W//grx }
sub wrap { (shift) =~ s/(.{96}.*?\s)/$1\n/gr }

for my($filter, $text) (@tests) {
my(%Claim, %Actual, $count_claim, $count_actual);
my %Punc = ('apostrophe' => "'", 'hyphen' => '-', 'comma' => ',', 'exclamation' => '!');
my $str = my $filtered = my $original = lc $text;
$str =~ s/\!/exclamation/g;

say wrap $text;
my $filter_func = $filter ? subname( $filter ) =~ s/main:://r : '';
say "\nNOT filtering out punctuation" unless $filter_func;

$str =~ s/\bone ([a-z])[,.]\b/one $1's,/g;
for my($word, $number) (%nums) { $str =~ s/ \b $word \b /$number/gix }
$str =~ s/(\d0)[ \-](\d)/$1 + $2/gxe;
$str =~ s/\b1 100 and (\d+)\b/100 + $1/e;
$str =~ s/(\d+) ([a-z])['s,.]*\b/ $Claim{$2} = $1/ge;

$filtered = &$filter($original) if $filter;
$Actual{$_} = () = $filtered =~ /$_/g for keys %Claim;
$count_claim .= "$_($Claim{$_}) " for sort keys %Claim;
$count_actual .= "$_($Actual{$_}) " for sort keys %Actual;

unless ($filter_func) {
for (sort keys %Punctuation) {
$str =~ m/(\d+) ($_)/;
$count_claim .= "$Punctuation{$2}($1) " if $1 and $Punctuation{$2};
my $n = () = $filtered =~ /$Punctuation{$_}/g;
$count_actual .= "$Punctuation{$_}($n) " if $n;
}
}

say "\nClaimed character counts:\n" . wrap $count_claim;
say "\nActual character counts:\n" . wrap $count_actual;

say "\nAutogram? ". (my $AG = $count_claim eq $count_actual ? 'True' : 'False');
say "Autogram? " . ($AG and $1 == $orig =~ tr/a-z// ? 'True' : 'False') . ' (with added sentence length condition)'
if $str =~ /(\d+) letters/;
say "\n" . '=' x 101;
}</syntaxhighlight>
{{out}}
<pre style="height:60ex">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.

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

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.

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

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.

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

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 !

NOT filtering out punctuation

Claimed character counts:
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) '(23) ,(27) !(1) -(7)

Actual character counts:
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) '(23) ,(27) !(1) -(7)

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.

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

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.

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

Autogram? True
Autogram? True (with added sentence length condition)

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

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

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.

NOT filtering out punctuation

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 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) '(14) ,(13)

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.

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 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(1)

Autogram? False

=====================================================================================================</pre>


=={{header|Phix}}==
=={{header|Phix}}==
<!--<lang Phix>(phixonline)-->
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">tests</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">split</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">substitute</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"""
<span style="color: #008080;">constant</span> <span style="color: #000000;">tests</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">split</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">substitute</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"""
1. This sentence employs two a's, two c's, two d's, twenty-eight e's,
1. 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,
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,
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.
twenty-three t's, six v's, ten w's, two x's, five y's, and one z.
2. This sentence employs two a's, two c's, two d's, twenty eight e's,
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,
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,
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.
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
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,
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,
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,
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,
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,
four x's, eleven y's, twenty-seven commas, twenty-three apostrophes,
seven hyphens and, last but not least, a single !
seven hyphens and, last but not least, a single !
4. This pangram contains four as, one b, two cs, one d, thirty es,
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,
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 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.
eighteen ts, two us, seven vs, eight ws, two xs, three ys, & one z.
5. This sentence contains one hundred and ninety-seven letters:
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,
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,
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,
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.
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,
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,
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.
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,
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,
five o's, six r's, eighteen s's, eight t's, four u's, three v's,
two w's, three x'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,
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,
four o's, six r's, eighteen s's, eight t's, three u's, three v's,
two w's, four z's.
two w's, four z's.
"""</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n "</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" "</span><span style="color: #0000FF;">),</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">),</span>
"""</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n "</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" "</span><span style="color: #0000FF;">),</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">),</span>
Line 242: Line 646:
<span style="color: #7060A8;">assert</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">..</span><span style="color: #000000;">3</span><span style="color: #0000FF;">]=</span><span style="color: #008000;">". "</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">assert</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">..</span><span style="color: #000000;">3</span><span style="color: #0000FF;">]=</span><span style="color: #008000;">". "</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">4</span><span style="color: #0000FF;">..$]</span>
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">4</span><span style="color: #0000FF;">..$]</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">shorten</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"characters"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">40</span><span style="color: #0000FF;">)})</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">shorten</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #008000;">""</span><span style="color: #0000FF;">,</span><span style="color: #000000;">60</span><span style="color: #0000FF;">)})</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">actual</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">255</span><span style="color: #0000FF;">),</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">actual</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">255</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">claimed</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">255</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">claimed</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">255</span><span style="color: #0000FF;">),</span>
Line 300: Line 704:
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">diff</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">" (differences: claimed:%s, actual:%s)"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">claim</span><span style="color: #0000FF;">,</span><span style="color: #000000;">act</span><span style="color: #0000FF;">})</span>
<span style="color: #000000;">diff</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">" (differences: claimed:%s, actual:%s)"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">claim</span><span style="color: #0000FF;">,</span><span style="color: #000000;">act</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">elsif</span> <span style="color: #000000;">check_letters</span> <span style="color: #008080;">then</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">lc</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">filter</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"out"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" -:,'."</span><span style="color: #0000FF;">))</span>
<span style="color: #000000;">diff</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">" (%d letters)"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">lc</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Autogram? %t%s\n\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">autogram</span><span style="color: #0000FF;">,</span><span style="color: #000000;">diff</span><span style="color: #0000FF;">})</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Autogram? %t%s\n\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">autogram</span><span style="color: #0000FF;">,</span><span style="color: #000000;">diff</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</lang>-->
<!--</syntaxhighlight>-->
{{out}}
{{out}}
<pre>
<pre>
This sentence employs two a's, two c's, ..., ten w's, two x's, five y's, and one z. (259 characters)
This sentence employs two a's, two c's, two d's, twenty-eigh...y-three t's, six v's, ten w's, two x's, five y's, and one z.
Autogram? true
Autogram? true


This sentence employs two a's, two c's, ..., ten w's, two x's, five y's, and one z. (259 characters)
This sentence employs two a's, two c's, two d's, twenty eigh...y three t's, six v's, ten w's, two x's, five y's, and one z.
Autogram? true
Autogram? true


Only the fool would take trouble to veri...hens and, last but not least, a single ! (456 characters)
Only the fool would take trouble to verify that his sentence...ostrophes, seven hyphens and, last but not least, a single !
Autogram? true
Autogram? true


This pangram contains four as, one b, tw...vs, eight ws, two xs, three ys, & one z. (268 characters)
This pangram contains four as, one b, two cs, one d, thirty ...n ts, two us, seven vs, eight ws, two xs, three ys, & one z.
Autogram? true
Autogram? true


This sentence contains one hundred and n...four w's, four x's, five y's, and one z. (295 characters)
This sentence contains one hundred and ninety-seven letters:...six u's, seven v's, four w's, four x's, five y's, and one z.
Autogram? true
Autogram? true (197 letters)


Thirteen e's, five f's, two g's, five h'..., four v's, six w's, four x's, two y's. (166 characters)
Thirteen e's, five f's, two g's, five h's, eight i's, two l'...twelve t's, three u's, four v's, six w's, four x's, two y's.
Autogram? true
Autogram? true


Fifteen e's, seven f's, four g's, six h'...our u's, three v's, two w's, three x's. (150 characters)
Fifteen e's, seven f's, four g's, six h's, eight i's, four n...een s's, eight t's, four u's, three v's, two w's, three x's.
Autogram? false (differences: claimed:':0 ,:0 , actual:':14 ,:13 )
Autogram? false (differences: claimed:':0 ,:0 , actual:':14 ,:13 )


Sixteen e's, five f's, three g's, six h'...hree u's, three v's, two w's, four z's. (149 characters)
Sixteen e's, five f's, three g's, six h's, nine i's, five n'...een s's, eight t's, three u's, three v's, two w's, four z's.
Autogram? false (differences: claimed:x:0 z:4 , actual:x:3 z:1 )
Autogram? false (differences: claimed:x:0 z:4 , actual:x:3 z:1 )
</pre>
Changing the fifth item as shown below gives:
<pre>
This sentence contains one hundred and seventy-nine letters:...ix u's, seven v's, four w's, four x's, five y's, and one z.
Autogram? false (differences: claimed:letters:179 , actual:letters:197 )
</pre>
</pre>


Line 336: Line 748:
Using [https://raku.land/github:jkramer/Text::Wrap Text::Wrap] from the ecosystem. Install command: <code>zef install -v git://github.com/jkramer/p6-Text-Wrap.git</code>.
Using [https://raku.land/github:jkramer/Text::Wrap Text::Wrap] from the ecosystem. Install command: <code>zef install -v git://github.com/jkramer/p6-Text-Wrap.git</code>.


<lang perl6>my %nums = :0zero, :1one, :2two, :3three, :4four, :5five, :6six, :7seven, :8eight, :9nine, :10ten, :11eleven,
<syntaxhighlight lang="raku" line>my %nums = :0zero, :1one, :2two, :3three, :4four, :5five, :6six, :7seven, :8eight, :9nine, :10ten, :11eleven,
:12twelve, :13thirteen, :14fourteen, :15fifteen, :16sixteen, :17seventeen, :18eighteen, :19nineteen,
:12twelve, :13thirteen, :14fourteen, :15fifteen, :16sixteen, :17seventeen, :18eighteen, :19nineteen,
:20twenty, :30thirty, :40forty, :50fifty, :60sixty, :70seventy, :80eighty, :90ninety, :100hundred, :1single;
:20twenty, :30thirty, :40forty, :50fifty, :60sixty, :70seventy, :80eighty, :90ninety, :100hundred, :1single;
Line 386: Line 798:


say '=' x 100;
say '=' x 100;
}</lang>
}</syntaxhighlight>
{{out}}
{{out}}
<pre style="height:50ex;overflow:scroll;">====================================================================================================
<pre style="height:50ex;overflow:scroll;">====================================================================================================
Line 514: Line 926:
{{libheader|Wren-str}}
{{libheader|Wren-str}}
Frankly, not a bullet-proof solution but good enough to check the required sentences.
Frankly, not a bullet-proof solution but good enough to check the required sentences.
<lang ecmascript>import "./str" for Str
<syntaxhighlight lang="wren">import "./str" for Str


var numbers = [
var numbers = [
Line 630: Line 1,042:
autogram.call(t[0], t[1])
autogram.call(t[0], t[1])
System.print("=" * 80)
System.print("=" * 80)
}</lang>
}</syntaxhighlight>


{{out}}
{{out}}

Latest revision as of 10:30, 7 November 2023

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. For task 3 and 7, punctuation counts must be checked, and some ('comma', 'apostrophe', 'hyphen') punctuation may be represented in the autogram using the spelled out english names for the punctuation and the checker must respect the inconsistent use of apostrophes in the spellings of the counts (while still counting apostrophes accurately) and must accept 'single' as a synonym for 'one'.

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



J

The task asks us for a rough check, so we rely on normalization to implement the stable core of the algorithm. Also, we use us and uk from the Number names task and explicitly support autograms with character counts higher than 99 (though of course none appear in the task examples).

In other words, we explicitly ignore details which were not specified in the task description as requirements of all autograms.

Implementation:

NB. requires uk and us from rosettacode Number_names#J
normalize=: {{ tolower ' '(I.(tolower=toupper)y)}y }}
normalize=: tolower@#~ tolower~:toupper

autogram=: {{
  y=. normalize y
  counts=: #/.~ y
  letters=: counts (], '''s'#~1<[)each~.y
  usgrams=: letters (us@],' ',[)each counts
  ukgrams=: letters (uk@],' ',[)each counts
  */(+./@E.&normalize&y every usgrams) +. +./@E.&normalize&y every ukgrams
}}

NB. we use a different autogram requirement for some cases
normalizep=: tolower@#~ e.&(''',-!') +. tolower~:toupper
normalizep2=: rplc&('apostrophe';'''';'comma';',';'hyphen';'-';'exclamation point';'!')

autogramp=: {{
  y=. normalizep y
  counts=: #/.~ y
  letters=: counts (], '''s'#~1<[)each~.y
  usgrams=: letters (us@],' ',[)each counts
  ukgrams=: letters (uk@],' ',[)each counts
  grams=: (, rplc&('''s';'s')L:0) usgrams,:ukgrams
  grams=: (, }.@rplc&('Zone';'Zsingle')@('Z'&,)L:0) grams
  */+./+./@E.&(normalizep2 Y) every grams
}}

Task examples:

   autogram {{)n 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.}}
1
   autogram {{)n 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.}}
1
   autogram {{)n 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 !}}
1
   autogramp {{)n 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.}}
0
   autogram {{)n 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.}}
1
   autogram {{)n 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.}}
1
   autogramp {{)n 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.}}
0
   autogram {{)n 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.}}
0

As an aside, this illustrates that rosettacode's J syntax highlighter does not properly handle J's {{)n delimited character literals (a recent language feature, introduced in J903).

Julia

Validating the total letter count when used.

""" Rosetta Code task rosettacode.org/mw/index.php?title=Autogram_checker """

using DataStructures

const textnumbers = Dict("single" => 1, "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, "fourteen" => 14, "fifteen" => 15, "sixteen" => 16,
    "seventeen" => 17, "eighteen" => 18, "nineteen" => 19, "twenty" => 20, "thirty" => 30,
    "forty" => 40, "fifty" => 50, "sixty" => 60, "seventy" => 70, "eighty" => 80, "ninety" => 90)

"""
    function phrasetointeger(txt)

Convert text spelled-out numbers from 1 to 999
"""
function phrasetointeger(txt)
    words = split(txt, r"\W+")
    n = 0
    for w in words
    	n += get(textnumbers, w, 0)
        w == "hundred" && (n *= 100)
    end
    return n
end

"""
    function isautogram(txt, countpunctuation; verbose = true)

Verify an autogram. Count punctuation if second argument is true, error messages if verbose
"""
function isautogram(txt, countpunctuation; verbose = true)
    s = lowercase(txt)
    charcounts = counter(s)
    stillneedmention = Dict(p[1] => isletter(p[1]) || p[1] != ' ' && countpunctuation ? p[2] : 0 for p in charcounts)
    s = " " * replace(s, r"^\.(?:employs|composed|contains)" => "")
    for mention in split(s, r"\s*,|:\s*")
        mention = replace(mention, r" and$" => "")
        spos = findlast(isspace, mention)
        numfromtext = phrasetointeger(mention[begin:spos-1])
        numfromtext == 0 && continue
        c = mention[begin+spos:end]
        if c == "letters"
            if numfromtext != count(isletter, txt)   # verify a total letter count
                verbose && println("The total letter count (should be $(count(isletter, txt))) is incorrect.")
                return false
            end
            continue
        end
        ch = contains(c, "comma") ? ',' : contains(c, "apostrophe") ? '\'' : contains(c, "hyphen") ? '-' : Char(c[1])
        if charcounts[ch] == numfromtext   # verify an individual character count
            stillneedmention[ch] = 0
        else
            verbose && println("The count of $ch in the phrase is incorrect.")
            return false
        end
    end
    for p in stillneedmention
        if p[2] > 0  # a letter we counted was not counted by the sentence
            verbose && println("The letter and count $p was not mentioned in the counts in the phrase.")
            return false
        end
    end
    return true
end

for (i, t) in enumerate([
    ("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.", false),
    ("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.", false),
    ("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 !", 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.", false),
    ("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.", false),
    ("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.", false),
    ("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.", true),
    ("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.", false),
   ])
    println("Test phrase $i is", isautogram(t[1], t[2]) ? " " : " not ", "a valid autogram.\n")
end
Output:
Test phrase 1 is a valid autogram.

Test phrase 2 is a valid autogram.

Test phrase 3 is a valid autogram.

Test phrase 4 is a valid autogram.

Test phrase 5 is a valid autogram.

Test phrase 6 is a valid autogram.

The letter and count '\'' => 14 was not mentioned in the counts in the phrase.
Test phrase 7 is not a valid autogram.

The count of z in the phrase is incorrect.
Test phrase 8 is not a valid autogram.

Nim

Translation of: Wren
import std/[algorithm, sequtils, strformat, strutils, tables]

const

  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"}.toOrderedTable

  Punctuation = {"comma": ",", "hyphen": "-", "apostrophe": "'", "exclamation": "!"}.toTable

  LowerLetters = {'a'..'z'}
  Symbols = {',', '-', '\'', '!'}

proc autogram(sentence: string; ignorePunct: bool) =
  echo &"Sentence:\n{sentence}"
  echo &"""Ignore punctuation: {["no", "yes"][ord(ignorePunct)]}"""
  var s = sentence.toLowerAscii
  # Get actual character counts.
  let chars = if ignorePunct: LowerLetters else: LowerLetters + Symbols
  var ctable1: CountTable[char]
  for c in s:
    if c in chars:
      ctable1.inc(c)
  let keys1 = sorted(ctable1.keys.toSeq)   # Sort into lexicographical order.
  let charCounts1 = keys1.mapIt((it, ctable1[it])).join(" ")
  echo "\nActual character counts:"
  echo charCounts1

  for text, value in Numbers.pairs:
    s = s.replace(text, value)
  if not ignorePunct:
    for punct in Punctuation.pairs:
      s = s.replace(punct[0], punct[1])
  let words = s.split(' ')
  var ctable2: CountTable[char]
  let wc = words.len
  var i = 0
  while i < wc - 1:
    if words[i].all(isDigit):
      if words[i+1].all(isDigit) and i + 2 < wc:
        let count = words[i].parseInt() + words[i+1].parseInt()
        let ch = words[i + 2][0]
        ctable2[ch] = count
        inc i, 3
      else:
        let count = words[i].parseInt()
        let ch = words[i + 1][0]
        ctable2[ch] = count
        inc i, 2
    elif '-' in words[i]:
      let split = words[i].split('-')
      if split[0].all(isDigit) and split[1].all(isDigit):
        let count = split[0].parseInt() + split[1].parseInt()
        let ch = words[i + 1][0]
        ctable2[ch] = count
        inc i, 2
      else:
        inc i
    else:
      inc i

  let keys2 = sorted(ctable2.keys.toSeq)
  let charCounts2 = keys2.mapIt((it, ctable2[it])).join(" ")
  echo "\nPurported character counts:"
  echo charCounts2
  echo &"\nIs autogram? {charCounts1 == charCounts2}"

const 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(t[0], t[1])
  echo repeat('=', 80)
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
================================================================================

Perl

use v5.36;
use experimental <builtin for_list>;
use Sub::Util 'subname';
use List::Util 'sum';

my %nums = (
'zero' => 0, 'single' => 1, '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,
'fourteen' => 14, 'fifteen' => 15, 'sixteen' => 16, 'seventeen' => 17, 'eighteen' => 18, 'nineteen' => 19,
'twenty' => 20, 'thirty' => 30, 'forty' => 40, 'fifty' => 50, 'sixty' => 60, 'seventy' => 70, 'eighty' => 80,
'ninety' => 90, 'hundred' => 100,
);

my @tests = (
    \&punctuation, "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.",
    \&punctuation, "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.",
    '',            "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 !",
    \&punctuation, "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.",
    \&punctuation, "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.",
    \&punctuation, "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.",
    '',            "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.",
    \&punctuation, "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."
);

sub punctuation ($text) { $text =~ s/\W//grx }
sub wrap { (shift) =~ s/(.{96}.*?\s)/$1\n/gr }

for my($filter, $text) (@tests) {
    my(%Claim, %Actual, $count_claim, $count_actual);
    my %Punc = ('apostrophe' => "'", 'hyphen' => '-', 'comma' => ',', 'exclamation' => '!');
    my $str = my $filtered = my $original = lc $text;
    $str =~ s/\!/exclamation/g;

    say wrap $text;
    my $filter_func = $filter ? subname( $filter ) =~ s/main:://r : '';
    say "\nNOT filtering out punctuation" unless $filter_func;

    $str =~ s/\bone ([a-z])[,.]\b/one $1's,/g;
    for my($word, $number) (%nums) { $str =~ s/ \b $word \b /$number/gix }
    $str =~ s/(\d0)[ \-](\d)/$1 + $2/gxe;
    $str =~ s/\b1 100 and (\d+)\b/100 + $1/e;
    $str =~ s/(\d+) ([a-z])['s,.]*\b/ $Claim{$2} = $1/ge;

    $filtered = &$filter($original) if $filter;
    $Actual{$_} = () = $filtered =~ /$_/g for keys %Claim;
    $count_claim  .= "$_($Claim{$_}) "  for sort keys %Claim;
    $count_actual .= "$_($Actual{$_}) " for sort keys %Actual;

    unless ($filter_func) {
        for (sort keys %Punctuation) {
            $str =~ m/(\d+) ($_)/;
            $count_claim  .= "$Punctuation{$2}($1) " if $1 and $Punctuation{$2};
            my $n = () = $filtered =~ /$Punctuation{$_}/g;
            $count_actual .= "$Punctuation{$_}($n) " if $n;
        }
    }

    say "\nClaimed character counts:\n" . wrap $count_claim;
    say "\nActual character counts:\n"  . wrap $count_actual;

    say "\nAutogram? ". (my $AG = $count_claim eq $count_actual ? 'True' : 'False');
    say "Autogram? " . ($AG and $1 == $orig =~ tr/a-z// ? 'True' : 'False') . ' (with added sentence length condition)'
        if $str =~ /(\d+) letters/;
    say "\n" . '=' x 101;
}
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.

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

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.

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

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.

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

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 !

NOT filtering out punctuation

Claimed character counts:
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) '(23) ,(27) !(1) -(7)

Actual character counts:
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) '(23) ,(27) !(1) -(7)

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.

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

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.

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

Autogram? True
Autogram? True (with added sentence length condition)

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

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

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.

NOT filtering out punctuation

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 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) '(14) ,(13)

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.

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 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(1)

Autogram? False

=====================================================================================================

Phix

with javascript_semantics
constant tests = split(substitute("""
1. 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.
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.
""","\n "," "),"\n"),
numbers = 1&tagset(19)&tagset(90,20,10),
words = {"single"}&apply(true,ordinal,{numbers[2..$],true})
for s in tests do
    bool ignore_punctuation = not find(s[1],"37")
    assert(s[2..3]=". ")
    s = s[4..$]
    printf(1,"%s\n",{shorten(s,"",60)})
    sequence actual = repeat(0,255),
            claimed = repeat(0,255),
             claims = split_any(lower(s)," '&,-:.")
    for ch in s do
        if not find(ch," .")
        and (not find(ch,",'&!-:") or not ignore_punctuation) then
            ch = lower(ch)
            actual[ch] += 1
        end if
    end for
    integer w = 1, check_letters = 0
    while w<=length(claims) do
        string word = claims[w]
        w += 1
        integer k = find(word,words)
        if k then
            k = numbers[k]
            while w<=length(claims) do
                word = claims[w]
                w += 1
                integer l = find(word,words)
                if l then
                    k += numbers[l]
                elsif word="hundred" then
                    k *= 100
                elsif word!="and" then
                    l = find(word,{"commas","apostrophes","hyphens"})
                    if l then word = ",'-"[l..l] end if
                    if length(word)=1
                    or (length(word)=2 and word[2]='s') then
                        claimed[lower(word[1])] = k
                    elsif word="letters" then
                        check_letters = k
                    else
                        ?{word,k} // (placeholder)
                    end if
                    exit
                end if
            end while
        end if
    end while
    bool letters = check_letters=0 or check_letters=sum(actual),
         autogram = (claimed=actual) and letters
    string diff = ""
    if not autogram then
        string claim = "", act = ""
        for ch=1 to 255 do
            if claimed[ch]!=actual[ch] then
                claim &= sprintf("%c:%d ",{ch,claimed[ch]})
                act &= sprintf("%c:%d ",{ch,actual[ch]})
            end if
        end for
        if not letters then
            claim &= sprintf("letters:%d ",check_letters)
            act &= sprintf("letters:%d ",sum(actual))
        end if
        diff = sprintf("  (differences: claimed:%s, actual:%s)",{claim,act})
    elsif check_letters then
        integer lc = length(filter(s,"out"," -:,'."))
        diff = sprintf("  (%d letters)",lc)
    end if
    printf(1,"Autogram? %t%s\n\n",{autogram,diff})
end for
Output:
This sentence employs two a's, two c's, two d's, twenty-eigh...y-three t's, six v's, ten w's, two x's, five y's, and one z.
Autogram? true

This sentence employs two a's, two c's, two d's, twenty eigh...y three t's, six v's, ten w's, two x's, five y's, and one z.
Autogram? true

Only the fool would take trouble to verify that his sentence...ostrophes, seven hyphens and, last but not least, a single !
Autogram? true

This pangram contains four as, one b, two cs, one d, thirty ...n ts, two us, seven vs, eight ws, two xs, three ys, & one z.
Autogram? true

This sentence contains one hundred and ninety-seven letters:...six u's, seven v's, four w's, four x's, five y's, and one z.
Autogram? true  (197 letters)

Thirteen e's, five f's, two g's, five h's, eight i's, two l'...twelve t's, three u's, four v's, six w's, four x's, two y's.
Autogram? true

Fifteen e's, seven f's, four g's, six h's, eight i's, four n...een s's, eight t's, four u's, three v's, two w's, three x's.
Autogram? false  (differences: claimed:':0 ,:0 , actual:':14 ,:13 )

Sixteen e's, five f's, three g's, six h's, nine i's, five n'...een s's, eight t's, three u's, three v's, two w's, four z's.
Autogram? false  (differences: claimed:x:0 z:4 , actual:x:3 z:1 )

Changing the fifth item as shown below gives:

This sentence contains one hundred and seventy-nine letters:...ix u's, seven v's,  four w's, four x's, five y's, and one z.
Autogram? false  (differences: claimed:letters:179 , actual:letters:197 )

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.

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;
}
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.

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)
}
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
================================================================================