ちょこっとバズっているので、僕も遅れないように流行りに乗ってみました。
前回: (a == 1 && a == 2 && a == 3) を常に真にできますか?
簡単なあらましなどは他のサイトをご覧ください。
元ネタ: Can (a ==1 && a== 2 && a==3) ever evaluate to true?
まとめ: (a==1&&a==2&&a==3)を常にtrueにするStackOverflowの問題を解いたQiita記事まとめ
個人的に面白かった解法です。
- C言語でa == 1 && a == 2 && a == 3をtrueにしてみたい: 並行処理で真偽値判定中に変数を変えるという発想は変態的過ぎる!
- (a == 1 && a == 2 && a == 3) を常に真にする C#編 ~プロパティのgetterに副作用を持たせてはいけない。~: デバッガのバグは恐ろしい...
- Python2で(a == 1 and a == 2 and a == 3) を常にTrueと等しくする魔法の一文(演算子はいじらない系)(ソース4行): Python2の魔術
- (a==1&&a==2&&a==3)をtrueにするRubyスクリプト: 解く気がないもの感は好き
- PHP で (a == 1 && a == 2 && a == 3) を常に真(true)にできますか?: PHP怖い
- Java でもa == 1 && a == 2 && a == 3でtrueって出力させたい(真っ黒編): コンパイラを騙せばコードなんて必要ないんや!
なぜ再びやろうと思ったのか
そもそもの問題を突き詰めてみました。
(a == 1 && a == 2 && a == 3)
を常に真にできるか?
この文章には、実は2つの意味を含んでいます。
-
(a == 1 && a == 2 && a == 3)
という文字列を変えてはいけない - 常に真でなければならない
つまり、前回の僕の答えでは、答えになっていなかったのです!
ということで作ってみました。
みんな大好きPerlでどうぞ。
use strict;
use warnings;
my $count = 1;
sub a {
$count = $count > 2 ? 1 : $count + 1;
}
if (a == 1 && a == 2 && a == 3) {
print "True!\n";
}
$ perl do_function.pl
True!
Perlでは関数であることを示すために、シジルとして&
を付けるか関数名の最後に()
を付けます。
組込み関数名と被らない限りは&
を省略できます。
また、コードの意味が変わらないのであれば関数名の最後の()
を省略できるというPerlの規則により()
も省略できます。
つまり、a
というのは変数ではなく関数呼び出しです。
次にa
関数を見ると、単に変数をインクリメントしているだけでなく、3以上の場合は1を返すようにしています。
これにより、何度呼び出しても同じように真を返してくれます。
use strict;
use warnings;
my $count = 1;
sub a {
$count = $count > 2 ? 1 : $count + 1;
}
if (a == 1 && a == 2 && a == 3) {
print "True first!\n";
}
if (a == 1 && a == 2 && a == 3) {
print "True second!\n";
}
$ perl do_function_twice.pl
True first!
True second!
これにより、問題の本当の正解を得ることができました!
終わりに
みなさん面白い解法を思いついてくれて、勉強になりました。
こういう遊びみたいなところに技術力が試されるのかもしれませんね。
ここまで読んでくださってありがとうございました!
もしおかしい点、気づいた点がありましたら教えてください。
特に、もっともっと面白い解法がある場合はぜひ投稿してください!