A言語は、プログラムを短くするために作られたジョーク言語です。
A言語は以下のような点を意識して作られました。
- 空白・括弧・カンマなどの区切り文字を極力使わずに書け、一見文字の羅列にしか見えないプログラムを組める
- 全ての変数名や関数名は1文字のアルファベットしかつけられない
- オンラインジャッジの問題を解ける程度の最低限の機能がついている
makeをして、./interpreter
と./compiler
を作成します。
$ make
A言語で書いたソースコードを実行するには./interpreter
の引数にソースファイルを指定して実行します。
$ ./interpreter code.a
./compiler
の引数にソースファイルを指定して実行すると、C++言語のソースコードが出力されるので、オンラインジャッジ等に投げる時などにお使いください。
$ ./compiler code.a
また、src/combined.ccをコンパイルして実行ファイルを作ってもOKです。
$ g++ src/combined.cc -o interpreter
$ ./interpreter code.a
整数・小数・文字列・配列のいずれかです。
任意のASCII文字を変数名として使えます。
衝突した場合は上書きされます。
S[文字列]\
と書くと文字列を作ることができます。
\
を文字列に含みたい場合は\\
のように書いて下さい。
A[変数][値]
と書くと、変数への代入が出来ます。
以下の項目に共通することですが、[]
は読みやすさのために付けているもので、実際にコードを書く時には書かなくて良いものです。"
代入の式の値は代入された値になります。
I[型ID]
と書くと入力が出来ます。
型 | ID |
---|---|
整数 | d |
小数 | f |
文字列 | s |
O[値]
と書くと値を出力できます。
値が配列の場合は空白区切りで要素を出力し、末尾に改行を出力します。
printfのような形式でフォーマット変換をした文字列を作ります。
フォーマット指定子が1文字のものだけ対応しています。
フォーマットの出力は100文字程度に収まるようにして下さい。
M4d123
→ 0123
M.5f3.14
→ 3.14000
Mc65
→ A
M.9sSCat Snuke likes an array.\\
→ Cat Snuke
単項演算子として!,~,-
の3つが使えます。
文字列・配列の場合、~はソート、-は反転になります。
!58
→ 0
二項演算子として+,*,/,%,&,|,^,{,},<,>,=,#
が使えます。
引き算は+
と単項演算子-
を組み合わせて行って下さい。
{,}
はシフト演算子で、#
は≠です。
真偽値はFalseが 0、Trueが 1 となっています。
+演算子を文字列に対して行うと、文字列結合が出来ます。
小数の比較は 1e-10 の誤差を含めて比較されます。
Ax5Ay8+xy
→ 13
{3--2
→ 12
Ax6#x9
→ 1
?[整数][式]...[式]:[式]...[式]:
と書くと条件分岐が出来ます。
整数が 0 でない場合は1つ目の式、そうでない場合は2つ目の式が実行されます。
Ax7?+x1:+x5:
→ 8
P[式]...[式]:
と書くと複数の式をひとつの式としてまとめることが出来ます。
式の値は最後に評価された式の値となります。
R[カウンタ名][整数][式]
と書くと[整数]
で指定した回数だけループを回します。
ループを回す回数は1回以上でなければなりません。
W[式]
と書くと無限ループが出来ます。
式の値が 0 になると無限ループから抜け出します。
V[変数名][添字]...[添字]:
のようにアクセスします。
配列は自動的に必要なサイズまで拡張されるようになっているので、事前に宣言をする必要はありません。
文字列に対してアクセスした場合は、指定箇所の文字コードが整数で返ります。(この値に代入しても文字列は書き換わりません)
AVa1,0,2:9
→ [,[[,,9]]]
というような構造の配列
L[値]
と書くと、値の型が文字列か配列ならば長さを返し、そうでないならば-1を返します。
関数は[引数名]...[引数名]:[式]...[式]
という書式の文字列として作成して下さい。
関数の実行はF[文字列][引数]...[引数]
とします。
引数名で使われた変数は上書きされますが、関数の実行が終わると元に戻ります。
Ax3Ay5OFSxy:Ax+xy\\xyOMc32OxOMc32OyOMc10
→ 8 3 5
(関数内で引数に代入をしても関数外には影響がありません)
T[開始位置][長さ][文字列]
と書くと、部分文字列を取得できます。
T1,2Sabcde\\
→ bc
U[文字列][開始位置][文字列]
と書くと、1つ目の文字列の開始位置のindexからの文字列が2つ目の文字列で置換されます。
USabcde\\2Sxy\\
→ abxye
文字列や配列は基本的に参照で扱われているため、書き換えなどの際には気をつけてください。
AsSabc\AtsO-sOsOt
→ cbacbacba
スペースや改行等の特に役割のない文字を式と式の間に挿入しても読み飛ばされるようになっています。
数字と数字の間に挟む区切り文字としても利用できます。
アルファベットであっても、何も代入されていない文字は空白と同様と見なされてしまい、思わぬ挙動の原因となるので気をつけて下さい。
スペースとして使えない文字:AFILMOPRSTUVW0123456789?!~-+*/%&|^{}<>=#:
機能 | 記法 |
---|---|
整数 | [数字] |
小数 | [数字].[数字] |
文字列 | S[文字列]\ |
代入 | A[変数][値] |
入力 | I[型ID] |
出力 | O[値] |
フォーマット | M[フォーマット指定子][値] |
単項演算 | [単項演算子][項] |
二項演算 | [二項演算子][左項][右項] |
条件分岐 | ?[整数][式]...[式]:[式]...[式]: |
複数式処理 | P[式]...[式]: |
回数指定ループ | R[カウンタ名][整数][式] |
無限ループ | W[式] |
配列アクセス | V[変数名][添字]...[添字]: |
長さ取得 | L[値] |
関数作成 | S[引数名]...[引数名]:[式]...[式]\ |
関数実行 | F[文字列][引数]...[引数] |
部分文字列 | T[開始位置][長さ][文字列] |
文字列編集 | U[文字列][開始位置][文字列] |
数字の区切り | スペースやカンマなど |
AtCoderのジャッジに入るらしいので、実装・言語仕様をアップデートしました。
- 2025/07/17
- 複数式処理を
P[式][式]
からP[式]...[式]:
に変更- P をたくさん書く煩わしさを解消
- 条件分岐の中身を複数式に変更
- 関数の中身も複数式に変更
- メモリを一定以上使用すると落ちる問題を解消
- 複数式処理を
- 2025/07/23
- 文字列の添字アクセス(文字コードの取得のみ)を実装