トップ 最新 追記

U-memo

2006|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|08|
2009|08|10|
2010|02|03|
2011|11|12|
2012|04|
2016|02|
All= / Today= / Yesterday=

2007-04-04 [長年日記]

_ [Golf][OCaml] あなごる right time

OCaml のライブラリを全く信頼していなかったことがおもな敗因かなー。

しかし閏秒の扱いを全く知らなかったのも事実でー。

timezone のファイルは

/usr/share/zoneinfo/*

にあるけれど、閏秒考慮はその中の

/usr/share/zoneinfo/right/*

だから UTC の場合は TZ=right/UTC となるわけか。

問題タイトルでちゃんと語っていたわけですねぇ。はー。

_ [Golf][OCaml] あなごる Bracket matching

概ね魔法の差、でいいのかな。

あれ? ksk さんのには End-of-file 例外の処理が出てこないな。 入力の最後に改行があったんかしらん。 (追記)何を寝ぼけたことを書いてるんだオレわ。

ksk さん

let p,q,x=Obj.magic(Printf.printf,Scanf.scanf,"failed at: %c%s\n")
let rec f(h::t)=q"%c"
 (fun c->
  c=10&(h=0&0=p"yes\n"||p x 'E'"OL";f[0])
  ||c*7mod 4<2&f(c::h::t)
  ||h=c-2+41/c&f t
  ||(q"%s\n"(p x c);f[0])
 );;
f[0]

わたし

open String;;
while 1=1do
 let o,a,p,u=print_endline,read_line(),"failed at: ","(<[{}]>)"in
 let rec(@)l i=
  try
   let q=index u a.[i]in
     q<4&u.[7-q]::l@i+1
     ||List.hd l=a.[i]&List.tl l@i+1
     ||()=o(p^sub a i(length a-i))
   with _->
     l=['0']&()=o"yes"
     ||()=o(p^"EOL")in
 ['0']@0
done

スタックに使うリストをさいしょに括弧文字以外の物を番兵として入れておくのは同じ(魔法を使ってないので私のは Char であるけれど)。

_ [Golf][OCaml] あなごる

OCaml 11位転落 だー

2問解けば10位復帰できそうだけど(平均点を上げる努力をしない子


2007-04-10 [長年日記]

_ [Golf][OCaml] あなごる duplicate lines

期限つき問題が追加されてて既に何人もエントリされてたので、がんばった。 何も考えずにに組んだら勝てなかったのでちょっと考えてしまったけど、とりあえずトップ。

Statistics を見る限り ksk さんはすぐに追い付いてくるんだろうなぁ。

(追記)と思ったら airobo さんに抜かれてしまった!

がんばって抜き返す。

本日のツッコミ(全2件) [ツッコミを入れる]

_ ksk [あー,ちょっと違うアプローチだったみたいですね.思いつきませんでした. delete last line の 52B..]

_ うかい [delete last も同じアプローチですね…って抜かれてるYo!]


2007-04-12 [長年日記]

_ [プロセッサ] CISC の変態命令

べつに TR 命令は、 バウンダリの合わない(ページ境界を跨いだ)ストア命令の延長でしかない (と言えるほどは簡単でないが)とか言ってみるテスト。

# x86 だってページ跨ぎのロード/ストアくらいはハンドリングしてるだろうし

EX (EXECUTE) 命令の変態さ加減(と出現頻度の高さ)に比べればまだまだ。

# 特権命令はもっとアレだけど。

(追記)リンク先の論議は TR命令の例外ハンドリングに勘違いがあるように見える。


2007-04-16 [長年日記]

_ [Golf][OCaml] あなごるいくつかネタばれ

ネタばれプラグインは RSS でも無力なのねー。 読みたくない人はきをつけよー。

概ね一月以上膠着しているものをネタばらしー。

hello world

print_string"Hello, world!"

これしかないはず。

echo

exec するなら短いコマンドを探すのみ。

Sys.command"pg"

しない場合は普通に書くとこんなもんだが、

while 1=1do print_endline(read_line())done

Scanf に魔術が。

Scanf.scanf"%s@1"print_string

99shinh

let w,k=" on the wall",", "let(>)i o=Printf.printf"%d shinichiro%s of hamaji%s"i[|"es";""|].(1/i)o;i;;for
i=99downto 1do(i>w^k>[|".
Take one down and pass it around";".
Go to the store and buy some more"|].(1/i)^k)-1+1/i*99>w^".

"done

まだ 10byte 縮むんですって。 終了条件がうまく作れれば縮みそうなんだけど。

example

let(!)u="&quot;example."^u^"&quot;";;Printf.printf"<HTML>
<HEAD>
  <TITLE>Example Web Page</TITLE>
</HEAD>
<body>
<p>You have reached this web page by typing %s,
%s,
  or %s into your web browser.</p>
<p>These domain names are reserved for use in documentation and are not availabl
e
  for registration. See <a href=\"http://www.rfc-editor.org/rfc/rfc2606.txt\">RFC
  2606</a>, Section 3.</p>
</BODY>
</HTML>"!"com"!"net"!"org"

smiley

あと2byte が縮まらない

let rec f b c i=print_string c;f(b^"))")b(i-i/i);;f"
:-)"":
:-"32

Tennis

あと15Bはちょっと遠い。アルゴリズムの問題か?

open Printf
let rec(@)p q=let(>)x y=x=y&()=printf"Set is tied at %d
"x||()=printf"Player%d %s %d - %d
"(2-(x+3)/(y+3))[|"leads";"wins the set"|].(x/7+y/7)(max x y)(min x y);x@y
in read_int()=1&p+1>q||p>q+1;;0@0

Permutater はパス

del blank

ネタばれ済ですが再掲

let rec a c=c>""&print_endline c=();a(read_line());;a""

dancing

あと1バイトなんだが全然違うんだろうか。

print_string([|" ('-')/
 /|_|";"\('-')
  |_|\\";"\('-')/
  |_|"|].(String.length(read_line())/5)^"
  | |")

bowling

まだ多少は縮むのだけど、ずいぶんと先は長い。

#load"str.cma"let z=Printf.printf"%d "let rec
s r t=fun(h::i::j)->let p=t+h+i+if
h+i>9then List.hd j else 0in z p;s(r-r/r)p(if h>9then i::j
else j);;s 9 0(List.map
int_of_string(Str.split(Str.regexp" ")(read_line())))

e は kskさんのネタばらし参照

ハミング数は他の言語へのネタばれになるから肝心なところを隠して

let rec(>)n i=n+i/i>i-Obj.magic(
  ごにょごにょ
Printf.printf"%d
"n);;1>read_int()

Perl でトップに立ってるのに OCaml で 3B 届いてないのが謎。

Hole in one はパス

Ultimate

print_int 42

Card sharp

先は長いがやる気は無し。

let x=String.length(read_line())let y a=List.iter(fun b->Printf.printf"%s of %ss
"b a)(["Ace";"2";"3";"4";"5";"6";"7";"8";"9";"10";"Jack"]@[|[];["Queen"];[]|].(x/8)@["King"]);;y"Spade";y"Heart";x<11&()=y"Diamond";y"Club"

even line

let rec(!)c=c();print_endline(c());!c;;!read_line

Sort-char は ksk さんのネタばらし参照

SQRT

while 1=1do Printf.printf"%.9f
"(sqrt(read_float()))done

fibonacci は ksk さんの から記号関数技を使えばよい

prime

実質初のネタばらし?

let r=ref(read_int())let rec(@)j i=j=1&decr r=Printf.printf"%d
"i;i/j*j=i&i@ !r/ !r+i||j-1@i;;1@2

invert case

あと1バイトなんだがこんなシンプルだと方向性も見えない。

while 1=1do print_char(Char.chr(input_byte stdin lxor 32))done

LCS

解答に問題があるのでおおむね解答埋め込み。

let x=String.sub;;Scanf.scanf"%s %s"(fun a b->print_string[|x(b^b)0
51^"0100001000001010011010000101000001100000000001111110001001000010101010011001011000111101

010000010001101111";x

b 4 35;x a 0 29^"abraracadabrabrabracadabra"|].(Char.code(a.[6])/49))

ただサンプル解答が正しくても、まじめに解くと T.O. するわけだが。

del last

最近までトップだったわけだが転落。この延長上だとは思うんだが...

let rec(&)x b=read_line(print_string b)^"
"&x;;""&""

swap

let rec(!)b=print_endline(b()^"
"^b());!b;;!read_line

rotate

あと2バイト?

Scanf.scanf"%s@
%s@?"(fun a b->print_string(b^a))

#?はバイナリ文字

transpose はパス(まじめに考えてないし)

exit

exec

print_int(Sys.command(read_line()))

exec なし

print_int[|0;255;1|].(input_byte stdin mod 4)

multi sort

他にやってるひといないけど

#load"str.cma"open List
let f x=Str.split(Str.regexp" ")(read_line x)let rec d x=try d(x@[f()])with _->x
let rec(%)l=function h::t->sort(fun p q->compare(nth p(h-1))(nth q(h-1)))l%t|_->iter(fun u->print_endline(String.concat" "u))l;;d[]%rev_map
int_of_string(f())

つかれたのでここまで

本日のツッコミ(全1件) [ツッコミを入れる]

_ ksk [dancingを参考にしたら結構縮んで,Haskellに追いつきました. あとhammingは魔法を使わないと縮むか..]


2007-04-19 [長年日記]

_ [Golf] あなごるサーバずっと落ちてるっぽいな

inverse matrix の回答期限までに直るのかなぁ?

387Bまで縮めたのを準備中なのだけど。


2007-04-20 [長年日記]

_ [Golf][OCaml] あなごる 逆行列

(やはり)kskさんに負けた。

Gauss-Jordan 法あたりで求めるとして、

  • 普通にやると倍精度浮動小数でも誤差が大きく出る
  • 途中で対角要素が 0 のやつがいるので pivot 操作相当が必要

への対処が問題といえる。

387B 版は浮動小数をあきらめて Num (無限精度有理数)を使い、pivot 操作として最下行を足し込むようにした。(400B台後半の頃はまじめにやってたが)

post-mortem (359B) では浮動小数点にして誤差をごまかした。

初期の版数のもさらしておこう。

#load "nums.cma"
open Num
let a=Array.make_matrix 9 18(Int 0);;
for i=0to 8do
 for j=0to 8do
  Scanf.scanf "%d "(fun x->a.(i).(j)<-Int x)
 done;
 a.(i).(i+9)<-(Int 1)
done;;
for i=0to 8do
 if a.(i).(i)=Int 0 then
  for j=i+1to 8do
   for k=0to 17do
    a.(i).(k)<-a.(i).(k)+/a.(j).(k)
   done
  done;
 for j=0to 8do
  let u=a.(i).(i)in
  let c=a.(j).(i)//u in
  for k=0to 17do
   a.(j).(k)<-if i=j then a.(j).(k)//u
              else a.(j).(k)-/a.(i).(k)*/c
  done
 done
done;
for i=0to 8do
 for j=9to 16do
  Printf.printf "%d "(int_of_num a.(i).(j))
 done;
 Printf.printf "%d\n"(int_of_num a.(i).(17))
done
本日のツッコミ(全2件) [ツッコミを入れる]

_ ksk [m.ukaiのさんのコードを基に再投稿させていただきました.]

_ うかい [おー素晴らしいですー]