echo

anarchy golf - echo

入力をそのまま出力へ受け流す、というもの。
最近Scalaでゴルフってると、入力の受け取り方を整理したいなと思うことが多かったので、しばらくはこのあたりのシンプルなのをこなしていこうと思う。


あなごるで標準入力から値を取得する場合によく使われるのが、readLine と io.Source.stdin (だと思う。他にいい方法あったら教えてください!)
まだゴルフ初心者だけど、なんとなく両者にもってるイメージというかを書いてみる。

  • readLine: String (8 bytes)
    • 1行ごとに文字列を取得して処理できる。取得結果の文字列からは行末の改行コードは省かれる。
    • while(0<1)ループや再起と一緒に使用して繰り返し処理を行い、例外で処理を止める(いいのかw)というパターンが多い。
    • よって、無限ループで使用する場合、入力がとぎれたところで例外を飛ばすようになっていないと処理が終わらずタイムアウトする。
    • 8 bytes なので短い。
  • io.Source.stdin: BufferedSource (15 bytes)
    • 全入力が一度にとれる。
    • 15 bytes なので若干長い。
    • io.Source.stdin.mkString で全入力を1つの文字列としてげっつ。でも長い。
    • io.Source.stdin.getLines で行ごとのイテレータげっつ。でも長(ry
    • BufferedSource をうまく使えるといろいろできるかも?


とかとか。


前置きが長くなったけども、今回の問題 echo
入力をそのまま出せばいいなら、

while(0<1)println(readLine)


でいいんじゃないの?と思ったが、これだと↑の方でも書いたけども、ループが終わらずタイムアウトになる。


じゃあio.Source.stdin 使うか、と書いたのが次。
全文字列を1回でprint。

  • 31bytes

print(io.Source.stdin.mkString)


mkStringそもそも使わなくてもいんじゃね、というのが次。
foreachで回して1文字ずつprint。

  • 30bytes

io.Source.stdin.foreach(print)


これ以上どうすれば、でもTOPは27bytesだしな・・・としばらく悩んだ後に出たのが次。
.rで正規表現オブジェクトにすることで、入力がなくなったら例外が投げられて処理が終わるように!

  • 29bytes

while(0<1)println(readLine.r)


とりあえず現状29bytesが精一杯。
TOPとは2bytes差。
ゴルフはやりだすと夢中になってしまい、時間がマッハで過ぎていくので、そこそこで自制しないと危ないw