(2010-01の一覧)
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

2010-01-05 Tue (他の年の同じ日: 2007)

世界のナベアツ問題をワンライナーで
2010-01-05-1 / カテゴリ: [programming][perl] / [permlink]

ネタがないと言いつつ見つかってしまった。というか、2年ぶりくらいの戯術ネタ。

前の部署の同期がブログで「perlで世界のナベアツ問題」と題してコードを書いてたのをたまたま発見したけど、最後に、単に改行とインデントを削っただけのワンライナーを載せてるのでちょっと添削してみた

元(http://d.hatena.ne.jp/bata64/20080410/1207801849から引用)
perl -e 'foreach(1..40){if($_%8==0){print"$_ぅぅういえぇえあ\n";}elsif($_%3==0||$_=~/3/){print"$_っ!!\n";}else{print"$_\n";}}'

アレンジ後
perl -le 'print !($_%8)?"$_ぅぅういえぇえあ":(!($_%3) or /3/)?"$_っ!!":$_ for(1..40);'

一応解説
  • -lは、printなどで自動改行するためのオプションスイッチ(ぺるりめも書いてねぇ…)。
  • foreach でなく for なのは単にタイプ数の削減(Perlでは、forとforeachは同じ働きをする)、更に、ループブロックとして使用せず、文の修飾子として記述することで、ブレースを削除( expr if cond; の要領)。
  • 出力部分を print の引数に三項演算子を使用することで、1文に圧縮。
  • 剰余0の検知を比較演算子でなく、否定を使うことでなんとなくスマートに。(多分見にくくなってる)
  • 3のマッチングの $_ =~ の削除はセオリー通り
やっぱ1文で書いてこそのワンライナーだよねっ :D
ちなみに元の要件はチェックしてないのでアルゴリズム自体は知らん:p


chalowってリスト表記どうすんだっけ…


リスト対応したぜ [2011-06-13-1]
Referrer (Inside): [2010-01-06-1]
前の日 / 次の日 / 最新 / 2010-01

2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12

最終更新時間: 2013-05-02 16:12