ToDo:
がホントかどうかチェックしよう。
昨日は gopku.rb
s = ''
`cpp #{ARGV[0]}`.split(/\n/).each do |l|
next if l =~ /^#/
s += l.sub(/^ */, '').chomp
end
File.open('out', 'w') do |o|
o.print s
end
p s.size
system("xclip < out")
PKU に Submit するために C のコードをコメント除去・空白削除して コピーバッファにつっこむ。
今日は prod.rb
|000>+|001>+|010>+|100>+|111> が 4項で書けないことを 証明したいらしいんで反例探しで 簡単なケースだけチェック。 まぁ結果見つからんかった。
def get(s, i)
s & (1 << i) != 0 ? 1 : 0
end
def st(s, t)
if (t == 0)
s.to_s
else
['0+1','0-1'][s]
end
end
def state_str(s, t)
r = ''
for i in 0...12
r += '(' + st(get(s, i), get(t, i % 3)) + ')'
end
r
end
def addterms(as, *ts)
r = []
ts.each do |t|
as.each do |a|
b = t.dup
e = a.dup
if e =~ /^-/
e.sub!(/^-/, '')
if b =~ /^-/
b.sub!(/^-/, '')
else
b = '-' + b
end
end
r.push(b+e)
end
end
r
end
def addminus(t, m)
if m == 1
if t =~ /^-/
t.sub(/^-/, '')
else
'-' + t
end
else
t
end
end
for m in 0...16
p m
for t in 0...8
for s in 0...4096
st = Hash.new(0)
for i in 0...4
a = []
minus = get(m, i)
if get(t, 0) == 0
a.push(addminus(get(s, i*3).to_s, minus))
else
if get(s, i*3) == 0
a.push(addminus('0', minus))
a.push(addminus('1', minus))
else
a.push(addminus('0', minus))
a.push(addminus('-1', minus))
end
end
if get(t, 1) == 0
a = addterms(a, get(s, i*3+1).to_s)
else
if get(s, i*3+1) == 0
a = addterms(a, '0', '1')
else
a = addterms(a, '0', '-1')
end
end
if get(t, 2) == 0
a = addterms(a, get(s, i*3+2).to_s)
else
if get(s, i*3+2) == 0
a = addterms(a, '0', '1')
else
a = addterms(a, '0', '-1')
end
end
a.each do |at|
e = at.dup
if e =~ /^-/
e.sub!(/^-/, '')
st[e] -= 1
else
st[e] += 1
end
end
end
if st.key?('000') && st.key?('111') && st.key?('001') && st.key?('010') && st.key?('100') && st.size == 5
p state_str(s, t)
p st
end
end
end
end
(21:35)
b,l,s[99];main(m,n,i,w,x,y,z){
for(;;){
for(;n=getchar(n)-10;l+=8)s[n]++;
if(l==24&&s['E']==s['N']==s['D']==1)break;
z=85;
x=55;
for(;;){
s[m=n=99]=9999;
w = 0;
for(y=i=x;i<=z;i++){
if(s[i]) {
if(!w)w=i;
y = i;
if(s[i]<s[m]){
if(s[i]<s[n]){m=n;n=i;}
else m=i;
}
}
}
x=w;
z=y;
if(m==99)break;
b+=(s[m]+=s[n]);
s[n]=0;
}
printf("%d %d %.1f\n",l,b,1.*l/b);
b=l=0;
}
}
適当にCで書いてその場しのぎの高速化しても通らなかった。 なんかCで通ってる人いるんだけどなぁ。 まぁC++の方が短くなりそうな気すらする。
(02:53)
#include<cstdio>
#include<set>
int m,n,b,l,i,k[99];main(){
std::multiset<int>s;
for(;;){
for(;n=getchar()-10;l+=8)k[n]++;
if(l==24&&k['E']==k['N']==k['D']==1)break;
for(i=55;i<=85;i++){if(k[i])s.insert(k[i]);}
for(;s.size()>1;){
std::multiset<int>::iterator i=s.begin();
m = *i;
s.erase(i++);
n = *i;
s.erase(i);
b+=(m+=n);
s.insert(m);
}
printf("%d %d %.1f\n",l,b,1.*l/b);
b=l=0;
}
}
おやこれでもTLE。ダメじゃん!
(03:09)
*m,*n,*i,s[99];main(b,l){
for(;m=n=memset(s,0,396);printf("%d %d %.1f\n",l,b,1.*l/b)){
for(l=0;b=getchar()-10;l+=8){
s[b]++;
if(b-l==60)return;
}
for(b=0;m-s-1;){
b+=*m+=*n;
*n=0;
m=n=s+1;
*m=99;
for(i=s+86;*i-99;)
*--i&&*i<*m?*i<*n?m=n,n=i:(m=i):0;
}
b=b?b:l/8;
}
}
250Byte。さっさとアルゴリズムいじれと
(04:53)
と言われて少し違う気がしたんだけど。
なんというかじゃすとふぉーふぁんのうはうというか。 グッドでもバッドでもなくて、 ホビーノウハウというか。
コード短縮もホビーノウハウ。
(23:19)
がどうとか言ってる子はキモい子です! って話があったんだけど、 みんなどういう理由でそんな子になってしまったんだろうか… あと妙に同世代が多い気がするんだよな。 少し上の人は I hate C++! がデファクトに なりきっているというか。
世界で2番目に誤解された言語 C++ 。とかどうだろう。
いや、別に誤解はされてないな…
まぁそんなこんなで最近見てる人の経歴を適当に見てみる。
http://d.hatena.ne.jp/Cryolite/
同世代の模様。
奥さんがいらっしゃるってことは少し上かしら。 しかし最近はそういう判断は外れる歳になっている。
http://d.hatena.ne.jp/syd_syd/
大学院生さんらしい。 いかにも言語好きーな人なのでわかりやすいかな。
http://d.hatena.ne.jp/y-hamigaki/
今気付いたけど cppll でよく見る人だったよ!
http://d.hatena.ne.jp/mb2sync/
あーそういや Boost.Typeof 見てみないとなーと思ったんだった。 http://d.hatena.ne.jp/mb2sync/20050422#p1 はあとで見る系。
結局世代とかよくわからんかったけど なんでもいいや。
(03:07)
http://www.accu-usa.org/2000-05-Main.html
あれーユーザ定義型はーと思ったら REGISTER_TYPEOF とかあるな…
しんどいけどマジメに追ってみよう…
#include <iostream>
#include <list>
#include <boost/typeof/typeof.hpp>
using namespace std;
using namespace boost;
struct C {
C() { cout << "hello world!" << endl; }
};
int ifunc() { return 0; }
list<int>::iterator itefunc() { static list<int> l; return l.begin(); }
C cfunc() { return C(); }
int main() {
BOOST_AUTO(i, ifunc());
BOOST_AUTO(ite, itefunc());
BOOST_AUTO(c, cfunc());
}
ああうん。すごいな。
(03:36)
int main() {
BOOST_TYPEOF(cfunc()) c = cfunc();
c = *(new BOOST_TYPEOF(cfunc()));
}
_ が、 cl.exe だと、
int main() {
boost::type_of::msvc_typeid_wrapper<sizeof(*boost::type_of::encode_start(cfunc()))>::type c = cfunc();
c = *(new boost::type_of::msvc_typeid_wrapper<sizeof(*boost::type_of::encode_start(cfunc()))>::type);
}
_ こうなる。 GCC だと __typeof__ になる。
_ インスタンス化するたびにカウントアップする template とか作れば、 まぁこれで作れるかなぁ。
_ で、インスタンス化するたびにカウントアップねえ…
#include <iostream>
#include <list>
#include <boost/typeof/typeof.hpp>
using namespace std;
using namespace boost;
struct C {
C() { cout << "hello world!" << endl; }
};
struct D {};
C cfunc() { return C(); }
C cfunc2() { return C(); }
D dfunc() { return D(); }
int main() {
BOOST_TYPEOF(cfunc()) c = cfunc();
c = *(new BOOST_TYPEOF(cfunc()));
cout << sizeof(*boost::type_of::encode_start(cfunc())) << endl;
cout << sizeof(*boost::type_of::encode_start(cfunc2())) << endl;
cout << sizeof(*boost::type_of::encode_start(dfunc())) << endl;
}
_ が、 5 5 6 と出力する。明らかにカウンタがある。
_ http://boost-sandbox.cvs.sourceforge.net/*checkout*/boost-sandbox/boost-sandbox/boost/typeof/msvc/typeof_impl.hpp?revision=1.5
_ どう見てもカウンタみたいです。 実装がよくわからんがな。
_ あとまぁ msvc/ 以外の実装は不明チックな。 compliant implementation もよくわからんけど、 要するに BOOST_PP マンセーってことですか。
_ んー。なんか昔見たことある気が超するんだよなぁ。
_ (04:26)
最初聞いた時は冗談レベルに思ったけど、 もっと評価されていいよなぁという気がした。
このへんとかも面白げである。
http://www.tohoho-web.com/html/server.htm
(05:32)
template <class T> struct S {
private:
static T m();
public:
enum { t = sizeof(m()) };
};
についてヒマな時追ってみる。
(01:41)
| 前 | 2026年 1月 |
次 | ||||
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| 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 | 31 |
全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。