0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AtCoder に登録したら解くべき精選過去問 10 問を Uiua で解いてみた

Last updated at Posted at 2025-05-02

はじめに

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

ABC086A - Product

&p⊏◿2/×⊜⋕⊸≠@ &sc{"Even""Odd"}

ABC081A - Placing Marbles

ABC081A - Placing Marbles

/+≡⋕&sc

ABC081B - Shift only

ABC081B - Shift only

◌⍥(⨬∘(⊓÷₂+₁)=0/+⊸◿2)∞⊜⋕⊸≠@ &sc◌&sc0

2025-05-05 追記
ラクラムシさんにより配列指向らしい解法を教えて頂きました

/↧⊗1⋯⊜⋕⊸≠@ &sc◌&sc

ABC087B - Coins

ABC087B - Coins

⍥₃/+=⋕&sc⊞+⊞+∩₃°□°⊟₃⍚(×⇡)+1[⍥₃(⋕&sc)]50_100_500

ABC083B - Some Sums

ABC083B - Some Sums

/+▽⤚(×∩≥⤚:≡(/+≡⋕°⋕))⇡+1°⊟₃⊜⋕⊸≠@ &sc

ABC088B - Card Game for Two

ABC088B - Card Game for Two

⌵/-⊕/+◿2°⊏⍆⊜⋕⊸≠@ &sc◌&sc

°⊏ の挙動は非自明だと思います。⇡⊸⧻ と同様の振る舞いをします。

ABC085B - Kagami Mochi

ABC085B - Kagami Mochi

⧻◴[⍥(⋕&sc)]⋕&sc

ABC085C - Otoshidama

ABC085C - Otoshidama

⤚:°⊟⊜⋕⊸≠@ &sc⊸≡/+↯∞_2⊞⊟⇡9⇡2001
⊙(⊸≡(/+×10000_5000_1000)≡⊂˜-⊙(⊸≡/+▽≤))
&p/$"_ _"⊏⊙(˜⊂¯1_¯1_¯1)⊗1=

雑に書くとMLEになっちゃいました。メモリを使わないようにしようにも $2000 \times 2000$ のループ(配列操作なら問題ない)はかなり遅いので困りましたが、5000円札を9枚以上使う意味はないそうです。(参考

ABC049C - 白昼夢

ABC049C - 白昼夢

&p⊏≍""⍥(⍣(°(˜⊂"dream")|°(˜⊂"erase")|°(˜⊂"dreamer")|°(˜⊂"eraser")|∘))∞&sc{"NO""YES"}

ABC086C - Traveling

ABC086C - Traveling

&p⊏/××⊃≥(=∩◿₂)⧈(/+:°⊂⌵/-)2⊂[⍥(⊜⋕⊸≠@ &sc)]⋕&sc0_0_0{"No""Yes"}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?