bnghtz

string feladat - utolso legyen M.pl

Nov 9th, 2013
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 2.44 KB | None | 0 0
  1. #! /usr/bin/perl
  2. =feladat kiiras
  3. Az angol ABC betűit (ABCDEFGHIJKLMNOPQRSTUVWXYZ) piramis formában leírjuk. Amikor a Z-hez érünk, akkor ismét az A. Hányadik soroknál fordul elő először, hogy két egymás követő sor M betűvel végződik? Hányadik sor végén lesz M betű először?
  4. =cut
  5.  
  6. #==== INCLUDES
  7. use strict;
  8. use warnings;
  9.  
  10. #==== GLOBALS
  11. my $abc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  12. my $flags = 0;
  13.  
  14. #==== SUBS
  15.  
  16. sub checkFlags(@)
  17. {
  18.   my $flags = shift;
  19.   my $temp = 0;
  20.   foreach (@_){ $temp |= $_; }
  21.   return ($flags & $temp) == $temp;
  22. }
  23.  
  24. #=== CODE
  25.  
  26. my $i = 1;
  27. my $first_last_m;
  28. my $first_double_last_m;
  29.  
  30. my $first_letter = '';
  31. my $prev_first_letter = 'undefined';
  32. my $last_letter = '';
  33. my $prev_last_letter = 'undefined';
  34.  
  35. my $string = '';
  36.  
  37. while (!checkFlags($flags,(1,2)))
  38. {
  39.  
  40.   $string .= $abc if length($string) < $i;
  41.  
  42.   $prev_first_letter = $first_letter;
  43.   $prev_last_letter = $last_letter;
  44.  
  45.   my $out = substr($string,0,$i);
  46.   $string = substr($string,$i);
  47.  
  48.   $first_letter = substr($out,0,1);
  49.   $last_letter = substr($out,-1,1);
  50.  
  51.   if (!defined($first_last_m) && $last_letter eq 'M')
  52.   {
  53.     $first_last_m = $i;
  54.     $flags |= 1;
  55.   }
  56.  
  57.   if (!defined($first_double_last_m) && $last_letter eq 'M' && $prev_last_letter eq 'M')
  58.   {
  59.     $first_double_last_m = $i;
  60.     $flags |= 2;
  61.   }
  62.  
  63.   printf ("%3d  %s\n",$i,$out);
  64.  
  65.   $i++;
  66. }
  67.  
  68. print "\n";
  69. print "elso elofordulas: utolso betu eloszor M: $first_last_m\n";
  70. print "elso elofordulas: utolso betu egymas utan ketszer M : $first_double_last_m\n";
  71.  
  72.  
  73. =eredmeny
  74.   1  A
  75.   2  BC
  76.   3  DEF
  77.   4  GHIJ
  78.   5  KLMNO
  79.   6  PQRSTU
  80.   7  VWXYZAB
  81.   8  CDEFGHIJ
  82.   9  KLMNOPQRS
  83.  10  TUVWXYZABC
  84.  11  DEFGHIJKLMN
  85.  12  OPQRSTUVWXYZ
  86.  13  ABCDEFGHIJKLM
  87.  14  NOPQRSTUVWXYZA
  88.  15  BCDEFGHIJKLMNOP
  89.  16  QRSTUVWXYZABCDEF
  90.  17  GHIJKLMNOPQRSTUVW
  91.  18  XYZABCDEFGHIJKLMNO
  92.  19  PQRSTUVWXYZABCDEFGH
  93.  20  IJKLMNOPQRSTUVWXYZAB
  94.  21  CDEFGHIJKLMNOPQRSTUVW
  95.  22  XYZABCDEFGHIJKLMNOPQRS
  96.  23  TUVWXYZABCDEFGHIJKLMNOP
  97.  24  QRSTUVWXYZABCDEFGHIJKLMN
  98.  25  OPQRSTUVWXYZABCDEFGHIJKLM
  99.  26  NOPQRSTUVWXYZABCDEFGHIJKLM
  100.  
  101. elso elofordulas: utolso betu eloszor M: 13
  102. elso elofordulas: utolso betu egymas utan ketszer M : 26
  103.  
  104. =cut
  105.  
  106.  
  107. =matematiksu megoldas
  108.     n sorhoz felhasználsz n*(n+1)/2 betűt, 26 betű van, M a 13., ezért
  109. n*(n+1)/2 = 13 mod 26
  110. tehát n, vagy n+1 osztható 13-mal
  111. n=12 nem jó, n=13 igen
  112. n=25 és n=26 esetén a maradék ( mod 26 ) egyaránt 13.
  113. =cut
Advertisement
Add Comment
Please, Sign In to add comment