aboutsummaryrefslogtreecommitdiff
path: root/challenge-289/jeanluc2020/perl/ch-2.pl
blob: ab1c8a7360363ae6f5d3222f033bcebf94d42dc7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!/usr/bin/env perl
# https://theweeklychallenge.org/blog/perl-weekly-challenge-289/#TASK2
#
# Task 2: Jumbled Letters
# =======================
#
# An Internet legend dating back to at least 2001 goes something like this:
#
##    Aoccdrnig to a rscheearch at Cmabrigde Uinervtisy, it deosn’t mttaer in
##    waht oredr the ltteers in a wrod are, the olny iprmoetnt tihng is taht
##    the frist and lsat ltteer be at the rghit pclae. The rset can be a toatl
##    mses and you can sitll raed it wouthit porbelm. Tihs is bcuseae the huamn
##    mnid deos not raed ervey lteter by istlef, but the wrod as a wlohe.
#
# This supposed Cambridge research is unfortunately an urban legend. However,
# the effect has been studied. For example—and with a title that probably made
# the journal’s editor a little nervous—Raeding wrods with jubmled lettres:
# there is a cost by Rayner, White, et. al. looked at reading speed and
# comprehension of jumbled text.
#
# Your task is to write a program that takes English text as its input and
# outputs a jumbled version as follows:
#
# 1. The first and last letter of every word must stay the same
# 2. The remaining letters in the word are scrambled in a random order (if that
#     happens to be the original order, that is OK).
# 3. Whitespace, punctuation, and capitalization must stay the same
# 4. The order of words does not change, only the letters inside the word
#
# So, for example, “Perl” could become “Prel”, or stay as “Perl,” but it could
# not become “Pelr” or “lreP”.
#
# I don’t know if this effect has been studied in other languages besides
# English, but please consider sharing your results if you try!
#
############################################################
##
## discussion
##
############################################################
#
# We replace all words with a randomized version of it by splitting
# each word into its first character, the middle part and the last
# character, of which we shuffle the middle part. We use the shuffle
# function from List::Util to do the actual randomizing, so the actual
# work is running s///eg on the input (e allows to call a function on
# the matched parts), and the randomize() function simply splits the
# middle part into individual characters, randomizes them and joins
# them together again.

use strict;
use warnings;
use List::Util qw(shuffle);

jumbled_letters("Perl");
jumbled_letters("Banane");
jumbled_letters("Motoröl");
jumbled_letters("The weekly challenge");
jumbled_letters("This supposed Cambridge research is unfortunately an urban legend. However, the effect has been studied.");

sub jumbled_letters {
   my $text = shift;
   print "Input: $text\n";
   $text =~ s/\b(\w)(\w*)(\w)\b/randomize($1, $2, $3)/eg;
   print "Output: $text\n";
}

sub randomize {
   my ($x, $y, $z) = @_;
   return $x . join("", shuffle(split//, $y)) . $z;
}