1

私は perl で FizzBu​​zz を書くことをいじっています...具体的に言うと、悪夢のようなコード行を作成して、それができるかどうかを確認したいと思っています。もちろん、これはネストされた 3 項ステートメントを意味します。

ただし、15 年代では FizzBu​​zz は表示されず、Fizz のみが表示されることがわかりました。最初の 3 項ステートメントが true を返した場合、2 番目のステートメントをスキップしているだけであることを意味するため、理由を見つけることができません。

これが私が思いついた小さな悪夢です。はい、それはもっと悪いことかもしれませんが、私は実際には perl にそれほど強くありません。

#!/usr/bin/perl

for (my $i=1; $i<=100; $i++) {
      ( !( ($i % 3 == 0) ? print "Fizz" : 0) && !( ($i % 5 == 0) ? print "Buzz" : 0) ) ? print "$i\n" : print "\n";
}

出力の最初の 20 行を次に示します。

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
Fizz
16
17
Fizz
19
Buzz

これが起こる原因となる印刷ステートメントは何をしているのでしょうか?

4

3 に答える 3

2

これは、 perlopに記載されている短絡評価の例です。の場合、a() && b()がfalse のb()場合は評価されません。a()あなたの(深くネストされた紛らわしい)三項ステートメントでは、それは同じことになります。これを修正するには、ステートメントを複数の行に分割します。

于 2014-10-15T20:18:59.947 に答える
1

簡略化:

for my $i ( 1 .. 20 ) {
    print +( ( $i % 3 ? '' : 'Fizz' ) . ( $i % 5 ? '' : 'Buzz' ) ) || $i, "\n";
}

出力:

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
于 2014-10-15T22:05:47.203 に答える
0

実際、さあ、ビット シフトで 1 日を節約できます

#!/usr/bin/perl

for (my $i=1; $i<=100; $i++) {
      (((($i % 3 == 0) ? print "Fizz" : 0) + ( ($i % 5 == 0) ? print "Buzz" : 0)) << 1) ? print "\n" : print "$i\n";
}

出力:

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz

最も厄介なソリューション

于 2014-10-15T20:37:36.317 に答える