LoginSignup
2

More than 5 years have passed since last update.

(a == 1 && a == 2 && a == 3) を常に真にできますか? その2

Last updated at Posted at 2018-01-23

ちょこっとバズっているので、僕も遅れないように流行りに乗ってみました。

前回: (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記事まとめ

個人的に面白かった解法です。

なぜ再びやろうと思ったのか

そもそもの問題を突き詰めてみました。

(a == 1 && a == 2 && a == 3)を常に真にできるか?

この文章には、実は2つの意味を含んでいます。

  • (a == 1 && a == 2 && a == 3)という文字列を変えてはいけない
  • 常に真でなければならない

つまり、前回の僕の答えでは、答えになっていなかったのです!

ということで作ってみました。

みんな大好きPerlでどうぞ。

do_function.pl
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を返すようにしています。

これにより、何度呼び出しても同じように真を返してくれます。

do_function_twice.pl
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!

これにより、問題の本当の正解を得ることができました!

終わりに

みなさん面白い解法を思いついてくれて、勉強になりました。
こういう遊びみたいなところに技術力が試されるのかもしれませんね。

ここまで読んでくださってありがとうございました!

もしおかしい点、気づいた点がありましたら教えてください。
特に、もっともっと面白い解法がある場合はぜひ投稿してください!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2