読者です 読者をやめる 読者になる 読者になる

本履歴

購入した古本の履歴と時々プログラミング

備忘録がわり。いきなり誰得な内容。あなごる(GPC)向け。

Pascal Golfについてはid:ytqwertyさんのPascal Golfという記事がありやす。一部重なっていますが、まあ気にしない。

変数初期化

グローバル変数は0で初期化されるが、それ以外の値にしたい時、varの中で初期化。下記のケースはbも1に初期化されるので注意。

var a,b:word;begin;a:=1;
var a,b:word=1;begin

ループでの初期化。一種類の変数を利用する場合限定。varがどこでも置けるのが盲点。

var a:word;begin;repeat a:=1;... until 1=0end.
begin;repeat var a:word=1;... until 1=0end.

文字列の初期化。文字列の入力と初期化を同時にする場合限定。

var s,t:string;begin;repeat readln(s);t:="";... until 1=0end.
var s,t:string;begin;repeat readln(s,t);... until 1=0end.

リテラル

集合型リテラルで等式判定。255まで限定。複雑な条件式を短くできる可能性がある。

if(a=0)|(a=n)then 
if a in[0,n]then 

数値リテラル。36進数。下記は同じ出力。

writeln(3450139116625338);
writeln(36#XYZ0123456);

文字型
ASCII# 33-59(! ... ;),74(J),77(M),110(m)以外はハットにより2バイトで表現可能。特に、^j(改行),^'(スペース)はよく使う。
下記は同じ出力。

var s,t:string;begin ... write(s,#10,t);
var s,t:string;begin ... write(s+^j+t);

プリプロセッサ

C言語のが使える。どうしても縮まないときはこれを試す。下記はPermutationsから

#define F(X)for X:=0to 5do
var a,b,c,d,e,f:word;begin
F(a)F(b)F(c)F(d)F(e)F(f)if[a,b,c,d,e,f]=[0..5]then writeln(a,b:2,c:2,d:2,e:2,f:2)end.

var a,b,c,d,e,f:word;begin
for a:=0to 5do for b:=0to 5do for c:=0to 5do for d:=0to 5do for e:=0to 5do for f:=0to 5do if[a,b,c,d,e,f]=[0..5]then writeln(a,b:2,c:2,d:2,e:2,f:2)end.

文字列の出力

部分文字列の出力は全パターン検討する。

write(s[2..9]);
write(("1234567890")[1..n]);//文字列リテラルの場合は()で括る
write(s:n);
write(copy(s,2,9));

改行は文字列リテラルに入れられる。下記は同じ出力。

writeln("FOO");
write("FOO
");

スペース付き

write(s:20);
write(s:-20);//スペース出力が変わる

三項演算子もどき。if thenで文字列出力する場合は、スライス関数で部分文字列を作れば大抵短くなる。

if a=0then writeln("A")else writeln("B");
writeln(("BA")[1+ord[a=0]]);

論理式

and,orは&,|で置き換える。

if odd(a)and even(b)then
if odd(a)&even(b)then

思い出したら、また書く。やあよ、やあよ!