In the area of Discrete Mathematics there is an elegant problem about having a random set with random number of elements.
The problem is about finding a sequence of consecutive elements in the random set that gives the maximum possible sum.
I was using the R language because I can easily share the result in the web. R is a excellent statistical programming language which is accessible to everybody.
I am developing this short but elegant solution for the purpose of training my students which are enrolled in basic programming course.
To other students, somewhere out there, this example will help you understand the challenge of building nested for loops which is essential for learning any programming language.
password_creator = function(RandomSet,Size){
# declare containers
dat <- list()
Sums <- list()
txtdata <- NULL
counter = 0
# Gather all elements of the random set as a single value
# that is values are gathered without a comma
#
Reference_Set <- RandomSet[1]
for (i in 2:length(RandomSet)){
Reference_Set <- paste0(Reference_Set," ",RandomSet[i])
}
# start generating all possible subsets of
# consecutive elements
for (j in 2:Size){
for (i in 1:(Size-(j-1))){
data <- RandomSet[i]
txtdat <- RandomSet[i]
for (k in 1:(j-1)){
# accumulate data as a vector
data <- c(data, RandomSet[i+k])
# accumulate data as a single value
txtdat <- paste0(txtdat," ",RandomSet[i+k])
}
# fill up the temporary containers
counter = counter + 1
# store the data into a list
dat[[counter]] <- data
# Compute the sum of terms
Sums[[counter]] <- sum(data)
# store the text data into a list
txtdata[counter] <- txtdat
}
}
# Sums is a list but I want the actual values
# so I have to convert to single array format
# using the unlist command
Sumseq <- unlist(Sums)
# convert array to dataframe because I
# want to get the corresponding index number
Sumseq <- as.data.frame(Sumseq)
head(Sumseq)
# pull out the index numbers and put it inside the dataframe
# the index numbers are actually the row names
#
Sums <- cbind(row.names(Sumseq),Sumseq,txtdata,counter,Reference_Set)
tail(Sums)
# rename the column heading
colnames(Sums) <- c("Index","Sumseq","Sequence","Num_Subsets","Random_Set")
tail(Sums)
# Be sure that the column index is a numeric
Sums$Index <- as.numeric(Sums$Index)
# arrange the dataset according to highest sum
suppressPackageStartupMessages(library(dplyr))
(max_sum <- arrange(Sums,Sumseq))
# the highest sum occurs at the last row, so pick
# all values in the last row
(last_row_values <- max_sum[nrow(max_sum),])
# send the result to the boss
return(last_row_values)
}
# You must run first the entire function above so that the
# codes below will run
# You are the boss and you want to create a dynamic password
# with the property that the sun is maximum out of the possible
# sequence of consecutive elements
# Process 100 passwords
(UniversalSet <- -100:100)
## [1] -100 -99 -98 -97 -96 -95 -94 -93 -92 -91 -90 -89 -88 -87 -86
## [16] -85 -84 -83 -82 -81 -80 -79 -78 -77 -76 -75 -74 -73 -72 -71
## [31] -70 -69 -68 -67 -66 -65 -64 -63 -62 -61 -60 -59 -58 -57 -56
## [46] -55 -54 -53 -52 -51 -50 -49 -48 -47 -46 -45 -44 -43 -42 -41
## [61] -40 -39 -38 -37 -36 -35 -34 -33 -32 -31 -30 -29 -28 -27 -26
## [76] -25 -24 -23 -22 -21 -20 -19 -18 -17 -16 -15 -14 -13 -12 -11
## [91] -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4
## [106] 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
## [121] 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
## [136] 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
## [151] 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
## [166] 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
## [181] 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
## [196] 95 96 97 98 99 100
Container = matrix("",nrow=100,ncol=4)
# define marker If you want to get the same result
# as you run the module for several times
set.seed(123)
# I want to process 100 RandomSets of length between 10 to 20
for (n in 1:100){
# n=1
# pick any number from 10 to 20 as maximum size of a subset
Size <- sample(10:20,1)
# Generate the elements of a random subset using sample command
RandomSet <- sample(UniversalSet,Size,rep=FALSE)
# Function call that will return the sequence with the highest
# possible sum
result <- password_creator(RandomSet,Size)
# Deposit result to container per random set generated
Container[n,1] <- paste0( "Number ", result$Index, " out of ", result$Num_Subsets," subsets")
Container[n,2] <- result$Sum
Container[n,3] <- result$Sequence
Container[n,4] <- result$Random_Set
}
Container <- as.data.frame(Container)
colnames(Container) <- c("Details","Max_Sum","Consecutive Elements","Random_Set")
# Present as a nice table
suppressPackageStartupMessages(library(flextable))
Container <- flextable(Container)
Container <- autofit(Container)
Container <- theme_box(Container)
This table contains the list of consecutive integers that gives the maximum sum for any random set of positive or negative integers.
Details | Max_Sum | Consecutive Elements | Random_Set |
Number 65 out of 66 subsets | 388 | 94 69 -51 17 -58 100 96 52 -11 -10 90 | -87 94 69 -51 17 -58 100 96 52 -11 -10 90 |
Number 24 out of 153 subsets | 231 | 69 99 63 | -9 36 -2 -29 -75 -94 69 99 63 -23 -20 -58 2 16 -25 42 -69 8 |
Number 70 out of 120 subsets | 382 | 54 87 -48 34 94 96 65 | 36 68 -27 -78 54 87 -48 34 94 96 65 -67 -32 -29 -25 -38 |
Number 7 out of 55 subsets | 63 | 74 -11 | -4 -10 52 -63 -80 -60 74 -11 -41 -85 15 |
Number 51 out of 105 subsets | 197 | 99 -15 100 -62 58 17 | 99 -15 100 -62 58 17 -51 -67 -97 -88 -32 26 52 -49 -79 |
Number 136 out of 153 subsets | 231 | 67 11 -71 39 58 20 9 57 -37 41 -34 50 21 | 59 -76 -66 67 11 -71 39 58 20 9 57 -37 41 -34 50 21 -22 -16 |
Number 67 out of 91 subsets | 281 | 77 5 -3 98 26 73 -84 89 | 35 -50 -27 77 5 -3 98 26 73 -84 89 -55 -47 62 |
Number 105 out of 136 subsets | 432 | 12 6 34 50 53 1 59 94 54 69 | 9 -7 -22 -77 12 6 34 50 53 1 59 94 54 69 -96 -31 -85 |
Number 43 out of 136 subsets | 282 | 95 83 10 94 | -69 -80 -46 -26 63 -18 -62 -47 36 -53 -24 95 83 10 94 -100 67 |
Number 29 out of 78 subsets | 152 | 3 94 -8 63 | -85 -13 -47 75 -81 3 94 -8 63 -49 7 -79 76 |
Number 154 out of 171 subsets | 307 | 20 82 35 -55 -16 8 6 -24 73 71 59 -65 72 41 | -42 -17 -90 20 82 35 -55 -16 8 6 -24 73 71 59 -65 72 41 -85 24 |
Number 24 out of 45 subsets | 130 | 34 85 -40 51 | -61 67 -91 24 -92 -94 34 85 -40 51 |
Number 18 out of 105 subsets | 154 | 84 56 14 | 50 -75 -68 84 56 14 -91 -48 -47 6 -90 -76 -49 99 34 |
Number 84 out of 153 subsets | 162 | 9 33 -10 28 5 12 85 | -11 59 51 -44 4 0 -78 -87 9 33 -10 28 5 12 85 -20 -72 -75 |
Number 156 out of 190 subsets | 487 | 87 53 -60 33 58 -8 44 91 64 -44 47 62 60 | -94 87 53 -60 33 58 -8 44 91 64 -44 47 62 60 -35 -97 -27 32 16 -76 |
Number 119 out of 136 subsets | 536 | 45 69 58 33 88 4 75 44 72 -48 3 93 | -46 -16 -56 45 69 58 33 88 4 75 44 72 -48 3 93 -38 -8 |
Number 44 out of 45 subsets | 513 | 76 29 40 -77 99 94 98 64 90 | -99 76 29 40 -77 99 94 98 64 90 |
Number 64 out of 153 subsets | 335 | 69 88 97 5 65 11 | -88 69 88 97 5 65 11 -37 -21 -65 -66 -14 -34 -53 10 -78 36 -40 |
Number 5 out of 120 subsets | 92 | 21 71 | -70 -28 -65 -79 21 71 -60 -9 -8 24 -58 -62 64 6 -68 -18 |
Number 40 out of 55 subsets | 168 | 77 74 17 -34 14 20 | -80 -25 -7 -66 -71 77 74 17 -34 14 20 |
Number 51 out of 55 subsets | 439 | 1 69 67 98 100 -75 40 47 92 | -5 1 69 67 98 100 -75 40 47 92 -7 |
Number 148 out of 153 subsets | 220 | 35 66 -20 90 -19 5 18 -90 12 7 29 46 40 -70 57 14 | 35 66 -20 90 -19 5 18 -90 12 7 29 46 40 -70 57 14 -79 -7 |
Number 170 out of 171 subsets | 718 | 96 63 77 60 55 76 -89 80 95 -35 -51 74 78 16 33 27 21 42 | -85 96 63 77 60 55 76 -89 80 95 -35 -51 74 78 16 33 27 21 42 |
Number 7 out of 66 subsets | 6 | -1 7 | -42 -98 -4 -68 -53 -26 -1 7 -56 -91 69 -77 |
Number 5 out of 120 subsets | 45 | 38 7 | 45 -42 36 -48 38 7 -93 13 -96 -72 -51 -31 -27 -75 -28 -90 |
Number 101 out of 120 subsets | 362 | 83 -5 54 18 95 -13 55 -34 9 67 33 | -95 83 -5 54 18 95 -13 55 -34 9 67 33 -65 -46 22 19 |
Number 52 out of 78 subsets | 154 | 52 65 -1 4 -76 31 79 | -91 52 65 -1 4 -76 31 79 -79 16 -77 66 -54 |
Number 36 out of 91 subsets | 250 | 87 89 36 38 | 73 -47 -54 43 -82 58 21 -64 2 -53 87 89 36 38 |
Number 71 out of 190 subsets | 272 | 14 57 88 -46 98 61 | 14 57 88 -46 98 61 -44 25 -63 -17 -38 73 -23 -31 45 29 19 -26 -80 -14 |
Number 5 out of 136 subsets | 100 | 33 67 | -42 64 -20 -46 33 67 -95 27 10 55 -69 -52 -17 -54 47 29 11 |
Number 42 out of 120 subsets | 177 | 98 61 -13 31 | 14 -91 100 -42 -52 34 -40 65 7 -65 16 -78 98 61 -13 31 |
Number 100 out of 105 subsets | 443 | 56 85 83 78 77 -53 30 -68 61 -35 -37 67 99 | 56 85 83 78 77 -53 30 -68 61 -35 -37 67 99 -81 -23 |
Number 126 out of 153 subsets | 591 | 98 67 88 -6 49 22 -15 83 60 7 80 58 | 98 67 88 -6 49 22 -15 83 60 7 80 58 -55 -77 -41 57 50 -84 |
Number 171 out of 171 subsets | 335 | 86 84 70 -78 -56 35 -22 63 -34 -62 60 65 -73 -14 80 1 37 8 85 | 86 84 70 -78 -56 35 -22 63 -34 -62 60 65 -73 -14 80 1 37 8 85 |
Number 76 out of 153 subsets | 168 | 35 28 -21 17 93 -23 39 | 35 28 -21 17 93 -23 39 -29 26 -60 -93 84 -49 -34 67 -99 -36 34 |
Number 41 out of 78 subsets | 164 | 40 37 -7 26 68 | 23 -21 -94 -56 -25 -76 -10 40 37 -7 26 68 -89 |
Number 74 out of 136 subsets | 344 | 76 66 -14 21 62 33 100 | -30 -86 -18 76 66 -14 21 62 33 100 -97 -20 75 -93 80 -34 7 |
Number 38 out of 91 subsets | 199 | 55 33 36 60 15 | -87 55 33 36 60 15 -55 -37 -82 -3 28 79 -33 -11 |
Number 56 out of 171 subsets | 228 | 60 -40 50 68 90 | -26 32 -82 -66 60 -40 50 68 90 -52 -16 -32 -37 -25 -99 17 -83 -97 5 |
Number 26 out of 120 subsets | 174 | 79 7 88 | 17 -29 92 19 -90 -22 84 -45 5 -86 79 7 88 -12 -65 30 |
Number 65 out of 120 subsets | 251 | 32 -13 59 -12 93 92 | -33 19 -48 0 -77 100 -34 -90 -27 -8 32 -13 59 -12 93 92 |
Number 22 out of 66 subsets | 62 | 87 -70 -27 72 | 87 -70 -27 72 -42 -77 -66 -91 -37 -29 71 -59 |
Number 66 out of 120 subsets | 139 | 34 65 -84 27 60 8 29 | 34 65 -84 27 60 8 29 -22 10 -35 -31 9 -42 74 -92 -78 |
Number 24 out of 153 subsets | 157 | 4 70 83 | 42 11 -8 -80 18 -53 4 70 83 -97 -30 -45 -51 23 38 -26 -41 -16 |
Number 81 out of 171 subsets | 146 | 20 13 94 -2 -3 -43 67 | 20 13 94 -2 -3 -43 67 -88 -93 -99 22 -95 -14 -84 59 -24 -29 1 87 |
Number 20 out of 120 subsets | 168 | 73 41 54 | -46 23 -82 -86 73 41 54 -68 -51 -83 47 -10 -59 -27 -48 -38 |
Number 11 out of 153 subsets | 82 | 19 63 | 58 -18 -46 13 -83 7 -57 -9 -80 -72 19 63 -17 -78 -59 -19 -39 -37 |
Number 142 out of 190 subsets | 209 | 23 70 24 11 -96 -1 54 50 30 42 2 | 78 45 -91 -2 -18 -99 23 70 24 11 -96 -1 54 50 30 42 2 -43 34 -67 |
Number 32 out of 55 subsets | 175 | 44 34 35 -36 98 | -83 -55 -92 -22 44 34 35 -36 98 -2 -76 |
Number 46 out of 55 subsets | 258 | 38 95 -61 47 100 -83 81 41 | 38 95 -61 47 100 -83 81 41 -9 -34 9 |
Number 93 out of 120 subsets | 293 | 50 -22 -13 67 60 64 87 -72 20 52 | 50 -22 -13 67 60 64 87 -72 20 52 -59 53 -57 -93 43 -62 |
Number 19 out of 120 subsets | 247 | 83 70 94 | -36 -7 -43 83 70 94 -45 -79 44 -2 41 18 -37 -77 -93 47 |
Number 50 out of 136 subsets | 315 | 36 62 90 84 43 | -27 -15 77 -84 36 62 90 84 43 -49 -2 -66 81 -75 -88 -65 74 |
Number 26 out of 120 subsets | 159 | 62 82 15 | 52 -73 56 -57 -47 100 -72 47 -8 -88 62 82 15 -96 -45 -24 |
Number 44 out of 120 subsets | 183 | 71 -29 25 65 51 | -9 71 -29 25 65 51 -26 -14 -7 -53 -86 -36 81 -91 -15 -59 |
Number 42 out of 78 subsets | 188 | 61 90 -14 -25 76 | 68 -76 -7 79 -64 27 -74 -66 61 90 -14 -25 76 |
Number 10 out of 66 subsets | 159 | 68 91 | 56 -30 72 9 -67 24 -54 28 -91 68 91 -62 |
Number 46 out of 55 subsets | 200 | 7 33 59 2 88 -21 -11 43 | 7 33 59 2 88 -21 -11 43 -99 61 -23 |
Number 71 out of 91 subsets | 411 | 85 -71 66 -31 95 94 73 86 14 | 85 -71 66 -31 95 94 73 86 14 -53 37 -73 -34 28 |
Number 45 out of 45 subsets | 228 | 60 63 14 40 13 -22 -24 73 -7 18 | 60 63 14 40 13 -22 -24 73 -7 18 |
Number 11 out of 55 subsets | 86 | 7 77 2 | 7 77 2 -75 63 -65 -45 -44 -98 -90 -50 |
Number 171 out of 190 subsets | 472 | 0 93 49 44 32 14 -22 100 -39 62 -10 97 -12 42 22 | -5 0 93 49 44 32 14 -22 100 -39 62 -10 97 -12 42 22 -66 -71 61 -32 |
Number 31 out of 91 subsets | 200 | 36 89 72 3 | 98 29 -78 -80 -82 36 89 72 3 -69 -53 -86 53 47 |
Number 62 out of 66 subsets | 307 | 58 24 51 -84 -30 84 -24 62 85 81 | -46 58 24 51 -84 -30 84 -24 62 85 81 -88 |
Number 12 out of 78 subsets | 65 | 57 8 | 26 -76 -72 80 -85 68 -92 -64 -47 -77 -87 57 8 |
Number 19 out of 78 subsets | 89 | 75 -36 50 | 10 -61 18 66 -29 -87 75 -36 50 -75 -55 -78 48 |
Number 6 out of 45 subsets | 68 | -5 73 | -62 -30 -56 -54 -25 -5 73 -41 -18 -12 |
Number 36 out of 45 subsets | 251 | 36 8 25 9 50 58 65 | 36 8 25 9 50 58 65 -68 -21 -41 |
Number 97 out of 136 subsets | 99 | 73 -18 43 -95 79 -12 -6 -55 90 | 32 -38 68 -9 -64 73 -18 43 -95 79 -12 -6 -55 90 -93 70 18 |
Number 15 out of 78 subsets | 133 | 41 92 0 | -77 -96 41 92 0 -2 -97 -66 -91 -89 27 75 -98 |
Number 10 out of 171 subsets | 115 | 97 18 | 87 -56 -93 44 32 -18 1 -69 -99 97 18 -52 -50 45 53 -71 -32 -8 -55 |
Number 57 out of 136 subsets | 207 | 66 49 -25 94 23 | -100 75 -7 25 -49 -94 37 -65 35 -52 -32 66 49 -25 94 23 -54 |
Number 120 out of 120 subsets | 536 | 90 61 16 46 9 49 -83 78 25 -34 6 -49 64 96 94 68 | 90 61 16 46 9 49 -83 78 25 -34 6 -49 64 96 94 68 |
Number 38 out of 45 subsets | 257 | 76 97 -4 1 67 -41 61 | -62 -86 76 97 -4 1 67 -41 61 -11 |
Number 35 out of 55 subsets | 237 | 96 87 -66 97 -47 70 | 96 87 -66 97 -47 70 -28 -79 -81 74 13 |
Number 14 out of 120 subsets | 168 | 71 97 | 68 41 -72 -90 87 -81 78 -12 -88 -25 33 -34 -9 71 97 -82 |
Number 134 out of 190 subsets | 241 | 25 55 -72 68 32 11 -6 6 86 36 | -38 -1 49 38 54 -99 33 -46 -53 25 55 -72 68 32 11 -6 6 86 36 -18 |
Number 16 out of 190 subsets | 137 | 100 37 | -84 88 -60 -76 -25 -82 -49 -90 42 -13 -18 38 -68 4 -78 100 37 -83 51 1 |
Number 153 out of 153 subsets | 338 | 77 -30 2 39 -21 30 58 -80 -39 61 -73 63 53 28 -11 93 69 19 | 77 -30 2 39 -21 30 58 -80 -39 61 -73 63 53 28 -11 93 69 19 |
Number 14 out of 91 subsets | 83 | 1 20 62 | 1 20 62 -7 -89 40 -51 91 -68 51 -92 58 -5 27 |
Number 164 out of 190 subsets | 578 | 17 50 13 64 70 46 43 66 -5 -51 94 31 78 62 | -2 17 50 13 64 70 46 43 66 -5 -51 94 31 78 62 -67 56 -24 -47 -34 |
Number 62 out of 153 subsets | 185 | 3 60 61 37 24 | -48 67 32 -96 -7 -30 9 44 -3 -84 88 -90 -87 3 60 61 37 24 |
Number 42 out of 105 subsets | 108 | 3 86 -68 70 17 | -89 -66 3 86 -68 70 17 -90 -29 -20 -97 -25 -54 83 -87 |
Number 31 out of 66 subsets | 225 | 54 -26 76 56 65 | 54 -26 76 56 65 -82 -80 -52 -95 -32 43 6 |
Number 63 out of 91 subsets | 210 | 72 15 -33 91 -5 -9 79 | -23 26 89 -32 19 -71 -39 72 15 -33 91 -5 -9 79 |
Number 60 out of 105 subsets | 89 | 61 -25 41 -34 -53 99 | -59 -81 -26 -61 48 -43 -18 -58 -100 61 -25 41 -34 -53 99 |
Number 35 out of 171 subsets | 141 | 65 -19 95 | 31 -97 92 -20 -65 44 66 -42 -32 36 -70 -60 58 -66 -28 -52 65 -19 95 |
Number 38 out of 171 subsets | 116 | 42 -10 49 35 | -48 -85 42 -10 49 35 -36 -96 -92 -70 -34 68 -69 100 -78 -19 -43 50 14 |
Number 141 out of 153 subsets | 266 | 65 31 15 -31 53 -62 -5 54 25 89 -26 48 -4 14 | -63 -71 65 31 15 -31 53 -62 -5 54 25 89 -26 48 -4 14 -29 -84 |
Number 17 out of 136 subsets | 188 | 34 94 60 | 34 94 60 -77 -14 20 -55 -74 39 -52 35 -15 -3 32 21 -24 -6 |
Number 53 out of 171 subsets | 200 | 56 83 36 -52 77 | -81 56 83 36 -52 77 -59 38 -36 -3 12 -39 -87 -13 -64 4 -8 37 96 |
Number 69 out of 78 subsets | 299 | 98 49 71 -90 -83 26 39 30 86 73 | 98 49 71 -90 -83 26 39 30 86 73 -19 11 -52 |
Number 101 out of 105 subsets | 566 | 97 -65 80 56 -64 88 9 69 81 92 82 -55 96 | -71 97 -65 80 56 -64 88 9 69 81 92 82 -55 96 -50 |
Number 29 out of 45 subsets | 199 | 82 21 13 29 54 | 61 -91 -32 -96 82 21 13 29 54 -39 |
Number 74 out of 190 subsets | 372 | 90 -2 69 40 91 84 | -37 0 -20 90 -2 69 40 91 84 -7 -70 -50 23 -84 14 77 -28 -39 21 -15 |
Number 70 out of 105 subsets | 247 | 3 23 93 28 45 -30 -10 95 | 3 23 93 28 45 -30 -10 95 -65 -32 -26 26 -74 -59 90 |
Number 7 out of 45 subsets | 153 | 89 64 | 22 5 -69 -14 -16 -57 89 64 -5 -61 |
Number 2 out of 120 subsets | 88 | 5 83 | -87 5 83 -53 -12 -98 17 -78 -26 -40 22 -6 -39 35 -10 -52 |
Number 57 out of 153 subsets | 166 | 68 -26 84 -55 95 | -73 55 17 -57 78 -50 -70 -24 68 -26 84 -55 95 -41 -39 16 -46 13 |
Number 74 out of 105 subsets | 204 | 47 -1 -40 22 76 71 -35 64 | 51 -89 14 -57 47 -1 -40 22 76 71 -35 64 -82 -24 2 |