-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAppState.swift
74 lines (56 loc) · 1.77 KB
/
AppState.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
//
// AppState.swift
// Ciphers
//
// Created by Arjun B on 12/04/23.
//
import Foundation
enum AppPage: Int, CaseIterable {
case zero = 0
case one = 1
case two = 2
case three = 3
case four = 4
}
class AppState: ObservableObject {
@Published var page: AppPage = .zero
let encrypted = cshift(message: "VIEWED THROUGH HOLES OF LIGHT,\nHIDDEN IN PLAIN SIGHT, THE CLUE\nFACES LEFT FROM RIGHT", by: 10)
let decrypted = "VIEWED THROUGH HOLES OF LIGHT,\nHIDDEN IN PLAIN SIGHT, THE CLUE\nFACES LEFT FROM RIGHT"
let blocked = "...... ......H ....S O. ....T.\n.....N .. ...I. ...... ... C...\n.A... .... ...M ....."
let solution = "MACINTOSH"
var isFirstPage: Bool {
page.rawValue <= 0
}
var isLastPage: Bool {
page.rawValue >= AppPage.allCases.count - 1
}
func nextPage() {
if isLastPage { return }
page = AppPage(rawValue: page.rawValue + 1) ?? .zero
}
func prevPage() {
if isFirstPage { return }
page = AppPage(rawValue: page.rawValue - 1) ?? .zero
}
func reset() {
page = .zero
}
}
func cshift(message: String, by shift: Int) -> String {
let first = 65
let last = 65 + 25
let count = 26
let result = message.uppercased().utf8.map { char in
let value = Int(char)
// if not in A...Z, leave unchanged
if value < first || value > last {
return value
}
// amount by which character should be offset
var offset = (value - first) + shift
// bring within A...Z
offset = (offset % count + count) % count
return (first + offset)
}
return String(result.map { Character(UnicodeScalar($0)!) })
}