2010年03月29日

code golf その7

シャー。次は、Grid Computing。Grid Computingって聞くともう難しそうでテンション下がる。が、これはそのまま、gridでcomputingなので簡単。00〜99までの数値が10*10の格子状になって入力される。この入力の行、列をそれぞれ加算して一番大きい結果を出力すればいい。
t=[map(int,raw_input().split())for x in[0]*10]
print max(map(sum,t+zip(*t)))
これは深く考えることなくこうなって、76byte。pythonのトップは、73byte。あと3byte。もういいか。というか、削れる気がしない。

…ホントに無理か。思いつかない。
posted by s.s.s.r at 00:17| Comment(0) | TrackBack(0) | python | このブログの読者になる | 更新情報をチェックする

2010年03月26日

code golf その6

振り返ることなく進む。どりゃー。次は、Vigenere Cipher。ヴィジュネル暗号。と言ってもサッパリ分からないけど。Wikipediaによると、こんなマトリックスを使った暗号らしい。
問題としては、改行によって分けられたキーワードと平文が標準入力から取得できる。で、それを暗号化して出力。キーワード・平文ともに大文字のアルファベットであると。
key=raw_input()
text=raw_input()
enc=''
i=0
for c in text:
	if i>=len(key):i=0
	k=key[i];i+=1
	A=ord(k)+ord(c)-65;
	enc+=chr(A>90 and A-26 or A)
print enc
154byte。pythonのトップは73byte。まあ、取りあえずだし。
で、考える。キーワードと平文両方のループを扱うためのインデックスが気持ち悪い。消したい。
r=''
for k,p in zip(raw_input()*9,raw_input()):A=ord(k)+ord(p)-65;r+=chr(A>90 and A-26 or A)
print r
で、変数なんかも1文字にして、こうなる。平文の長さに対してキーワードは9つ分もあれば十分であろう、という根拠のない予測に基づいているあたりが危険ではあるが、テストケースはクリア出来るようなのでよしとする。ついでに言うとzip関数内の評価順についての仕様も知らないのだが、これも通るのでスルー。これで一気に100byte。
ここでハイパー小細工タイム。
r=''
f=raw_input
for k,p in zip(f()*9,f()):A=ord(k)+ord(p)-65;r+=chr(A-(A>90)*26)
print r
raw_inputを代入して簡略化し、結果部分も修正。これで89byte。あと16byteも削れるか?
あ、キーワードと平文を合計して26で剰余をとればローテートできるのか。
r=''
f=raw_input
for k,p in zip(f()*9,f()):r+=chr((ord(k)+ord(p))%26+65)
print r
これで80byte。あと7byte。無理。どう考えてもカツカツだ。根本的な考え方が違うのか、あるいは文法的な抜け道があるのか。

posted by s.s.s.r at 22:11| Comment(0) | TrackBack(0) | python | このブログの読者になる | 更新情報をチェックする

2010年03月25日

code golf その5

わー。続いては、Roman to Decimalに挑戦。ローマ数字(?)の表記を数値に直す。アルファベットと数値の対応は、
I: 1
V: 5
X: 10
L: 50
C: 100
D: 500
M: 1000
となっている。数値が大きい順から現れるが、それが逆転している場合は減算。分かりづらいか?まあIVだと5-1で4とかそんな感じ。MMMCCXCだと3290だそうだ。
一発目。
T={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
p=1001
r=0
for c in raw_input():
	r+=T[c]
	if p<T[c]:
		r-=2*p
	p=T[c]
print r
これで134byte。結構短いか?と思いきや、pythonのトップは72byte。問題が単純なだけだったか。まあ、これをベースに削ろう。
p=1001
r=0
for c in raw_input():
	t={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}[c];r+=t
	if p<t:r-=2*p
	p=t
print r
テーブルの変数を消してその他小細工で、124byte。後は、if文が消せそうか?p=1001という頭の悪さもどうにかしたい。
p=1001
r=0
for c in raw_input():t={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}[c];r+=t-(p<t)*p*2;p=t
print r
だいぶ汚くなったが、if文を消して116byte。

p=1001
r=0
for c in raw_input():t=dict(I=1,V=5,X=10,L=50,C=100,D=500,M=1000)[c];r+=t-(p<t)*p*2;p=t
print r
これで106byte。文法レベルで知らなかったこととか平気で出てくる。help(dict)とかちゃんと見ておけばよかった。

p=r=0
for c in raw_input():t=dict(I=1,V=5,X=10,L=50,C=100,D=500,M=1000)[c];r+=t-(p<t)*p*2;p=t
print r
積をとってるのだから、pの初期値がゼロでも結果として問題なかったことに気づいて101byte。頭打ちか。

posted by s.s.s.r at 23:07| Comment(0) | TrackBack(0) | python | このブログの読者になる | 更新情報をチェックする

2010年03月24日

code golf その4

ガンガン行こう。お次はSwitchboard。これはそのまんま、あみだくじ。1行目の全アルファベットを辿った結果を出力する。
で、とりあえず。あみだくじ中の'X'の位置によってアルファベットを入れ替える、という方法をとることにする。奇数なら隣り合ったもの、偶数なら1こ飛ばしでいいはず。
import sys
I=list(raw_input())
for L in sys.stdin:
	for J,C in enumerate(L):
		if C=='X':V=2-J%2;I[J-V],I[J+V]=I[J+V],I[J-V]
print''.join(I)
で、140byte。pythonのTOPは、114byte。
import sys
I=list(raw_input())
for L in sys.stdin:
	J=0
	for C in L:
		if C=='X':V=2-J%2;I[J-V],I[J+V]=I[J+V],I[J-V]
		J+=1
print''.join(I)
enumerateをやめたら139byteに。ループが深いのが気に入らない。
なんというか、全体的に残念なコードになった。
import sys
I=0
for L in sys.stdin:
	I=I or list(L);J=0
	for C in L:
		if C=='X':V=2-J%2;I[J-V],I[J+V]=I[J+V],I[J-V]
		J+=1
print''.join(I)
raw_inputをやめたら138byteに。1byteしか削れない。

posted by s.s.s.r at 21:09| Comment(0) | TrackBack(0) | python | このブログの読者になる | 更新情報をチェックする

2010年03月23日

code golf その3

ちょっと詰まったらすぐ次へ。サクサク行こう。お次はSaving Time。デジタル表記の時刻を、簡素なアナログ時計っぽいものとして出力すればOK。
とりあえず動くもの。
h,m=map(int,raw_input().split(':'))
h%=12
m/=5
O=[' 'for x in range(103)]
T=[8,22,40,59,77,92,102,84,63,43,26,14]
R=[9,23,24,41,42,60,61,78,79,93]
for r in R:O[r]='\n'
for t in T:O[t]='o'
O[T[h]]='h'
O[T[m]]=h-m and'm'or'x'
print ''.join(O)
240byte。pythonのトップは126byte。ほぼ倍。
早くも行き詰まった感があるので早速小細工に入る。
h,m=map(int,raw_input().split(':'))
O=[' 'for x in' '*103]
T=8,22,40,59,77,92,102,84,63,43,26,14
for r in 9,23,24,41,42,60,61,78,79,93:O[r]='\n'
for t in T:O[t]='o'
O[T[h%12]]='h'
O[T[m/5]]='mx'[h%12-m/5==0]
print''.join(O)
これで223byte。絶対方向性間違ってる。

あ、初期化は
O=[' ']*103
こうでいいのか。これで212byte。うーむ。改行のテーブルはTから割り出せないこともないけど、かえって長くなるか。
posted by s.s.s.r at 23:51| Comment(0) | TrackBack(0) | python | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。