| All Source For Hash (Associative Array) Access | 
| hash.awka | 
# $Id: hash.gawk,v 1.3 2001/05/20 06:13:00 doug Exp $
# http://www.bagley.org/~doug/shootout/
# this program modified from:
#   http://cm.bell-labs.com/cm/cs/who/bwk/interps/pap.html
# Timing Trials, or, the Trials of Timing: Experiments with Scripting
# and User-Interface Languages</a> by Brian W. Kernighan and
# Christopher J. Van Wyk.
BEGIN {
    n = (ARGV[1] < 1) ? 1 : ARGV[1];
    for (i = 1; i <= n; i++)
    x[sprintf("%x", i)] = i
    for (i = n; i > 0; i--)
    if (i in x)
        c++
    print c
}
 | 
| hash.bcc | 
/* -*- mode: c -*-
 * $Id: hash.gcc,v 1.2 2001/01/07 08:33:09 doug Exp $
 * http://www.bagley.org/~doug/shootout/
 */
#include <stdio.h>
#include <stdlib.h>
#define inline
#include "simple_hash.h"
int main(int argc, char *argv[]) {
    int i, c=0, n = ((argc == 2) ? atoi(argv[1]) : 1);
    char buf[32];
    struct ht_ht *ht = ht_create(n);
    for (i=1; i<=n; i++) {
    sprintf(buf, "%x", i);
    (ht_find_new(ht, buf))->val = i;
    }
    for (i=n; i>0; i--) {
    sprintf(buf, "%d", i);
    if (ht_find(ht, buf)) c++;
    }
    ht_destroy(ht);
    printf("%d\n", c);
    return(0);
}
 | 
| hash.csharp | 
// $Id: hash.csharp,v 1.0 2002/02/14 14:48:00 dada Exp $
// http://dada.perl.it/shootout/
using System;
using System.Collections;
class App {
    public static int Main(String[] args) {        
        int n;
        Hashtable X = new Hashtable();     
        int c = 0;
        
        n = System.Convert.ToInt32(args[0]);
        if(n < 1) n = 1;
        
        for(int i=1; i<=n; i++) {
            X.Add( i.ToString("x"), i);
        }
        
        for(int i=n; i>0; i--) {
            if(X.ContainsKey(i.ToString())) c++;
        }
        Console.WriteLine(c.ToString());
        return(0);
    }
}
 | 
| hash.cygperl | 
#!/usr/local/bin/perl
# $Id: hash.perl,v 1.3 2001/05/16 16:11:41 doug Exp $
# http://www.bagley.org/~doug/shootout/
# this program is modified from:
#   http:#cm.bell-labs.com/cm/cs/who/bwk/interps/pap.html
# Timing Trials, or, the Trials of Timing: Experiments with Scripting
# and User-Interface Languages</a> by Brian W. Kernighan and
# Christopher J. Van Wyk.
use strict;
my $n = $ARGV[0] || 1;
my %X = ();
my $c = 0;
for my $i (1..$n) {
    $X{sprintf('%x', $i)} = $i;
}
for my $i (reverse 1..$n) {
    ++$c if exists $X{$i};
}
print "$c\n";
 | 
| hash.delphi | 
program hash1_2;
uses
  simpleHash in 'simpleHash.pas';
const
  cHexChars: array [0..15] of char = '0123456789abcdef';
  cNullStr: PChar = '00000000';
  function hexStr(i: cardinal): string;
  var n: integer;
  begin
    if i=0 then
      result:='0'
    else begin
      setString(result,cNullStr,8);
      n:=8;
      while (i>0) do begin
        result[n]:=cHexChars[i and $f];
        i:=i shr 4;
        dec(n);
      end;
      for n:=1 to 8 do
        if result[n]<>'0' then begin
          delete(result,1,n-1);
          exit;
        end;
    end;
  end;
var h: TStringHash; n, Count, i: cardinal; code: integer; s: string;
begin
  n :=1;
  if ParamCount=1 then
    Val(ParamStr(1),n,code);
  h:=TStringHash.Create;
  for i:=1 to n do
    h.add(hexStr(i),i);
  count:=0;
  for i:=1 to n do begin
    str(i,s);
    if h.get(s)<>nil then inc(Count);
  end;
  h.Destroy;
  writeln(Count);
end.
 | 
| hash.elastic | 
// $Id: hash.elastic,v 1.0 2002/05/21 14:38:00 dada Exp $
package xhash;
import basic;
import sys;
import array;
import hash;
private n = 1;
private i;
private c = 0;
private X = %[];
if(array.length(sys.args) > 0) {
    n = basic.int(sys.args[0]);
} else {
    n = 1;
}
for(i=1; i<=n; i++) {
    X[basic.sprintf("%x", i)] = i;
}
for(i=n; i>0; i=i-1) {
     if(hash.has_key(X, basic.sprintf("%d", i))) {
        c = c + 1;
    }
}
basic.print(c);
 | 
| hash.erlang | 
%%% -*- mode: erlang -*-
%%% $Id: hash.erlang,v 1.3 2001/05/21 01:28:48 doug Exp $
%%% http://www.bagley.org/~doug/shootout/
%%% Tweaked by James Hague.
%% Use ETS tables (Erlang's associative store).
-module(hash).
-export([main/0, main/1]).
main() -> main(['1']).
main([Arg]) ->
    N = list_to_integer(atom_to_list(Arg)),
    H = ets:new(ok, [set]),
    doinserts(0, N, H),
    Count = dolookups(N, 0, H),
    io:format("~w~n", [Count]),
    halt(0).
format_hex(0) -> $0;
format_hex(X) -> format_hex(X, []).
format_hex(0, Hex) -> Hex;
format_hex(X, Hex) ->
    N = X band 16#f,
    if
       N < 10 -> format_hex(X bsr 4, [N+$0 | Hex]);
       true ->   format_hex(X bsr 4, [N+($a-10) | Hex])
    end.
doinserts(N, N, H) -> ok;
doinserts(I, N, H) ->
    Hx = format_hex(I),
    ets:insert(H, {Hx, I}),
    doinserts(I+1, N, H).
dolookups(0, C, H) -> C;
dolookups(I, C, H) ->
    Nx = integer_to_list(I),
    case ets:lookup(H, Nx) of
        []-> dolookups(I-1, C, H);
        _ -> dolookups(I-1, C+1, H)
    end.
 | 
| hash.fpascal | 
Program hash;
uses SysUtils, Classes;
type
   THashEntryPtr = ^THashEntryRec;
   THashEntryRec = record
      name : string;
      number : longint;
      next : THashEntryPtr;
   end;
const
   TABLE_SIZE = 100000;
type THash = class
    private
        hashtable : array[0..TABLE_SIZE - 1] of THashEntryRec;
        function hash(s : string) : longint;
    public
        constructor Create;
        function store(name : string; number : longint; var error : longint) : boolean;
        function fetch(name : string; var number : longint) : boolean;
        function exists(name : string) : boolean;
end;
constructor THash.Create;
var
   i : longint;
begin
   for i := 0 to TABLE_SIZE - 1 do
      hashtable[i].next := nil;
end;
function THash.hash(s : string) : longint;
var
   i, j : longint;
begin
    if length(s) = 0 then Result := 0
    else
    begin
        j := ord(s[1]) mod TABLE_SIZE;
        for i := 2 to length(s) do
            j := (j shl 8 + ord(s[i])) mod TABLE_SIZE;
        Result := j;
    end;
end;
function THash.store(name : string; number : longint; var error : longint) : boolean;
var
   node, prev : THashEntryPtr;
begin
   error := 0;
   prev := @hashtable[hash(name)];
   node := prev^.next;
   
   while (node <> nil) and (node^.name <> name) do
   begin
      prev := node;
      node := node^.next;
   end;
   if node <> nil then error := 1
   else begin
      new(prev^.next);
      node := prev^.next;
      if node = nil then error := -1
      else begin
         node^.name := name;
     node^.number := number;
     node^.next := nil;
      end;
   end;
   
   Result := error = 0;
end;
function THash.fetch(name : string; var number : longint) : boolean;
var
   node : THashEntryPtr;
begin
   node := hashtable[hash(name)].next;
   while (node <> nil) and (node^.name <> name) do
      node := node^.next;
   if node <> nil then number := node^.number;
   Result := node <> nil;
end;
function THash.exists(name : string) : boolean;
var
   node : THashEntryPtr;
begin
   node := hashtable[hash(name)].next;
   while (node <> nil) and (node^.name <> name) do
      node := node^.next;
   Result := node <> nil;
end;
    
var
    n, i, c, err : longint;
    X : THash;
begin
    if ParamCount = 0 then
        n := 1
    else
        n := StrToInt(ParamStr(1));
        
    if n < 1 then n := 1;
    
    X := THash.Create();
    
    For i := 1 To n do
        X.store( Format('%x', [i]), i, err );
    
    c := 0;
    For i:= n downto 1 do
    begin
        if X.exists( IntToStr(i) ) Then Inc(c);
    end;
    
    Writeln (IntToStr(c));
end.
 | 
| hash.gawk | 
# $Id: hash.gawk,v 1.3 2001/05/20 06:13:00 doug Exp $
# http://www.bagley.org/~doug/shootout/
# this program modified from:
#   http://cm.bell-labs.com/cm/cs/who/bwk/interps/pap.html
# Timing Trials, or, the Trials of Timing: Experiments with Scripting
# and User-Interface Languages</a> by Brian W. Kernighan and
# Christopher J. Van Wyk.
BEGIN {
    n = (ARGV[1] < 1) ? 1 : ARGV[1];
    for (i = 1; i <= n; i++)
    x[sprintf("%x", i)] = i
    for (i = n; i > 0; i--)
    if (i in x)
        c++
    print c
}
 | 
| hash.gcc | 
/* -*- mode: c -*-
 * $Id: hash.gcc,v 1.2 2001/01/07 08:33:09 doug Exp $
 * http://www.bagley.org/~doug/shootout/
 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "simple_hash.h"
int main(int argc, char *argv[]) {
    int i, c=0, n = ((argc == 2) ? atoi(argv[1]) : 1);
    char buf[32];
    struct ht_ht *ht = ht_create(n);
    for (i=1; i<=n; i++) {
    sprintf(buf, "%x", i);
    (ht_find_new(ht, buf))->val = i;
    }
    for (i=n; i>0; i--) {
    sprintf(buf, "%d", i);
    if (ht_find(ht, buf)) c++;
    }
    ht_destroy(ht);
    printf("%d\n", c);
    return(0);
}
 | 
| hash.gforth | 
\ -*- mode: forth -*-
\ $Id: hash.gforth,v 1.1 2001/05/25 21:30:18 doug Exp $
\ http://www.bagley.org/~doug/shootout/
\ from Anton Ertl:
0. argc @ 1- arg >number 2drop drop constant NUM
wordlist constant x
: build 
    get-current x set-current
    base @ hex
    NUM 0 ?do
    i 0 <# #s #> nextname i constant
    loop
    base ! set-current ;
: countdecs 
    0 0 NUM -do
    i 0 <# #s #> x search-wordlist if
        drop 1+
    endif
    1 -loop
;
build countdecs 0 .r cr bye
 | 
| hash.ghc | 
-- $Id: hash.ghc,v 1.3 2001/06/18 18:17:03 doug Exp $
-- http://www.bagley.org/~doug/shootout/
-- from Bryn Keller
-- build with ghc -O2 -package data hash.ghc
import System (getArgs)
import FiniteMap
import Numeric (showInt)
countKeys tbl 0 = 0
countKeys tbl n = case (lookupWithDefaultFM tbl False (show n)) of
                    True -> 1 + countKeys tbl (n - 1)
                    _    -> countKeys tbl (n - 1)
buildTable tbl max num | num <= max = buildTable (addToFM tbl (showHex num "") True) max (num + 1)
                       | otherwise = tbl
showHex n r = let (n',d) = quotRem n 16
                  r'     = toEnum (fromEnum '0' + fromIntegral d) : r
                  in if n' == 0 then r' else showHex n' r'
main = do  args <- getArgs
           case args of
            [number] -> let num = read number
                            tbl = buildTable emptyFM num 1
                    in do putStrLn $ show (countKeys tbl num)
            _        -> fail "You must enter a number."
 | 
| hash.guile | 
#!/usr/local/bin/guile \
-e main -s
!#
;;; $Id: hash.guile,v 1.3 2001/06/29 23:12:37 doug Exp $
;;; http://www.bagley.org/~doug/shootout/
(define (main args)
  (use-modules (ice-9 format))
  (let* ((n (or (and (= (length args) 2) (string->number (cadr args))) 1))
     (last (- n 1))
     (c 0)
     (x (make-hash-table n)))
    (do ((i 1 (+ i 1)))
    ((> i n))
      (hash-set! x (number->string i 16) i))
    (do ((i last (- i 1)))
    ((< i 0))
      (if (hash-ref x (number->string i 10))
      (set! c (+ c 1))))
    (display (format "~D\n" c))))
 | 
| hash.ici | 
// $Id: hash.ici,v 1.0 2003/01/03 11:44:00 dada Exp $
// http://dada.perl.it/shootout
//
// contributed by Tim Long
n = argv[1] ? int(argv[1]) : 1;
x = struct();
for (i = 1; i < n + 1; ++i)
    x[sprintf("%x", i)] = i;
c = 0;
for (i = n; i > 0; --i)
    c += x[string(i)] != NULL;
printf("%d\n", c);
 | 
| hash.icon | 
# -*- mode: icon -*-
# $Id: hash.icon,v 1.1 2000/12/18 03:10:54 doug Exp $
# http://www.bagley.org/~doug/shootout/
procedure hexstring(i)
    local s
    if i = 0 then s := "0"
    else {
    s := ""
    while i ~= 0 do {
        s := "0123456789abcdef"[iand(i,15) + 1] || s
        i := ishift(i,-4)
    }
    }
    return s
end
procedure main(argv)
    local n
    local X
    local c
    local i
    n := argv[1] | 1
    X := table(0)
    c := 0
    every i := 1 to n do {
    X[hexstring(i)] := i
    }
    every i := n to 1 by -1 do {
    if (member(X,string(i))) then { c +:= 1 }
    }
    write(c)
end
 | 
| hash.java | 
// $Id: hash.java,v 1.3 2001/03/02 02:17:29 doug Exp $
// http://www.bagley.org/~doug/shootout/
// this program is modified from:
//   http://cm.bell-labs.com/cm/cs/who/bwk/interps/pap.html
// Timing Trials, or, the Trials of Timing: Experiments with Scripting
// and User-Interface Languages</a> by Brian W. Kernighan and
// Christopher J. Van Wyk.
import java.io.*;
import java.util.*;
public class hash {
    public static void main(String args[]) throws IOException {
    int n = Integer.parseInt(args[0]);
    int i, c;
    String s = "";
    Integer ii;
    // the original program used:
    // Hashtable ht = new Hashtable();
    // John Olsson points out that Hashtable is for synchronized access
    // and we should use instead:
    HashMap ht = new HashMap();
    c = 0;
    for (i = 1; i <= n; i++)
        ht.put(Integer.toString(i, 16), new Integer(i));
    for (i = 1; i <= n; i++)
        // The original code converted to decimal string this way:
        // if (ht.containsKey(i+""))
        if (ht.containsKey(Integer.toString(i, 10)))
        c++;
    System.out.println(c);
    }
}
 | 
| hash.jscript | 
// -*- mode: java -*-
// $Id: hash.njs,v 1.1 2001/07/08 20:20:06 doug Exp $
// http://www.bagley.org/~doug/shootout/
// from: David Hedbor <david@hedbor.org>
// modified by Aldo Calpini <dada@perl.it> for Win32
var i, c = 0;
var n;
ARGS = WScript.Arguments;
if(ARGS.length > 0) {
  n = parseInt(ARGS.Item(0), "10");
  if(n < 1) n = 1;
} else {   
  n = 1;
}
var X = new Object();
for (i=1; i<=n; i++) {
   X[i.toString(16)] = i;
}
for (i=n; i>0; i--) {
  if (X[i.toString()]) c++;
}
WScript.Echo(c);
 | 
| hash.lcc | 
/* -*- mode: c -*-
 * $Id: hash.gcc,v 1.2 2001/01/07 08:33:09 doug Exp $
 * http://www.bagley.org/~doug/shootout/
 */
#include <stdio.h>
#include <stdlib.h>
#include "simple_hash.h"
int main(int argc, char *argv[]) {
    int i, c=0, n = ((argc == 2) ? atoi(argv[1]) : 1);
    char buf[32];
    struct ht_ht *ht = ht_create(n);
    for (i=1; i<=n; i++) {
    sprintf(buf, "%x", i);
    (ht_find_new(ht, buf))->val = i;
    }
    for (i=n; i>0; i--) {
    sprintf(buf, "%d", i);
    if (ht_find(ht, buf)) c++;
    }
    ht_destroy(ht);
    printf("%d\n", c);
    return(0);
}
 | 
| hash.lua | 
-- $Id: hash.lua,v 1.1 2000/12/10 00:48:41 doug Exp $
-- http://www.bagley.org/~doug/shootout/
-- Author: Roberto Ierusalimschy
local n = tonumber((arg and arg[1]) or 1)
local X={}
for i=1,n do
  X[format("%x", i)] = i
end
local c = 0
for i=n,1,-1 do
  if X[i..''] then c = c+1 end
end
print(c)
 | 
| hash.lua5 | 
-- $Id: hash.lua,v 1.1 2000/12/10 00:48:41 doug Exp $
-- http://www.bagley.org/~doug/shootout/
-- contributed by Roberto Ierusalimschy
local n = tonumber((arg and arg[1]) or 1)
local X={}
for i=1,n do
  X[string.format("%x", i)] = i
end
local c = 0
for i=n,1,-1 do
  if X[i..''] then c = c+1 end
end
print(c)
 | 
| hash.mawk | 
# $Id: hash.mawk,v 1.2 2001/05/20 06:13:00 doug Exp $
# http://www.bagley.org/~doug/shootout/
# this program modified from:
#   http://cm.bell-labs.com/cm/cs/who/bwk/interps/pap.html
# Timing Trials, or, the Trials of Timing: Experiments with Scripting
# and User-Interface Languages</a> by Brian W. Kernighan and
# Christopher J. Van Wyk.
BEGIN {
    n = (ARGV[1] < 1) ? 1 : ARGV[1];
    for (i = 1; i <= n; i++)
    x[sprintf("%x", i)] = i
    for (i = n; i > 0; i--)
    if (i in x)
        c++
    print c
}
 | 
| hash.mercury | 
%% $Id: hash.mercury,v 1.1 2001/07/28 19:11:22 doug Exp $
%% http://www.bagley.org/~doug/shootout/
%% from Fergus Henderson
:- module mytest.
:- interface.
:- import_module io.
:- pred main(state::di, state::uo) is det.
:- implementation.
:- import_module string, hash_table, list, int.
main -->
    io__command_line_arguments(Args),
    { N = (if Args = [Arg], to_int(Arg, N0) then N0 else 1) },
    { X = insert_values(1, N, hash_table__new(string_double_hash, 18, 0.33)) },
    print(count(N, X, 0)), nl.
:- func insert_values(int, int, hash_table(string, int)) = hash_table(string, int).
:- mode insert_values(in, in, hash_table_di) = hash_table_uo.
insert_values(I, N, X0) =
    (if I > N then X0
    else insert_values(I + 1, N, X0^elem(int_to_base_string(I, 16)) := I)).
:- func count(int, hash_table(string, int), int) = int.
:- mode count(in, hash_table_ui, in) = out.
count(I, X, C0) =
    (if I = 0 then C0
    else count(I - 1, X,
        (if search(X, int_to_string(I), _) then C0 + 1 else C0))).
 | 
| hash.mingw32 | 
/* -*- mode: c -*-
 * $Id: hash.gcc,v 1.2 2001/01/07 08:33:09 doug Exp $
 * http://www.bagley.org/~doug/shootout/
 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "simple_hash.h"
int main(int argc, char *argv[]) {
    int i, c=0, n = ((argc == 2) ? atoi(argv[1]) : 1);
    char buf[32];
    struct ht_ht *ht = ht_create(n);
    for (i=1; i<=n; i++) {
    sprintf(buf, "%x", i);
    (ht_find_new(ht, buf))->val = i;
    }
    for (i=n; i>0; i--) {
    sprintf(buf, "%d", i);
    if (ht_find(ht, buf)) c++;
    }
    ht_destroy(ht);
    printf("%d\n", c);
    return(0);
}
 | 
| hash.nice | 
/* The Great Win32 Language Shootout http://dada.perl.it/shootout/ 
   contributed by Isaac Gouy (Nice novice)
To compile:	
   nicec --sourcepath=.. -d=. -a hash.jar hash
To run:
   java -jar hash.jar 80000
*/
import ackermann; // reuse toSingleInt
void main(String[] args){
   let n = toSingleInt(args);
   var count = 0;
   HashMap table = new HashMap();
   for (int i = 1; i <= n; i++) 
      table.put( toString(i, 16), i );
   for (int i = n; i > 0; i--)
      if (table.get( toString(i, 10) ) != null) count++;
   println(count);
}
String toString(int, int) = 
   native String java.lang.Integer.toString(int, int);
 | 
| hash.ocaml | 
(*
 * $Id: hash.ocaml,v 1.4 2001/01/08 03:02:47 doug Exp $
 * http://www.bagley.org/~doug/shootout/
 * with help from Markus Mottl
 *)
let hexdigits =  [| '0'; '1'; '2'; '3'; '4'; '5'; '6'; '7';
                    '8'; '9'; 'a'; 'b'; 'c'; 'd'; 'e'; 'f'; |]
let buf = String.create 32
let rec hexstring_of_int n idx len =
  if n <= 0 then String.sub buf idx len
  else begin
    let new_idx = idx - 1
    and new_len = len + 1 in
    String.set buf new_idx hexdigits.(n land 15);
    hexstring_of_int (n lsr 4) new_idx new_len
  end
let _ =
  let n =
    try int_of_string Sys.argv.(1)
    with Invalid_argument _ -> 1 in
  let hx = Hashtbl.create n in
  for i = 1 to n do
    Hashtbl.add hx (hexstring_of_int i 32 0) true
  done;
  let c = ref 0 in
  for i = n downto 1 do
    if Hashtbl.mem hx (string_of_int i) then incr c
  done;
  Printf.printf "%d\n" !c
 | 
| hash.ocamlb | 
(*
 * $Id: hash.ocaml,v 1.4 2001/01/08 03:02:47 doug Exp $
 * http://www.bagley.org/~doug/shootout/
 * with help from Markus Mottl
 *)
let hexdigits =  [| '0'; '1'; '2'; '3'; '4'; '5'; '6'; '7';
                    '8'; '9'; 'a'; 'b'; 'c'; 'd'; 'e'; 'f'; |]
let buf = String.create 32
let rec hexstring_of_int n idx len =
  if n <= 0 then String.sub buf idx len
  else begin
    let new_idx = idx - 1
    and new_len = len + 1 in
    String.set buf new_idx hexdigits.(n land 15);
    hexstring_of_int (n lsr 4) new_idx new_len
  end
let _ =
  let n =
    try int_of_string Sys.argv.(1)
    with Invalid_argument _ -> 1 in
  let hx = Hashtbl.create n in
  for i = 1 to n do
    Hashtbl.add hx (hexstring_of_int i 32 0) true
  done;
  let c = ref 0 in
  for i = n downto 1 do
    if Hashtbl.mem hx (string_of_int i) then incr c
  done;
  Printf.printf "%d\n" !c
 | 
| hash.oz | 
%%% $Id: hash.oz,v 1.0 2002/08/19 16:24:00 dada Exp $
%%% http://dada.perl.it/shootout/
%%% 
%%% contributed by Isaac Gouy
%%  Usage: start from command line with
%%     ozc -x hash.oz -o hash.oz.exe
%%     hash.oz.exe 2000
functor
import System Application
define
   fun {IntToHexString I Hex}
      if I =< 0 then Hex else
     local M D in 
        D = I div 16
        M = I mod 16
        if M < 10 then 
           {IntToHexString D M+&0|Hex}
        else
           {IntToHexString D (M-10)+&a|Hex}
        end
     end
      end
   end
   proc {InsertHexKeys H N}
      for I in 0..N-1 do 
    {Dictionary.put H {String.toAtom {IntToHexString I nil}} I}
      end
   end
   proc {CountLookups H I S C}
      if I >= 0 then 
     if {Dictionary.member H {String.toAtom {IntToString I}}} then
        {CountLookups H I-1 S+1 C}
     else 
        {CountLookups H I-1 S C}
     end
      else C = S end
   end
in 
   local Args N H Count in
      [Args] = {Application.getArgs plain}
      N = {String.toInt Args}
      {NewDictionary H}
      {InsertHexKeys H N}
      {CountLookups H N 0 Count}
      {System.showInfo Count}
   end
   {Application.exit 0}
end
 | 
| hash.parrot | 
# $Id: hash.parrot,v 1.0 2002/08/20 11:14:00 dada Exp $
# http://dada.perl.it/shootout/
    set I1, P0[1]
    new P1, .PerlHash
#    new P2, .PerlInt
    set I0, 1
BUILD:
    bsr DEC2HEX
    
#    set P2, I0
#    set P1[S0], P2
    
    set P1[S0], I0
    inc I0
    le I0, I1, BUILD
    set I0, 0
COUNT:
    set S0, I1
#    print "GET hash("
#    print S0
#    print ")="
#    set P2, P1[S0]
#    typeof I2, P2
#    typeof S2, P2
#    print S2
    set I2, P1[S0]
    unless I2, NEXT
#    eq I2, .PerlUndef, NEXT
#    print " ++"
    inc I0
NEXT:
#    print "\n"
    dec I1
    if I1, COUNT
    
    print I0
    print "\n"
    end
DEC2HEX:
    
    set S0, ""
    set I10, I0
DEC2HEX_START:
    mod I11, I10, 16    
    lt I11, 10, DEC2HEX_N    
    eq I11, 15, DEC2HEX_F
    eq I11, 14, DEC2HEX_E
    eq I11, 13, DEC2HEX_D
    eq I11, 12, DEC2HEX_C
    eq I11, 11, DEC2HEX_B
    eq I11, 10, DEC2HEX_A
DEC2HEX_N:
    set S1, I11
    concat S0, S1, S0
    branch DEC2HEX_NEXT
    
DEC2HEX_A:
    concat S0, "a", S0
    branch DEC2HEX_NEXT
DEC2HEX_B:
    concat S0, "b", S0
    branch DEC2HEX_NEXT
DEC2HEX_C:
    concat S0, "c", S0
    branch DEC2HEX_NEXT
DEC2HEX_D:
    concat S0, "d", S0
    branch DEC2HEX_NEXT
DEC2HEX_E:
    concat S0, "e", S0
    branch DEC2HEX_NEXT
    
DEC2HEX_F:
    concat S0, "f", S0
DEC2HEX_NEXT:
    div I10, I10, 16
    if I10, DEC2HEX_START
    ret
 | 
| hash.perl | 
#!/usr/local/bin/perl
# $Id: hash.perl,v 1.3 2001/05/16 16:11:41 doug Exp $
# http://www.bagley.org/~doug/shootout/
# this program is modified from:
#   http:#cm.bell-labs.com/cm/cs/who/bwk/interps/pap.html
# Timing Trials, or, the Trials of Timing: Experiments with Scripting
# and User-Interface Languages</a> by Brian W. Kernighan and
# Christopher J. Van Wyk.
use strict;
my $n = $ARGV[0] || 1;
my %X = ();
my $c = 0;
for my $i (1..$n) {
    $X{sprintf('%x', $i)} = $i;
}
for my $i (reverse 1..$n) {
    ++$c if exists $X{$i};
}
print "$c\n";
 | 
| hash.php | 
<?php
/*
 $Id: hash.php,v 1.2 2001/05/06 05:25:08 doug Exp $
 http://www.bagley.org/~doug/shootout/
*/
$n = ($argc == 2) ? $argv[1] : 1;
for ($i = 1; $i <= $n; $i++) {
    $X[dechex($i)] = $i;
}
for ($i = $n; $i > 0; $i--) {
    if ($X[$i]) { $c++; }
}
print "$c\n";
?>
 | 
| hash.pike | 
#!/usr/local/bin/pike// -*- mode: pike -*-
// $Id: hash.pike,v 1.2 2000/12/12 21:28:39 doug Exp $
// http://www.bagley.org/~doug/shootout/
// from: Martin Nilsson
void main(int argc, array(string) argv)
{
    int i, c = 0;
    int n = (int)argv[-1];
    if (n < 1) n = 1;
      
    mapping(string:int) X = ([]);
    
    for (i=1; i<=n; i++) {
    X[sprintf("%x", i)] = i;
    }
    for (i=n; i>0; i--) {
    if (X[(string)i]) c++;
    }
    write("%d\n", c);
}
 | 
| hash.pliant | 
# $Id: hash.pliant,v 1.0 2002/02/06 16:48:00 dada Exp $
# http://dada.perl.it/shootout/
module "/pliant/language/context.pli"
gvar (Dictionary Str Int) X
gvar Int c
gvar Int i
gvar Str s_n := cast ((pliant_script_args translate Address 1) map CStr) Str
if (s_n parse (gvar Int n))
  c := 0
  for (i) 1 n
    X insert (string i "radix 16") i
  for (i) n 1 step -1
    if (X exists (string i))
      c := c + 1
  console c eol
else
  console "usage: nestedloop.pli <number>" eol
 | 
| hash.poplisp | 
;;; -*- mode: lisp -*-
;;; $Id: hash.poplisp,v 1.0 2002/05/03 13:28:00 dada Exp $
(declaim (optimize (speed 3) (space 0) (safety 0) (debug 0) (compilation-speed 0)))
(defun command-line-argument ()
  (parse-integer (or (car pop11::poparglist) "1")))
(defconstant +digit+ "0123456789ABCDEF")
(defconstant +digits-needed+
  #(    (10 100 1000 10000 100000 10000000 100000000 536870911)
        (16 256 4096 65536 1048576 16777216 268435456 4294967296 536870911)
    )
)
(defun fixnum-to-string (n base)
  (declare (fixnum n base))
  (let* ((size (position-if (lambda (x) (> (the fixnum x) n))
                (aref +digits-needed+ (ash base -4))))
     (result (make-string (1+ size))))
    (loop for i fixnum from size downto 0 with q fixnum = n and r fixnum = 0
      do (multiple-value-setq (q r) (floor q base))
         (setf (schar result i) (aref +digit+ r)))
    result)
)
(defun main (&optional (n (command-line-argument)))
  (let ((hash (make-hash-table :test 'equal :size n)))
    (macrolet ((hash (i base) `(gethash (fixnum-to-string ,i ,base) hash)))
      (loop for i fixnum from 1 to n do (setf (hash i 16) i))
      (format t "~a~%" (loop for i fixnum from n downto 1 count (hash i 10))))))
(main)
 | 
| hash.python | 
#!/usr/local/bin/python
# $Id: hash.python,v 1.4 2001/06/10 03:33:57 doug Exp $
# http://www.bagley.org/~doug/shootout/
# with help from from Gustavo Niemeyer
import sys
#sys.setcheckinterval(10000)
def main():
    n = int(sys.argv[1])
    X = {}
    myhex = hex
    for i in xrange(1,n+1):
        X[myhex(i)[2:]] = i
    c = 0
    has_key = X.has_key
    for i in xrange(n, 0, -1):
        c += has_key(`i`)
    print c
main()
 | 
| hash.rebol | 
REBOL [
    Title:   "Hash"
    Author:  "Aldo Calpini"
    Date:    05-Jul-2001
    File:    %hash.r
]
NUM: to-integer to-string system/script/args
NUM: either NUM < 1 [ 1 ] [ NUM ]
myhex: func [ N /local k flag c r ] [
    k: to-hex N
    k: to-string k
    flag: 0
    r: copy ""
    forall k [
        c: first k
        if (c <> #"0") or (flag = 1) [
            append r c
            flag: 1
        ]
    ]
    return r
]
X: make hash! []
c: 0
for i 1 NUM 1 [
    append X myhex i
    append X i
]
for i NUM 1 -1 [
    s: to-string i
    if select/skip X s 2 [
        c: c + 1
    ]
]
print c
write %output.rebol c
 | 
| hash.rexx | 
parse arg n
If n < 1 Then Do
    n = 1
End
Do i = 1 To n
    xx = d2x(i)
    X.xx = i
End
c = 0
Do i = n To 1 By -1
    if X.i <> "X."i Then Do
        c = c + 1
    End
End
Say c
 | 
| hash.ruby | 
#!/usr/local/bin/ruby
# -*- mode: ruby -*-
# $Id: hash.ruby,v 1.2 2001/05/16 15:54:34 doug Exp $
# http://www.bagley.org/~doug/shootout/
n = Integer(ARGV.shift || 1)
X = {}
for i in 1 .. n
    X[sprintf("%x", i)] = 1
end
c = 0
(n).step(1,-1) do |i|
    if (X.has_key?(i.to_s)) then
    c += 1
    end
end
puts c
 | 
| hash.se | 
-- -*- mode: eiffel -*-
-- $Id: hash.se,v 1.3 2001/01/18 20:57:05 doug Exp $
-- http://www.bagley.org/~doug/shootout/
class HASH
   
creation make
   
feature -- Initialization
   
   make is
      local
     n : INTEGER
     i, j, c : INTEGER
     s : STRING
     ht : DICTIONARY[INTEGER, STRING]
     
     arg: ARGUMENTS
      do
     n := argument(1).to_integer
     !!ht.with_capacity(n);
     
     from  i := 1
     until i > n
     loop
        s := i.to_hexadecimal
        from  j := 1
        until s @ j /= '0'
        loop  j := j + 1
        end
        ht.put (i, s.substring(j,s.count))
        i := i+1
     end
     
     from  i := n
     until i = 0
     loop
        s := i.to_string
         if ht.has (s) then
           c := c + 1
        end
        i := i - 1
     end
     
     print (c.out + "%N")
      end
end -- class HASH
 | 
| hash.slang | 
% $Id: hash.slang,v 1.0 2003/01/03 14:09:00 dada Exp $
% http://dada.perl.it/shootout/
%
% contributed by John E. Davis
define main ()
{
   variable n = integer (__argv[1]);
   variable X = Assoc_Type[Int_Type];
   _for (1, n, 1)
     {
    variable i = ();
    X[sprintf("%x", i)] = i;
     }
   variable c = 0;
   _for (n, 1, -1)
     {
    i = ();
    if (assoc_key_exists (X, string(i)))
      c++;
     }
   vmessage ("%d", c);
}
main();
 | 
| hash.smlnj | 
(* -*- mode: sml -*-
 * $Id: hash.smlnj,v 1.3 2001/07/09 00:25:28 doug Exp $
 * http://www.bagley.org/~doug/shootout/
 *)
structure Test : sig
    val main : (string * string list) -> OS.Process.status
end = struct
open HashTable;
fun hashtest n =
    let
    val hx = mkTable (HashString.hashString, op =) (n, (Fail "not found"))
    fun doinserts i n =
        if i < n then (
        insert hx ((Int.fmt StringCvt.HEX i), i);
        doinserts (i+1) n
        ) else ()
    fun dolookups i c =
        if i > 0 then
        case find hx (Int.toString i) of
            SOME key => dolookups (i-1) (c+1)
          | _ => dolookups (i-1) c
        else c
    in (
    doinserts 0 n;
    dolookups n 0
    ) end;
fun atoi s = case Int.fromString s of SOME num => num | NONE => 0;
fun main(name, args) = 
    let
    val arg = hd(args @ ["1"])
    val num = atoi arg
    val result = hashtest num
    in
    print (Int.toString result) ; print "\n" ;
    OS.Process.success
    end
end
val _ = SMLofNJ.exportFn("hash", Test.main);
 | 
| hash.tcl | 
#!/usr/local/bin/tclsh
# $Id: hash.tcl,v 1.4 2001/05/02 05:32:39 doug Exp $
# http://www.bagley.org/~doug/shootout/
# this program is modified from:
#   http://cm.bell-labs.com/cm/cs/who/bwk/interps/pap.html
# Timing Trials, or, the Trials of Timing: Experiments with Scripting
# and User-Interface Languages</a> by Brian W. Kernighan and
# Christopher J. Van Wyk.
proc main {} {
    global argv
    set n [lindex $argv 0]
    for {set i 1} {$i <= $n} {incr i} {
        set x([format {%x} $i]) $i
    }
    set c 0
    for {set i $n} {$i > 0} {incr i -1} {
    if {[info exists x($i)]} {
        incr c
    }
    }
    puts $c
}
main
 | 
| hash.vbscript | 
n = WScript.Arguments(0)
If n < 1 Then n = 1
Set X = CreateObject("Scripting.Dictionary")
c = 0
For i = 1 To N
    X.Add Hex(i), i
Next
For i = n To 1 step -1
    If X.Exists(CStr(i)) Then c = c + 1
Next
WScript.Echo c
 | 
| hash.vc | 
/* -*- mode: c -*-
 * $Id: hash.gcc,v 1.2 2001/01/07 08:33:09 doug Exp $
 * http://www.bagley.org/~doug/shootout/
 */
#include <stdio.h>
#include <stdlib.h>
#include "simple_hash.vc.h"
int main(int argc, char *argv[]) {
    int i, c=0, n = ((argc == 2) ? atoi(argv[1]) : 1);
    char buf[32];
    struct ht_ht *ht = ht_create(n);
    for (i=1; i<=n; i++) {
    sprintf(buf, "%x", i);
    (ht_find_new(ht, buf))->val = i;
    }
    for (i=n; i>0; i--) {
    sprintf(buf, "%d", i);
    if (ht_find(ht, buf)) c++;
    }
    ht_destroy(ht);
    printf("%d\n", c);
    return(0);
}
 | 
| hash.vc++ | 
// -*- mode: c++ -*-
// $Id: hash.g++,v 1.2 2001/06/20 03:20:02 doug Exp $
// http://www.bagley.org/~doug/shootout/
#include <stdio.h>
#include <iostream>
#include <hash_map.h>
using namespace std;
struct eqstr {
    bool operator()(const char* s1, const char* s2) const {
    return strcmp(s1, s2) == 0;
    }
};
int
main(int argc, char *argv[]) {
    int n = ((argc == 2) ? atoi(argv[1]) : 1);
    char buf[16];
    typedef hash_map<const char*, int, hash<const char*>, eqstr> HM;
    HM X;
    for (int i=1; i<=n; i++) {
    sprintf(buf, "%x", i);
    X[strdup(buf)] = i;
    }
    int c = 0;
    for (int i=n; i>0; i--) {
    sprintf(buf, "%d", i);
    if (X[strdup(buf)]) c++;
    }
    cout << c << endl;
}
 | 
| hash.vpascal | 
Program hash;
uses SysUtils, Classes;
type
   THashEntryPtr = ^THashEntryRec;
   THashEntryRec = record
      name : string;
      number : longint;
      next : THashEntryPtr;
   end;
const
   TABLE_SIZE = 100000;
type THash = class
    private
        hashtable : array[0..TABLE_SIZE - 1] of THashEntryRec;
        function hash(s : string) : longint;
    public
        constructor Create;
        function store(name : string; number : longint; var error : longint) : boolean;
        function fetch(name : string; var number : longint) : boolean;
        function exists(name : string) : boolean;
end;
constructor THash.Create;
var
   i : longint;
begin
   for i := 0 to TABLE_SIZE - 1 do
      hashtable[i].next := nil;
end;
function THash.hash(s : string) : longint;
var
   i, j : longint;
begin
    if length(s) = 0 then Result := 0
    else
    begin
        j := ord(s[1]) mod TABLE_SIZE;
        for i := 2 to length(s) do
            j := (j shl 8 + ord(s[i])) mod TABLE_SIZE;
        Result := j;
    end;
end;
function THash.store(name : string; number : longint; var error : longint) : boolean;
var
   node, prev : THashEntryPtr;
begin
   error := 0;
   prev := @hashtable[hash(name)];
   node := prev^.next;
   
   while (node <> nil) and (node^.name <> name) do
   begin
      prev := node;
      node := node^.next;
   end;
   if node <> nil then error := 1
   else begin
      new(prev^.next);
      node := prev^.next;
      if node = nil then error := -1
      else begin
         node^.name := name;
     node^.number := number;
     node^.next := nil;
      end;
   end;
   
   Result := error = 0;
end;
function THash.fetch(name : string; var number : longint) : boolean;
var
   node : THashEntryPtr;
begin
   node := hashtable[hash(name)].next;
   while (node <> nil) and (node^.name <> name) do
      node := node^.next;
   if node <> nil then number := node^.number;
   Result := node <> nil;
end;
function THash.exists(name : string) : boolean;
var
   node : THashEntryPtr;
begin
   node := hashtable[hash(name)].next;
   while (node <> nil) and (node^.name <> name) do
      node := node^.next;
   Result := node <> nil;
end;
    
var
    n, i, c, err : longint;
    X : THash;
begin
    if ParamCount = 0 then
        n := 1
    else
        n := StrToInt(ParamStr(1));
        
    if n < 1 then n := 1;
    
    X := THash.Create;
    
    For i := 1 To n do
        X.store( Format('%x', [i]), i, err );
    
    c := 0;
    For i:= n downto 1 do
    begin
        if X.exists( IntToStr(i) ) Then Inc(c);
    end;
    
    Writeln (IntToStr(c));
end.
 |