pattern_mixing.pl 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #!/usr/bin/perl
  2. # Author: Daniel "Trizen" Șuteu
  3. # License: GPLv3
  4. # Date: 03 July 2015
  5. # Website: https://github.com/trizen
  6. #
  7. # The problem:
  8. #
  9. # Mix the stars with the letters in the following pattern,
  10. # in a random, but uniform way, preserving the original order
  11. # of letters and preserving the original shape of the pattern.
  12. #
  13. my $pattern = <<'EOT';
  14. ******C*******w*******X*******y*******X*******o*******f******
  15. igpvAoBLhCffXgIIlyI8gFC8L88vILCg98Io81gaICXpIIg8CIvwFB8I8wXgC
  16. vIAgLA,L>8CgCCyywcIiF>L=8LX='CgCLfgvC8wXgXKef9B8CIggvIALKXLCv
  17. y>IgXIXg8w1}CA=y8ylAyw=8Cgyffy8loKK88A8f=,II'gfFFwfvgvCAC8yyLIg
  18. KXf'''IAX=yiovg>C,8gIAgvAIXFjgCy8Xv89v'XIILy=AC1A8yvov9KvXywffX
  19. 8CFyCC9LvfCvF8gg$yv8vALIIILKsKXyvgCI8yfIKF8L,I9C8BiFwfg,A8h8gF'
  20. BvgL8C8FfXCC8gB,Iv88AgC8X1CCIFuCX8L>Xi=CCv8ICI8I>KC8IFB8oIFKAvA
  21. LvgCIg'wBAFLg'1''f=yLLI'ff'fo9gIA>yFv8FIoy'CLfI8f8vk'y8F=vw>gKf
  22. vy8X >KLXgKw'og'vF1By'gBvLIXX8KB'XvA'8vofilg CgC'
  23. fyBA 8iLIy8IoIvoC,yg,gI=yC8i'I8gL>8'9{ 8gB>
  24. AF18 I8A=vyA'1pfwv,I8lvIABACffIy AyFC
  25. 1Avpg Cv'KIyK8C'g9IyFKIL8A=vo yCABX
  26. Ffv8A C,9wyIKI,Kn=iXf8wL1w9 8,ygf
  27. X88oKC ICII8'F8ILCLy>>If CC8LCy
  28. XCAIg CFAwBvCfyAIgIyA BI9'g
  29. gyIwL8 lgXIXXXAX8gI8 8IBiyX
  30. FXAygA vgoFFFXAggC i,LI>I
  31. KIXgt vXCA8prCI gAK=y
  32. ****** ********* ******
  33. ******* ******* *******
  34. ******* ******* *******
  35. ******** ***** ********
  36. ********* ***** *********
  37. ********** ***** **********
  38. ************ ******* ************
  39. *******************************************
  40. *****************************************
  41. ***************************************
  42. *************************************
  43. *********************************
  44. *******************************
  45. *****************************
  46. *************************
  47. *********************
  48. *****************
  49. *************
  50. *********
  51. EOT
  52. #
  53. ## Solution
  54. #
  55. my @chars = split(//, $pattern);
  56. my @letters = grep { $_ ne '*' and /^\S/ } @chars;
  57. my @stars = grep { $_ eq '*' } @chars;
  58. my $ratio = @stars / (@letters + @stars);
  59. foreach my $char (@chars) {
  60. if ($char =~ /^\s/) {
  61. print $char;
  62. next;
  63. }
  64. if (@stars) {
  65. if (rand(1) <= $ratio) {
  66. print shift @stars;
  67. next;
  68. }
  69. }
  70. print @letters ? shift(@letters) : shift(@stars);
  71. }