Implementation of Challenge #7 in StackOverflow: https://stackoverflow.com/beta/challenges/79767716/code-challenge-7-pangram-checker
File resources/char2int.h
#include "swan_types.h"
/* Macro to convert a char to a swan_uint32 / swan_uint64 */
#define char2uint32_charUtils(c) ((swan_uint32)(c))
#define char2uint64_charUtils(c) ((swan_uint64)(c))File assets/Pangrams.swan
-- version swan: 2025.2 graph: 2.1
use charUtils;
function GetPangramType (sentence: char^STR_LENGTH;)
returns (pangram_type: PangramType;)
{
diagram
(#0 expr forward
<<STR_LENGTH>> with [c]=sentence;
diagram
(#1 def asciiCode
#pragma diagram {"xy":"h34450;v-29600","wh":"14000;3200"} #end)
(#2 expr charUtils::char2uint32(c)
#pragma diagram {"xy":"h-14060;v-29600","wh":"28000;3200"} #end)
(#3 wire #2 => #1)
(var
asciiCode;)
(activate #5
if (65 <= asciiCode) and (asciiCode <= 90)
then
{
diagram
(#6 expr last'maskOccurence lor (1 lsl (asciiCode - 65))
#pragma diagram {"xy":"h-6625;v-5076","wh":"50000;3200"} #end)
(#7 def maskOccurence
#pragma diagram {"xy":"h36450;v-5076","wh":"18000;3200"} #end)
(#8 expr last'multipleOccurences
#pragma diagram {"xy":"h-12450;v1276","wh":"26000;3200"} #end)
(#9 expr (last'maskOccurence land (1 lsl (asciiCode - 65))) > 0
#pragma diagram {"xy":"h-27000;v5076","wh":"56000;3200"} #end)
(#10 expr #11 or #12
where
(#11 group)
(#12 group)
#pragma diagram {"xy":"h14000;v3176"} #end)
(#13 def multipleOccurences
#pragma diagram {"xy":"h38450;v3176","wh":"22000;3200"} #end)
(#14 wire #6 => #7)
(#15 wire #9 => #12)
(#16 wire #8 => #11)
(#17 wire #10 => #13)
#pragma diagram {"xy":"h0;v-13778","wh":"114000;17352"} #end
}
elsif (97 <= asciiCode) and (asciiCode <= 122)
then
{
diagram
(#18 expr last'maskOccurence lor (1 lsl (asciiCode - 97))
#pragma diagram {"xy":"h-7950;v-5049","wh":"50000;3200"} #end)
(#19 def maskOccurence
#pragma diagram {"xy":"h36450;v-5049","wh":"18000;3200"} #end)
(#21 expr last'multipleOccurences
#pragma diagram {"xy":"h-12000;v1249","wh":"26000;3200"} #end)
(#22 def multipleOccurences
#pragma diagram {"xy":"h38450;v3149","wh":"22000;3200"} #end)
(#23 expr #24 or #25
where
(#24 group)
(#25 group)
#pragma diagram {"xy":"h14000;v3149"} #end)
(#26 expr (last'maskOccurence land (1 lsl (asciiCode - 97))) > 0
#pragma diagram {"xy":"h-27000;v5049","wh":"56000;3200"} #end)
(#20 wire #18 => #19)
(#27 wire #23 => #22)
(#28 wire #26 => #25)
(#29 wire #21 => #24)
#pragma diagram {"xy":"h0;v7406","wh":"114000;17297"} #end
}
else
{
#pragma diagram {"xy":"h0;v23114","wh":"114000;6400"} #end
}
#pragma diagram {"xy":"h0;v2205","wh":"114000;52628"} #end)
until asciiCode = 0
returns (maskOccurence: last=0_ui32,
multipleOccurences: last=false)
#pragma diagram {"xy":"H-53452;V20029","wh":"122600;78399"} #end)
(/* ASCII TABLE
A = 65 .. Z = 90
a = 97 .. z = 122
To recorde the occurence of letters,
we use a bitmask for the position of the letter in the alphabet
(starting by 0).
If the bitmask = 67108863 (2^26-1), then all letters have been found.
We will also need to record if a letter has been found twice,
by using the bitmask to check whether we have a previous occurence.
*/ let
#pragma diagram {"xy":"H-38588;V-54226","wh":"70000;22814"} #end)
(#30 def pangram_type
#pragma diagram {"xy":"H81748;V65128","wh":"16000;3200"} #end)
(#31 expr NOT_PANGRAM
#pragma diagram {"xy":"H31748;V68828","wh":"16000;3200"} #end)
(#32 expr if #33 then #34 else #35
where
(#33 group)
(#34 group)
(#35 group)
#pragma diagram {"xy":"H56748;V65128"} #end)
(#36 expr 67108863
#pragma diagram {"xy":"H18798;V42228","wh":"12000;3200"} #end)
(#37 expr #38 = #39
where
(#38 group)
(#39 group)
#pragma diagram {"xy":"H34748;V44128"} #end)
(#40 expr PANGRAM
#pragma diagram {"xy":"H1848;V61328","wh":"12000;3200"} #end)
(#41 expr if #42 then #43 else #44
where
(#42 group)
(#43 group)
(#44 group)
#pragma diagram {"xy":"H34748;V63228"} #end)
(#45 expr PERFECT_PANGRAM
#pragma diagram {"xy":"H-2152;V65128","wh":"20000;3200"} #end)
(#46 wire #31 => #35
#pragma diagram {"wp":"#31 h7500 v-1800 #35"} #end)
(#47 wire #0 .(2) => #39
#pragma diagram {"wp":"v25999|#0 #39"} #end)
(#48 wire #36 => #38)
(#49 wire #37 => #33
#pragma diagram {"wp":"#37 h18500 #33"} #end)
(#50 wire #0 .(3) => #42
#pragma diagram {"wp":"v36949|#0 h26900 #42"} #end)
(#51 wire #40 => #43)
(#52 wire #45 => #44)
(#53 wire #41 => #34)
(#54 wire #32 => #30)
}
function CountPangrams <<N>> (listStrings: char^STR_LENGTH^N;)
returns (countNonPangrams: uint32;
countPangrams: uint32;
countPerfectPangrams: uint32;)
{
diagram
(#0 expr forward
<<N>> with [s]=listStrings;
diagram
(activate #1 when GetPangramType(s) match
| NOT_PANGRAM :
{
diagram
(#2 def nbNonP
#pragma diagram {"xy":"h15000;v0","wh":"10000;3200"} #end)
(#3 expr last'nbNonP + 1
#pragma diagram {"xy":"h-12000;v0","wh":"20000;3200"} #end)
(#4 wire #3 => #2)
#pragma diagram {"xy":"h0;v-7700","wh":"52000;7200"} #end
}
| PANGRAM :
{
diagram
(#5 def nbPangram
#pragma diagram {"xy":"h17000;v0","wh":"14000;3200"} #end)
(#6 expr last'nbPangram + 1
#pragma diagram {"xy":"h-13000;v0","wh":"22000;3200"} #end)
(#7 wire #6 => #5)
#pragma diagram {"xy":"h0;v3359","wh":"52000;7200"} #end
}
| PERFECT_PANGRAM :
{
diagram
(#8 def nbPerfectP
#pragma diagram {"xy":"h17000;v0","wh":"14000;3200"} #end)
(#9 expr last'nbPerfectP + 1
#pragma diagram {"xy":"h-13000;v0","wh":"22000;3200"} #end)
(#10 wire #9 => #8)
#pragma diagram {"xy":"h0;v14419","wh":"52000;7200"} #end
}
#pragma diagram {"xy":"h-3025;v-1000","wh":"52000;36038"} #end)
returns (nbNonP: last=0_ui32,
nbPangram: last=0_ui32,
nbPerfectP: last=0_ui32)
#pragma diagram {"xy":"H-18350;V-17991","wh":"68650;54038"} #end)
(#11 def countNonPangrams
#pragma diagram {"xy":"H43925;V-26691","wh":"20000;3200"} #end)
(#12 def countPangrams
#pragma diagram {"xy":"H42925;V-15631","wh":"18000;3200"} #end)
(#13 def countPerfectPangrams
#pragma diagram {"xy":"H45925;V-4572","wh":"24000;3200"} #end)
(#14 wire #0 .(1) => #11
#pragma diagram {"wp":"v-8700|#0 #11"} #end)
(#15 wire #0 .(2) => #12
#pragma diagram {"wp":"v2360|#0 #12"} #end)
(#16 wire #0 .(3) => #13
#pragma diagram {"wp":"v13419|#0 #13"} #end)
}
type PangramType = enum { NOT_PANGRAM, PANGRAM, PERFECT_PANGRAM };
const STR_LENGTH: int32 = 64;



Posted in StackOverflow: https://stackoverflow.com/beta/challenges/79767716/79778922