0
  	   /พึ0ภำ     1ฮึภำ ์    1#! /usr/bin/env python

# Python interface to the Internet finger daemon.
#
# Usage: finger [options] [user][@host] ...
#
# If no host is given, the finger daemon on the local host is contacted.
# Options are passed uninterpreted to the finger daemon!


import sys, string
from socket import *


# Hardcode the number of the finger port here.
# It's not likely to change soon...
#
FINGER_PORT = 79


# Function to do one remote finger invocation.
# Output goes directly to stdout (although this can be changed).
#
def finger(host, args):
    s = socket(AF_INET, SOCK_STREAM)
    s.connect((host, FINGER_PORT))
    s.send(args + '\n')
    while 1:
        buf = s.recv(1024)
        if not buf: break
        sys.stdout.write(buf)
    sys.stdout.flush()


# Main function: argument parsing.
#
def main():
    options = ''
    i = 1
    while i < len(sys.argv) and sys.argv[i][:1] == '-':
        options = options + sys.argv[i] + ' '
        i = i+1
    args = sys.argv[i:]
    if not args:
        args = ['']
    for arg in args:
        if '@' in arg:
            at = string.index(arg, '@')
            host = arg[at+1:]
            arg = arg[:at]
        else:
            host = ''
        finger(host, options + arg)


# Call the main function.
#
main()
     3ยึM:ฯภำ 8    3๓
๏ic        
   @   sั  d  Z  d Z d d d d d d d d	 g Z d
 d l m Z m Z m Z m Z m Z m	 Z	 d
 d l
 m Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z y d
 d l TWn e k
 rn Xd   Z e Z d* d  Z e Z d* d  Z e  d k rอg  Z! d  d! d" d# d$ d% d& d' d( d) g
 Z" x e" D] Z# e e! e#  qrWg  Z$ x e! rฎe$ j% e e!   qWe$ GHd
 d* l& Z& e& j'   n  d* S(+   s๏  Heap queue algorithm (a.k.a. priority queue).

Heaps are arrays for which a[k] <= a[2*k+1] and a[k] <= a[2*k+2] for
all k, counting elements from 0.  For the sake of comparison,
non-existing elements are considered to be infinite.  The interesting
property of a heap is that a[0] is always its smallest element.

Usage:

heap = []            # creates an empty heap
heappush(heap, item) # pushes a new item on the heap
item = heappop(heap) # pops the smallest item from the heap
item = heap[0]       # smallest item on the heap without popping it
heapify(x)           # transforms list into a heap, in-place, in linear time
item = heapreplace(heap, item) # pops and returns smallest item, and adds
                               # new item; the heap size is unchanged

Our API differs from textbook heap algorithms as follows:

- We use 0-based indexing.  This makes the relationship between the
  index for a node and the indexes for its children slightly less
  obvious, but is more suitable since Python uses 0-based indexing.

- Our heappop() method returns the smallest item, not the largest.

These two make it possible to view the heap as a regular Python list
without surprises: heap[0] is the smallest item, and heap.sort()
maintains the heap invariant!
so  Heap queues

[explanation by Fran็ois Pinard]

Heaps are arrays for which a[k] <= a[2*k+1] and a[k] <= a[2*k+2] for
all k, counting elements from 0.  For the sake of comparison,
non-existing elements are considered to be infinite.  The interesting
property of a heap is that a[0] is always its smallest element.

The strange invariant above is meant to be an efficient memory
representation for a tournament.  The numbers below are `k', not a[k]:

                                   0

                  1                                 2

          3               4                5               6

      7       8       9       10      11      12      13      14

    15 16   17 18   19 20   21 22   23 24   25 26   27 28   29 30


In the tree above, each cell `k' is topping `2*k+1' and `2*k+2'.  In
an usual binary tournament we see in sports, each cell is the winner
over the two cells it tops, and we can trace the winner down the tree
to see all opponents s/he had.  However