Golf

とみたまさひろ

2019-10-05

Nagano.rb #3

自己紹介

  • とみたまさひろ
  • @tmtms
  • https://tmtms.hatenablog.com
  • 富士通クラウドテクノロジーズ
  • 東京単身赴任中
  • Ruby / MySQL / Postfix
  • 趣味: 文字化け解析
  • 最近Ruby書いてない

最近はゴルフで遊んでます

ゴルフ場

http://golf.shinh.org/

コードゴルフ

コードゴルフはコンピュータプログラミング・コンテストの一種。参加者は与えられたアルゴリズムを、可能な限りもっとも短いソースコードで記述することを競う。
ショートコーディング、コードパズル等とも呼ばれる。

https://ja.wikipedia.org/wiki/コードゴルフ

入力

TEST
foo bar baz
The quick brown fox jumps over the lazy dog.

出力

1 1 4 TEST
2 3 11 foo bar baz
3 9 44 The quick brown fox jumps over the lazy dog.

https://magazine.rubyist.net/articles/0023/0023-RubiMaGolf.html

普通

80 byte

i = 0
while l = gets
  i += 1
  puts "#{i} #{l.split.size} #{l.size-1} #{l}"
end

ゴルファーが書くと

38 byte

#!ruby -ap
$><<[$.,$F.size,~/$/,p]*" "

shebang

#!ruby オプション

コマンドラインオプションをスクリプト内で指定

本来は、OSがコマンド実行時に先頭が #! で始まっているものをスクリプトとして処理するためのもの

Ruby も1行目を同様に処理をする

#!ruby -ap
...
  • -p
    • 標準入力を1行 $_ に入れる
    • スクリプトを実行する
    • 処理の最後に $_ を出力する
    • 標準入力がなくなるまで繰り返し
  • -a
    • $_ を分割して $F に入れる
while $_ = $stdin.gets
  $F = $_.split
  ...
  puts $_
end

2行目

$><<[$.,$F.size,~/$/,p]*" "

$> = $stdout

IO#<< = IO#print

$. = 行番号

~/.../ = $_ =~ /.../

Array#* = Array#join

p

デバッグ出力用のメソッド

require 'date'
p Date.today
#=> #<Date: 2019-10-05 ((2458762j,0s,0n),+0s,2299161j)>

p

引数を与えないと何も出力しない

戻り値が nil

nil の代わりに p と書ける

i = 0
while l = gets
  i += 1
  puts "#{i} #{l.split.size} #{l.size-1} #{l}"
end

#!ruby -ap
$><<[$.,$F.size,~/$/,p]*" "

同じことをいろんな書き方ができるRuby向き

その他 Tips

括弧省略

p(123)

p 123

空白をなくす

p 123 if true
hoge "abc"

p 123if true
hoge"abc"

文字列中の式展開

"abc #{hoge} xyz"

$@ で始まる変数は { } を省略可能

"abc #$_ xyz"

スクリプト末尾の改行を取る

これで1文字削減!

るびまゴルフ

https://magazine.rubyist.net/articles/0021/0021-RubiMaGolf.html

Ruby Code Golf Technic

https://qiita.com/tbpgr/items/775636617d58bed56657

RubyのコードゴルフのTips

https://qiita.com/siman/items/d67643066e591b2f34ab

http://golf.shinh.org/

  • 入出力のサンプルさえ満たせばいい

  • 例外で終了してもいい

ruby-jp

https://ruby-jp.github.io/

#codegolf : ゴルフで遊んでいる人たち

Enjoy Golf !