Last active
October 5, 2016 01:04
-
-
Save na-o-ys/44a6f3bd6f1ed9ebd27835581f6289b7 to your computer and use it in GitHub Desktop.
だんだん速くなるfizzbuzz
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| max = ARGV[0].to_i | |
| 1.upto(max) do |i| | |
| if i % 15 == 0 | |
| puts "FizzBuzz" | |
| elsif i % 3 == 0 | |
| puts "Fizz" | |
| elsif i % 5 == 0 | |
| puts "Buzz" | |
| else | |
| puts i | |
| end | |
| end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| max = ARGV[0].to_i | |
| arr = 1.upto(max).to_a.map { |i| | |
| if i % 15 == 0 | |
| "FizzBuzz" | |
| elsif i % 3 == 0 | |
| "Fizz" | |
| elsif i % 5 == 0 | |
| "Buzz" | |
| else | |
| i | |
| end | |
| } | |
| puts arr.join("\n") |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| max = ARGV[0].to_i | |
| arr = 1.upto(max).to_a | |
| 2.step(max - 1, 3) { |i| arr[i] = "Fizz" } | |
| 4.step(max - 1, 5) { |i| arr[i] = "Buzz" } | |
| 14.step(max - 1, 15) { |i| arr[i] = "FizzBuzz" } | |
| puts arr.join("\n") |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # frozen_string_literal: true | |
| max = ARGV[0].to_i | |
| arr = 1.upto(max).to_a | |
| 2.step(max - 1, 3) { |i| arr[i] = "Fizz" } | |
| 4.step(max - 1, 5) { |i| arr[i] = "Buzz" } | |
| 14.step(max - 1, 15) { |i| arr[i] = "FizzBuzz" } | |
| puts arr.join("\n") |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| @iseq = ["YARVInstructionSequence/SimpleDataFormat", | |
| 2, | |
| 3, | |
| 1, | |
| {:arg_size=>0, :local_size=>4, :stack_max=>3}, | |
| "<main>", | |
| "fizzbuzz", | |
| "fizzbuzz", | |
| 1, | |
| :top, | |
| [:i, :max, :arr], | |
| {}, | |
| [], | |
| [:max, | |
| [:getglobal, :$*], | |
| [:putobject_OP_INT2FIX_O_0_C_], | |
| [:opt_aref, {}, false], | |
| [:opt_send_without_block, {:mid=>:to_i, :orig_argc=>0}, false], | |
| [:setlocal_OP__WC__0, 3], | |
| :initialize_array, | |
| [:putobject_OP_INT2FIX_O_1_C_], | |
| [:getlocal_OP__WC__0, 3], | |
| [:opt_send_without_block, {:mid=>:upto, :orig_argc=>1}, false], | |
| [:opt_send_without_block, {:mid=>:to_a, :orig_argc=>0}, false], | |
| [:setlocal_OP__WC__0, 2], | |
| :main, | |
| # Fizz | |
| # i = 2 | |
| [:putobject, 2], | |
| [:setlocal_OP__WC__0, 4], | |
| :fizz_loop_start, | |
| # if i < max | |
| [:getlocal_OP__WC__0, 4], | |
| [:getlocal_OP__WC__0, 3], | |
| [:opt_lt, {}, false], | |
| [:branchunless, :fizz_loop_end], | |
| [:pop], | |
| # arr[i] = "Fizz" | |
| [:putnil], | |
| [:getlocal_OP__WC__0, 2], # arr | |
| [:getlocal_OP__WC__0, 4], # i | |
| [:putobject, "Fizz"], | |
| [:setn, 3], | |
| [:opt_aset, {}, false], | |
| [:pop], | |
| # i += 3 | |
| [:getlocal_OP__WC__0, 4], | |
| [:putobject, 3], | |
| [:opt_plus, {}, false], | |
| [:setlocal_OP__WC__0, 4], | |
| [:jump, :fizz_loop_start], | |
| :fizz_loop_end, | |
| # Buzz | |
| # i = 4 | |
| [:putobject, 4], | |
| [:setlocal_OP__WC__0, 4], | |
| :buzz_loop_start, | |
| # if i < max | |
| [:getlocal_OP__WC__0, 4], | |
| [:getlocal_OP__WC__0, 3], | |
| [:opt_lt, {}, false], | |
| [:branchunless, :buzz_loop_end], | |
| [:pop], | |
| # arr[i] = "Buzz" | |
| [:putnil], | |
| [:getlocal_OP__WC__0, 2], # arr | |
| [:getlocal_OP__WC__0, 4], # i | |
| [:putobject, "Buzz"], | |
| [:setn, 3], | |
| [:opt_aset, {}, false], | |
| [:pop], | |
| # i += 5 | |
| [:getlocal_OP__WC__0, 4], | |
| [:putobject, 5], | |
| [:opt_plus, {}, false], | |
| [:setlocal_OP__WC__0, 4], | |
| [:jump, :buzz_loop_start], | |
| :buzz_loop_end, | |
| # FizzBuzz | |
| # i = 14 | |
| [:putobject, 14], | |
| [:setlocal_OP__WC__0, 4], | |
| :fizzbuzz_loop_start, | |
| # if i < max | |
| [:getlocal_OP__WC__0, 4], | |
| [:getlocal_OP__WC__0, 3], | |
| [:opt_lt, {}, false], | |
| [:branchunless, :fizzbuzz_loop_end], | |
| [:pop], | |
| # arr[i] = "FizzBuzz" | |
| [:putnil], | |
| [:getlocal_OP__WC__0, 2], # arr | |
| [:getlocal_OP__WC__0, 4], # i | |
| [:putobject, "FizzBuzz"], | |
| [:setn, 3], | |
| [:opt_aset, {}, false], | |
| [:pop], | |
| # i += 15 | |
| [:getlocal_OP__WC__0, 4], | |
| [:putobject, 15], | |
| [:opt_plus, {}, false], | |
| [:setlocal_OP__WC__0, 4], | |
| [:jump, :fizzbuzz_loop_start], | |
| :fizzbuzz_loop_end, | |
| :output, | |
| [:putself], | |
| [:getlocal_OP__WC__0, 2], | |
| [:putobject, "\n"], | |
| [:opt_send_without_block, {:mid=>:join, :orig_argc=>1}, false], | |
| [:opt_send_without_block, {:mid=>:puts, :flag=>20, :orig_argc=>1}, false], | |
| [:leave]]] | |
| require 'fiddle' | |
| class RubyVM::InstructionSequence | |
| load_fn_addr = Fiddle::Handle::DEFAULT['rb_iseq_load'] | |
| load_fn = Fiddle::Function.new(load_fn_addr, | |
| [Fiddle::TYPE_VOIDP] * 3, | |
| Fiddle::TYPE_VOIDP) | |
| define_singleton_method(:load) do |data, parent = nil, opt = nil| | |
| load_fn.call(Fiddle.dlwrap(data), parent, opt).to_value | |
| end | |
| end | |
| RubyVM::InstructionSequence.load(@iseq).eval |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
a_1: 素
a_2: puts を削減
a_3: 演算(除算, 比較演算)を削減
a_4: String 生成を削減
a_4_opt_iseq: ISeqに書き下す