Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #! /usr/bin/perl
- =feladat kiiras
- 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?
- =cut
- #==== INCLUDES
- use strict;
- use warnings;
- #==== GLOBALS
- my $abc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
- my $flags = 0;
- #==== SUBS
- sub checkFlags(@)
- {
- my $flags = shift;
- my $temp = 0;
- foreach (@_){ $temp |= $_; }
- return ($flags & $temp) == $temp;
- }
- #=== CODE
- my $i = 1;
- my $first_last_m;
- my $first_double_last_m;
- my $first_letter = '';
- my $prev_first_letter = 'undefined';
- my $last_letter = '';
- my $prev_last_letter = 'undefined';
- my $string = '';
- while (!checkFlags($flags,(1,2)))
- {
- $string .= $abc if length($string) < $i;
- $prev_first_letter = $first_letter;
- $prev_last_letter = $last_letter;
- my $out = substr($string,0,$i);
- $string = substr($string,$i);
- $first_letter = substr($out,0,1);
- $last_letter = substr($out,-1,1);
- if (!defined($first_last_m) && $last_letter eq 'M')
- {
- $first_last_m = $i;
- $flags |= 1;
- }
- if (!defined($first_double_last_m) && $last_letter eq 'M' && $prev_last_letter eq 'M')
- {
- $first_double_last_m = $i;
- $flags |= 2;
- }
- printf ("%3d %s\n",$i,$out);
- $i++;
- }
- print "\n";
- print "elso elofordulas: utolso betu eloszor M: $first_last_m\n";
- print "elso elofordulas: utolso betu egymas utan ketszer M : $first_double_last_m\n";
- =eredmeny
- 1 A
- 2 BC
- 3 DEF
- 4 GHIJ
- 5 KLMNO
- 6 PQRSTU
- 7 VWXYZAB
- 8 CDEFGHIJ
- 9 KLMNOPQRS
- 10 TUVWXYZABC
- 11 DEFGHIJKLMN
- 12 OPQRSTUVWXYZ
- 13 ABCDEFGHIJKLM
- 14 NOPQRSTUVWXYZA
- 15 BCDEFGHIJKLMNOP
- 16 QRSTUVWXYZABCDEF
- 17 GHIJKLMNOPQRSTUVW
- 18 XYZABCDEFGHIJKLMNO
- 19 PQRSTUVWXYZABCDEFGH
- 20 IJKLMNOPQRSTUVWXYZAB
- 21 CDEFGHIJKLMNOPQRSTUVW
- 22 XYZABCDEFGHIJKLMNOPQRS
- 23 TUVWXYZABCDEFGHIJKLMNOP
- 24 QRSTUVWXYZABCDEFGHIJKLMN
- 25 OPQRSTUVWXYZABCDEFGHIJKLM
- 26 NOPQRSTUVWXYZABCDEFGHIJKLM
- elso elofordulas: utolso betu eloszor M: 13
- elso elofordulas: utolso betu egymas utan ketszer M : 26
- =cut
- =matematiksu megoldas
- n sorhoz felhasználsz n*(n+1)/2 betűt, 26 betű van, M a 13., ezért
- n*(n+1)/2 = 13 mod 26
- tehát n, vagy n+1 osztható 13-mal
- n=12 nem jó, n=13 igen
- n=25 és n=26 esetén a maradék ( mod 26 ) egyaránt 13.
- =cut
Advertisement
Add Comment
Please, Sign In to add comment