Skip to content

Instantly share code, notes, and snippets.

@Pagwin2
Created November 11, 2023 06:16
Show Gist options
  • Select an option

  • Save Pagwin2/07042faaa3e5ae275652874b47cb969f to your computer and use it in GitHub Desktop.

Select an option

Save Pagwin2/07042faaa3e5ae275652874b47cb969f to your computer and use it in GitHub Desktop.
electron subshell program
-- First Int is the Layer, second is the Fill of that layer
data SubShell = S Integer Integer | P Integer Integer | D Integer Integer | F Integer Integer deriving (Show, Eq)
instance Ord SubShell where
S l1 _ <= P l2 _ | l1==l2 = True
S l1 _ <= D l2 _ | l1==l2 = True
S l1 _ <= F l2 _ | l1==l2 = True
P l1 _ <= D l2 _ | l1==l2 = True
P l1 _ <= F l2 _ | l1==l2 = True
D l1 _ <= F l2 _ | l1==l2 = True
S l1 _ <= S l2 _ = l1 <= l2
S l1 _ <= P l2 _ = l1 <= l2
S l1 _ <= D l2 _ = l1 <= l2
S l1 _ <= F l2 _ = l1 <= l2
P l1 _ <= S l2 _ = l1 <= l2
P l1 _ <= P l2 _ = l1 <= l2
P l1 _ <= D l2 _ = l1 <= l2
P l1 _ <= F l2 _ = l1 <= l2
D l1 _ <= S l2 _ = l1 <= l2
D l1 _ <= P l2 _ = l1 <= l2
D l1 _ <= D l2 _ = l1 <= l2
D l1 _ <= F l2 _ = l1 <= l2
F l1 _ <= S l2 _ = l1 <= l2
F l1 _ <= P l2 _ = l1 <= l2
F l1 _ <= D l2 _ = l1 <= l2
F l1 _ <= F l2 _ = l1 <= l2
shellConstruct :: Integer -> [SubShell]
shellConstruct n = if n < 1 then [] else (reverse . emptyYeet) $ shellConstructHelper [] n
emptyYeet :: [SubShell] -> [SubShell]
emptyYeet (S layer 0:rem) = rem
emptyYeet (P layer 0:rem) = rem
emptyYeet (D layer 0:rem) = rem
emptyYeet (F layer 0:rem) = rem
emptyYeet list = list
shellConstructHelper :: [SubShell] -> Integer -> [SubShell]
-- initial starting spot for recursion
shellConstructHelper [] 0 = []
shellConstructHelper [] 1 = [S 1 1]
shellConstructHelper [] 2 = [S 1 2]
shellConstructHelper [] n = shellConstructHelper [S 1 2] $ n-2
-- shuttling up through the layers
shellConstructHelper (S layer 2: rem) n | layer >= 6 = shellConstructHelper ([F (layer-1) 0, S layer 2] ++ rem) n
shellConstructHelper (S layer 2: rem) n | layer >= 4 = shellConstructHelper ([D (layer-1) 0, S layer 2] ++ rem) n
shellConstructHelper (S layer 2: rem) n | layer >= 2 = shellConstructHelper ([P layer 0, S layer 2] ++ rem) n
shellConstructHelper (S layer 2: rem) n | layer < 2 = shellConstructHelper ([S (layer+1) 0, S layer 2] ++ rem) n
shellConstructHelper (P layer 6: rem) n = shellConstructHelper ([S (layer+1) 0, P layer 6] ++ rem) n
shellConstructHelper (D layer 10: rem) n = shellConstructHelper ([P (layer+1) 0, D layer 10] ++ rem) n
shellConstructHelper (F layer 14: rem) n = shellConstructHelper ([D (layer+1) 0, F layer 14] ++ rem) n
-- recursion base case
shellConstructHelper list 0 = list
-- shuttling electrons into each layer
shellConstructHelper (S layer electrons: rem) n = shellConstructHelper (S layer (electrons+1) : rem) $ n-1
shellConstructHelper (P layer electrons: rem) n = shellConstructHelper (P layer (electrons+1) : rem) $ n-1
shellConstructHelper (D layer electrons: rem) n = shellConstructHelper (D layer (electrons+1) : rem) $ n-1
shellConstructHelper (F layer electrons: rem) n = shellConstructHelper (F layer (electrons+1) : rem) $ n-1
electronsInShell :: SubShell -> Integer
electronsInShell (S _ n) = n
electronsInShell (P _ n) = n
electronsInShell (D _ n) = n
electronsInShell (F _ n) = n
shellInversion :: [SubShell] -> Integer
shellInversion = sum . map electronsInShell
fullDisplay :: [SubShell] -> String
fullDisplay = foldMap display
display :: SubShell -> String
display (S layer electrons) = l ++ "s^{" ++ e ++ "}"
where
l = show layer
e = show electrons
display (P layer electrons) = l ++ "p^{" ++ e ++ "}"
where
l = show layer
e = show electrons
display (D layer electrons) = l ++ "d^{" ++ e ++ "}"
where
l = show layer
e = show electrons
display (F layer electrons) = l ++ "f^{" ++ e ++ "}"
where
l = show layer
e = show electrons
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment