新ジャンル:回文プログラミング
ブラウザのアドレスバーに貼り付けてお楽しみください。
javascript:''[_=((_=''+-~-~'')+{})[-~_*_]+(_+{})[_]+(_+{}._)[_]+(_+![])[_*_]+(_+!'')[_/_]+(_+!'')[_]+(''+!'')[_]+(_+{})[-~_*_]+(_+!'')[_/_]+(_+{})[_]+(_+!'')[_]][_](_[_][_]((_=-~-~_+'',(_+!'')[_])+(_+!'')[_*_]+(_+!'')[_/_]+(''+!'')[_]+(_+!'')[_]+(_+{}._)[_]+'\''+['',~(_*-_+_),_-~_+_|_,_*_+_-~_,-_*~_+_,(_<<_-~_)+'("\\'+(''+!'')[_]+-~(_*_)+-_*~_+(''+{}._)[_]+(_+!'')[_*_]+'\\'+(''+!'')[_]+-_*~_+-~(_*_)+_*_*_+~-(_<<_)+'\\'+(''+!'')[_]+-~_+_%_+_*_+(''+{})[_]+'\\'+(''+!'')[_]+-~_+_%_+_*_+_*_+'?")'][(_+{})[_*_]+(_+{})[_]+(_+_/'')[_*_]+(_+{}._)[_]]('\\'+_/_)+'\'')())(_)//(_)(()(''\'+(_/_+'\\')[[_](_.{}+_)+[_*_](''/_+_)+[_]({}+_)+[_*_]({}+_)]['("?'+_*_+_*_+_%_+_~-+[_](''!+'')+'\\'+[_]({}+'')+_*_+_%_+_~-+[_](''!+'')+'\\'+(_<<_)-~+_*_*_+(_*_)~-+_~*_-+[_](''!+'')+'\\'+[_*_](''!+_)+[_](_.{}+'')+_~*_-+(_*_)~-+[_](''!+'')+'\\")'+(_~-_<<_),_+_~*_-,_~-_+_*_,_|_+_~-_,(_+_-*_)~,'']+''\'+[_](_.{}+_)+[_](''!+_)+[_](''!+'')+[_/_](''!+_)+[_*_](''!+_)+([_](''!+_),''+_~-~-=_))[_][_]_)[_][[_](''!+_)+[_]({}+_)+[_/_](''!+_)+[_*_~-]({}+_)+[_](''!+'')+[_](''!+_)+[_/_](''!+_)+[_*_]([]!+_)+[_](_.{}+_)+[_]({}+_)+[_*_~-]({}+(''~-~-+''=_))=_]'':tpircsavaj
■動作画面
※推奨ブラウザ:Firefox, Chrome, Safari, Opera, Windows7のIE8もしくはIE9で動作確認しています。
■追記:
id:hasegawayosukeさんに卑怯な気がすると言われたので、記号だけで//を使わずに回文javascriptを書いてみました。
('"\')(("')[_=((_=''+-~-~'')+{})[-~_*_]+(_+{})[_]+(_+{}._)[_]+(_+![])[_*_]+(_+!'')[_/_]+(_+!'')[_]+(''+!'')[_]+(_+{})[-~_*_]+(_+!'')[_/_]+(_+{})[_]+(_+!'')[_]][_](_[_][_]((_=-~-~_+'',(_+!'')[_])+(_+!'')[_*_]+(_+!'')[_/_]+(''+!'')[_]+(_+!'')[_]+(_+{}._)[_]+'\''+['',(~(_*-_+_)),(_-~_+_|_),(_*_+_-~_),-_*~_+_,((_<<_-~_))+'(\\\'',''+_%_+_/_,_*_+_,(_-~_+_|_),(_*_+_-~_)+'\\'+_*_+_%_,((_<<_-~_)-~_),(~(_*-_+_)),(~_^~_*_+_)+'\\'+_*_+_%_,(~_*~_|_)+'\\'+_*_+_%_,(_*_+_-~_),-_*~_+_,(_*_+_-~_)+'\\'+_*_+_%_,(~_*~_|_)+'\\'+_*_+_%_,(~_^~_*_+_),(~(_*-_+_)),((_<<_-~_)-~_)+'\\'+_*_+_%_,(_*_+_-~_),(_-~_+_|_),_*_+_,(''+_%_+_/_)+'\\\')'][(_+{})[_*_]+(_+{})[_]+(_+_/'')[_*_]+(_+{}._)[_]]('\\'+_/_)+'\'')(")(''\'+(_/_+'\\')[[_](_.{}+_)+[_*_](''/_+_)+[_]({}+_)+[_*_]({}+_)]['('\\\'+(_/_+_%_+''),_+_*_,(_|_+_~-_),(_~-_+_*_),_%_+_*_+'\\'+(_~-(_~-_<<_)),((_+_-*_)~),(_+_*_~^_~),_%_+_*_+'\\'+(_|_~*_~),_%_+_*_+'\\'+(_~-_+_*_),_+_~*_-,(_~-_+_*_),_%_+_*_+'\\'+(_|_~*_~),_%_+_*_+'\\'+(_+_*_~^_~),((_+_-*_)~),(_~-(_~-_<<_)),_%_+_*_+'\\'+(_~-_+_*_),(_|_+_~-_),_+_*_,_/_+_%_+'',''\\\)'+((_~-_<<_)),_+_~*_-,(_~-_+_*_),(_|_+_~-_),((_+_-*_)~),'']+''\'+[_](_.{}+_)+[_](''!+_)+[_](''!+'')+[_/_](''!+_)+[_*_](''!+_)+([_](''!+_),''+_~-~-=_))[_][_]_)[_][[_](''!+_)+[_]({}+_)+[_/_](''!+_)+[_*_~-]({}+_)+[_](''!+'')+[_](''!+_)+[_/_](''!+_)+[_*_]([]!+_)+[_](_.{}+_)+[_]({}+_)+[_*_~-]({}+(''~-~-+''=_))=_]('"))('\"')
括弧()[]{}の対応づけが逆になっているのは見た目のための仕様です。(厳密には文字列の reverse になっていない鏡像です)
■追記(5/19 19:47)
2010年5月19日のヘッドラインニュース - GIGAZINE
に(右から見ても左から見ても同じ文字列でプログラミング)との解説付きで掲載していただきました。
■参考文献:
Linux kernel の wireless.c で .header_type とか,ドットで始まる変数名?がある件について
http://twitter.com/k_morihisa/status/9006163842
Twitter / Morihisa Kazuaki: Linux kernel の wireless.c で .header_type とか,ドットで始まる変数名?がある.謎
Linux-Kernel Archive: 2.6.18-git9 wireless fixes break ipw2200 association to AP with WPAのパッチとかみると、たしかにこんな断片のC言語のソースコードがでてくる。
@@ -242,24 +234,24 @@ [SIOCSIWESSID - SIOCIWFIRST] = { .header_type = IW_HEADER_TYPE_POINT, .token_size = 1, - .max_tokens = IW_ESSID_MAX_SIZE, + .max_tokens = IW_ESSID_MAX_SIZE + 1, .flags = IW_DESCR_FLAG_EVENT, }, [SIOCGIWESSID - SIOCIWFIRST] = { .header_type = IW_HEADER_TYPE_POINT, .token_size = 1, - .max_tokens = IW_ESSID_MAX_SIZE, + .max_tokens = IW_ESSID_MAX_SIZE + 1, .flags = IW_DESCR_FLAG_DUMP, }, [SIOCSIWNICKN - SIOCIWFIRST] = { .header_type = IW_HEADER_TYPE_POINT, .token_size = 1, - .max_tokens = IW_ESSID_MAX_SIZE, + .max_tokens = IW_ESSID_MAX_SIZE + 1, }, [SIOCGIWNICKN - SIOCIWFIRST] = { .header_type = IW_HEADER_TYPE_POINT, .token_size = 1, - .max_tokens = IW_ESSID_MAX_SIZE, + .max_tokens = IW_ESSID_MAX_SIZE + 1, }, [SIOCSIWRATE - SIOCIWFIRST] = { .header_type = IW_HEADER_TYPE_PARAM, @@ -346,8 +338,8 @@ .max_tokens = sizeof(struct iw_pmksa), }, }; -static const unsigned standard_ioctl_num = (sizeof(standard_ioctl) / - sizeof(struct iw_ioctl_description)); +static const int standard_ioctl_num = (sizeof(standard_ioctl) / + sizeof(struct iw_ioctl_description)); /* * Meta-data about all the additional standard Wireless Extension events
http://twitter.com/takesako/status/9016296481 でも返事しましたが、
つまり、こういうこと?
#include <stdio.h> typedef struct x{ char a; char b; } X; int main(void) { const X x[] = { [2] = { .a=69, .b=0, }, [0] = { .a=65, .b=66, }, [1] = { .a=67, .b=68, }, }; printf("%s\n",x); }
→ 実行結果:ABCDE
12月5日@大阪
就活生向けIT業界セミナーで講演します | TAKESAKO @ Yet another Cybozu Labs
今週末12/5(土)、日帰りで大阪に行きます!
日時:12月5日(土)
場所:大阪ドーンセンター
14:00 受付開始
14:30 ボクがはてなを選んだ理由〜グローバルなサービスを求めて〜
栗栖 義臣(はてな)
15:10 ITエンジニアと株式会社の付き合い方(恋愛編)
竹迫 良範(サイボウズ・ラボ)
16:00 IT業界のヒ・ミ・ツ
佐藤 学(サイボウズ)
16:30 座談会
Aチーム、Bチーム、Cチームにわかれて質疑応答
(20分交代ですべての学生に各チーム回るイメージ)
まだ、座席に若干余裕があるみたいなので、興味のある方はぜひ。
Hatena × Cybozu ITエンジニアによるITエンジニアのためのIT業界セミナー 12月5日@大阪
http://cybozu.co.jp/company/job/recruitment/seminar/hatena/index.html
ちなみに私は新大阪21時発ぐらいの新幹線で東京に帰る予定です。
vip コマンドと zip コマンドの正しい使い方
vip - vi pipe (vipっていうviラッパー作った - kazuhoのメモ置き場)
http://github.com/kazuho/vip/blob/master/vip
$ vip | perl i print "Hello\n"; [Esc]:wq "~/vip/20091028-123818-1" [New] 1L, 10C written Hello $ ls ~/vip/ 20091028-123634-1 20091028-123818-1 $ more 20091028-* :::::::::::::: 20091028-123634-1 :::::::::::::: 前に書いたプログラムの内容 :::::::::::::: 20091028-123818-1 :::::::::::::: print "Hello\n";
$ cd ~/vip/ $ zip -dekure Enter password: fushianasan Verify password: fushianasan zip error: Invalid command arguments (specify just one action)
あれ?
ANSI C Trigraph
このプログラムは普通にVisual C++でコンパイルできたりする不思議。
??=/??/ *?=/??/ */include<stdio.h> int/*??*/main(int/**/T,char*e??(??))??<??/ printf("??/110ello,%s??/n",e??(T-T??));??>
■実行結果
C:\> cl a.c Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. a.c Microsoft (R) Incremental Linker Version 8.00.50727.762 Copyright (C) Microsoft Corporation. All rights reserved. /out:a.exe a.obj C:\> a.exe Hello,a.exe
gccでコンパイルしたい場合は -ansi オプションを使うか -trigraphs オプションをつける必要がある。
$ gcc -ansi a.c && ./a.out Hello,./a.out $ gcc -trigraphs a.c && ./a.out Hello,./a.out
gccのコンパイルオプションのデフォルトでは -trigraphs はオフになっている。
$ gcc a.c a.c:1:1: 警告: trigraph ??= ignored, use -trigraphs to enable a.c:1: error: 文法エラー が '?' トークンの前にあります a.c:1:5: 警告: trigraph ??/ ignored, use -trigraphs to enable a.c:2:5: 警告: trigraph ??/ ignored, use -trigraphs to enable a.c:4:30: 警告: trigraph ??( ignored, use -trigraphs to enable a.c:4:33: 警告: trigraph ??) ignored, use -trigraphs to enable a.c:4:37: 警告: trigraph ??< ignored, use -trigraphs to enable a.c:4:40: 警告: trigraph ??/ ignored, use -trigraphs to enable a.c:5:9: 警告: trigraph ??/ ignored, use -trigraphs to enable a.c:5:22: 警告: trigraph ??/ ignored, use -trigraphs to enable a.c:5:29: 警告: trigraph ??( ignored, use -trigraphs to enable a.c:5:35: 警告: trigraph ??) ignored, use -trigraphs to enable a.c:5:40: 警告: trigraph ??> ignored, use -trigraphs to enable
■参考文献