Настройте мой код, чтобы решить головоломку - PullRequest
1 голос
/ 10 ноября 2011

5 обезьян делят n персиков, они не могут распределяться одинаково.Таким образом, первая обезьяна сбрасывает 1 персик, и общее количество персиков можно разделить на 5, и первая обезьяна приняла его участие.

Затем вторая обезьяна, -1 персик, может быть разделена на 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";
    }
}

Я думаю сократить код.Но чувствовал себя тяжело.Кто-нибудь может помочь?

Ответы [ 3 ]

1 голос
/ 10 ноября 2011

Прежде всего, вам действительно следует использовать прагмы strict и warnings в верхней части ваших сценариев. Ваше $n использование особенно беспокоит. В будущем, если вы объявите переменные с my, но будете использовать одно и то же имя, вы передадите тот факт, что они будут представлять одинаковое количество, не опасаясь, что они могут столкнуться.

В любом случае, здесь слегка отполирована, и что более важно, strict и warnings безопасная версия:

#!/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";
}

А теперь, если вы действительно хотите повеселиться (не используйте это в производстве, читайте в первую очередь!):

#!/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";
}

или даже игра в гольф:

for(0..10000){$r=$n=$_;map$r*=--$r%5?next:4/5,1..5;print"now: $r\torigin: $n\n"}
1 голос
/ 11 ноября 2011

Рассмотрим это решение:

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 ($@) {
    print "solution: $i\n";
    last;
  }
}

Я уверен, что внутри скрывается монада.

0 голосов
/ 10 ноября 2011

Я не уверен на 100%, что понимаю ваш вопрос, но вместо поиска ответа начните с последней обезьяны. Минимальное количество персиков, которое он мог бы взять, равно 1, и даже если осталось немного, чтобы получить минимум, предположим, что осталось 0. Теперь посчитайте, сколько персиков увидела мартышка, вторая и последняя, ​​и т. Д.

Нет необходимости зацикливаться, если вы начинаете с последней обезьяны

 # 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
...