add finished quiz #1, madlibs
authorDavid Blacka <david@blacka.com>
Fri, 21 Oct 2011 02:41:16 +0000 (22:41 -0400)
committerDavid Blacka <david@blacka.com>
Fri, 21 Oct 2011 02:41:16 +0000 (22:41 -0400)
madlibs.rb [new file with mode: 0755]
ml_1.txt [new file with mode: 0644]

diff --git a/madlibs.rb b/madlibs.rb
new file mode 100755 (executable)
index 0000000..6cb83ac
--- /dev/null
@@ -0,0 +1,42 @@
+#!/usr/bin/env ruby
+
+tokens = []  # a list of tokens
+names  = {}  # a hash to hold reusable tokens
+
+unless ARGV.length > 0 and test(?e, ARGV[0])
+  $stderr.puts "usage: #{$PROGRAM_NAME} mad_lib_file"
+  exit 1
+end
+
+madlibstr = IO.read(ARGV[0]) # the madlib
+
+# Parse and replace the tokens with unique placeholder strings.
+pos = 1
+madlibstr.gsub!(/\(\(([^)]+)\)\)/) do |token|
+  token.delete!("()") # clean up token
+
+  if token =~ /^(\w+):(.*)$/
+    # we have a named token, so record the name and position
+    names[$1] = pos
+    token = $2
+  elsif names[token]
+    # we are using a named token
+    next "<<#{names[token]}>>"
+  end
+  # otherwise, we have a new token
+  tokens << { :token => token, :pos => pos }
+
+  pos += 1
+  "<<#{pos - 1}>>"
+end
+
+# For each token, ask the user for an answer, then use the answer.
+tokens.each do |token|
+  print "Tell me #{token[:token]}? "
+  value = $stdin.gets.chomp
+  madlibstr.gsub!("<<#{token[:pos]}>>", value)
+end
+
+# Finally, report the mad lib.
+puts "---"
+puts madlibstr
diff --git a/ml_1.txt b/ml_1.txt
new file mode 100644 (file)
index 0000000..9018d12
--- /dev/null
+++ b/ml_1.txt
@@ -0,0 +1,4 @@
+Our favorite language is ((gem:a gemstone)).  We think ((gem)) is
+better than ((another gemstone)).
+
+Some ((a plural noun)) like ((a reptile)) better, but we know better.