[#319108] Iterator objects and lazy evaluation — Yuh-Ruey Chen <maian330@...>

Two questions:

14 messages 2008/11/01

[#319117] Poor performance of Ruby 1.8.7 when installed with MacPorts — abc <arcadiorubiogarcia@...>

Hi,

15 messages 2008/11/01

[#319176] Ruby for Philosophers — Sebastian Torena <citizenkant@...>

Hi there,

14 messages 2008/11/02

[#319196] ruby1.9: lazy versions of Enumerator#select and friends? — Brian Candler <b.candler@...>

I've been having a play with Enumerators in ruby 1.9, in particular

12 messages 2008/11/02

[#319239] Rake task for building latex? — Stefano Crocco <stefano.crocco@...>

Does anyone know whether there's a rake task to build latex files, including

10 messages 2008/11/03

[#319319] Ruby's take on S.O.L.I.D. — Mike Lopke <reglopke@...>

I'm curious about everyone's take on Bob Martin's S.O.L.I.D. design

16 messages 2008/11/03

[#319401] Combination of numbers in an array that add up to x — Hae Lee <hae.lee.subscription@...>

Objective: Find list of values in an array that adds up to a specific

17 messages 2008/11/04

[#319404] Showing a spinner ? — Aldric Giacomoni <aldric@...>

How do I show a spinner on the command line interface when a ruby script

13 messages 2008/11/04

[#319440] What would you like to know about JRuby? — Charles Oliver Nutter <charles.nutter@...>

Tom Enebo and I are putting together our JRuby presentation for

22 messages 2008/11/04

[#319532] What's the Best Way to Mimic an HTTP Request? — Daniel Miessler <daniel@...>

I'm trying to write a tool that will take a domain as an argument and

10 messages 2008/11/05

[#319546] Ruby has a Face that it wears on its feet — "Jayson Williams" <williams.jayson@...>

In my opinion, Ruby's official face should be Shoes. Shoes gives Ruby

17 messages 2008/11/05
[#319553] Re: Ruby has a Face that it wears on its feet — "Martin DeMello" <martindemello@...> 2008/11/05

On Wed, Nov 5, 2008 at 11:17 AM, Jayson Williams

[#319576] how to quickly find a string towards the end of a large io object — bwv549 <jtprince@...>

How do I scan starting at the end of a big io object to find a string

12 messages 2008/11/06

[#319702] Sudoku Generator (#182) — Matthew Moss <matt@...>

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

14 messages 2008/11/07

[#319769] implementing mvc - using observer pattern - beginner to OOP — Adam Akhtar <adamtemporary@...>

Hi I started making a simple command line todo list application as a way

10 messages 2008/11/08

[#319770] what's easiest way to compare a Float & BigDecimal (i.e. like a equals mechanism) — "Greg Hauptmann" <greg.hauptmann.ruby@...>

Hi,

8 messages 2008/11/08

[#319835] Moving large amount of files, 1.750.000+ — Sebastian Newstream <abeansits@...>

Hello fellow Rubyists!

15 messages 2008/11/09
[#319837] Re: Moving large amount of files, 1.750.000+ — Robert Klemme <shortcutter@...> 2008/11/09

On 09.11.2008 18:04, Sebastian Newstream wrote:

[#319861] Notepad++ (no debug output, using XP) — Ed Hardy <asm.sol@...>

Notepad++ seems to be a great editor for Ruby, in XP Windows. However,

13 messages 2008/11/10

[#319902] Problem with object methods? — Carter Davis <theshakrah@...>

I recently made an object for a game I'm making. It uses the constructor

16 messages 2008/11/10
[#319908] Re: Problem with object methods? — Hugh Sasse <hgs@...> 2008/11/10

[#319911] Re: Problem with object methods? — Carter Davis <theshakrah@...> 2008/11/10

Okay, I made an example.

[#320057] Convert text string i.e 'Peter' into integer ID — Justus Ohlhaver <ohlhaver@...>

Hello,

23 messages 2008/11/12

[#320101] Issue with block and getting to local variables — Tarek Other <cashew250@...>

Ok I'm new to ruby and want to do the following, I want to define a

12 messages 2008/11/12

[#320103] Need tutoring on using a path environment variable — dkmd_nielsen <donn@...>

I don't know what to do. I have an environment variable, PW_PATH,

11 messages 2008/11/12

[#320135] '#' characters are breaking my regexp — Max Williams <toastkid.williams@...>

I'm trying to build a regexp that includes music notes, eg Bb or C#.

14 messages 2008/11/13

[#320202] Highline - question with multiple choices — szimek <szimek@...>

Hi,

14 messages 2008/11/14
[#320208] Re: Highline - question with multiple choices — James Gray <james@...> 2008/11/14

On Nov 14, 2008, at 4:23 AM, szimek wrote:

[#320270] Re: Highline - question with multiple choices — szimek <szimek@...> 2008/11/15

On 14 Lis, 14:52, James Gray <ja...@grayproductions.net> wrote:

[#320213] Unit Conversion (#183) — Matthew Moss <matt@...>

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

37 messages 2008/11/14

[#320280] IO#lineno= doesn't work the way I expected — Chad Perrin <perrin@...>

I'm working on something that operates on each line of a file

22 messages 2008/11/15
[#320283] Re: IO#lineno= doesn't work the way I expected — Tim Hunter <TimHunter@...> 2008/11/15

Chad Perrin wrote:

[#320286] Re: IO#lineno= doesn't work the way I expected — Chad Perrin <perrin@...> 2008/11/15

On Sun, Nov 16, 2008 at 02:27:45AM +0900, Tim Hunter wrote:

[#320287] Re: IO#lineno= doesn't work the way I expected — "Michael Guterl" <mguterl@...> 2008/11/15

On Sat, Nov 15, 2008 at 2:08 PM, Chad Perrin <perrin@apotheon.com> wrote:

[#320288] Re: IO#lineno= doesn't work the way I expected — "Michael Guterl" <mguterl@...> 2008/11/15

On Sat, Nov 15, 2008 at 2:54 PM, Michael Guterl <mguterl@gmail.com> wrote:

[#320359] Why does tmail stop my CGI script form working? — Chad Perrin <perrin@...>

I decided to try TMail for the back end of a new contact page on a

14 messages 2008/11/17

[#320370] How can I overload a method in Ruby — Zhao Yi <youhaodeyi@...>

This is my class definition:

19 messages 2008/11/17
[#320374] Re: How can I overload a method in Ruby — Einar Magn俍 Boson <einarmagnus@...> 2008/11/17

there is no overloading, only overriding.

[#320417] How to extract links of a particular class type — "Sita Rami Reddy" <sitaramireddy@...>

I have a web page which has n number of links.

11 messages 2008/11/17

[#320446] function to select only certain key/value pairs from hash? — Aryk Grosz <tennisbum2002@...>

Whenever Im coding I usually come across having to create a new hash

14 messages 2008/11/17

[#320482] I don't like specs, should I change my point of view ? — Zouplaz <user@...>

Hello, I'm not trolling. I don't like specs (RSpec) : everytime I had a

18 messages 2008/11/18

[#320500] Should is the new Must? — Trans <transfire@...>

Why did 'should' become the going nomenclature of BDD framworks?

21 messages 2008/11/18

[#320553] Syntax question from a newbie to Ruby — David Spitzer <davidspitzer@...>

I am just learning Ruby and I can not seem to see why the first example

12 messages 2008/11/18

[#320655] build hash by iterating — Jason Lillywhite <jason.lillywhite@...>

I am building a hash this way:

15 messages 2008/11/19

[#320665] Question about host, gethostbyname and getaddress — Vladimir Fekete <fekete@...>

Hi *,

11 messages 2008/11/19

[#320709] ANN: One-Click Ruby Installer 186-27 Release Candidate 2 — Luis Lavena <luislavena@...>

Hello Ruby for Windows users!

11 messages 2008/11/19

[#320811] Found a ruby bug in the URI class, what do I do? — Ben Johnson <bjohnson@...>

I'm pretty sure this is a bug, and it seem so obvious that I'm thinking

9 messages 2008/11/20

[#320908] Befunge (#184) — Matthew Moss <matt@...>

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

28 messages 2008/11/22
[#321031] Re: [QUIZ] Befunge (#184) — Matthew Moss <matt@...> 2008/11/24

Hopefully the quiz isn't intimidating... It's a fairly simple language

[#321006] Can you run a command line script with arguments, without typing 'ruby' first? — "Jayson Williams" <williams.jayson@...>

Hi All,

29 messages 2008/11/24
[#321008] Re: Can you run a command line script with arguments, without typing 'ruby' first? — "Diogo Lisboa" <diogoslisboa@...> 2008/11/24

chmod a+x my_script (restrict permissions if you want)

[#321022] Re: Can you run a command line script with arguments, without typing 'ruby' first? — "Jayson Williams" <williams.jayson@...> 2008/11/24

I am using win os, so the shabang thing isn't an option for me. I put

[#321023] Re: Can you run a command line script with arguments, without typing 'ruby' first? — "Glen Holcomb" <damnbigman@...> 2008/11/24

On Mon, Nov 24, 2008 at 2:12 PM, Jayson Williams

[#321024] Re: Can you run a command line script with arguments, without typing 'ruby' first? — "Glen Holcomb" <damnbigman@...> 2008/11/24

On Mon, Nov 24, 2008 at 2:21 PM, Glen Holcomb <damnbigman@gmail.com> wrote:

[#321027] Re: Can you run a command line script with arguments, without typing 'ruby' first? — "Jayson Williams" <williams.jayson@...> 2008/11/24

The associations are correct. I reset them just to be sure though. I

[#321095] Re: Can you run a command line script with arguments, without typing 'ruby' first? — Daniel Schömer <daniel.schoemer@...> 2008/11/25

Jayson Williams wrote:

[#321037] Chris Pine tutorial assistance chapter 7 sort data without use of .sort method — jgheal@...

I'm learning to progam and came accross Chris Pine's Ruby Tutorial.

12 messages 2008/11/24

[#321039] Good math/stats libraries for Ruby? — Kenneth McDonald <kenneth.m.mcdonald@...>

There seem to be lots of small stats/math libraries for Ruby, but none

10 messages 2008/11/24

[#321166] time to back peddle? (Ruby 1.8.7) — Trans <transfire@...>

I just updated my Ubuntu system and was a bit surprised to find:

16 messages 2008/11/26

[#321179] How to get a reference to a block (when no explicit block parameter is used?) — Kenneth McDonald <kenneth.m.mcdonald@...>

In a function, I can find out if a block was given using block_given?,

8 messages 2008/11/26

[#321246] Performance issues with large files -- ruby vs. python :) — sa 125 <s_ayalon@...>

Hi all -

16 messages 2008/11/27
[#321248] Re: Performance issues with large files -- ruby vs. python :) — Florian Gilcher <flo@...> 2008/11/27

>

[#321271] Ruby's duck typing — "stephan.zimmer" <stephan.zimmer@...>

I would like to represent certain data by a list; to this end I let

17 messages 2008/11/27

[#321287] Programming Noob Chris Pine Tutorial sorting without use of array.sort method — whisperjim <jgheal@...>

I'm working through the following tutorial http://pine.fm/LearnToProgram/

10 messages 2008/11/27

[#321297] eRuby/erb outside of Rails — Jonny Noog <jonnynoog@...>

Hello,

18 messages 2008/11/28

[#321387] best gui toolkit — Warren Dulnuan <rr3800@...>

What is the best GUI toolkit for Ruby?

32 messages 2008/11/29
[#321397] Re: best gui toolkit — Vladimir Fekete <fekete@...> 2008/11/29

[#321421] Anyone scraping dynamic AJAX sites? — Becca Girl <cschall@...>

Hello.

12 messages 2008/11/30

[#321428] Enumerable#select used to return actual values — Mike Austin <"mike[nospam]"@...>

I'm pretty sure select used to use the actual value of the called block,

36 messages 2008/11/30
[#321432] Re: Enumerable#select used to return actual values — Robert Klemme <shortcutter@...> 2008/11/30

On 30.11.2008 04:46, Mike Austin wrote:

[#321906] Re: Enumerable#select used to return actual values — Mark Thomas <mark@...> 2008/12/04

On Nov 29, 10:46=A0pm, Mike Austin <"mike[nospam]"@mike-austin.com>

[#321912] Re: Enumerable#select used to return actual values — Trans <transfire@...> 2008/12/04

Re: [QUIZ] Befunge (#184)

From: Einar Magn俍 Boson <einarmagnus@...>
Date: 2008-11-26 04:56:40 UTC
List: ruby-talk #321139
My take on it (in ruby 1.8.6 on leopard), please tell me of unrubyesqe  
(that a word?) idioms I've used.

It's less terse than it could have been but I like how it let me  
define the operations (see below) and it's fun to watch in debug mode!

My definitions:
   Directions = {
     ?^ => :up,
     ?> => :right,
     ?< => :left,
     ?v => :down
   }

   [?+, ?-, ?*, ?/, ?%].each do |ch|
     mk_i(ch) { push arg2.send(ch.chr.to_sym, arg1) }
   end

   Directions.each do |ch, dir|
     mk_i(ch) { turn dir }
   end

   (?0..?9).each do |i|
     mk_i(i) { push i.chr.to_i }
   end

   mk_i(?!)  { push arg1.zero? ? 1 : 0 }
   mk_i(??)  { turn Directions.values[rand(4)] }
   mk_i(?_)  { turn(arg1 == 0 ? :right : :left) }
   mk_i(?|)  { turn(arg1 == 0 ? :down : :up) }
   mk_i(?")  { toggle_stringmode }
   mk_i(?:)  { push arg1, arg1 }
   mk_i(?\\) { push arg1, arg2 }
   mk_i(?$)  { arg1 } # discard
   mk_i(?.)  { output arg1.to_s + " " }
   mk_i(?,)  { output arg1.chr }
   mk_i(?#)  { step }
   mk_i(?g)  { push instruction_get(arg2, arg1) }
   mk_i(?p)  { instruction_set(arg2, arg1, arg3) }
   mk_i(?&)  { push get_int }
   mk_i(?~)  { push get_chr }
   mk_i(?@)  { stop }
   mk_i(?\ ) {  } #nop
   mk_i(?`)  { push(arg2 > arg1 ? 1 : 0) }


Full solution attached, run with `ruby -d befunge2.rb [input_file]` to  
see what's going on, `ruby befunge.rb [input_file]` to just run  
normally.
Requires the highline gem, `sudo install highline`. That was the only  
way I found to get characters from STDIN without the user having to  
press enter after. The paging I use is very primitive though, is there  
a way to make a console-app more usable, like non-blocking input  
without manual threads, and printing at specific co-ordinates of the  
terminal without having to send weird control sequences? How would you  
write `less` in ruby? is there an example somewhere?

Having an exception signal normal halt is not very nice, I agree, but  
this is a hack.






einarmagnus



Attachments (1)

befunge2.rb (4.24 KB, text/x-ruby-script)
require 'rubygems'
require 'highline'
require "highline/import"

include HighLine::SystemExtensions

class Instruction
	attr_reader :cmd
	
	def initialize chr, &b 
		@cmd = chr
		@command = b
		(@@all ||= {}).update @cmd => self 
	end
	
	def invoke state
		@args = []
		@state = state
		instance_eval &@command
	end
	
	def self.get(ch); @@all[ch];	end
	def to_s;					@cmd.chr;		end
	
private
	
	# works because all instructions can be expressed as 
	# one function call and arguments are evaluated first.
	def method_missing name, *args
		if /^arg(\d)$/ =~ name.to_s then
			arg = $1.to_i - 1
			while not @args[arg]
				@args << @state.pop 
			end
			@args[arg]
		else
			@state.send(name, *args)
		end
	end
	
	#make instructions
	def self.mk_i chr, &b
		Instruction.new chr, &b
	end
	Directions = {	
		?^ => :up,
		?> => :right,
		?< => :left,
		?v => :down 
	}

	[?+, ?-, ?*, ?/, ?%].each do |ch|
		mk_i(ch) { push arg2.send(ch.chr.to_sym, arg1) }
	end
	
	Directions.each do |ch, dir|
		mk_i(ch) { turn dir }
	end
	
	(?0..?9).each do |i|
		mk_i(i) { push i.chr.to_i }
	end
	
	mk_i(?!)	{ push arg1.zero? ? 1 : 0 }
	mk_i(??)	{ turn Directions.values[rand(4)] }
	mk_i(?_)	{ turn(arg1 == 0 ? :right : :left) }
	mk_i(?|)	{ turn(arg1 == 0 ? :down : :up) }
	mk_i(?")	{ toggle_stringmode }
	mk_i(?:)	{ push arg1, arg1 }
	mk_i(?\\) { push arg1, arg2 }
	mk_i(?$)	{ arg1 } # discard
	mk_i(?.)	{ output arg1.to_s + " " }
	mk_i(?,)	{ output arg1.chr }
	mk_i(?#)	{ step }
	mk_i(?g)	{ push instruction_get(arg2, arg1) }
	mk_i(?p)	{ instruction_set(arg2, arg1, arg3) }
	mk_i(?&)	{ push get_int }
	mk_i(?~)	{ push get_chr }
	mk_i(?@)	{ stop }
	mk_i(?\ ) {	 } #nop
	mk_i(?`)	{ push(arg2 > arg1 ? 1 : 0) }
end

class State
	attr_reader :stack, :result, :steps
	def initialize source
		@steps = 0
		@stack = []
		@result = ""
		@stringmode = false
		@instructions = Array.new(25) { i = Instruction.get(?\ ); (1..80).map { i } }
		source.each_with_index do |line, y|
			x=0
			line.each_byte do |b| 
				instruction_set x, y, b
				x += 1
			end
		end
		@PC_x, @PC_y = 0, 0
		turn :right
	end
	
	def toggle_stringmode
		@stringmode ^= true
	end
	
	def instruction_set x, y, ch
		i = Instruction.get(ch) || Instruction.mk_i(ch)
		@instructions[y][x] = i
	end
	
	def instruction_get x, y
		@instructions[y][x].cmd
	end
	
	def push *ch
		@stack.push *ch
	end
	
	def pop
		# is this really right? defaulting to 0 at underflow..?
		# a lot of programs seem to depend on it though
		@stack.pop || 0
	end
	
	def output str
		if $DEBUG
			@result << str
		else
			print str
		end
	end
	def turn direction
		@direction = direction
	end
	
	class Done<Exception
	end
	
	def step
		case @direction
		when :right:	@PC_x += 1 
		when :left:		@PC_x -= 1 
		when :down:		@PC_y += 1 
		when :up:			@PC_y -= 1 
		when :done:		raise Done
		else					raise "This should not happen!"
		end
		@PC_x %= 80
		@PC_y %= 25
	end
	
	def execute_current
		@steps += 1
		i = @instructions[@PC_y][@PC_x]
		if @stringmode && i.cmd != ?"
			push i.cmd
		else
			i.invoke self
		end
		step
	end
	
	def get_chr
		ch = get_character
		output ch.chr if $DEBUG
		ch
	end
	
	def get_int
		int = ask("", Integer)
		output "#{int}#{$/}" if $DEBUG
		int
	end
	
	def highlight ins
		if ins == " "
			ins = "x"
		end
		"\e[0;36m#{ins}\e[m"
	end
	def escape ins
		if (?\ ..?~).include? ins 
			ins.chr 
		else
			"\e[0;33mO\e[m"
		end
	end
	def stop
		@direction = :done
	end
	
	def to_s
		str = ""
		str << @steps.to_s << " steps#{$/}"
		str << @stack.inspect << "#{$/}"
		(0...25).each do |y|
			(0...80).each do |x|
				inst = escape(instruction_get(x, y))
				if [x, y] == [@PC_x, @PC_y]
					inst = highlight(inst)
				end
				str << inst
			end
			str << "#{$/}"
		end
		str << @result << "#{$/}"
	end
end


if $0 == __FILE__
	
	source = if ARGV[0] then
		open(ARGV[0]) { |f| f.read }
	else
		DATA.read
	end.split /[\r\n]+/
	befunge = State.new source
	begin
		loop do
			if $DEBUG
				puts "#{$/}" * [terminal_size[1]-26, 0].max + befunge.to_s
				sleep 0.005
			end
			befunge.execute_current
		end
	rescue State::Done => e
		puts "#{$/}Done in #{befunge.steps} steps."
	ensure
		puts befunge.result if not $DEBUG
	end

end

__END__
                                     v
>v"Please enter a number n, for n! "0<
,:             >$*99g1-:99p#v_.25*,@
^_&:1-99p>:1-:!|10          < 
         ^     <

In This Thread