Is this text readable? |
Our task is to write a script readable.kts that takes a filename as an argument, and prints out the file while shuffling the internal letters of each word. For example:
$ kts readable.kts input.txt In this cuosre we will use the Ktoiln priromangmg laguange. In my exnepciree, sdentuts doevelp a sltye of pngarormmig in teihr frist prmanrigmog lngaugae. Tehy find it diufciflt to laren a dirnefeft slyte ltear, even if tehy stiwch to a dirnfeeft lanaugge. Tihs manes taht suentdts sluohd strat ealry to use a mrdeon lagaugne taht ecaruenogs writnig clean and elngaet code, and sptorpus a good obcejt-oeritend and fnitoacunl sltye. We will toeerfrhe use Kotiln in this csuroe. Ktolin is flluy catbmploie with Jvaa, so you can use it for ainytnhg that can be done in Jvaa, but it is a much mroe mdoren, much mroe rebldaae, and much mroe sesnbile lnaaggue. We wlil aslo epnxeriemt wtih cpmionilg Kliton suorce to Jvcsraipat, so you can run yuor pgrarmos idnsie a web bsroewr, and will even wtrie slmal apps taht can run on Arnidod pnehos. Msot suttends will stlil have to lrean C++ and/or Jvaa ltaer driung their suetids—but I bleveie that afetr gniettg prrmongimag prticcae in Koitln, they wlil be albe to wtrie betetr cdoe in those leuagnags as well.
To make your life easier, start with the following skeleton (readable.kts):
// check if ch is a letter fun isLetter(ch: Char) = ch in 'a'..'z' || ch in 'A'..'Z' // shuffle(s) returns a randomly shuffled copy of the string s fun shuffle(s: String): String { val l = s.toMutableList() java.util.Collections.shuffle(l) return l.joinToString("") } fun reorderLetters(s: String) { var i = 0 while (i < s.length) { // modify this space } println() } if (args.size != 1) println("Usage: kts readable.kts <filename>") else java.io.File(args[0]).forEachLine { reorderLetters(it) }
Don't change the existing code, except that you need to fill in the while-loop in the function reorderLetters. (It is okay to add additional functions.)
The skeleton already takes care of checking that there is exactly one parameter on the command line, opening a file with that name, and calling reorderLetters for each line of the file.
Inside reorderLetters, look at the letters of the string s one by one. If it is not a letter, print it out immediately using print(s[i]). If it is a letter, you will need a second loop that walks ahead to find the last letter of the word. Print the first letter, print the shuffled internal letters, and print the last letter of the word. Make sure you handle one-letter and two-letter words correctly.
You can test with the input file input.txt.
Is this text readable? |