Skip to content

Instantly share code, notes, and snippets.

@jfthuong
Last active September 30, 2025 10:28
Show Gist options
  • Select an option

  • Save jfthuong/d6e7be545268256d3b724b67bcb48f3d to your computer and use it in GitHub Desktop.

Select an option

Save jfthuong/d6e7be545268256d3b724b67bcb48f3d to your computer and use it in GitHub Desktop.
Count Pangrams With Scade One.md

Implementation

Implementation of Challenge #7 in StackOverflow: https://stackoverflow.com/beta/challenges/79767716/code-challenge-7-pangram-checker

Graphical operators

Get Type

Get type of Pangram

Count pangrams by types

Count Pangrams by Type

Run with the list of 1000 strings

Result

Code

Imported C code to get ASCII Code

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

Swan files

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;
@jfthuong
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment