はじめに
AtCoder言語アップデートテスト用コンテストがついに公開されましたね
https://atcoder.jp/contests/language-test-202505
大変嬉しい限りです。この記事では自分が提案した Uiua で AtCoderBeginnersSelection の問題を解いていきます。
Uiua
Uiua はスタックベースの配列指向言語です。配列指向といえば APL だと思いますが、まさにその影響下にあり、BQN に強くインスパイアされた言語です。
コードは下のような感じです。
+1 2
これで3が出力されます。ポーランド記法っぽいですが、右からかく逆ポーランド記法というふうに捉えた方が正確かもしれません。処理としては
- スタックに2を積む
- スタックに1を積む
- スタックの上2つを取り出し足した結果をスタックに積む
みたいな感じです。最後まで実行するとスタックに残っているものが全て出力されます。
次は配列指向っぽいコードも見てみましょう。
×2⇡4
これは [0 2 4 6]
になります。⇡4
は [0 1 2 3]
という配列になり ×2
で全ての要素が倍になります。なんとなくイメージはつかめたでしょうか?
入出力
標準入力を受け取る関数は &sc
です。これにより1行が文字列(Uiua では文字列は文字の1次元配列)としてスタックに積まれます。
文字列を数に変換するには ⋕
を使います。空白区切りの場合は ⊜⋕⊸≠@
を使うといいです。⊜
の説明が面倒なので説明は省きます。
出力は &p
を使います。スタックの一番上の要素を取り出し、出力します。
配列を空白区切りで出力するときは &p/$"_ _"
を使います。
AtCoderBeginnersSelection
PracticeA - Welcome to AtCoder
PracticeA - Welcome to AtCoder
&p&sc&p+/+⊜⋕⊸≠@ &sc⋕&sc
/+
で配列の合計を計算できます。/
は Modifier と呼ばれ、関数を受け取ります。Modifierが受け取る関数は構文解析をした時点で決まり、関数とくっついてひとつの関数のように振る舞います。
ABC086A - Product
&p⊏◿2/×⊜⋕⊸≠@ &sc{"Even""Odd"}
ABC081A - Placing Marbles
/+≡⋕&sc
ABC081B - Shift only
◌⍥(⨬∘(⊓÷₂+₁)=0/+⊸◿2)∞⊜⋕⊸≠@ &sc◌&sc0
2025-05-05 追記
ラクラムシさんにより配列指向らしい解法を教えて頂きました
/↧⊗1⋯⊜⋕⊸≠@ &sc◌&sc
ABC087B - Coins
⍥₃/+=⋕&sc⊞+⊞+∩₃°□°⊟₃⍚(×⇡)+1[⍥₃(⋕&sc)]50_100_500
ABC083B - Some Sums
/+▽⤚(×∩≥⤚:≡(/+≡⋕°⋕))⇡+1°⊟₃⊜⋕⊸≠@ &sc
ABC088B - Card Game for Two
⌵/-⊕/+◿2°⊏⍆⊜⋕⊸≠@ &sc◌&sc
°⊏
の挙動は非自明だと思います。⇡⊸⧻
と同様の振る舞いをします。
ABC085B - Kagami Mochi
⧻◴[⍥(⋕&sc)]⋕&sc
ABC085C - Otoshidama
⤚:°⊟⊜⋕⊸≠@ &sc⊸≡/+↯∞_2⊞⊟⇡9⇡2001
⊙(⊸≡(/+×10000_5000_1000)≡⊂˜-⊙(⊸≡/+▽≤))
&p/$"_ _"⊏⊙(˜⊂¯1_¯1_¯1)⊗1=
雑に書くとMLEになっちゃいました。メモリを使わないようにしようにも $2000 \times 2000$ のループ(配列操作なら問題ない)はかなり遅いので困りましたが、5000円札を9枚以上使う意味はないそうです。(参考)
ABC049C - 白昼夢
&p⊏≍""⍥(⍣(°(˜⊂"dream")|°(˜⊂"erase")|°(˜⊂"dreamer")|°(˜⊂"eraser")|∘))∞&sc{"NO""YES"}
ABC086C - Traveling
&p⊏/××⊃≥(=∩◿₂)⧈(/+:°⊂⌵/-)2⊂[⍥(⊜⋕⊸≠@ &sc)]⋕&sc0_0_0{"No""Yes"}