Игорь Пашев

Mar. 25th, 2012

01:15 am - НОД на ECMAScript при поддержке Node.js

#!/usr/bin/node


function gcd2(a, b) {
    return b == 0 ? a : gcd2(b, a % b);
}

// Don't use parseInt() itself in map() - it used to have 2 arguments
var nums = process.argv.map(
        function(s) {return parseInt(s)}
    ).filter( // It will not work if this script or node itself is named as number ;-)
        function(t) {return !isNaN(t)}
    );

if (nums.length > 0) {
    var GCD = nums.reduce(gcd2); // Yeah, we could use lambda here
    console.log(GCD);
}

https://github.com/ip1981/GCD/blob/master/gcd.js

Tags: , , ,
(Оставить комментарий)

Jul. 23rd, 2011

03:52 pm - НОД на Гоу

/*
 SYNOPSIS:

 With GCC >= 4.6:
 # gccgo gcd.go -o gcd-go
 # ./gcd-go 11 22 33 44 121

 With Google Go (6g for amd64, 8g for x86):
 # 6g -o gcd-go.o  gcd.go
 # 6l -o gcd-go-6g gcd-go.o
 # ./gcd-go-6g 11 22 33 44 121

 GCC makes dynamically linked binary,
 but Google Go - statically linked

*/

package main

// Both Google Go and GCC issue an error "imported and not used",
// if imported and not used :-)
import "fmt"
import "flag"
import "strconv"

func gcd2 (a, b uint) uint {
    if b == 0 {
        return a
    }
    /* 6g issues an error "function ends without a return statement",
       if we use if ... {... return} else {... return}.
       But GCC doesn't.
    */
    return gcd2(b, a % b)
}

func gcdn (ns []uint) uint {
    var r uint // zero by default
    for i := range ns {
        r = gcd2(r, ns[i])
    }
    return r
}

func main() {
    flag.Parse() // without this 6g will give flag.NArg() = 0 next (WTF?)
    n := flag.NArg()
    if n > 0 {
        ns := make([]uint, n) // We have garbage collector!

        // Or: for i := range ns, since range of ns is equal to flag.NArg()
        for i := 0; i < n; i++ {
            // Drop the second return value (error code):
            ns[i], _ = strconv.Atoui(flag.Arg(i))
        }

        g  := gcdn(ns)
        fmt.Printf("%v\n", g)
    }
}


https://github.com/ip1981/ebuilds/tree/master/dev-lang/golang

Tags: , , , ,
(Оставить комментарий)

Jul. 14th, 2011

08:34 pm - НОД на ассемблере (x86, 32 бита, Солярис 11)

https://github.com/ip1981/GCD/blob/master/assembler/gcd-x86-solaris.s

По системным вызовам Соляриса:
http://my.opera.com/myrkraverk/blog/2010/02/02/directly-calling-solaris-system-calls

Различия с линуксовой версией:

--- gcd-x86-linux.s	2011-07-04 00:33:43.000000000 +0400
+++ gcd-x86-solaris.s	2011-07-14 20:31:09.000000000 +0400
@@ -68,12 +68,15 @@
     
     # printing the number:
     mov $4,   %eax # syscall `write'
-    mov $1,   %ebx # write to stdout
-    mov %edi, %ecx # first character to write
     mov $buf_end, %edx
     sub %edi, %edx # edx is a number of characters to write (buf_end - edi)
     inc %edx       # + new line
-    int $0x80      # do syscall (print the number)
+    push %edx
+    push %edi # first character to write
+    push $1   # write to stdout
+    push $0   # dummy
+    int $0x91 # do syscall (print the number)
+    add $16, %esp # clean stack 16 = 4 * 4 (32 bits!)
 
     ret
 
@@ -133,6 +136,7 @@
 
 exit:
     mov $1,   %eax  # exit syscall
-    xor %ebx, %ebx  # exit code = 0
-    int $0x80
+    push $0       # exit code = 0
+    push $0       # dummy
+    int $0x91
 

Tags: , , ,
(Оставить комментарий)

Jul. 8th, 2011

01:23 am - НОД на C++

https://github.com/ip1981/GCD/blob/master/gcd.cpp

С отличие от чистого Си, одну и ту же программу можно
использовать и для встроенного unsigned int, и для GMP.
(https://github.com/ip1981/GCD/blob/master/gcd.c,
https://github.com/ip1981/GCD/blob/master/gcd-gmp.c).

Перегрузка функций, обобщённое программирование, все дела :-)

Программа )

Tags: , ,
(Оставить комментарий)

Jul. 5th, 2011

01:09 am - НОД на Рубине

Очень приятный язык.
https://github.com/ip1981/GCD/blob/master/gcd.rb

#!/usr/bin/env ruby

def gcd2 a, b
    if b == 0
        a
    else
        gcd2 b, a % b
    end
end

# http://railspikes.com/2008/8/11/understanding-map-and-reduce
def gcdn ns
    ns.reduce{ |a, b| gcd2 a, b }
end

puts gcdn ARGV.collect{ |s| s.to_i }


# ./gcd.rb 121 363 33
11

Tags: , ,
(4 комментария | Оставить комментарий)

Jul. 4th, 2011

12:39 am - НОД на ассемблере (x86, 32 бита, линукс)

https://github.com/ip1981/GCD/blob/master/assembler/gcd-x86-linux.s

Невероятный по красоте способ перевода строки в целое число
(http://www.cyberforum.ru/archive/t-214807.html):

str2uint_loop:
    lodsb # going forward from esi
    # HINT: assert '0' <= al <= '9'
    lea    (%ebx, %ebx, 4), %ebx # ebx = 4*ebx + ebx = 5*ebx ;-)
    lea -48(%eax, %ebx, 2), %ebx # ebx = 2*ebx + %eax - 48
                                 # ebx is multiplied by 10 each iteration,
                                 # eax-48 will be multiplied at the next iteration ;-)
    loop str2uint_loop
    ret


Алсо поупражнялся с GDB.
Алсо в планах Солярка и 64 бита.

Tags: , , ,
(Оставить комментарий)

Jun. 26th, 2011

02:23 pm - НОД на Фортране (2003)

Язык в целом приятный, но доступ к командной строке,
стандартизированный только в Фортране 2003, убивает.

https://github.com/ip1981/GCD

! SYNOPSIS:
!
! # gfortran -o gcd-f gcd.f03
! # ./gcd-f 11 22 33 121
!

program GCD
implicit none

integer, allocatable :: ns(:)
integer :: i, n
character*20 :: tmpstr

n = command_argument_count()

allocate(ns(n)) ! allocate memory for numbers given in command line

do i = 1, n
    call get_command_argument(i, tmpstr)
    ns(i) = str2int(tmpstr)
end do

print *,  gcdn(ns)

deallocate(ns)


! If we declare functions first,
! we have to specify its types within
! the `program' section.
! See http://en.wikibooks.org/wiki/Fortran/Fortran_procedures_and_functions
contains

pure integer function str2int (s)
    character*(*), intent(in) :: s
    read (s, *) str2int
end function

pure recursive integer function gcd2 (a, b) result(GCD)
    integer, intent(in) :: a, b
    if (b == 0) then
        GCD = a
    else
        GCD = gcd2(b, mod(a, b))
    end if
end function gcd2

pure integer function gcdn(n)
    integer, intent(in) :: n(:) ! n is an array
    integer :: i
    gcdn = n(1)
    do i = 2, size(n)
        gcdn = gcd2(gcdn, n(i))
    end do
end function

end program

Tags: , ,
(4 комментария | Оставить комментарий)

Apr. 10th, 2011

10:31 pm - НОД на TCL

Наибольший общий делитель на Тикле:

https://github.com/ip1981/GCD/blob/master/gcd.tcl

Tags: , ,
(1 комментарий | Оставить комментарий)

Feb. 20th, 2011

03:57 pm - НОД на Луне

#!/usr/bin/env lua

-- SYNOPSIS:
-- # chmod +x gcd.lua; ./gcd.lua 121 22 33 44
-- # lua gcd.lua 121 33 22

-- http://www.lua.org/pil/6.3.html
function gcd2(a, b)
    if b == 0 then
        return a
    else
        return gcd2(b, a % b)
    end
end

function gcdn(ns)
    r = ns[1]
    local r = ns[1]
    for i = 2, table.maxn(ns) #ns do
        r = gcd2(r, ns[i])
    end
    return r
end

print(gcdn(arg))

Tags: , ,
(6 комментариев | Оставить комментарий)

Feb. 13th, 2011

03:55 pm - Наибольший общий делитель на Прологе

Введение

Со школьных времён я при изучении нового языка пишу на нём алгоритм Евклида для нахождения наибольшего общего делителя (НОД). Здесь — https://github.com/ip1981/GCD — я начал собирать коллекцию программ на разных языках. У них одна идея: программа ищет НОД для чисел, указанных в командной строке. Возможно, я добавлю чтение из файла, так как главная цель — не НОД, а возможности языка. Я знаю про Rosetta Code, но там каша из кода, написанного разными людьми, не доведённого до конца, местами говнокод.

НОД на Прологе )

P. S. https://docs.google.com/document/pub?id=10vRZ-OykfEUfehlVUjlmBSbDAuOHVNtZmtfnbXD_9QU

Tags: , , ,
(Оставить комментарий)