Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
34
Task/Hailstone-sequence/R/hailstone-sequence-1.r
Normal file
34
Task/Hailstone-sequence/R/hailstone-sequence-1.r
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
### PART 1:
|
||||
makeHailstone <- function(n){
|
||||
hseq <- n
|
||||
while (hseq[length(hseq)] > 1){
|
||||
current.value <- hseq[length(hseq)]
|
||||
if (current.value %% 2 == 0){
|
||||
next.value <- current.value / 2
|
||||
} else {
|
||||
next.value <- (3 * current.value) + 1
|
||||
}
|
||||
hseq <- append(hseq, next.value)
|
||||
}
|
||||
return(list(hseq=hseq, seq.length=length(hseq)))
|
||||
}
|
||||
|
||||
### PART 2:
|
||||
twenty.seven <- makeHailstone(27)
|
||||
twenty.seven$hseq
|
||||
twenty.seven$seq.length
|
||||
|
||||
### PART 3:
|
||||
max.length <- 0; lower.bound <- 1; upper.bound <- 100000
|
||||
|
||||
for (index in lower.bound:upper.bound){
|
||||
current.hseq <- makeHailstone(index)
|
||||
if (current.hseq$seq.length > max.length){
|
||||
max.length <- current.hseq$seq.length
|
||||
max.index <- index
|
||||
}
|
||||
}
|
||||
|
||||
cat("Between ", lower.bound, " and ", upper.bound, ", the input of ",
|
||||
max.index, " gives the longest hailstone sequence, which has length ",
|
||||
max.length, ". \n", sep="")
|
||||
30
Task/Hailstone-sequence/R/hailstone-sequence-2.r
Normal file
30
Task/Hailstone-sequence/R/hailstone-sequence-2.r
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
###Task 1:
|
||||
collatz <- function(n)
|
||||
{
|
||||
lastIndex <- 1
|
||||
output <- lastEntry <- n
|
||||
while(lastEntry != 1)
|
||||
{
|
||||
#Each branch updates lastEntry, lastIndex, and appends a new element to the end of output.
|
||||
#Note that the return value of lastIndex <- lastIndex + 1 is lastIndex + 1.
|
||||
#You may be surprised that output can be appended to despite starting as just a single number.
|
||||
#If so, recall that R's numerics are vectors, meaning that output<-n created a vector of length 1.
|
||||
#It's ugly, but efficient.
|
||||
if(lastEntry %% 2) lastEntry <- output[lastIndex <- lastIndex + 1] <- 3 * lastEntry + 1
|
||||
else lastEntry <- output[lastIndex <- lastIndex + 1] <- lastEntry %/% 2
|
||||
}
|
||||
output
|
||||
}
|
||||
|
||||
###Task 2:
|
||||
#Notice how easy it is to access the required elements:
|
||||
twentySeven <- collatz(27)
|
||||
cat("The first four elements are:", twentySeven[1:4], "and the last four are:", twentySeven[length(twentySeven) - 3:0], "\n")
|
||||
|
||||
###Task 3:
|
||||
#Notice how a several line long loop can be avoided with R's sapply or Vectorize:
|
||||
seqLenghts <- sapply(seq_len(99999), function(x) length(collatz(x)))
|
||||
longest <- which.max(seqLenghts)
|
||||
cat("The longest sequence before the 100000th is found at n =", longest, "and it has length", seqLenghts[longest], "\n")
|
||||
#Equivalently, line 1 could have been: seqLenghts <- sapply(Vectorize(collatz)(1:99999), length).
|
||||
#Another good option would be seqLenghts <- lengths(Vectorize(collatz)(1:99999)).
|
||||
Loading…
Add table
Add a link
Reference in a new issue