Welcome to Software Development on Codidact!
Will you help us build our independent community of developers helping developers? We're small and trying to grow. We welcome questions about all aspects of software development, from design to code to QA and more. Got questions? Got answers? Got code you'd like someone to review? Please join us.
Post History
Hi, I'm trying to code an Enigma machine in Haskell which were used by the German in WWII to transmit coded messages. An Enigma Machine consists of 3 rotors which are substitution ciphers and a re...
#6: Post edited
Why does my code show an error at deriving (eq)? Could someone help me check my code above, thanks!!
- Why does my code show an error at deriving (eq)? (SOLVED) NEW ERROR: At SimpleEnigma & SteckeredEnigma constructors which I need help on :")
#5: Post edited
- Hi, I'm trying to code an Enigma machine in Haskell which were used by the German in WWII to transmit coded messages. An Enigma Machine consists of 3 rotors which are substitution ciphers and a reflector which contains 13 pairs of characters. To encode a character it is first encoded by the first rotor, then the encoded character from this is passed to the second rotor and then so on through one more rotor to a reflector which swaps this new character with the one it is paired with. This paired character is then encoded in reverse back the opposite way through the rotors until you end up with a final encoded character.
- Before an individual character is encoded the rotors are shifted. If you had a very long message, before anything is encoded the first rotor is shifted one place, this character is then passed through the system and encoded. Then before the second character is encoded the first rotor is shifted again. The rotor is continually shifted until it reaches the start again. After the 25th character has been encoded, the first rotor reaches where it started from but now the second rotor shifts one place. The first rotor then turns another 26 times before the second rotor turns again. When the second rotor has turned 26 times the third rotor turns once. This keeps happening until 25 25 25 is reached at which point they reset back to 0 0 0 and the cycle starts again.
**My problem: In this code I'm having an error at `deriving (eq)` here (I've added a comment beside it so it stands out), it says that there is an illegal deriving item 'eq' in the data declaration for 'Enigma' typecheck.** Also I'm not done yet (just coded halfway) so if you see that I'm missing something please tell me about it, I'm also not sure if I'm coding it right as well.- ```module Enigma where
- import Data.Char
- import Data.Maybe
- {- Part 1: Simulation of the Enigma -}
- type Rotor = (String, Enigma)
- type Reflector = [(Char, Char)]
- type Offset = Int
- type Offsets = (Offset, Offset, Offset)
- type Stecker = [(Char, Char)]
- --Plugboard is the stecker
- data Enigma = SimpleEnigma Rotor Rotor Rotor Reflector Offsets
- | SteckeredEnigma Rotor Rotor Rotor Reflector Offsets Stecker
deriving (eq) -- ERROR here with a red underline on eq- SimpleEnigma = SimpleEnigma rotor1 rotor2 rotor3 reflectorB offsets
SteckeredEnigma = SteckeredEnigma rotor1 rotor2 rotor3 reflectorB offsets steckerB- offset_step :: Offsets->Offsets
- offset_step (l, m, 25) = offset (l, m, 0) --left, middle, right
- offset_step (l, m, r) = (l, m, r+1)
- offsetlm :: Offsets->Offsets
- offsetlm (l, 25, 0) = (offset)
- offsetlm (l,m,0)=(l,m+1,0)
- offsetl :: Offsets->Offsets
- offsetl (25,0,0)= (0,0,0)
- offsetl (l,0,0)=(l+1,0,0)
- offsetN :: Offsets->Int->Offsets
- offsetN os 0 = os
- offsetN os n = offsetN (offset_step os) (n-1)
- offsetN os 0 = os
- offsetN os n = offsetN (offset_step os) (n-1)
- enigmaEncodeA x (SimpleEnigma lr mr rr ref) (ol,om,or)=
- reverseEncode rr or -- left rotor returning
- (reverseEncode mr om -- middle rotor returning
- (reverseEncode lr ol -- left rotor returning
- (reflect -- fixed reflector
- (encode lr ol -- left rotor forward
- (encode mr om-- mid rotor forward
- (encode rr or x) -- right rotor forward
- )
- )
- ref
- )
- )
- )
- encodeMessage :: String -> Enigma -> String
- encodeMessage _ _ = "" -- you need to complete this!
- encodeMessage x e os = enigmaEncodeA x e (offset_step os)
- {- Useful definitions and functions -}
- -- substitution cyphers for the Enigma rotors
- -- as pairs of (wirings, knock-on position)
- -- knock-on position is where it will cause the next left wheel to
- -- advance when it moves past this position
- --"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- rotor1=("EKMFLGDQVZNTOWYHXUSPAIBRCJ",17::Int) --Knock-on position:17
- rotor2=("AJDKSIRUXBLHWTMCQGZNPYFVOE",5::Int) --Knock-on position: 5
- rotor3=("BDFHJLCPRTXVZNYEIWGAKMUSQO",22::Int)
- rotor4=("ESOVPZJAYQUIRHXLNFTGKDCMWB",10::Int)
- rotor5=("VZBRGITYUPSDNHLXAWMJQOFECK",0::Int)
- {- the standard Enigma reflector (Reflector B)
- swapped A<->Y, B<->R, C<->U,D<->H, E<->Q, F<->S, G<->L,
- I<->P, J<->X, K<->N, M<->O, T<->Z,V<->W
- -}
- reflectorB= [('A','Y'),
- ('B','R'),
- ('C','U'),
- ('D','H'),
- ('E','Q'),
- ('F','S'),
- ('G','L'),
- ('I','P'),
- ('J','X'),
- ('K','N'),
- ('M','O'),
- ('T','Z'),
- ('V','W')]
- {- alphaPos: given an uppercase letter, returns its index in the alphabet
- ('A' = position 0; 'Z' = position 25)
- -}
- alphaPos :: Char -> Int
- alphaPos c = (ord c) - ord 'A'
- ```
- **I've added a picture of how the Enigma machine words by mapping the characters and creating offsets for the rotors for your reference, below:**
- ![Enigma Machine Algorithm](https://software.codidact.com/uploads/QG3Y8isgk6tXVdUiDtW45w3K)
- **Thanks, any help is greatly appreciated!! :-)**
- Hi, I'm trying to code an Enigma machine in Haskell which were used by the German in WWII to transmit coded messages. An Enigma Machine consists of 3 rotors which are substitution ciphers and a reflector which contains 13 pairs of characters. To encode a character it is first encoded by the first rotor, then the encoded character from this is passed to the second rotor and then so on through one more rotor to a reflector which swaps this new character with the one it is paired with. This paired character is then encoded in reverse back the opposite way through the rotors until you end up with a final encoded character.
- Before an individual character is encoded the rotors are shifted. If you had a very long message, before anything is encoded the first rotor is shifted one place, this character is then passed through the system and encoded. Then before the second character is encoded the first rotor is shifted again. The rotor is continually shifted until it reaches the start again. After the 25th character has been encoded, the first rotor reaches where it started from but now the second rotor shifts one place. The first rotor then turns another 26 times before the second rotor turns again. When the second rotor has turned 26 times the third rotor turns once. This keeps happening until 25 25 25 is reached at which point they reset back to 0 0 0 and the cycle starts again.
- **My problems:** The `deriving (eq)` here (I've added a comment beside it so it stands out) has been solved, thank you. Currently, it says that:
- **Constructor 'SimpleEnigma' should have 5 arguments, but was given none in the pattern: SimpleEnigma.
- In a pattern binding: SimpleEnigma = SimpleEnigma rotor1 rotor2 rotor3 reflectorB offsets typecheck**
- **Constructor 'SteckeredEnigma' should have 6 arguments, but was given none in the pattern: SteckeredEnigma.
- In a pattern binding: SteckeredEnigma = SteckeredEnigma rotor1 rotor2 rotor3 reflectorB offsets typecheck**
- How can I resolve the issue here?
- Also I'm not done yet (just coded halfway) so if you see that I'm missing something please tell me about it, I'm also not sure if I'm coding it right as well.
- ```module Enigma where
- import Data.Char
- import Data.Maybe
- {- Part 1: Simulation of the Enigma -}
- type Rotor = (String, Enigma)
- type Reflector = [(Char, Char)]
- type Offset = Int
- type Offsets = (Offset, Offset, Offset)
- type Stecker = [(Char, Char)]
- --Plugboard is the stecker
- data Enigma = SimpleEnigma Rotor Rotor Rotor Reflector Offsets
- | SteckeredEnigma Rotor Rotor Rotor Reflector Offsets Stecker
- deriving (eq) -- ERROR here with a red underline on eq (ERROR FIXED)
- {-ERROR BELOW: Constructor 'SimpleEnigma' should have 5 arguments, but was given none in the pattern: SimpleEnigma.
- Constructor 'SteckeredEnigma' should have 6 arguments, but was given none in the pattern: SteckeredEnigma.-}
- SimpleEnigma = SimpleEnigma rotor1 rotor2 rotor3 reflectorB offsets
- SteckeredEnigma = SteckeredEnigma rotor1 rotor2 rotor3 reflectorB offsets steckerB
- offset_step :: Offsets->Offsets
- offset_step (l, m, 25) = offset (l, m, 0) --left, middle, right
- offset_step (l, m, r) = (l, m, r+1)
- offsetlm :: Offsets->Offsets
- offsetlm (l, 25, 0) = (offset)
- offsetlm (l,m,0)=(l,m+1,0)
- offsetl :: Offsets->Offsets
- offsetl (25,0,0)= (0,0,0)
- offsetl (l,0,0)=(l+1,0,0)
- offsetN :: Offsets->Int->Offsets
- offsetN os 0 = os
- offsetN os n = offsetN (offset_step os) (n-1)
- offsetN os 0 = os
- offsetN os n = offsetN (offset_step os) (n-1)
- enigmaEncodeA x (SimpleEnigma lr mr rr ref) (ol,om,or)=
- reverseEncode rr or -- left rotor returning
- (reverseEncode mr om -- middle rotor returning
- (reverseEncode lr ol -- left rotor returning
- (reflect -- fixed reflector
- (encode lr ol -- left rotor forward
- (encode mr om-- mid rotor forward
- (encode rr or x) -- right rotor forward
- )
- )
- ref
- )
- )
- )
- encodeMessage :: String -> Enigma -> String
- encodeMessage _ _ = "" -- you need to complete this!
- encodeMessage x e os = enigmaEncodeA x e (offset_step os)
- {- Useful definitions and functions -}
- -- substitution cyphers for the Enigma rotors
- -- as pairs of (wirings, knock-on position)
- -- knock-on position is where it will cause the next left wheel to
- -- advance when it moves past this position
- --"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- rotor1=("EKMFLGDQVZNTOWYHXUSPAIBRCJ",17::Int) --Knock-on position:17
- rotor2=("AJDKSIRUXBLHWTMCQGZNPYFVOE",5::Int) --Knock-on position: 5
- rotor3=("BDFHJLCPRTXVZNYEIWGAKMUSQO",22::Int)
- rotor4=("ESOVPZJAYQUIRHXLNFTGKDCMWB",10::Int)
- rotor5=("VZBRGITYUPSDNHLXAWMJQOFECK",0::Int)
- {- the standard Enigma reflector (Reflector B)
- swapped A<->Y, B<->R, C<->U,D<->H, E<->Q, F<->S, G<->L,
- I<->P, J<->X, K<->N, M<->O, T<->Z,V<->W
- -}
- reflectorB= [('A','Y'),
- ('B','R'),
- ('C','U'),
- ('D','H'),
- ('E','Q'),
- ('F','S'),
- ('G','L'),
- ('I','P'),
- ('J','X'),
- ('K','N'),
- ('M','O'),
- ('T','Z'),
- ('V','W')]
- {- alphaPos: given an uppercase letter, returns its index in the alphabet
- ('A' = position 0; 'Z' = position 25)
- -}
- alphaPos :: Char -> Int
- alphaPos c = (ord c) - ord 'A'
- ```
- **I've added a picture of how the Enigma machine words by mapping the characters and creating offsets for the rotors for your reference, below:**
- ![Enigma Machine Algorithm](https://software.codidact.com/uploads/QG3Y8isgk6tXVdUiDtW45w3K)
- **Thanks, any help is greatly appreciated!! :-)**
#3: Post edited
- Hi, I'm trying to code an Enigma machine in Haskell which were used by the German in WWII to transmit coded messages. An Enigma Machine consists of 3 rotors which are substitution ciphers and a reflector which contains 13 pairs of characters. To encode a character it is first encoded by the first rotor, then the encoded character from this is passed to the second rotor and then so on through one more rotor to a reflector which swaps this new character with the one it is paired with. This paired character is then encoded in reverse back the opposite way through the rotors until you end up with a final encoded character.
- Before an individual character is encoded the rotors are shifted. If you had a very long message, before anything is encoded the first rotor is shifted one place, this character is then passed through the system and encoded. Then before the second character is encoded the first rotor is shifted again. The rotor is continually shifted until it reaches the start again. After the 25th character has been encoded, the first rotor reaches where it started from but now the second rotor shifts one place. The first rotor then turns another 26 times before the second rotor turns again. When the second rotor has turned 26 times the third rotor turns once. This keeps happening until 25 25 25 is reached at which point they reset back to 0 0 0 and the cycle starts again.
- **My problem: In this code I'm having an error at `deriving (eq)` here (I've added a comment beside it so it stands out), it says that there is an illegal deriving item 'eq' in the data declaration for 'Enigma' typecheck.** Also I'm not done yet (just coded halfway) so if you see that I'm missing something please tell me about it, I'm also not sure if I'm coding it right as well.
- ```module Enigma where
import Data.Char -- to use functions on charactersimport Data.Maybe -- breakEnigma uses Maybe type- {- Part 1: Simulation of the Enigma -}
- type Rotor = (String, Enigma)
- type Reflector = [(Char, Char)]
- type Offset = Int
- type Offsets = (Offset, Offset, Offset)
- type Stecker = [(Char, Char)]
- --Plugboard is the stecker
- data Enigma = SimpleEnigma Rotor Rotor Rotor Reflector Offsets
- | SteckeredEnigma Rotor Rotor Rotor Reflector Offsets Stecker
- deriving (eq) -- ERROR here with a red underline on eq
- SimpleEnigma = SimpleEnigma rotor1 rotor2 rotor3 reflectorB offsets
- SteckeredEnigma = SteckeredEnigma rotor1 rotor2 rotor3 reflectorB offsets steckerB
- offset_step :: Offsets->Offsets
- offset_step (l, m, 25) = offset (l, m, 0) --left, middle, right
- offset_step (l, m, r) = (l, m, r+1)
- offsetlm :: Offsets->Offsets
- offsetlm (l, 25, 0) = (offset)
- offsetlm (l,m,0)=(l,m+1,0)
- offsetl :: Offsets->Offsets
- offsetl (25,0,0)= (0,0,0)
- offsetl (l,0,0)=(l+1,0,0)
- offsetN :: Offsets->Int->Offsets
- offsetN os 0 = os
- offsetN os n = offsetN (offset_step os) (n-1)
- offsetN os 0 = os
- offsetN os n = offsetN (offset_step os) (n-1)
- enigmaEncodeA x (SimpleEnigma lr mr rr ref) (ol,om,or)=
- reverseEncode rr or -- left rotor returning
- (reverseEncode mr om -- middle rotor returning
- (reverseEncode lr ol -- left rotor returning
- (reflect -- fixed reflector
- (encode lr ol -- left rotor forward
- (encode mr om-- mid rotor forward
- (encode rr or x) -- right rotor forward
- )
- )
- ref
- )
- )
- )
- encodeMessage :: String -> Enigma -> String
- encodeMessage _ _ = "" -- you need to complete this!
- encodeMessage x e os = enigmaEncodeA x e (offset_step os)
- {- Useful definitions and functions -}
- -- substitution cyphers for the Enigma rotors
- -- as pairs of (wirings, knock-on position)
- -- knock-on position is where it will cause the next left wheel to
- -- advance when it moves past this position
- --"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- rotor1=("EKMFLGDQVZNTOWYHXUSPAIBRCJ",17::Int) --Knock-on position:17
- rotor2=("AJDKSIRUXBLHWTMCQGZNPYFVOE",5::Int) --Knock-on position: 5
- rotor3=("BDFHJLCPRTXVZNYEIWGAKMUSQO",22::Int)
- rotor4=("ESOVPZJAYQUIRHXLNFTGKDCMWB",10::Int)
- rotor5=("VZBRGITYUPSDNHLXAWMJQOFECK",0::Int)
- {- the standard Enigma reflector (Reflector B)
- swapped A<->Y, B<->R, C<->U,D<->H, E<->Q, F<->S, G<->L,
- I<->P, J<->X, K<->N, M<->O, T<->Z,V<->W
- -}
- reflectorB= [('A','Y'),
- ('B','R'),
- ('C','U'),
- ('D','H'),
- ('E','Q'),
- ('F','S'),
- ('G','L'),
- ('I','P'),
- ('J','X'),
- ('K','N'),
- ('M','O'),
- ('T','Z'),
- ('V','W')]
- {- alphaPos: given an uppercase letter, returns its index in the alphabet
- ('A' = position 0; 'Z' = position 25)
- -}
- alphaPos :: Char -> Int
- alphaPos c = (ord c) - ord 'A'
- ```
- **I've added a picture of how the Enigma machine words by mapping the characters and creating offsets for the rotors for your reference, below:**
- ![Enigma Machine Algorithm](https://software.codidact.com/uploads/QG3Y8isgk6tXVdUiDtW45w3K)
- **Thanks, any help is greatly appreciated!! :-)**
- Hi, I'm trying to code an Enigma machine in Haskell which were used by the German in WWII to transmit coded messages. An Enigma Machine consists of 3 rotors which are substitution ciphers and a reflector which contains 13 pairs of characters. To encode a character it is first encoded by the first rotor, then the encoded character from this is passed to the second rotor and then so on through one more rotor to a reflector which swaps this new character with the one it is paired with. This paired character is then encoded in reverse back the opposite way through the rotors until you end up with a final encoded character.
- Before an individual character is encoded the rotors are shifted. If you had a very long message, before anything is encoded the first rotor is shifted one place, this character is then passed through the system and encoded. Then before the second character is encoded the first rotor is shifted again. The rotor is continually shifted until it reaches the start again. After the 25th character has been encoded, the first rotor reaches where it started from but now the second rotor shifts one place. The first rotor then turns another 26 times before the second rotor turns again. When the second rotor has turned 26 times the third rotor turns once. This keeps happening until 25 25 25 is reached at which point they reset back to 0 0 0 and the cycle starts again.
- **My problem: In this code I'm having an error at `deriving (eq)` here (I've added a comment beside it so it stands out), it says that there is an illegal deriving item 'eq' in the data declaration for 'Enigma' typecheck.** Also I'm not done yet (just coded halfway) so if you see that I'm missing something please tell me about it, I'm also not sure if I'm coding it right as well.
- ```module Enigma where
- import Data.Char
- import Data.Maybe
- {- Part 1: Simulation of the Enigma -}
- type Rotor = (String, Enigma)
- type Reflector = [(Char, Char)]
- type Offset = Int
- type Offsets = (Offset, Offset, Offset)
- type Stecker = [(Char, Char)]
- --Plugboard is the stecker
- data Enigma = SimpleEnigma Rotor Rotor Rotor Reflector Offsets
- | SteckeredEnigma Rotor Rotor Rotor Reflector Offsets Stecker
- deriving (eq) -- ERROR here with a red underline on eq
- SimpleEnigma = SimpleEnigma rotor1 rotor2 rotor3 reflectorB offsets
- SteckeredEnigma = SteckeredEnigma rotor1 rotor2 rotor3 reflectorB offsets steckerB
- offset_step :: Offsets->Offsets
- offset_step (l, m, 25) = offset (l, m, 0) --left, middle, right
- offset_step (l, m, r) = (l, m, r+1)
- offsetlm :: Offsets->Offsets
- offsetlm (l, 25, 0) = (offset)
- offsetlm (l,m,0)=(l,m+1,0)
- offsetl :: Offsets->Offsets
- offsetl (25,0,0)= (0,0,0)
- offsetl (l,0,0)=(l+1,0,0)
- offsetN :: Offsets->Int->Offsets
- offsetN os 0 = os
- offsetN os n = offsetN (offset_step os) (n-1)
- offsetN os 0 = os
- offsetN os n = offsetN (offset_step os) (n-1)
- enigmaEncodeA x (SimpleEnigma lr mr rr ref) (ol,om,or)=
- reverseEncode rr or -- left rotor returning
- (reverseEncode mr om -- middle rotor returning
- (reverseEncode lr ol -- left rotor returning
- (reflect -- fixed reflector
- (encode lr ol -- left rotor forward
- (encode mr om-- mid rotor forward
- (encode rr or x) -- right rotor forward
- )
- )
- ref
- )
- )
- )
- encodeMessage :: String -> Enigma -> String
- encodeMessage _ _ = "" -- you need to complete this!
- encodeMessage x e os = enigmaEncodeA x e (offset_step os)
- {- Useful definitions and functions -}
- -- substitution cyphers for the Enigma rotors
- -- as pairs of (wirings, knock-on position)
- -- knock-on position is where it will cause the next left wheel to
- -- advance when it moves past this position
- --"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- rotor1=("EKMFLGDQVZNTOWYHXUSPAIBRCJ",17::Int) --Knock-on position:17
- rotor2=("AJDKSIRUXBLHWTMCQGZNPYFVOE",5::Int) --Knock-on position: 5
- rotor3=("BDFHJLCPRTXVZNYEIWGAKMUSQO",22::Int)
- rotor4=("ESOVPZJAYQUIRHXLNFTGKDCMWB",10::Int)
- rotor5=("VZBRGITYUPSDNHLXAWMJQOFECK",0::Int)
- {- the standard Enigma reflector (Reflector B)
- swapped A<->Y, B<->R, C<->U,D<->H, E<->Q, F<->S, G<->L,
- I<->P, J<->X, K<->N, M<->O, T<->Z,V<->W
- -}
- reflectorB= [('A','Y'),
- ('B','R'),
- ('C','U'),
- ('D','H'),
- ('E','Q'),
- ('F','S'),
- ('G','L'),
- ('I','P'),
- ('J','X'),
- ('K','N'),
- ('M','O'),
- ('T','Z'),
- ('V','W')]
- {- alphaPos: given an uppercase letter, returns its index in the alphabet
- ('A' = position 0; 'Z' = position 25)
- -}
- alphaPos :: Char -> Int
- alphaPos c = (ord c) - ord 'A'
- ```
- **I've added a picture of how the Enigma machine words by mapping the characters and creating offsets for the rotors for your reference, below:**
- ![Enigma Machine Algorithm](https://software.codidact.com/uploads/QG3Y8isgk6tXVdUiDtW45w3K)
- **Thanks, any help is greatly appreciated!! :-)**
#2: Post edited
- Hi, I'm trying to code an Enigma machine in Haskell which were used by the German in WWII to transmit coded messages. An Enigma Machine consists of 3 rotors which are substitution ciphers and a reflector which contains 13 pairs of characters. To encode a character it is first encoded by the first rotor, then the encoded character from this is passed to the second rotor and then so on through one more rotor to a reflector which swaps this new character with the one it is paired with. This paired character is then encoded in reverse back the opposite way through the rotors until you end up with a final encoded character.
- Before an individual character is encoded the rotors are shifted. If you had a very long message, before anything is encoded the first rotor is shifted one place, this character is then passed through the system and encoded. Then before the second character is encoded the first rotor is shifted again. The rotor is continually shifted until it reaches the start again. After the 25th character has been encoded, the first rotor reaches where it started from but now the second rotor shifts one place. The first rotor then turns another 26 times before the second rotor turns again. When the second rotor has turned 26 times the third rotor turns once. This keeps happening until 25 25 25 is reached at which point they reset back to 0 0 0 and the cycle starts again.
- **My problem: In this code I'm having an error at `deriving (eq)` here (I've added a comment beside it so it stands out), it says that there is an illegal deriving item 'eq' in the data declaration for 'Enigma' typecheck.** Also I'm not done yet (just coded halfway) so if you see that I'm missing something please tell me about it, I'm also not sure if I'm coding it right as well.
- ```module Enigma where
- import Data.Char -- to use functions on characters
- import Data.Maybe -- breakEnigma uses Maybe type
-- add extra imports if needed, but only standard library functions!- {- Part 1: Simulation of the Enigma -}
- type Rotor = (String, Enigma)
- type Reflector = [(Char, Char)]
- type Offset = Int
- type Offsets = (Offset, Offset, Offset)
- type Stecker = [(Char, Char)]
- --Plugboard is the stecker
- data Enigma = SimpleEnigma Rotor Rotor Rotor Reflector Offsets
- | SteckeredEnigma Rotor Rotor Rotor Reflector Offsets Stecker
- deriving (eq) -- ERROR here with a red underline on eq
- SimpleEnigma = SimpleEnigma rotor1 rotor2 rotor3 reflectorB offsets
- SteckeredEnigma = SteckeredEnigma rotor1 rotor2 rotor3 reflectorB offsets steckerB
- offset_step :: Offsets->Offsets
- offset_step (l, m, 25) = offset (l, m, 0) --left, middle, right
- offset_step (l, m, r) = (l, m, r+1)
- offsetlm :: Offsets->Offsets
- offsetlm (l, 25, 0) = (offset)
- offsetlm (l,m,0)=(l,m+1,0)
- offsetl :: Offsets->Offsets
- offsetl (25,0,0)= (0,0,0)
- offsetl (l,0,0)=(l+1,0,0)
- offsetN :: Offsets->Int->Offsets
- offsetN os 0 = os
- offsetN os n = offsetN (offset_step os) (n-1)
- offsetN os 0 = os
- offsetN os n = offsetN (offset_step os) (n-1)
- enigmaEncodeA x (SimpleEnigma lr mr rr ref) (ol,om,or)=
- reverseEncode rr or -- left rotor returning
- (reverseEncode mr om -- middle rotor returning
- (reverseEncode lr ol -- left rotor returning
- (reflect -- fixed reflector
- (encode lr ol -- left rotor forward
- (encode mr om-- mid rotor forward
- (encode rr or x) -- right rotor forward
- )
- )
- ref
- )
- )
- )
- encodeMessage :: String -> Enigma -> String
- encodeMessage _ _ = "" -- you need to complete this!
- encodeMessage x e os = enigmaEncodeA x e (offset_step os)
{- You will need to add many more functions. Remember, design it carefully- and keep it simple! If things are feeling complicated, step back from your- code and think about the design again.-}{- Part 2: Finding the Longest Menu -}{- -- here!!type Menu = -- the supplied type is not correct; fix it!type Crib = bool -- the supplied type is not correct; fix it!longestMenu :: Crib -> MenulongestMenu _ = False{- Part 3: Simulating the Bombe -}breakEnigma :: Crib -> Maybe (Offsets, Stecker)breakEnigma _ = Nothing-} --here!!- {- Useful definitions and functions -}
- -- substitution cyphers for the Enigma rotors
- -- as pairs of (wirings, knock-on position)
- -- knock-on position is where it will cause the next left wheel to
- -- advance when it moves past this position
- --"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
rotor1=("EKMFLGDQVZNTOWYHXUSPAIBRCJ",17::Int) --17rotor2=("AJDKSIRUXBLHWTMCQGZNPYFVOE",5::Int) --5rotor3=("BDFHJLCPRTXVZNYEIWGAKMUSQO",22::Int) --22- rotor4=("ESOVPZJAYQUIRHXLNFTGKDCMWB",10::Int)
- rotor5=("VZBRGITYUPSDNHLXAWMJQOFECK",0::Int)
- {- the standard Enigma reflector (Reflector B)
- swapped A<->Y, B<->R, C<->U,D<->H, E<->Q, F<->S, G<->L,
- I<->P, J<->X, K<->N, M<->O, T<->Z,V<->W
- -}
- reflectorB= [('A','Y'),
- ('B','R'),
- ('C','U'),
- ('D','H'),
- ('E','Q'),
- ('F','S'),
- ('G','L'),
- ('I','P'),
- ('J','X'),
- ('K','N'),
- ('M','O'),
- ('T','Z'),
- ('V','W')]
- {- alphaPos: given an uppercase letter, returns its index in the alphabet
- ('A' = position 0; 'Z' = position 25)
- -}
- alphaPos :: Char -> Int
- alphaPos c = (ord c) - ord 'A'
- ```
- **I've added a picture of how the Enigma machine words by mapping the characters and creating offsets for the rotors for your reference, below:**
- ![Enigma Machine Algorithm](https://software.codidact.com/uploads/QG3Y8isgk6tXVdUiDtW45w3K)
- **Thanks, any help is greatly appreciated!! :-)**
- Hi, I'm trying to code an Enigma machine in Haskell which were used by the German in WWII to transmit coded messages. An Enigma Machine consists of 3 rotors which are substitution ciphers and a reflector which contains 13 pairs of characters. To encode a character it is first encoded by the first rotor, then the encoded character from this is passed to the second rotor and then so on through one more rotor to a reflector which swaps this new character with the one it is paired with. This paired character is then encoded in reverse back the opposite way through the rotors until you end up with a final encoded character.
- Before an individual character is encoded the rotors are shifted. If you had a very long message, before anything is encoded the first rotor is shifted one place, this character is then passed through the system and encoded. Then before the second character is encoded the first rotor is shifted again. The rotor is continually shifted until it reaches the start again. After the 25th character has been encoded, the first rotor reaches where it started from but now the second rotor shifts one place. The first rotor then turns another 26 times before the second rotor turns again. When the second rotor has turned 26 times the third rotor turns once. This keeps happening until 25 25 25 is reached at which point they reset back to 0 0 0 and the cycle starts again.
- **My problem: In this code I'm having an error at `deriving (eq)` here (I've added a comment beside it so it stands out), it says that there is an illegal deriving item 'eq' in the data declaration for 'Enigma' typecheck.** Also I'm not done yet (just coded halfway) so if you see that I'm missing something please tell me about it, I'm also not sure if I'm coding it right as well.
- ```module Enigma where
- import Data.Char -- to use functions on characters
- import Data.Maybe -- breakEnigma uses Maybe type
- {- Part 1: Simulation of the Enigma -}
- type Rotor = (String, Enigma)
- type Reflector = [(Char, Char)]
- type Offset = Int
- type Offsets = (Offset, Offset, Offset)
- type Stecker = [(Char, Char)]
- --Plugboard is the stecker
- data Enigma = SimpleEnigma Rotor Rotor Rotor Reflector Offsets
- | SteckeredEnigma Rotor Rotor Rotor Reflector Offsets Stecker
- deriving (eq) -- ERROR here with a red underline on eq
- SimpleEnigma = SimpleEnigma rotor1 rotor2 rotor3 reflectorB offsets
- SteckeredEnigma = SteckeredEnigma rotor1 rotor2 rotor3 reflectorB offsets steckerB
- offset_step :: Offsets->Offsets
- offset_step (l, m, 25) = offset (l, m, 0) --left, middle, right
- offset_step (l, m, r) = (l, m, r+1)
- offsetlm :: Offsets->Offsets
- offsetlm (l, 25, 0) = (offset)
- offsetlm (l,m,0)=(l,m+1,0)
- offsetl :: Offsets->Offsets
- offsetl (25,0,0)= (0,0,0)
- offsetl (l,0,0)=(l+1,0,0)
- offsetN :: Offsets->Int->Offsets
- offsetN os 0 = os
- offsetN os n = offsetN (offset_step os) (n-1)
- offsetN os 0 = os
- offsetN os n = offsetN (offset_step os) (n-1)
- enigmaEncodeA x (SimpleEnigma lr mr rr ref) (ol,om,or)=
- reverseEncode rr or -- left rotor returning
- (reverseEncode mr om -- middle rotor returning
- (reverseEncode lr ol -- left rotor returning
- (reflect -- fixed reflector
- (encode lr ol -- left rotor forward
- (encode mr om-- mid rotor forward
- (encode rr or x) -- right rotor forward
- )
- )
- ref
- )
- )
- )
- encodeMessage :: String -> Enigma -> String
- encodeMessage _ _ = "" -- you need to complete this!
- encodeMessage x e os = enigmaEncodeA x e (offset_step os)
- {- Useful definitions and functions -}
- -- substitution cyphers for the Enigma rotors
- -- as pairs of (wirings, knock-on position)
- -- knock-on position is where it will cause the next left wheel to
- -- advance when it moves past this position
- --"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- rotor1=("EKMFLGDQVZNTOWYHXUSPAIBRCJ",17::Int) --Knock-on position:17
- rotor2=("AJDKSIRUXBLHWTMCQGZNPYFVOE",5::Int) --Knock-on position: 5
- rotor3=("BDFHJLCPRTXVZNYEIWGAKMUSQO",22::Int)
- rotor4=("ESOVPZJAYQUIRHXLNFTGKDCMWB",10::Int)
- rotor5=("VZBRGITYUPSDNHLXAWMJQOFECK",0::Int)
- {- the standard Enigma reflector (Reflector B)
- swapped A<->Y, B<->R, C<->U,D<->H, E<->Q, F<->S, G<->L,
- I<->P, J<->X, K<->N, M<->O, T<->Z,V<->W
- -}
- reflectorB= [('A','Y'),
- ('B','R'),
- ('C','U'),
- ('D','H'),
- ('E','Q'),
- ('F','S'),
- ('G','L'),
- ('I','P'),
- ('J','X'),
- ('K','N'),
- ('M','O'),
- ('T','Z'),
- ('V','W')]
- {- alphaPos: given an uppercase letter, returns its index in the alphabet
- ('A' = position 0; 'Z' = position 25)
- -}
- alphaPos :: Char -> Int
- alphaPos c = (ord c) - ord 'A'
- ```
- **I've added a picture of how the Enigma machine words by mapping the characters and creating offsets for the rotors for your reference, below:**
- ![Enigma Machine Algorithm](https://software.codidact.com/uploads/QG3Y8isgk6tXVdUiDtW45w3K)
- **Thanks, any help is greatly appreciated!! :-)**
#1: Initial revision
Why does my code show an error at deriving (eq)? Could someone help me check my code above, thanks!!
Hi, I'm trying to code an Enigma machine in Haskell which were used by the German in WWII to transmit coded messages. An Enigma Machine consists of 3 rotors which are substitution ciphers and a reflector which contains 13 pairs of characters. To encode a character it is first encoded by the first rotor, then the encoded character from this is passed to the second rotor and then so on through one more rotor to a reflector which swaps this new character with the one it is paired with. This paired character is then encoded in reverse back the opposite way through the rotors until you end up with a final encoded character. Before an individual character is encoded the rotors are shifted. If you had a very long message, before anything is encoded the first rotor is shifted one place, this character is then passed through the system and encoded. Then before the second character is encoded the first rotor is shifted again. The rotor is continually shifted until it reaches the start again. After the 25th character has been encoded, the first rotor reaches where it started from but now the second rotor shifts one place. The first rotor then turns another 26 times before the second rotor turns again. When the second rotor has turned 26 times the third rotor turns once. This keeps happening until 25 25 25 is reached at which point they reset back to 0 0 0 and the cycle starts again. **My problem: In this code I'm having an error at `deriving (eq)` here (I've added a comment beside it so it stands out), it says that there is an illegal deriving item 'eq' in the data declaration for 'Enigma' typecheck.** Also I'm not done yet (just coded halfway) so if you see that I'm missing something please tell me about it, I'm also not sure if I'm coding it right as well. ```module Enigma where import Data.Char -- to use functions on characters import Data.Maybe -- breakEnigma uses Maybe type -- add extra imports if needed, but only standard library functions! {- Part 1: Simulation of the Enigma -} type Rotor = (String, Enigma) type Reflector = [(Char, Char)] type Offset = Int type Offsets = (Offset, Offset, Offset) type Stecker = [(Char, Char)] --Plugboard is the stecker data Enigma = SimpleEnigma Rotor Rotor Rotor Reflector Offsets | SteckeredEnigma Rotor Rotor Rotor Reflector Offsets Stecker deriving (eq) -- ERROR here with a red underline on eq SimpleEnigma = SimpleEnigma rotor1 rotor2 rotor3 reflectorB offsets SteckeredEnigma = SteckeredEnigma rotor1 rotor2 rotor3 reflectorB offsets steckerB offset_step :: Offsets->Offsets offset_step (l, m, 25) = offset (l, m, 0) --left, middle, right offset_step (l, m, r) = (l, m, r+1) offsetlm :: Offsets->Offsets offsetlm (l, 25, 0) = (offset) offsetlm (l,m,0)=(l,m+1,0) offsetl :: Offsets->Offsets offsetl (25,0,0)= (0,0,0) offsetl (l,0,0)=(l+1,0,0) offsetN :: Offsets->Int->Offsets offsetN os 0 = os offsetN os n = offsetN (offset_step os) (n-1) offsetN os 0 = os offsetN os n = offsetN (offset_step os) (n-1) enigmaEncodeA x (SimpleEnigma lr mr rr ref) (ol,om,or)= reverseEncode rr or -- left rotor returning (reverseEncode mr om -- middle rotor returning (reverseEncode lr ol -- left rotor returning (reflect -- fixed reflector (encode lr ol -- left rotor forward (encode mr om-- mid rotor forward (encode rr or x) -- right rotor forward ) ) ref ) ) ) encodeMessage :: String -> Enigma -> String encodeMessage _ _ = "" -- you need to complete this! encodeMessage x e os = enigmaEncodeA x e (offset_step os) {- You will need to add many more functions. Remember, design it carefully - and keep it simple! If things are feeling complicated, step back from your - code and think about the design again. -} {- Part 2: Finding the Longest Menu -} {- -- here!! type Menu = -- the supplied type is not correct; fix it! type Crib = bool -- the supplied type is not correct; fix it! longestMenu :: Crib -> Menu longestMenu _ = False {- Part 3: Simulating the Bombe -} breakEnigma :: Crib -> Maybe (Offsets, Stecker) breakEnigma _ = Nothing -} --here!! {- Useful definitions and functions -} -- substitution cyphers for the Enigma rotors -- as pairs of (wirings, knock-on position) -- knock-on position is where it will cause the next left wheel to -- advance when it moves past this position --"ABCDEFGHIJKLMNOPQRSTUVWXYZ" rotor1=("EKMFLGDQVZNTOWYHXUSPAIBRCJ",17::Int) --17 rotor2=("AJDKSIRUXBLHWTMCQGZNPYFVOE",5::Int) --5 rotor3=("BDFHJLCPRTXVZNYEIWGAKMUSQO",22::Int) --22 rotor4=("ESOVPZJAYQUIRHXLNFTGKDCMWB",10::Int) rotor5=("VZBRGITYUPSDNHLXAWMJQOFECK",0::Int) {- the standard Enigma reflector (Reflector B) swapped A<->Y, B<->R, C<->U,D<->H, E<->Q, F<->S, G<->L, I<->P, J<->X, K<->N, M<->O, T<->Z,V<->W -} reflectorB= [('A','Y'), ('B','R'), ('C','U'), ('D','H'), ('E','Q'), ('F','S'), ('G','L'), ('I','P'), ('J','X'), ('K','N'), ('M','O'), ('T','Z'), ('V','W')] {- alphaPos: given an uppercase letter, returns its index in the alphabet ('A' = position 0; 'Z' = position 25) -} alphaPos :: Char -> Int alphaPos c = (ord c) - ord 'A' ``` **I've added a picture of how the Enigma machine words by mapping the characters and creating offsets for the rotors for your reference, below:** ![Enigma Machine Algorithm](https://software.codidact.com/uploads/QG3Y8isgk6tXVdUiDtW45w3K) **Thanks, any help is greatly appreciated!! :-)**