2011-11-10 10 views
1

5猿の共有n桃、それらは均等に配ることができない。したがって、最初の猿は1桃をダンプし、桃の総数は5で割ることができ、最初の猿が彼の役割を果たしました。困惑を解決するために私のコードを調整しなさい

次に2番目の猿、-1桃は5で割り切れ、彼の役割を果たしました。 5番目のサルがすべての手順を完了するまで。まだいくつかの桃が残っているかもしれません。

この条件を満たす桃の最小数を指定します。

Perlコード1:

#!/usr/bin/perl -w 
for $n (0..10000){  #this is basic idea but code is too messy ! 
    if(($n-1) % 5 == 0){ 
    $remain = 4/5 * ($n -1); 
     if(($remain - 1) % 5 == 0){ 
      $remain = 4/5 * ($remain -1); 
      if(($remain - 1) % 5 == 0){ 
       $remain = 4/5 * ($remain -1); 
       if(($remain - 1) % 5 == 0){ 
        $remain = 4/5 * ($remain -1); 
        if(($remain - 1) % 5 == 0){ 
         $remain = 4/5 * ($remain -1); 
         print "remain: $remain original: $n\n"; 
        } 
       } 
      } 
      } 
    } 
} 

Perlコード2:

sub doit($){ 
    ($n) = @_; 
    if(($n - 1) % 5 ==0){ #if can be distributed by 5 monkey 
     $n = ($n - 1) * 4/5; #commit distribute 
     return $n; 
    }else{ 
     return -1; #fail 
    } 
} 

for $n (0..10000){ #restriction 
    $r = $n; #"recursively" find solution 
    $o = $n; #backup n 
    $count = 0; 
    for ($i = 0; $i < 5; $i++){ #assume there is 5 monkey, it can be changed 
     $r = doit($r); 
    if($r == -1){ #skip once fail 
     last; 
    } 
    $count++; 
    } 
    if($count == 5){ # if pass 5 test, then you found the number ! 
     print "now ".$r."\n"; 
     print "origin ".$o."\n"; 
    } 
} 

私はいくつかのコードをカットするために考えています。しかし、一生懸命に感じた。誰も助けることができますか?

+1

まず、あなたは厳しい警告を使用していません! –

+3

この質問はdownvotesを値するものではありません。 Code-in-the-Codeの投稿と比べて、CodeFarmerは2回良い試みをしました。しかし、それは上のより良い記述を使用することができます。 –

+0

ええ、本当に恐ろしい世界的な使用のために、私はそれを投票しましたが、実際には良い質問であるので、後で私の心を変えました。問題は、それが私にunvortをさせないということです! –

答えて

1

を開始した場合、あなたは本当にあなたのスクリプトの先頭にstrictwarningsプラグマを使用する必要があります。あなたの$nの使用は特に心配です。将来、myで変数を宣言しても同じ名前を使用すると、衝突する可能性がなく、同じ数量を表すという事実を伝えます。あなたは本当にそれが(最初の生産、読みやすさでこれを使用しないで楽しいものにしたい場合は、今

#!/usr/bin/env perl 

use strict; 
use warnings; 

sub doit { 
    my ($n) = @_; 
    if(($n - 1) % 5 ==0){ #if can be distributed by 5 monkey 
     $n = ($n - 1) * 4/5; #commit distribute 
     return $n; 
    } else { 
     return undef; #fail 
    } 
} 

OUTER: for my $n (0..10000){ #restriction 
    my $r = $n; #"recursively" find solution 
    for (1..5){ #assume there is 5 monkey, it can be changed 
     $r = doit($r); 
     next OUTER unless defined $r; 
    } 
    # if code gets here, then it passed 5 test, then you found the number ! 
    print "now: $r\torigin: $n\n"; 
} 

そして:とにかく、ここ

はやや洗練、そしてもっと重要なstrictwarnings安全なバージョンです。 !):

#!/usr/bin/env perl 

use strict; 
use warnings; 

OUTER: for my $n (0..10000){ 
    my $r = $n; 
    $r = ($r - 1) % 5 ? next OUTER : 4/5 * ($r - 1) for (1..5); 
    print "now: $r\torigin: $n\n"; 
} 

かさえgolfed:

for(0..10000){$r=$n=$_;map$r*=--$r%5?next:4/5,1..5;print"now: $r\torigin: $n\n"} 
+0

うわー、それは素晴らしいアドバイスです – CodeFarmer

0

私はあなたの質問を理解しているわけではありませんが、答えを検索する代わりに、最後の猿で始めてください。彼が取ることができる最小の桃は1であり、最小値を得るために左があるかもしれないとしても、0が残っていると仮定する。今度は、サルが最後に見た2番目の桃などをいくつ計算します。

ループする必要はありませんあなたはまず第一に、最後の猿から

# set numPeaches to what the last monkey had 
$numPeaches = 1; 

# then, figure out how many the second to last monkey had, and add to numPeaches 

# and, so on ... 

# until you get to the first monkey 
+0

ええ、私はちょうど問題を解決するために何かをコーディングしてみたいです。最新の桃の残りは0より大きい任意の数になる可能性があります。この場合、最小の数は3121です。5番目の部分が取られた後も、それはまだ数千のままです – CodeFarmer

1

この解決策を検討してください:

sub share { 
    ($_[0] - 1) % 5 == 0 ? ($_[0]-1)/5*4 : die "unable to share"; 
} 

for my $i (1..10000) { 
    eval { 
    share(share(share(share(share($i))))); 
    }; 
    unless ([email protected]) { 
    print "solution: $i\n"; 
    last; 
    } 
} 

私はそこに潜んでいるモナドがあると確信しています。

+0

はい、 – CodeFarmer

関連する問題