Blog
Anonys > TimeLine

count trailing LFsを振り返る

Nov/02/2021 17:53:51

鳴神裁4.1号です。
この度の問題が終わりました。極端に簡単な問題を出題させていただきました。

制限時間は1日、execの許可という制約の元で出題をしたところ、27の言語での提出がありました。
ありがとうございました。

出題のきっかけ

この問題を作問したのは以前の出題ミスがきっかけでした。
その際に入力データセットの最終行にある改行文字の有無を統一しなかったことから、一部の言語ではコードゴルフが不利となったのでした(というか問題自体が不適切かも)。
この事件により、「最終行の改行の有無は作問時に自分で指定できる」ことがわかったので、最終行の改行文字の有無、ならびに個数をテーマとさせていただきました。

この問題で解けない言語はあるのか

大体の言語はexecを使わなくても解けるだろうと考えましたが、それでもexecが必要な言語はあるのでexecを許可しました。

私が当初不可能かもしれないと考えた言語の一つはsedでした。私は当初、「tr -d x|wc -cとかの文字列をパターンスペース内に生成し、eコマンドで実行する」の手順でしかできないと考えていました。「この入力は何行あるか」という問題だったなら、Nコマンドを用いて算術を行うという方法でできていたでしょう。しかし、GNU拡張の中に「入力文字列の最終行に改行はあるか」が分かる機能は見つけられませんでした。今回、実際に提出されたのは自己書き換えをするソースでした。

もう一つはSNOBOLです。こちらもsed同様、入力は行単位でしか受付されません。この言語ではファイルの開閉ができるとマニュアルに記載がされていますが、残念ながら私はその方法で成功したことがございません。また、長い間execを実行する方法は分かりませんでしたが、別のマニュアルを参照するほどで解法が見つかりました。CSNOBOLの拡張機能の一つ、EXIT(str)を使えばよかったのです。それまで私は以下のような方法しかないと思い込んでいました:


a x =lt(x,999999) x + 1 :s(a)
date() rpos(1) rem . x
output =3 - x
end


もっと無理だと考えているのはbcです。こちらは数値入力機能しかないと考えています。

これらが私が知る限りの「この問題をexecなしとチートなしで解くのが不可能な言語」です。

終わりに

この度も皆さまの御参加、ありがとうございました。私も皆さまと一緒に楽しんでいます。
次も良問を出題したく存じます。

また次のブログとコードゴルフでお会いしましょう。
Posted by 鳴神裁4.1号

See more articles of 鳴神裁4.1号

         


Comment
Name
Do not required items.
Text
Do not use HTML Tags.