search
LoginSignup
0

More than 3 years have passed since last update.

posted at

updated at

AtCoder に登録したら解くべき精選過去問 10 問を Esolang で解いてみた ~ 05AB1E編

Esolangとは?

Esolang とは Esoteric programming language の略であり,日本語で言えば難解プログラミング言語のことである.
実用性よりは,プログラミングが難しくなるように設計されている.

実行方法は?

自分で,インタプリタをビルドしても良いが,Try it Online を使うのが楽である.

おすすめのサイト

  • Try it Online , webページ上でEsolangを実行できるサイト
  • Esolang wiki Esolangについてのドキュメントが抱負なwiki(英語)
  • esolang-box Esolang のコンパイラやインタプリタがたくさん詰まったDockerイメージ

05AB1Eの概要

スタック指向言語.ゴルフ言語.

スタック指向言語とは?

主にスタックを操作することによって,計算する言語.

ゴルフ言語とは?

ソースコードができるだけ短く書けるように設計された言語.

コード

  • AtCoderでテストしてもらえないため,問題ページに載っている入力例しか試していません.
  • ゴルフ言語ではあるが,ソースコードを短くする努力は(あまり)していません.
  • もっと短い書き方があるよってという場合はぜひコメントしてください!

Helloworld

"Hello, worldd!

"で囲うと文字列リテラルが作れる.
最後の"は省略できる.
stackの一番上が最後に自動的に出力される

Cat(1行)

I

I 入力1行をpushする

AtCoder 0

II#OOðIJ
  1. I 入力1行をpushする
  2. I# 入力1行を空白で分けてlistにしpushする
  3. O popし,listの合計をpushする
  4. O stackをすべてpopし合計をpushする
  5. ð 空白をpushする
  6. I 入力1行をpushする
  7. J stackをすべてpopしすべてを結合してpushする

O,Jのように,stackの一番上がlistならばlistに対して機能し,そうでなければstack全体に対して機能するcommandがある.

AtCoder 1

"Odd"I#PÈi"Even"
  1. "Odd" をpush
  2. I# 入力1行を空白で分けてlistにしpush
  3. P popし積を取る
  4. È popし偶数なら1を,奇数なら0をpush
  5. i"Even" popし1なら"Even"をpush

i<commands>}はpopして1ならば,}までのを実行する.が1つだけならば,}は省略できる.
偶数の場合は,"Odd", "Even"が最終的なstackになり, "Even"が出力される.
奇数の場合は."Odd"が最終的なstackになり, "Odd"が出力される.

AtCoder 2

ISO
  1. I 入力1行をpush
  2. S popし文字列を文字のリストに
  3. O popしリストの合計をpush

数字の文字列と数字は区別されない 123 == "123"

AtCoder 3

0UII#D[vyÉi1U¾}}X#ε2÷}D¼]
  1. 0U Xを0で初期化
  2. I 入力1行をpush,この値は使わない
  3. I# 入力1行を空白で分けてlistにしpush
  4. D popし2度push
  5. [...]無限ループ #で脱出
  6. v<commands>} popし,各要素についてを実行する.現在の要素はyで取得する
  7. y 現在の要素をpush
  8. É popし奇数であれば1をpush,そうでなければ0をpush
  9. i1U¾} popし1であれば,X=1とし,カウンタをpushする
  10. } vループの終わり
  11. X# Xをpushし1ならば無限ループを終わる
  12. ε2÷} popしすべての要素を2で割ったlistをpush
  13. D popし2度push
  14. ¼ カウンタを1増やす
  15. ] 無限ループの終わり

AtCoder 4

執筆中

AtCoder 5

0VI#`>U<sƒNSOX‹iDNSO‹iYN+V]Y
  1. 0V Yを0で初期化
  2. I#` 入力を空白でスプリットして,stackに展開 stack:[N, A, B]
  3. >U インクリメントして,Xに代入 stack:[N, A], X=B+1
  4. < デクリメント stack:[N, A-1]
  5. s stackの上2つをスワップ stack:[A-1, N]
  6. ƒ popして0~Nでループ stack:[A-1]
  7. NSO ループのインデックスの数の各桁を合計する
  8. X‹ popしてXより小さいなら1をpush,そうでないなら0をpush
  9. i popして1であるなら,次の命令を実行
  10. D スタックのトップを複製 stack:[A-1, A-1]
  11. NSO ループのインデックスの数の各桁を合計する
  12. A-1 < インデックスの数の各桁の合計 を判定 真なら1をpush,そうでなければ0をpush
  13. i popして1であるなら,次の命令を実行
  14. YN+V Yに対してインデックスを足す
  15. ] すべてのループとifのブロックを閉じる
  16. Y Yをpush

AtCoder 6

執筆中

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
What you can do with signing up
0