1. Perl / Говнокод #12475

    −115

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    #!/usr/bin/perl -w
    
    use strict;
    
    my $enchant_num=1;
    my $tries_num=0;
    
    print "Please, enter safe enchant lvl:\n";
    my $safe_enchant_num=<STDIN>; chomp $safe_enchant_num;
    print "Please enter maximum enchant lvl:\n";
    
    my $max_enchant_num=<STDIN>; chomp $max_enchant_num;
    
    if($max_enchant_num=~/\d/)
    {
    	if($max_enchant_num>$safe_enchant_num)
    	{
    		while($enchant_num<=$max_enchant_num)
    		{
    			if($enchant_num<=$safe_enchant_num)
    			{
    				while($enchant_num<=$safe_enchant_num)
    				{
    					print "Succesfully enchanted for +" . $enchant_num++ . "\r";
    				}
    			}
    			else
    			{
    				if(rand(100)<=66)
    				{
    					print "Succesfully enchanted for +" . $enchant_num++ . "\r";
    				}
    				else
    				{
    					print "Enchant failed for +" . $enchant_num++ . "\r";
    					$enchant_num=1;
    					$tries_num++;
    				}
    			}
    		}
    	}
    }
    else
    {
    	print "\nInput is incorrect\n";
    }
    print "\nEnchanted for $max_enchant_num with: $tries_num fails.";

    Комментарии излишни

    Запостил: mish, 25 Января 2013

    Комментарии (14) RSS

    • Кто-то не учил в универе статистику и теорию вероятностей. :)
      Ответить
    • Считайте, что я само уже себя задеанонило и затравило за нубство, но всё же прошу кэпа перечислить Б-гомерзости ОП-кода.
      Ответить
      • Ну к примеру:

        > if($max_enchant_num=~/\d/)
        Это не проверка на то, что ввели число, а проверка на то, содержит ли $max_enchant_num хотя бы одну цифру. А $safe_enchant_num вообще проверить забыли.
        Ответить
        • Проверять на число лучше через int, он и перевод чомпнет, и помрёт в случае ошибки.

          А чтобы не забыть переменные, я бы сделал так
          my $num1;
          my $num2;
          my $num3;
          
          my %numVars = ('Num 1' => \$num1, 'Num 2' => \$num2, 'Num 3' => \$num3);
          
          foreach my $name (keys %numVars) {
              print "Enter $name:";
              ${$numVars{$name}} = int <STDIN>;
          }
          
          print $num2;
          Ответить
      • А строки 16-41 можно переписать как-то так:
        while ($enchant_num <= $max_enchant_num) {
            if ($enchant_num <= $safe_enchant_num || rand(100)<=66) {
                print "Succesfully enchanted for +" . $enchant_num++ . "\r";
            } else {
                print "Enchant failed for +" . $enchant_num++ . "\r";
                $enchant_num=1;
                $tries_num++;
            }
        }
        Ответить
      • борман(д) перечислил тех мелочи.

        как по мне, главное говно в `rand(100)<=66`.

        тут можно просто по входным данным и захардкодженой вероятности 0.66 аналитически (без циклов и прочего) вычислить вывод.
        Ответить
        • Можно. Вероятность успешной заточки будет (2/3)^(max-safe). Матожидание количества фейлов - (3/2)^(max-safe).
          Ответить
          • Матожидание фейлов (3/2)^(max-safe) - 1
            http://goo.gl/l9IwS
            Ответить
          • сразу видно, что ты математик из ра-шки
            Ответить
    • Когда я вижу такой код, то я ненавижу Олмана.
      Хотя бы так бы сделали ёпта
      if($max_enchant_num=~/\d/)
      {
      	if($max_enchant_num>$safe_enchant_num)
      	{
      		while($enchant_num<=$max_enchant_num)
      		{
      			if($enchant_num<=$safe_enchant_num)
      			{
      				while($enchant_num<=$safe_enchant_num)
      					print "Succesfully enchanted for +" . $enchant_num++ . "\r";
      			} else if(rand(100)<=66)
      			{
      				print "Succesfully enchanted for +" . $enchant_num++ . "\r";
      			} else
      			{
      				print "Enchant failed for +" . $enchant_num++ . "\r";
      				$enchant_num=1;
      				$tries_num++;				
      			}
      		}
      	}
      } else
      	print "\nInput is incorrect\n";
      Ответить
      • Тарас, а почему ты сегодня не кричишь "учи, учи тервер"? Как раз тема подходящая.
        Ответить
        • Тарас:          Учи, учи тервер!
          Пехапешник:     слышь, семки есть?
          Ответить
        • Я в код не вчитывался и не врубаюсь. Ща почитаю и скажу.
          Ответить
          • Так, я почитал, и скажу, что тут много лишнего, а ещё есть некоторый шанс на вечный цикл.
            Ответить

    Добавить комментарий