Learning R: Build xkcd’s Star Wars Spoiler Generator

[This article was first published on R-Bloggers – Learning Machines, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.


Star Wars is somewhat nerdy, R definitely is… what could be more worthwhile than combining both ?

This Sunday was Star Wars Day (May the 4th be with you!) and suitable for the occasion we will do a little fun project and implement the following xkcd flowchart, which can give us more than 2 million different Star Wars plots.

Even if you are new to R, the used code should be comprehensible, so read on!

First, I provide you with the surrounding phrases…

phrase_1 <- "In this Star Wars movie, our heroes return to take on the First Order and new villain"
phrase_2 <- "with help from their new friend"
phrase_3 <- "Rey builds a new lightsaber with a"
phrase_4 <- "blade, and they head out to confront the First Order's new superweapon, the"
phrase_5 <- "a space station capable of"
phrase_6 <- "They unexpectedly join forces with their old enemy"
phrase_7 <- "and destroy the superweapon in a battle featuring"
phrase_8 <- "P.S. Rey's parents are"
phrase_9 <- "and"

…and the different options:

villain_name <- c("Kyle Ren", "Malloc", "Darth Sebelius", "Theranos", "Lord Juul")
friend_name <- c("Kim Spacemeasurer", "Teen Yoda", "Dab Tweetdeck", "Yaz Progestin", "TI-83")
color <- c("beige", "ochre", "mauve", "aquamarine", "taupe")
superweapon_name <- c("Sun Obliterator", "Moonsquisher", "World Eater", "Planet Zester", "Superconducting Supercollider")
evil_plan <- c("blowing up a planet with a bunch of beams of energy that combine into one", "blowing up a bunch of planets with one beam of energy that splits into many", "cutting a planet in half and smashing the halves together like two cymbals", "increasing the CO2 levels in a planet's atmosphere, causing rapid heating", "triggering the end credits before the movie is done")
character_1 <- c("Boba Fett", "Salacious Crumb", "The Space Slug", "the bottom half of Darth Maul", "Youtube commenters")
strange_event <- c("a bow that shoots little lightsaber-headed arrows", "X-Wings and TIE fighters dodging the giant letters of the opening crawl", "a Sith educational display that uses Force Lightning to demonstrate the dielectric breakdown of air", "Kylo Ren putting on another helmet over his smaller one", "a Sith car wash where the bristles on the brushes are little lightsabers")
character_2 <- c("Luke", "Leia", "Han", "Obi-Wan", "a random junk trader")
character_3 <- c("Poe", "BB-8", "Amilyn Holdo", "Laura Dern", "a random junk trader", "that one droid from the Jawa Sandcrawler that says Gonk")

A quick calculation reveals that we have 2,343,750 possibilities of different Star Wars stories.

Now, perhaps with the data readily available, you might want to try to implement the SWSG (Star Wars Spoiler Generator) yourself…

Here is one way to do it: we create a function with sample to choose from one of the given options, paste to concatenate the different parts, and cat to output the result:

SWSG <- function() {
  cat(paste(phrase_1, sample(villain_name, 1), phrase_2, sample(friend_name, 1)), "\n")
  cat(paste(phrase_3, sample(color, 1), phrase_4, sample(superweapon_name, 1), phrase_5, sample(evil_plan, 1)), "\n")
  cat(paste(phrase_6, sample(character_1, 1), phrase_7, sample(strange_event, 1)), "\n")
  cat(paste(phrase_8, sample(character_2, 1), phrase_9, sample(character_3_2, 1)))
}

Every call of this function generates a new random storyline:

SWSG()
## In this Star Wars movie, our heroes return to take on the First Order and new villain Kyle Ren with help from their new friend Kim Spacemeasurer 
## Rey builds a new lightsaber with a ochre blade, and they head out to confront the First Order's new superweapon, the Moonsquisher a space station capable of blowing up a bunch of planets with one beam of energy that splits into many 
## They unexpectedly join forces with their old enemy Boba Fett and destroy the superweapon in a battle featuring a bow that shoots little lightsaber-headed arrows 
## P.S. Rey's parents are Leia and Amilyn Holdo

SWSG()
## In this Star Wars movie, our heroes return to take on the First Order and new villain Theranos with help from their new friend Teen Yoda 
## Rey builds a new lightsaber with a aquamarine blade, and they head out to confront the First Order's new superweapon, the Moonsquisher a space station capable of blowing up a bunch of planets with one beam of energy that splits into many 
## They unexpectedly join forces with their old enemy the bottom half of Darth Maul and destroy the superweapon in a battle featuring X-Wings and TIE fighters dodging the giant letters of the opening crawl 
## P.S. Rey's parents are Han and a random junk trader

SWSG()
## In this Star Wars movie, our heroes return to take on the First Order and new villain Malloc with help from their new friend Kim Spacemeasurer 
## Rey builds a new lightsaber with a aquamarine blade, and they head out to confront the First Order's new superweapon, the Sun Obliterator a space station capable of cutting a planet in half and smashing the halves together like two cymbals 
## They unexpectedly join forces with their old enemy Youtube commenters and destroy the superweapon in a battle featuring Kylo Ren putting on another helmet over his smaller one 
## P.S. Rey's parents are a random junk trader and Poe

That was easy, right? May the FoRce be with you!

To leave a comment for the author, please follow the link and comment on their blog: R-Bloggers – Learning Machines.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)