bzoj 3779: 重组病毒 LCT+线段树+倍增

必威,从国家推动教育层面看


  1. 2012年,美国奥巴马总统倡议全民学习编程,全国开展“编程一小时”的推广公益活动

    必威 1

    obama-code.org-photo.jpg

  2. 2014年,“英国编程年”,英国规定5岁以上孩子,都要在校学习编程

    必威 2

    How-to-code—year-of-code_thumb.jpg

  3. 人口仅130万的小国爱沙尼亚,推广程序老虎(ProgeTiiger)计划,让7~16岁学生练习编写程序bzoj 3779: 重组病毒 LCT+线段树+倍增。

    必威 3

    ProgeTiiger_Logo_horisontaal_EST_web.jpg

  4. 亚洲地区的新加坡、香港等,都在公立学校推行编程课,香港更拔出总课时的30%列入程序编写

    必威 4

    QQ20160826-0@2x.png

  5. 2015年奇宝立项儿童编程,经过1年开发,先后编写出针对5-7岁儿童计算机思维学习游戏,7-12岁儿童编程学习软件火种Spark和课程,并先后落地10+城市2016年更开发儿童创客编程课程落地香港。

    必威 5

    QQ20160829-0@2x.png


题解:

题目真**长

我们用LCT来解决这道题。
首先我们需要观察到一个性质.每一次加入的病毒一定是新变种。
也就是说其实每个点究竟是那种颜色并不重要,因为每一次都加入新颜色
所以无论是什么颜色都会被直接xx掉。

所以我们的可以得出这样的一条结论

  • 一个点到根的不同的颜色数即为这个点到根时经过的虚边的个数
    也就是说我们直接把第一个操作当作access操作
    我们发现这样前两个操作都解决了
    但是我们查询一个点的时候并不能暴力跳fa找经过的虚边数.
    所以我们需要外部维护一下.
    由于我们要查询的是一个子树内的权和,那我们应该自然地想到用dfs序
    所以我们在进行LCT的过程中在外部动态维护一个dfs序.

Wait !!这是有换跟操作的啊,dfs序不是固定的.
我们可以根据当前的根节点rt与查询节点u的关系来分类讨论.
具体是:

if rt == u: query all
if lca(rt,u) == rt : query tree of u
if lca(u,rt) == u :
    find point p has min depth and (lca(p,rt) = p,lca(p,u) = u)

上述lca是指在初始树中.
我们发现lca 只是用来祖孙判定的,我们可以用dfs序来代替这个简单的问题.

还不明白的话,,可以看我这从晚自习开始一直调到第二天早自习的代码.

如果有人想问我是怎么做到拍了一晚上没找出错交到bzoj上4msRE却只因为自己写数据生成器的时候只生成了查询操作的话我是会非常乐意地告诉你以后写数据生成器写到一半的时候不要因为有事就编译好生成器然后关掉生成器的cpp去干一些其他的愉悦的会让你忘了你的生成器还没有写完的事情比如说在大下雨天去学校满是水的塑胶跑道上去跑操并且跑完后躺在全是水的假草坪上然后会机房的时候再感个冒.

。。。 。。。

呵呵

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
    x=0;char ch;bool flag = false;
    while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
    while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
const int maxn = 410000;
const double eps = 1e-8;
inline int dcmp(const double &x){
    return (x > -eps) - (x < eps);
}
int a[maxn],n,dep[maxn],rt;
namespace Graph{
    struct Edge{
    int to,next;
    }G[maxn<<1];
    int head[maxn],cnt;
    void add(int u,int v){
    G[++cnt].to = v;
    G[cnt].next = head[u];
    head[u] = cnt;
    }
    int ind[maxn],oud[maxn];
    int dfs_clock,fa[maxn][23];
#define v G[i].to
    void dfs(int u){
    ind[u] = ++ dfs_clock;a[dfs_clock] = u;
    for(int i = head[u];i;i=G[i].next){
        if(v == fa[u][0]) continue;
        dep[v] = dep[u] + 1;
        fa[v][0] = u;dfs(v);
    }
    oud[u] = dfs_clock;
    }
#undef v
}
namespace seg{
    double T[maxn<<2],lazy[maxn<<2];
    void build(int rt,int l,int r){
    if(l == r){
        T[rt] = dep[a[l]];
        return ;
    }
    int mid = (l+r) >> 1;
    build(rt<<1,l,mid);
    build(rt<<1|1,mid+1,r);
    T[rt] = T[rt<<1] + T[rt<<1|1];
    }
    inline void pushdown(int rt,int l,int r){
    if(rt == 0 || dcmp(lazy[rt] == 0) ) return;
    int mid = (l+r) >> 1;
    lazy[rt<<1] += lazy[rt];
    lazy[rt<<1|1] += lazy[rt];
    T[rt<<1] += lazy[rt]*(mid - l + 1);
    T[rt<<1|1] += lazy[rt]*(r - mid);
    lazy[rt] = 0;
    }
    void modify(int rt,int l,int r,int L,int R,int val){
    if(L <= l && r <= R){
        lazy[rt] += val;
        T[rt] += (r-l+1)*val;
        return ;
    }
    int mid = (l+r) >> 1;pushdown(rt,l,r);
    if(L <= mid) modify(rt<<1,l,mid,L,R,val);
    if(R >  mid) modify(rt<<1|1,mid+1,r,L,R,val);
    T[rt] = T[rt<<1] + T[rt<<1|1];
    }
    void modify(int x,int val){
    using namespace Graph;
    if(x == rt) modify(1,1,n,1,n,val);
    else if(ind[rt] < ind[x]||oud[x] < ind[rt])modify(1,1,n,ind[x],oud[x],val);
    else{
        int p = rt;
        for(int j=20;~j;--j){
        if(dep[fa[p][j]] <= dep[x]) continue;
        p = fa[p][j];
        }
        if(1 <= ind[p] - 1) modify(1,1,n,1,ind[p]-1,val);
        if(oud[p] + 1 <= n) modify(1,1,n,oud[p]+1,n,val);
    }
    }
    double query(int rt,int l,int r,int L,int R){
    if(L <= l && r <= R) return T[rt];
    int mid = (l+r) >> 1;pushdown(rt,l,r);
    if(R <= mid) return query(rt<<1,l,mid,L,R);
    if(L >  mid) return query(rt<<1|1,mid+1,r,L,R);
    return query(rt<<1,l,mid,L,R) + query(rt<<1|1,mid+1,r,L,R);
    }
}
namespace lct{
    struct Node{
    Node *ch[2],*fa;
    int id,tag;
    }mem[maxn],*it,*null;
    inline Node* newNode(){
    Node *p = it++;p->ch[0] = p->ch[1] = p->fa = null;
    p->id = -1;p->tag = 0;return p;
    }
    inline void init(){
    it = mem;null = it++;null->id = -1;
    null->ch[0] = null->ch[1] = null->fa = null;
    null->tag = 0;
    for(int i=1;i<=n;++i) newNode()->id = i;
    for(int i=2;i<=n;++i){
        (mem+i)->fa = (mem+Graph::fa[i][0]);
    }
    }
    inline void rever(Node *p){
    p->tag ^= 1;swap(p->ch[0],p->ch[1]);
    }
    inline void pushdown(Node *p){
    if(p == null || p->tag == 0) return ;
    if(p->ch[0] != null) rever(p->ch[0]);
    if(p->ch[1] != null) rever(p->ch[1]);
    p->tag = 0;
    }
    inline void rotate(Node *p,Node *x){
    int k = p == x->ch[1];
    Node *y = p->ch[k^1],*z = x->fa;
    if(z->ch[0] == x) z->ch[0] = p;
    if(z->ch[1] == x) z->ch[1] = p;
    if(y != null) y->fa = x;
    p->fa = z;p->ch[k^1] = x;
    x->fa = p;x->ch[k] = y;
    }
    inline bool isroot(Node *p){
    return (p == null) || (p->fa->ch[0] != p && p->fa->ch[1] != p);
    }
    inline void splay(Node *p){
    pushdown(p);
    while(!isroot(p)){
        Node *x = p->fa,*y = x->fa;
        pushdown(y);pushdown(x);pushdown(p);
        if(isroot(x)) rotate(p,x);
        else if((x->ch[0] == p)^(y->ch[0] == x)) rotate(p,x),rotate(p,y);
        else rotate(x,y),rotate(p,x);
    }
    }
    inline Node* find(Node *p){
    pushdown(p);
    while(p->ch[0] != null){
        p = p->ch[0];
        pushdown(p);
    }
    return p;
    }
    inline void access(Node *x){
    for(Node *y = null;x != null;y=x,x=x->fa){
        splay(x);
        if(x->ch[1] != null){
        Node *p = find(x->ch[1]);
        seg::modify(p->id,1);
        }
        x->ch[1] = y;
        if(y != null){
        Node *p = find(y);
        seg::modify(p->id,-1);
        }
    }
    }
    inline void makeroot(Node *p){
    access(p);splay(p);rever(p);
    rt = p->id;
    }
}
inline double query(int x){
    using namespace Graph;
    if(rt == x) return 1.0*seg::query(1,1,n,1,n)/n;
    if(ind[rt] < ind[x] || oud[x] < ind[rt])
    return 1.0*seg::query(1,1,n,ind[x],oud[x])/(oud[x]-ind[x]+1);
    int p = rt;
    for(int j=20;~j;--j){
    if(dep[fa[p][j]] <= dep[x]) continue;
    p = fa[p][j];
    }
    double upside = .0;
    if(1 <= ind[p] - 1) upside += seg::query(1,1,n,1,ind[p]-1);
    if(oud[p] + 1 <= n) upside += seg::query(1,1,n,oud[p]+1,n);
    double dnside = (ind[p]-1) + (n-(oud[p]+1)+1);
    return upside/dnside;
}
char cmd[12];
int main(){
    int m;read(n);read(m);
    for(int i=1,u,v;i<n;++i){
    read(u);read(v);
    Graph::add(u,v);
    Graph::add(v,u);
    }
    dep[1] = 1;rt = 1;Graph::fa[1][0] = 1;
    Graph::dfs(1);seg::build(1,1,n);lct::init();
    for(int j=1;j<=20;++j){
    for(int i=1;i<=n;++i){
        Graph::fa[i][j] = Graph::fa[Graph::fa[i][j-1]][j-1];
    }
    }
    int x;
    while(m--){
    scanf("%s",cmd);read(x);
    if(cmd[2] == 'L'){
        lct::access(lct::mem+x);
    }else if(cmd[2] == 'C'){
        lct::makeroot(lct::mem+x);
    }else{
        double ans = query(x);
        printf("%.10lfn",ans);
    }
    }
    return 0;
}

针对这一情况,政府成立了一个新的机构——英国政府密码学校(Government Code
and Cipher School,
GCCS),总部坐落在白金汉郡的布莱切利庄园。这个难题也交到了图灵手中,从1938
年9
月开始,图灵一直专门负责ENIGMA的密码分析。他率领着大约200多名精干人员进行密码分析,其中甚至还包括世界象棋冠军亚历山大。分析和计算的工作非常复杂,26
个字母在“ENIGMA”机中能替代8万亿个谜文字母。如果改动接线,变化会超过2.5
千万亿亿。图灵凭借着他的天才设想设计出一种破译机。这台机器主要由继电器构成,还用了80个电子管,由光电阅读器直接读入密码,每秒可读字符2000
个,被称为“图灵炸弹(Bombes)”。

编程改变了我的生活和我的美学观点,它已成为我个人的自然延伸,借助编程明确阐明我的思路,事实上它已经成为我表达自己的基本的方法。这些年来,我已经习惯成自然了,比如说,看到其它艺术家的作品,我不由自主地就会试图寻找作品中的逻辑成分。

德国一名电脑考古学家开发出电脑创作情诗程序,但他并非这一程序的原创者。
早在60多年前,情诗生成程序已经问世。 电脑作诗
1948年6月,世界上第一台能完全执行存储程序的电子计算机原型机在英国曼彻斯特大学诞生。人们给它取名“婴儿”。
当时研究人员为它编写了几十种新型程序,不过现今大部分已经丢失。
英国研究人员克里斯托弗·斯特雷奇也参与了“婴儿”的研制。他为测验这台原型机随机选择信息的能力,编写出自动创作情诗程序。
“婴儿”本身储存了大量诗歌数据。每次运行作诗程序,人们只需输入几百个含义浪漫的动词和名词,它就能自动生成一首短情诗。
斯特雷奇把“婴儿”的“大作”打印出来贴在公告栏上。虽然这些情诗不一定能打动女性的芳心,但作诗程序开创了电脑文本生成程序的先河。
后来随着计算机技术迅速发展,“婴儿”和作诗程序被人们渐渐遗忘。 历史重演
德国电脑考古学家戴维·瓦尔德近期在英国牛津大学博德利图书馆研究斯特雷奇论文时发现这一程序。
他花3个月时间编写出同样的在线“情诗生成器”程序供网民自由使用。
用户在线运行这一程序,输入一些词语,每次点击“重载”键,网页上就会出现一首新的情诗。
英国《曼彻斯特新闻晚报》10日援引瓦尔德的话报道:“这牵涉到一部分有国际影响力的英国计算机文化遗产。编写程序的这3个月十分折磨人,因为根据现今标准,这一程序非常原始。”
瓦尔德将于3月下旬在英国伦敦就作诗程序发表演讲。他制造的“婴儿”复制机不久后将在德国展出,届时他会用这台机器演示“情书程序”。
电脑“艺术”
斯特雷奇1916年出生于英格兰汉普斯特德,父亲爱好音乐和美术,母亲是一名数学家和电气工程师。这让斯特雷奇从小受到艺术和理工知识的双重熏陶。
他1935年进入剑桥大学国王学院学习,毕业后做过物理学家和校长,并从20世纪40年代开始对计算机技术产生兴趣。
1951年1月,斯特雷奇第一次接触有储存程序的计算机并开始编写程序。1952年,他结束校长工作,成为英国国家研究发展公司的全职计算机技术研究员。
同年夏天,斯特雷奇从姐姐那里得到灵感,利用同事、著名计算机科学家艾伦·图灵的随机数字生成器,开发出作诗程序,这是人类第一次利用计算机生成文学作品。
斯特雷奇还编写过最早的计算机音乐软件。他于1975年在牛津大学去世。

点击关键字阅读编程中儿童编程教育学习文章

我是家长,对编程0了解
了解STEM
STREAM教育
奇宝STREAM课程

我是唐一(微信号11681445),奇宝科技联合创始人。当过几年老师,编写过9本FLASH和PHOTOSHOP教科书,参与过上百集的长篇动画制作,带团队开发了500多个幼教APP。现在全力打造“编程中国”社群项目,旨在普及中国儿童学习编程,给孩子创造未来的力量。希望认识更多朋友分享我的经验和学习你的心得!

题目:

黑客们通过对已有的病毒反编译,将许多不同的病毒重组,并重新编译出了新型的重组病毒。这种病毒的繁殖和变异能力极强。为了阻止这种病毒传播,某安全机构策划了一次实验,来研究这种病毒。
实验在一个封闭的局域网内进行。局域网内有n台计算机,编号为1~n。一些计算机之间通过网线直接相连,形成树形的结构。局域网中有一台特殊的计算机,称之为核心计算机。根据一些初步的研究,研究员们拟定了一个一共m步的实验。实验开始之前,核心计算机的编号为1,每台计算机中都有病毒的一个变种,而且每台计算机中的变种都不相同。实验中的每一步会是下面中的一种操作:

  1. RELEASE x
    在编号为x的计算机中植入病毒的一个新变种。这个变种在植入之前不存在于局域网中。
  2. RECENTER x
    将核心计算机改为编号为x的计算机。但是这个操作会导致原来核心计算机中的病毒产生新变种,并感染过来。换言之,假设操作前的核心计算机编号为y,相当于在操作后附加了一次RELEASE
    y的操作。
    根据研究的结论,在植入一个新变种时,病毒会在局域网中搜索核心计算机的位置,并沿着网络中最短的路径感染过去。
    而第一轮实验揭露了一个惊人的真相:病毒的不同变种是互斥的。新变种在感染一台已经被旧变种感染的电脑时,会把旧变种完全销毁之后再感染。但研究员发现了实现过程中的漏洞。如果新变种在感染过程中尚未销毁过这类旧变种,需要先花费1单位时间分析旧变种,才能销毁。如果之前销毁过这类旧变种,就可以认为销毁不花费时间。病毒在两台计算机之间的传播亦可认为不花费时间。
    研究员对整个感染过程的耗时特别感兴趣,因为这是消灭病毒的最好时机。于是在m步实验之中,研究员有时还会做出如下的询问:
    3,REQUEST x
    询问如果在编号为x的计算机的关键集合中的计算机中植入一个新变种,平均感染时间为多长。编号为y的计算机在编号为x的计算机的关键集合中,当且仅当从y沿网络中的最短路径感染到核心计算机必须经过x。由于有RECENTER操作的存在,这个集合并不一定是始终不变的。
    至此,安全机构认为已经不需要实际的实验了,于是他们拜托你编写一个程序,模拟实验的结果,并回答所有的询问。

由于这个组的努力,特别是图灵的出色工作,他们掌握了破译该密码的一整套方法,从而了解了德军的动向,掌握了战争的主动权,为英美联军击败德国做出了突出贡献。1941
年5 月21
日,破译小组第一次立了大功,因为截获了希特勒给海军上将雷德尔的一封密电,将当时号称世界上最厉害的德国战列舰“俾斯麦”号击沉。1943
年4 月,日本联合舰队总司令长官山本五十六,在4 月18
日将飞抵卡西里湾,这份情报被破译小组破译,于是,这位战功卓著的日本司令的飞机,在距离卡西里只有几英里处被拦截并击落。

使用软件能够帮助我们体现作品的逻辑和行为。很多事情没有软件很难做,而且我们也不认为Perpetual
Storytelling
Apparatus是软件作品。艺术家使用软件几十年了,软件作为一种艺术工具和媒介被吸引到主流方向,这只是个时间的问题。
软件和计算机系统依然神神秘秘,这非常令人生厌。软件和算法已经无所不在,我们无法摆脱,日常生活中几乎任何过程和行为都受到软件系统的控制,最起码也得到支持。在我看来,大部分人对系统如何工作没有基本理解,这非常令人担忧。
Perpetual Storytelling
Apparatus布置照片,图片由本杰明·毛斯和朱利叶斯·冯·俾斯麦提供。

STREAM既然是未来的趋势,那奇宝为什么偏偏强调是儿童编程(Coding)而不是其他学科呢?可以从这几方面看的

查了一些二战时密码战的背景资料,贴在这里:

  • ###### 使用什么样的软件工具呢?

总结


  1. 未来的孩子不应该只是单纯享受科技带来的方便,反而需要成为创作创造之人,发明更多科技给所有人使用
  2. 西方国家提早认知到”儿童编程教育”是国家未来的竞争力,所以在孩子带有意识形态的年龄时便推动学习以及纷纷投入大量资源
  3. 信息科技技术一日千里,是未来世界发展基础,每个孩子都应该学会如何掌控计算机,而编程是最直接的途径
  4. 学懂编程就好像学会写字,孩子学会编程,将会对他们终生受用,因为它教会孩子如何思考,培养他们的逻辑思维和解决问题能力,而且能激发他们的创造力
  5. 在我近年来与家长或者老师的沟通当中,似乎他们还不清楚儿童编程对我们孩子未来的深远影响,从而极有可能错过孩子学习的机会

我写这篇文章,除了分享对儿童编程的理解外,更是因为新一代的孩子从小就在“触摸”的世界中成长,任何反应都是即时的信息反馈,他们需要学会命令它创造它,而不只是单纯使用它。
更希望所有家长可以突破传统思维,让孩子真正接触科技,操控科技,控制科技。

二战期间, 德国发明了一种看似不可破译的密码“ENIGMA”,这是一种用于ENIGMA
加密和解密的机器,这种密码被德军广泛使用,包括定位出没于大西洋运输线上的潜艇,这些潜艇以令人心惊胆战的速度击沉英军的船只,被丘吉尔称为“大西洋海战”。丘吉尔担心英军会因补给短缺而战败,而解决的唯一办法便是阻止德军的潜艇战术,破解ENIGMA
就是阻止德军的方式之一。如果英军能破译这些情报,他们就可以确定位置并击毁潜艇。但在整整
13 年里,英国人和法国人都认为ENIGMA 是不可破译的。

UNE Esthetique
Programmee,可以这么说,是在寻找艺术表现新领域的浪潮下,我个人的心境状态。为达此目标,我必须先学习一门编程语言,还要找到一台带绘图仪的计算机,让绘图机器连到计算机上。
在20世纪60年代,这是一项非常复杂的任务,当时还没有学校或者大学可以学习编程,编程相关的书籍也很少,找到一台电脑更是一种挑战,因为那时计算机中心的硬件价值几百万美元,空调机房占地2000平方英尺,这当然不是任何个人可以负担得起的,要想找到并且获得使用权限确实不容易。
将想要做的事情进行逻辑定义,从而把一个人的思想编写为程序,这样的学习实在是有趣,也为我的美学研究提供了一个全新的视角,让我对视觉过程有了更深入的理解。计算机从精力和智力两方面都扩展了我的艺术创作过程,其整体成效比两方面成效之和更要大。后来,我就把我的艺术创作叫做艺术“生成作品”,因为这些符号是我自己运用结构合理的编程算法,提前定制的。因此,我的工作是一种算法艺术,一种“编程美学”,其实现之前已经概念上存在(以程序方式)。

个人观点看


  1. 编程是学习成本最低、效益最大的学习科目,它只需要一台电脑和软件,学习范围也仅需要一张桌子和椅子
  2. 其他学科需要购置更多的器材和提供更大的场地或者需要建设一个空间来学习
  3. 编程是各种兴趣活动中唯一可以同时锻炼多种能力提升的技能

一直对图灵在二战中牵头用计算机原理破解德军密码这段历史很感兴趣,《模仿游戏》这部电影刚好再现了当年的往事,并还原地十分精彩。向图灵先生致敬,尤其是在曼彻斯特生活学习过三年,耳濡目染很多他的故事,看了电影感受更深。

  • #### 你为什么要使用这些工具?

引用自
《图灵——密码破译者》

  • ###### 为什么要使用这些工具呢?

从大环境看


  1. 编程现今已经渗透各行各业,未来的十年,相信会全面覆盖任何行业,没有哪一个行业不会和编程搭上关系

    必威 6

    6949359_3_thumb.jpg

    ###### *到市场买菜也可以用手机付费

  2. 既然任何行业都和编程有联系,那不久的将来就会缺乏大量人才,而人才需要培养,且培养速度需要够快!

  3. 工业4.0甚至将来的发展,机器人会取代部分行业的人手操控,懂编程的人会优胜于不懂编程的人
  4. 为国家持续性发展提供足够的科研力量,提升未来国家竞争力

图灵的许多思想和预见都在他死后不断得到验证,也始终引导、推动着计算机科学的发展。国际计算机协会于1966
年设立“图灵奖”,以专门奖励对计算机科学研究与推动计算机技术发展有卓越贡献的杰出科学家。

  • #### 什么是Une Esthetique Programmee?

图灵对 ENIGMA
的破译方法完全是纯数学和理论性的,据他的同事们回忆,他在破译密码的工作中,曾创造好几种新的统计理论,但都未形成论文发表,后来又重新为他人所创建,由A.瓦尔德(Wald)重新发现并提出的“序贯分析”就是其中之一。序贯分析是数理统计学的重要分支之一,其特点是,在研究决策问题时,不是预先固定样本量,而是逐次取样,直到样本提供足够的信息,能恰当做出决策为止。其中“序贯概率比检验(Sequential
Probability Ratio Test,
SPRT)”在密码分析中的应用,可以明显约减相关攻击所需的密钥量。

因为没有其他的办法来完成我的任务。

图灵的密码故事要从一个“谜”开始,ENIGMA (谜)
源自于希腊文,既是战争时期所用的密码(在所有用于军事和外交的密码里,最著名的恐怕应属第二次世界大战中德国使用的ENIGMA),而破解这个密码的正是阿兰•
麦席森• 图灵。

Processing处理小幅草图非常理想,分分秒秒就可以完成,像建立工具链和添加库等任务开销很小。虽然作为产品使用时速度不够快,即便从计算机科学家的角度来看,也不是最有效,但是使用已知、便利的工具和算法自有它的道理,以后还可以将需要提高速度的部分程序重写。
大部分软件我们自己编写,因为要么没有完成任务的可用工具,要么无法实现我们想要的控制。例如,扫描文档跟踪工具输出的附图路径都是无序、混乱的,这样画出来的图,看上去很乱。所以我们花很长的时间来决定所画线段的顺序和方向。方向很重要,因为大部分图纸都包含大量的标识线,我们希望这一部分明确具有人类灵感,因为我们的目标是通过绘图动作将文档重新转换。

  • #### 你为什么选择软件工作?
  • #### 使用什么软件工具?

在完成最终系统编程之前,我们尝试了各个方面的设计概念,比如找出任意两个专利之间的关联路径,或者抽取专利文献中的简明附图。大部分原型使用Processing编写,但是在逐行写出代码之前,我们也尝试了各种算法来验证效果。最终版本是用Java编写的,但有几件事情确是依赖Processing。
把专利文献扫描件转换为可以绘图的形式,是唯一依赖于外部软件的事情,由一个叫做AutoTrace的小工具来处理扫描样本数字化类型转换。

  • ###### 为什么选择利用软件来完成本工作?

在我回答你关于软件的问题之前,我得再次告诉你,搞到硬件在当时(1960年代)和搞到软件一样都是大问题,硬件是大麻烦,几乎弄不到,编写好的软件根本没有。20世纪60年代和70年代,我住在法国巴黎,靠着运气和不懈努力我才获了使用位于巴黎的法国气象计算机中心的权利。对我来说,它就是人间天堂,我可以使用当时最大最快的计算机CDC
6400,6600以及后来的7600,我还可以使用一台大型本森1286平板绘图仪。我用FORTRAN
IV编写程序,这种语言现在看上去有点像C语言,但即使在今天也有它的优点。早些年,所有的人都必须编写自己的程序,因为那时还没有编写好的软件,这个习惯我一直保持到长大以后,现在仍然针对每一项工作亲手编写程序。我那时马上就领悟到,自己具备编程能力,便掌握了一种强大而又精确的工具,不用借助外部翻译就可以将自己的想法付诸行动了。我从未想过用别人写的软件。

20世纪60年代初,我拜读了德国哲学家马克斯·本色教授的著作“AESTHETICA
IV”。他的作品远远超出了传统的艺术批评与实践,并把我带入了一个全新的知识领域。他主张认为,艺术不单单是奇思妙想,更应该通过理性的手段完成创作,而不是受情感的左右。但是在当时,正统的“艺术”就应该是抽象的表达,对此我完全理解,也看到了现代自由爵士音乐的许多流派,同时我也作为一名活跃的爵士音乐家参与其中。
阅读有关“理性艺术”的文章给我带来的是彻底的震撼,莫名之中,深深的共鸣已嵌入我的脑海。这个想法再也挥之不去,最终我明白了:如果艺术只是反映和领会我们的社会世界和技术世界,那么它也应该可以从同一个“物质”世界来创建。这些想法一直折磨了我很久,最终彻底改变了我对美学和艺术的看法,事实上,是我的整个生活都被颠覆了。把“思想”编程的想法,意味着在实际创作之前就要把想要做的事情原原本本地描绘出来,成为我痴迷的的目标,二维符号的发明和系统开发,我称之为“原创图形”,成为我的基础研究。这些符号不单单指其本身,其内容涵盖了创建历史。20世纪70年代初,我曾潜心运用立方体固定结构作为视觉字母表的工作,后来还扩展到更加复杂的N维超立方体结构。通过编程我创建了一个可以演奏“算法”的准乐器,其视觉构造令人难以想象。

  • #### 你为什么要创建 Perpetual Storytelling Apparatus?
  • #### 什么是Perpetual Storytelling Apparatus?
  • ###### 你为什么要创建Une Esthetique Programmee?

Perpetual Storytelling
Apparatus是一台使用专利附图为一个永无结局的故事情节配制插图的绘图机器。该机器把文本单词(如,小说)翻成专利附图流,八百万项专利通过2200万多个引用形成词汇表,通过引用前期专利,发现故事情节中的词语搭配,就可以找出专利之间的引用路径,这些连接形成潜在文本,将故事情节与技术发展描写相互交织,展现出一种全新的视觉连接和叙述层次。
该装置利用故事情节中词语搭配,搜索文本中包含这些词语的专利文献,然后将专利文献中的主要图纸提取出来绘制。随着故事情节的发展,找到下一个专利文件。搜索出来的专利和已经绘制过的专利之间,这些把两者连结起来的专利就绘制在中间,重复此过程,一个故事接着另一个故事不断提取,最后生成一张连续的专利附图流。 Perpetual
Storytelling
Apparatus的两个最早的实例是使用美国专利商标局的数据库第三台设备最近被安装在慕尼黑德国专利局,使用了在德国申请的全部专利案件。

我们创建了Perpetual Storytelling
Apparatus,是因为朱利叶斯和我以前(现在也是)对专利都非常感兴趣,当你要创造一件东西时,先要看看别人是如何解决这个问题的,专利是查阅技术原理的最佳途径。
专利数据库就是发明创造的大字典,一个巨大的档案库,但大多数人从来就没有查看过专利文献。该装置也为探索知识的海洋提供了考古途径,这意味着去揭示那些结束了的故事,这就是为什么把专利号也输出到每个图像旁边的原因。观众可以先在脑海中构造出故事梗概,还能够深入探究背后隐藏的意义。
专利也是对时代的写照,能够反映出个人和企业如何努力解决(应对)面临的需求和挑战。例如,在精神治疗药物被发明之前,很多描述抑制精神病人的方法也可以在专利中找到。
我们构建的绘图机器可以把专利附图转换成绘图动作,尽管时代久远,但大部分专利附图都很详细,并且符合视觉语言的共同标准。
Perpetual Storytelling
Apparatus布置照片,图片由本杰明·毛斯和朱利叶斯·冯·俾斯麦提供。
140访谈:图片

相关文章