diff options
| author | Amir Rajan <[email protected]> | 2020-09-11 02:02:01 -0500 |
|---|---|---|
| committer | Amir Rajan <[email protected]> | 2020-09-11 02:02:57 -0500 |
| commit | 33ec37b141e896b47ed642923fd33b0c658ae9fb (patch) | |
| tree | a40d3e5d41beeb06508200078f6f26b0ee57d6a4 /samples/00_learn_ruby_optional/00_intermediate_ruby_primer | |
| parent | 958cf43779d2bf528869e80511c4c4f2a433b2db (diff) | |
| download | dragonruby-game-toolkit-contrib-33ec37b141e896b47ed642923fd33b0c658ae9fb.tar.gz dragonruby-game-toolkit-contrib-33ec37b141e896b47ed642923fd33b0c658ae9fb.zip | |
synced samples
Diffstat (limited to 'samples/00_learn_ruby_optional/00_intermediate_ruby_primer')
11 files changed, 559 insertions, 0 deletions
diff --git a/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/02_printing_to_the_console.txt b/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/02_printing_to_the_console.txt new file mode 100644 index 0000000..dd86367 --- /dev/null +++ b/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/02_printing_to_the_console.txt @@ -0,0 +1,31 @@ +# ==================================================================================== +# Commenting Code +# ==================================================================================== +# +# Prefixing text with a pound sign (#) is how you comment code in Ruby. Example: +# +# I am commented code. And so are the lines above. +# +# I you want more than a quick primer on Ruby, check out https://poignant.guide/. It's +# an entertaining read. Otherwise, go to the next txt file. +# +# Follow along by visiting: +# https://s3.amazonaws.com/s3.dragonruby.org/dragonruby-gtk-intermediate.mp4 + +# ==================================================================================== +# Printing to the Console: +# ==================================================================================== +# +# Every time you save repl.rb file, DragonRuby runs the code within it. Copy this text +# to repl.rb and save to see Hello World printed to the console. + +repl do + puts '* RUBY PRIMER: Printing to the console using the ~puts~ function.' + puts '====' + puts '======' + puts '================================' + puts 'Hello World' + puts '================================' + puts '======' + puts '====' +end diff --git a/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/03_strings.txt b/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/03_strings.txt new file mode 100644 index 0000000..34ea252 --- /dev/null +++ b/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/03_strings.txt @@ -0,0 +1,15 @@ +# ==================================================================================== +# Strings +# ==================================================================================== +# +# Here is how you work with strings in Ruby. Take the text +# in this file and paste it into repl.rb and save: + +repl do + puts '* RUBY PRIMER: strings' + message = "Hello World" + puts "The value of message is: " + message + puts "Any value can be interpolated within a string using \#{}." + puts "Interpolated message: #{message}." + puts 'This #{message} is not interpolated because the string uses single quotes.' +end diff --git a/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/04_numbers.txt b/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/04_numbers.txt new file mode 100644 index 0000000..dfdf04d --- /dev/null +++ b/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/04_numbers.txt @@ -0,0 +1,21 @@ +# ==================================================================================== +# Numerics +# ==================================================================================== +# +# Here is how you work with numbers in Ruby. Take the text +# in this file and paste it into repl.rb and save: + +repl do + puts '* RUBY PRIMER: Fixnum and Floats' + a = 10 + puts "The value of a is: #{a}" + puts "a + 1 is: #{a + 1}" + puts "a / 3 is: #{a / 3}" + puts '' + + b = 10.12 + puts "The value of b is: #{b}" + puts "b + 1 is: #{b + 1}" + puts "b as an integer is: #{b.to_i}" + puts '' +end diff --git a/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/05_booleans.txt b/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/05_booleans.txt new file mode 100644 index 0000000..2a9060f --- /dev/null +++ b/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/05_booleans.txt @@ -0,0 +1,32 @@ +# ==================================================================================== +# Booleans +# ==================================================================================== +# +# Here is how you work with numbers in Ruby. Take the text +# in this file and paste it into repl.rb and save: + +repl do + puts '* RUBY PRIMER: TrueClass, FalseClass, NilClass (truthy / falsey values)' + puts "Anything that *isn't* false or nil is true." + + c = 30 + puts "The value of c is #{c}." + + if c + puts "This if statement ran because c is truthy." + end + + d = false + puts "The value if d is #{d}. The type for d is #{d.class}." + + if !d + puts "This if statement ran because d is falsey, using the not operator (!)." + end + + e = nil + puts "Nil is also considered falsey. The value of e is: #{e} (a blank string when printed). Which is of type #{e.class}." + + if !e + puts "This if statement ran because e is nil and the if statement applied the NOT operator. !e yields a type of #{(!e).class}." + end +end diff --git a/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/06_conditionals.txt b/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/06_conditionals.txt new file mode 100644 index 0000000..8a0c172 --- /dev/null +++ b/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/06_conditionals.txt @@ -0,0 +1,114 @@ +# ==================================================================================== +# Conditionals +# ==================================================================================== +# +# Here is how you create conditionals in Ruby. Take the text +# in this file and paste it into repl.rb and save: + +repl do + puts "* RUBY PRIMER: Conditionals" +end + +# ==================================================================================== +# if +# ==================================================================================== + +repl do + puts "** INFO: if statement" + i_am_one = 1 + if i_am_one + puts "This was printed because i_am_one is truthy." + end +end + +# ==================================================================================== +# if/else +# ==================================================================================== + +repl do + puts "** INFO: if/else statement" + i_am_false = false + if i_am_false + puts "This will NOT get printed because i_am_false is false." + else + puts "This was printed because i_am_false is false." + end +end + + +# ==================================================================================== +# if/elsif/else +# ==================================================================================== + +repl do + puts "** INFO: if/elsif/else statement" + i_am_false = false + i_am_true = true + if i_am_false + puts "This will NOT get printed because i_am_false is false." + elsif i_am_true + puts "This was printed because i_am_true is true." + else + puts "This will NOT get printed i_am_true was true." + end +end + +# ==================================================================================== +# case +# ==================================================================================== + +repl do + puts "** INFO case statement" + i_am_one = 1 # change this value to see different results + + case i_am_one + when 10 + puts "the value of i_am_one is 10" + when 9 + puts "the value of i_am_one is 9" + when 5 + puts "the value of i_am_one is 5" + when 1 + puts "the value of i_am_one is 1" + else + puts "Value wasn't cased." + end +end + +# ==================================================================================== +# comparison operators +# ==================================================================================== + +repl do + puts "** INFO: Different types of comparisons" + if 4 == 4 + puts "4 equals 4 (==)" + end + + if 4 != 3 + puts "4 does not equal 3 (!=)" + end + + if 3 < 4 + puts "3 is less than 4 (<)" + end + + if 4 > 3 + puts "4 is greater than 3 (>)" + end +end + +# ==================================================================================== +# and/or conditionals +# ==================================================================================== + +repl do + puts "** INFO: AND, OR operator (&&, ||)" + if (4 > 3) || (3 < 4) || false + puts "print this if 4 is greater than 3 OR 3 is less than 4 OR false is true (||)" + end + + if (4 > 3) && (3 < 4) + puts "print this if 4 is greater than 3 AND 3 is less than 4 (&&)" + end +end diff --git a/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/07_looping.txt b/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/07_looping.txt new file mode 100644 index 0000000..03c3d28 --- /dev/null +++ b/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/07_looping.txt @@ -0,0 +1,55 @@ +# ==================================================================================== +# Looping +# ==================================================================================== +# +# Looping looks a whole lot different than other languages. +# But it's pretty awesome when you get used to it. + +repl do + puts "* RUBY PRIMER: Loops" +end + +# ==================================================================================== +# times +# ==================================================================================== + +repl do + puts "** INFO: ~Numeric#times~ (for loop)" + 3.times do |i| + puts i + end +end + +# ==================================================================================== +# foreach +# ==================================================================================== + +repl do + puts "** INFO: ~Array#each~ (for each loop)" + array = ["a", "b", "c", "d"] + array.each do |char| + puts char + end + + puts "** INFO: ~Array#each_with_index~ (for each loop)" + array = ["a", "b", "c", "d"] + array.each do |char, i| + puts "index #{i}: #{char}" + end +end + +# ==================================================================================== +# ranges +# ==================================================================================== + +repl do + puts "** INFO: range block exclusive (three dots)" + (0...3).each do |i| + puts i + end + + puts "** INFO: range block inclusive (two dots)" + (0..3).each do |i| + puts i + end +end diff --git a/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/08_functions.txt b/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/08_functions.txt new file mode 100644 index 0000000..9ad38de --- /dev/null +++ b/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/08_functions.txt @@ -0,0 +1,69 @@ +# ==================================================================================== +# Functions +# ==================================================================================== + +# The last statement of a function is implictly returned. Parenthesis for functions +# are optional as long as the statement can be envaluated disambiguously. + +repl do + puts "* RUBY PRIMER: Functions" +end + +# ==================================================================================== +# Functions single parameter +# ==================================================================================== + +repl do + puts "* INFO: Function with one parameter" + + # function definition + def add_one_to n + n + 1 + end + + # Parenthesis are optional in Ruby as long as the + # parsing is disambiguous. Here are a couple of variations. + # Generally speaking, don't put parenthesis is you don't have to. + + # Conventional Usage of Parenthesis. + puts add_one_to(3) + + # DragonRuby's recommended use of parenthesis (inner function has parenthesis). + puts (add_one_to 3) + + # Full parens. + puts(add_one_to(3)) + + # Outer function has parenthesis + puts(add_one_to 3) +end + +# ==================================================================================== +# Functions with default parameter values +# ==================================================================================== + +repl do + puts "* INFO: Function with default value" + def function_with_default_value v = 10 + v * 10 + end + + puts "Passing the argument three yields: #{function_with_default_value 3}" + puts "Passing no argument yields: #{function_with_default_value}" +end + +# ==================================================================================== +# Nil default parameter value and ||= operator. +# ==================================================================================== + +repl do + puts "* INFO: Using the OR EQUAL operator (||=)" + def function_with_nil_default_with_local a = nil + result = a + result ||= "DEFAULT_VALUE_OF_A_IS_NIL_OR_FALSE" + "value is #{result}." + end + + puts "Passing 'hi' as the argument yields: #{function_with_nil_default_with_local 'hi'}" + puts "Passing nil: #{function_with_nil_default_with_local}" +end diff --git a/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/09_powerful_arrays.txt b/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/09_powerful_arrays.txt new file mode 100644 index 0000000..9904686 --- /dev/null +++ b/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/09_powerful_arrays.txt @@ -0,0 +1,210 @@ +# ==================================================================================== +# Arrays +# ==================================================================================== + +# Arrays are incredibly powerful in Ruby. Learn to use them well. + +repl do + puts "* RUBY PRIMER: ARRAYS" +end + +# ==================================================================================== +# Enumerable ranges and .to_a +# ==================================================================================== + +repl do + puts "** INFO: Create an array with the numbers 1 to 10." + one_to_ten = (1..10).to_a + puts one_to_ten +end + +# ==================================================================================== +# Finding elements +# ==================================================================================== + +repl do + puts "** INFO: Finding elements in an array using ~Array#find_all~." + puts "Create a new array that only contains even numbers from the previous array." + + one_to_ten = (1..10).to_a + evens = one_to_ten.find_all do |number| + number % 2 == 0 + end + + puts evens +end + +# ==================================================================================== +# Rejecting elements +# ==================================================================================== + +repl do + puts "** INFO: Removing elements in an array using ~Array#reject~." + puts "Create a new array that rejects odd numbers." + + one_to_ten = (1..10).to_a + also_even = one_to_ten.reject do |number| + number % 2 != 0 + end + + puts also_even +end + +# ==================================================================================== +# Array transform using the map function. +# ==================================================================================== + +repl do + puts "** INFO: Creating new derived values from an array using ~Array#map~." + puts "Create an array that doubles every number." + + one_to_ten = (1..10).to_a + doubled = one_to_ten.map do |number| + number * 2 + end + + puts doubled +end + +# ==================================================================================== +# Combining array functions. +# ==================================================================================== + +repl do + puts "** INFO: Combining ~Array#find_all~ along with ~Array#map~." + puts "Create an array that selects only odd numbers and then multiply those by 10." + + one_to_ten = (1..10).to_a + odd_doubled = one_to_ten.find_all do |number| + number % 2 != 0 + end.map do |odd_number| + odd_number * 10 + end + + puts odd_doubled +end + +# ==================================================================================== +# Product function. +# ==================================================================================== + +repl do + puts "** INFO: Create all combinations of array values using ~Array#product~." + puts "All two-item pairs of numbers 1 to 10." + one_to_ten = (1..10).to_a + all_combinations = one_to_ten.product(one_to_ten) + puts all_combinations +end + +# ==================================================================================== +# Uniq and sort function. +# ==================================================================================== + +repl do + puts "** INFO: Providing uniq values using ~Array#uniq~ and ~Array#sort~." + puts "All uniq combinations of numbers regardless of order." + puts "For example: [1, 2] is the same as [2, 1]." + one_to_ten = (1..10).to_a + uniq_combinations = + one_to_ten.product(one_to_ten) + .map do |unsorted_number| + unsorted_number.sort + end.uniq + puts uniq_combinations +end + +# ==================================================================================== +# Example of an advanced array transform. +# ==================================================================================== + +repl do + puts "** INFO: Advanced chaining. Combining ~Array's ~map~, ~find_all~, ~sort~, and ~sort_by~." + puts "All unique Pythagorean Triples between 1 and 100 sorted by area of the triangle." + + one_to_hundred = (1..100).to_a + + triples = + one_to_hundred.product(one_to_hundred).map do |width, height| + [width, height, Math.sqrt(width ** 2 + height ** 2)] + end.find_all do |_, _, hypotenuse| + hypotenuse.to_i == hypotenuse + end.map do |triangle| + triangle.map(&:to_i) + end.uniq do |triangle| + triangle.sort + end.map do |width, height, hypotenuse| + [width, height, hypotenuse, (width * height) / 2] + end.sort_by do |_, _, _, area| + area + end + + triples.each do |width, height, hypotenuse, _| + puts "(#{width}, #{height}, #{hypotenuse})" + end +end + +# ==================================================================================== +# Example of an sorting. +# ==================================================================================== + +repl do + puts "** INFO: Implementing a custom sort function that operates on the ~Hash~ datatype." + + things_to_sort = [ + { type: :background, order: 1 }, + { type: :foreground, order: 1 }, + { type: :foreground, order: 2 } + ] + puts "*** Original array." + puts things_to_sort + + puts "*** Simple sort using key." + # For a simple sort, you can use sort_by + results = things_to_sort.sort_by do |hash| + hash[:order] + end + + puts results + + puts "*** Custom sort." + puts "**** Sorting process." + # for a more complicated sort, you can provide a block that returns + # -1, 0, 1 for a left and right operand + results = things_to_sort.sort do |l, r| + sort_result = 0 + puts "here is l: #{l}" + puts "here is r: #{r || "nil"}" + # if either value is nil/false return 0 + if !l || !r + sort_result = 0 + # if the type of "left" is background and the + # type of "right" is foreground, then return + # -1 (which means "left" is less than "right" + elsif l[:type] == :background && r[:type] == :foreground + sort_result = -1 + # if the type of "left" is foreground and the + # type of "right" is background, then return + # 1 (which means "left" is greater than "right" + elsif l[:type] == :foreground && r[:type] == :background + sort_result = 1 + # if "left" and "right"'s type are the same, then + # use the order as the tie breaker + elsif l[:order] < r[:order] + sort_result = -1 + elsif l[:order] > r[:order] + sort_result = 1 + # returning 0 means both values are equal + else + sort_result = 0 + end + sort_result + end.to_a + + puts "**** Sort result." + puts results +end + +# ==================================================================================== +# Api documention for Array that is worth commiting to memory because arrays are so +# awesome in Ruby: https://docs.ruby-lang.org/en/2.0.0/Array.html +# ==================================================================================== diff --git a/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/main.rb b/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/main.rb new file mode 100644 index 0000000..96461aa --- /dev/null +++ b/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/main.rb @@ -0,0 +1,3 @@ +def tick args + args.outputs.labels << [640, 380, "Open repl.rb in the text editor of your choice and follow the document.", 0, 1] +end diff --git a/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/repl.rb b/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/repl.rb new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/app/repl.rb diff --git a/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/license-for-sample.txt b/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/license-for-sample.txt new file mode 100644 index 0000000..100dcec --- /dev/null +++ b/samples/00_learn_ruby_optional/00_intermediate_ruby_primer/license-for-sample.txt @@ -0,0 +1,9 @@ +Copyright 2019 DragonRuby LLC + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
