とみたまさひろ
2019-10-05
Nagano.rb #3
コードゴルフはコンピュータプログラミング・コンテストの一種。参加者は与えられたアルゴリズムを、可能な限りもっとも短いソースコードで記述することを競う。
ショートコーディング、コードパズル等とも呼ばれる。
入力
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]*" "
#!ruby オプション
コマンドラインオプションをスクリプト内で指定
本来は、OSがコマンド実行時に先頭が #!
で始まっているものをスクリプトとして処理するためのもの
Ruby も1行目を同様に処理をする
#!ruby -ap
...
-p
$_
に入れる$_
を出力する-a
$_
を分割して $F
に入れるwhile $_ = $stdin.gets
$F = $_.split
...
puts $_
end
$><<[$.,$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向き
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
https://qiita.com/tbpgr/items/775636617d58bed56657
入出力のサンプルさえ満たせばいい
例外で終了してもいい
#codegolf
: ゴルフで遊んでいる人たち