Tagged: python Toggle Comment Threads | 键盘快捷键

  • jinzihao pm10:38 on 2018年5月17日 链接地址 | 回复
    Tags: python, 算法   

    用3盏灯实现群聊 —— 一道趣味题和一个协议设计 

    这是题目:

    10个人不能见面,只靠3盏灯来交换信息,如何协调配合呢?
    不可思议的是,只要3盏灯,10个人就可以拉个群一起聊天了 —— 没错,互相发送文字,没有长度限制,只要把文字编码到这3盏灯的状态,再配合上一个正确的通信协议。

    来看一段聊天记录吧:

    这是Python实现:

    
    #!/usr/bin/env python
    import time
    import random
    import binascii
    
    STEPS = 0
    
    wire = [random.randint(0, 1), random.randint(0, 1), random.randint(0, 1)]
    SLAVE_COUNT = 9
    
    data = [None] * (SLAVE_COUNT + 1)
    data[0] = dict()
    data[0]["initialized"] = 0
    data[0]["mode"] = 0
    data[0]["last_read"] = 0
    data[0]["direction"] = 0
    data[0]["direction_initialized"] = 0
    data[0]["send_buffer"] = ""
    data[0]["recv_buffer"] = ""
    
    for i in range(1, SLAVE_COUNT + 1):
        data[i] = dict()
        data[i]["initialized"] = 0
        data[i]["mode"] = 0
        data[i]["last_clock"] = 0
        data[i]["last_read"] = 0
        data[i]["direction"] = 0
        data[i]["direction_initialized"] = 0
        data[i]["send_buffer"] = ""
        data[i]["recv_buffer"] = ""
    
    def str2bin(str):
        temp_str = bin(int(binascii.hexlify(str), 16))[2:]
        return temp_str
    
    def bin2str(bin):
        return binascii.unhexlify('%x' % int(bin, 2))
    
    def writeWire(id, value):
        wire[id] = value;
    
    def readWire(id):
        return wire[id];
    
    def flipWire(id):
        wire[id] = not wire[id]
    
    def node(id):
        if id == 0:
            master()
        elif id > 0:
            slave(id)
    
    def master():
        global STEPS
        if data[0]["mode"] == 0:
            if data[0]["initialized"] == 0:
                writeWire(2, 0)
                data[0]["initialized"] = 1
            else:
                if readWire(2) == 1:
                    data[0]["mode"] = 1
                    writeWire(0, 0)
                    data[0]["send_buffer"] = str2bin("Hello, I'm master") + '00000000'
                    # print("SEND: " + data[0]["send_buffer"])
                    data[0]["recv_buffer"] = ""
                    print("#" + str(STEPS) + " master connected")
            flipWire(0)
        elif data[0]["mode"] == 1:
            if data[0]["direction_initialized"] == 0:
                if readWire(1) == 0:
                    writeWire(1, 1)
                    data[0]["direction"] = 1
                else:
                    data[0]["direction"] = 0
                data[0]["direction_initialized"] = 1
                writeWire(0, 1)
                print("#" + str(STEPS) + " master direction " + str(data[0]["direction"]))
            else:
                if data[0]["direction"] == 1:
                    if readWire(0) == 0:
                        if len(data[0]["send_buffer"]):
                            send_data = int(data[0]["send_buffer"][0])
                            data[0]["send_buffer"] = data[0]["send_buffer"][1:]
                            writeWire(1, send_data)
                            writeWire(0, 1)
                            #print("#" + str(STEPS) + " master send " + str(send_data))
                        else:
                            data[0]["mode"] = 0
                            data[0]["direction_initialized"] = 0
                            writeWire(2, 0)
                            print("#" + str(STEPS) + " master disconnected")
                else:
                    if readWire(0) == 1:
                        recv_data = readWire(1)
                        #print("#" + str(STEPS) + " master received " + str(recv_data))
                        data[0]["recv_buffer"] = data[0]["recv_buffer"] + str(recv_data)
                        writeWire(0, 0)
                        if len(data[0]["recv_buffer"]) % 8 == 0:
                            if data[0]["recv_buffer"][-1] == "0" and data[0]["recv_buffer"][-2] == "0" and\
                                data[0]["recv_buffer"][-3] == "0" and data[0]["recv_buffer"][-4] == "0" and\
                                data[0]["recv_buffer"][-5] == "0" and data[0]["recv_buffer"][-6] == "0" and\
                                data[0]["recv_buffer"][-7] == "0" and data[0]["recv_buffer"][-8] == "0":
                                # print("RECV: " + data[0]["recv_buffer"])
                                print("#" + str(STEPS) + " master received " + bin2str(data[0]["recv_buffer"][1:-8]))
                                print("#" + str(STEPS) + " master disconnected")
                                data[0]["mode"] = 0
                                data[0]["direction_initialized"] = 0
                                writeWire(2, 0)
    
    def slave(id):
        global STEPS
        if data[id]["mode"] == 0:
            if data[id]["initialized"] == 0:
                data[id]["initialized"] = 1
                data[id]["last_clock"] = readWire(0)
            else:
                if readWire(0) != data[id]["last_clock"]:
                    if readWire(2) == 0:
                        writeWire(2, 1)
                        data[id]["mode"] = 1
                        writeWire(1, 0)
                        writeWire(0, 0)
                        data[id]["send_buffer"] = str2bin("Hello, I'm slave " + str(id)) + '00000000'
                        # print("SEND: " + data[id]["send_buffer"])
                        data[id]["recv_buffer"] = ""
                        print("#" + str(STEPS) + " slave " + str(id) + " connected")
                    data[id]["last_clock"] = readWire(0)
        elif data[id]["mode"] == 1:
            if data[id]["direction_initialized"] == 0:
                if readWire(1) == 0:
                    writeWire(1, 1)
                    data[id]["direction"] = 1
                else:
                    data[id]["direction"] = 0
                data[id]["direction_initialized"] = 1
                writeWire(0, 1)
                print("#" + str(STEPS) + " slave " + str(id) + " direction " + str(data[id]["direction"]))
            else:
                if data[id]["direction"] == 1:
                    if readWire(0) == 0:
                        if len(data[id]["send_buffer"]):
                            send_data = int(data[id]["send_buffer"][0])
                            data[id]["send_buffer"] = data[id]["send_buffer"][1:]
                            writeWire(1, send_data)
                            writeWire(0, 1)
                            #print("#" + str(STEPS) + " slave " + str(id) + " sent " + str(send_data))
                        else:
                            data[id]["mode"] = 0
                            data[id]["direction_initialized"] = 0
                            data[id]["initialized"] = 0
                            print("#" + str(STEPS) + " slave " + str(id) + " disconnected")
                else:
                    if readWire(0) == 1:
                        recv_data = readWire(1)
                        data[id]["recv_buffer"] = data[id]["recv_buffer"] + str(recv_data)
                        #print("#" + str(STEPS) + " slave " + str(id) + " received " + str(recv_data))
                        writeWire(0, 0)
                        if len(data[id]["recv_buffer"]) % 8 == 0:
                            if data[id]["recv_buffer"][-1] == "0" and data[id]["recv_buffer"][-2] == "0" and\
                                data[id]["recv_buffer"][-3] == "0" and data[id]["recv_buffer"][-4] == "0" and\
                                data[id]["recv_buffer"][-5] == "0" and data[id]["recv_buffer"][-6] == "0" and\
                                data[id]["recv_buffer"][-7] == "0" and data[id]["recv_buffer"][-8] == "0":
                                # print("RECV: " + data[id]["recv_buffer"])
                                print("#" + str(STEPS) + " slave " + str(id) + " received " + bin2str(data[id]["recv_buffer"][1:-8]))
                                print("#" + str(STEPS) + " slave " + str(id) + " disconnected")
                                data[id]["mode"] = 0
                                data[id]["direction_initialized"] = 0
                                data[id]["initialized"] = 0
    
    while True:
        node(random.randint(0, SLAVE_COUNT))
        STEPS += 1
        if STEPS == 100000:
            break
        #time.sleep(0.1)
    
    

     

    对这个通信协议做一点简单说明:

    这是一个区分服务器/客户端的协议,服务器为代码中的master,客户端为代码中的slave。

    服务器的两个状态:监听状态和通信状态

    客户端的两个状态:尝试连接状态和通信状态

    三盏灯的定义:

    在监听/尝试连接状态下,为(1) 时钟信号; (2) <未使用>;(3) 连接状态指示信号

    在通信状态下,为(1) 同步(ACK)信号;(2) 数据信号;(3) 连接状态指示信号

     
  • jinzihao pm1:21 on 2016年5月30日 链接地址 | 回复
    Tags: python,   

    今天用Python写人工智能导论的作业时又被坑了…
    这样一段代码:

    test_set_filename = [set()] * 5
    

    真的产生了一个list,里面有5个空set吗?
    并不。
    这个list确实有5个元素,但指向的都是同一个set
    一种正确的做法:

    test_set_filename = [None] * 5
    for i in range(0, 5):
        test_set_filename[i] = set()
    

    这样才能获得一个list,其5个元素分别是5个不同的set。

     
    • 陈文 下午9:09 on 2016年6月7日 链接地址 | 回复

      你还是看一下吧http://mini536.3vkj.net/

      • jinzihao 上午9:08 on 2016年6月8日 链接地址 | 回复

        用teleport备份全站的时候你可能需要设一下下载文件的最大大小,否则大文件都备份不下来

        • 陈文 上午10:17 on 2016年6月8日 链接地址 | 回复

          ok,另外这是福传(fortan2.0)的软件,还有1.0的,别再弄丢了
          福传1.0https://gadam.wodemo.com/file/400828
          福传2.0https://gadam.wodemo.com/file/400827

          • 陈文 上午10:19 on 2016年6月8日 链接地址 | 回复

            大文件考虑到网站服务器速度,下载地址全部迁移至度盘

            • Wilson 下午11:45 on 2016年6月12日 链接地址

              超级喜欢这个网站…我服务器空间够大如果你们不介意的话…

          • jinzihao 下午12:23 on 2016年6月8日 链接地址 | 回复

            谢谢,这个文件丢失好几年了…已经上传到服务器

  • jinzihao pm11:10 on 2016年3月7日 链接地址 | 回复
    Tags: python   

    python有一个package,叫做maproxy,可以很方便地创建反向代理(reverse proxy)。
    这项工作一般是由apache或是nginx完成的,但python也可以很容易地做到。
    首先安装:

    easy_install maproxy
    easy_install tornado
    

    示例代码:

    #!/usr/bin/env python
    import tornado.ioloop
    import maproxy.proxyserver
    
    server = maproxy.proxyserver.ProxyServer("www.w3.org",80)
    server.listen(8080)
    print("http://127.0.0.1:8080 -> http://www.w3..org")
    tornado.ioloop.IOLoop.instance().start()
    

    就可以把w3.org转发到http://127.0.0.1:8080,直接访问http://127.0.0.1:8080就能看到w3.org的网页。

     
    • chenyuan 下午9:23 on 2016年4月21日 链接地址 | 回复

      问问maproxy支不支持访问www.w3.org这个源站的同时还经过代理的,并且可不可以设置静态资源持久缓存?

      • jinzihao 下午1:05 on 2016年4月22日 链接地址 | 回复

        缓存的话…maproxy可能没那么强大…要缓存的话squid或varnish可能更好一些吧

  • jinzihao pm12:35 on 2016年2月5日 链接地址 | 回复
    Tags: python   

    python的unicode()函数在解决一些由于特殊字符导致python报错退出的情况下很有用,例如:

    processed_string = unicode("Æbleflæsk", "utf-8")

    这样后面处理到processed_string时就不会报错。

     
    • dgy18787 下午10:44 on 2016年2月23日 链接地址 | 回复

      小朋友你好!近来整理网页的时候,发现我这边链接的你的“21世纪下载站”域名已经失效了。不知道该站现在是否还能访问?如果还可以,可否提供我一下新站的地址呢?:-) 祝好

      • jinzihao 上午12:09 on 2016年2月25日 链接地址 | 回复

        唔…现在这个网站由于服务器空间原因暂时无法上线…请将其链接到http://jinzihao.info/dos/吧…等它恢复的时候它会在这个网址出现的…

    • 陈文 下午10:35 on 2016年2月27日 链接地址 | 回复

      你可以将原20世纪下载站的全部文件放在百度网盘分享吗?

      • jinzihao 下午1:08 on 2016年2月29日 链接地址 | 回复

        文件都在…但…百度网盘…放在那里还是不太放心…
        现在主要问题就是没有空间足够大的服务器…15个GB的文件…
        有进展我会发在这里的…这个网站(jinzihao.info)短期内不会消失的

        • 陈文 下午7:31 on 2016年4月4日 链接地址 | 回复

          谷歌盘行吗?这个盘靠谱

      • jinzihao 下午11:35 on 2016年2月29日 链接地址 | 回复

        http://dos.jinzihao.info
        网站已恢复~

  • jinzihao pm10:21 on 2016年1月27日 链接地址 | 回复
    Tags: python, 实测有效   

    https://stackoverflow.com/questions/8840303/urllib2-http-error-400-bad-request
    python的urllib2.urlopen()函数要注意对网址中的数据进行URL转义,诸如空格是一定不能有的。但不能把整个网址(包括http://)一起转义,否则”:”也会被转义。

     
  • jinzihao pm3:28 on 2015年3月25日 链接地址 | 回复
    Tags: , python,   

    linux下python获取本机IP:

    import os
    ip = os.popen("/sbin/ifconfig | grep 'inet addr' | awk '{print $2}'").read()
    ip = ip[ip.find(':')+1:ip.find('n')]
    print ip
    
     
c
写新的
j
下一篇文章/下一个回复
k
前一篇文章/以前的回复
r
回复
e
编辑
o
显示/隐藏 回复
t
回到顶部
l
go to login
h
show/hide help
shift + esc
取消