Sha256: ef0713edeb599a0a665d8d11ad9aee46633cbd4f4d7deb6f5c99a547f604e8ac

Contents?: true

Size: 1.56 KB

Versions: 9

Compression:

Stored size: 1.56 KB

Contents

const std = @import("std");
const ruby = @cImport(@cInclude("ruby/ruby.h"));
const testing = std.testing;

// Calculate number of open doors after N passes
// Code taken from Rosetta Code: https://rosettacode.org/wiki/100_doors#Zig
fn hundred_doors(passes: c_int) c_int {
    var doors = [_]bool{false} ** 101;
    var pass: u8 = 1;
    var door: u8 = undefined;
    
    while (pass <= passes) : (pass += 1) {
        door = pass;
        while (door <= 100) : (door += pass)
            doors[door] = !doors[door];
    }
    
    var num_open: u8 = 0;
    for (doors) |open| {
        if (open) 
            num_open += 1;
    }
    return num_open;
}

// This is a wrapper for hundred_doors function to make it work with Ruby.
fn rb_hundred_doors(...) callconv(.C) ruby.VALUE {
    var ap = @cVaStart();
    defer @cVaEnd(&ap);

    // first argument is `self`, but we don't use it so we need to discard it
    var self = @cVaArg(&ap, ruby.VALUE);
    _ = self;

    // back and forth conversion from Ruby types to internal types + delegation to
    // actual `hundred_doors` function
    var passes = ruby.NUM2INT(@cVaArg(&ap, ruby.VALUE));
    return ruby.INT2NUM(hundred_doors(passes));
}

export fn Init_libzigrb_100doors() void {
    ruby.ruby_init();
    var zig_rb_class: ruby.VALUE = ruby.rb_define_class("ZigExample", ruby.rb_cObject);
    _ = ruby.rb_define_method(zig_rb_class, "hundred_doors", rb_hundred_doors, 1);
}

test "hundred doors 100 passes" {
    try testing.expect(hundred_doors(100) == 10);
}

test "hundred_doors 1 pass" {
    try testing.expect(hundred_doors(1) == 100);
}

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
zig_example-0.4.0 ext/zigrb_100doors/src/main.zig
zig_example-0.4.0.pre ext/zigrb_100doors/src/main.zig
zig_example-0.3.4 ext/zigrb_100doors/src/main.zig
zig_example-0.3.3.1 ext/zigrb_100doors/src/main.zig
zig_example-0.3.2 ext/zigrb_100doors/src/main.zig
zig_example-0.3.1 ext/zigrb_100doors/src/main.zig
zig_example-0.3.0 ext/zigrb_100doors/src/main.zig
zig_example-0.2.0 ext/zigrb_100doors/src/main.zig
zig_example-0.1.0 ext/zigrb_100doors/src/main.zig