Your task is to hide a small message or string inside a larger block of text. To do so, you must hide the message as capital letters inside the larger
For the quoted test:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut convallis porta varius. Donec loBortis adipiscing dolor ac Euismod. Ut Mincidunt eY cursus nunc pulVinar, eu mAttis nibh tincidunt. PhaseLlus sEd molestie sapieN. InTeger congue maurIs in Nisi faucibus, at aliquam ligula consEctetur. Quisque laoreet turpis at est cursus, in consequat.
(Emboldened text only to highlight where the letters are)
The secret text reads:
BE MY VALENTINE
You choose how to spread the words out, and should error if you try to hide a string inside another that won't fit either from length or lack of required characters.
Assume the input is plain text, where the first letter of each sentence may be capitalised or not (those can be lower cased or ignored, but should not be part of the secret message, for clarity).
You'll get -10 points for writing a second program that recovers the hidden message from a block of text. In this eventuality your score is the average of the two, minus the 10 bonus points.
E.g. If the Message hiding code is 73 characters, and the recovery one is 80, your score is:
(73+80)/2-10=66.5
-
\$\begingroup\$ Given the order of operations, I think you mean: (73+80)/2-10=66.5 \$\endgroup\$user10766– user107662014年01月30日 22:48:12 +00:00Commented Jan 30, 2014 at 22:48
-
\$\begingroup\$ @user2509848 Yes I did. \$\endgroup\$AncientSwordRage– AncientSwordRage2014年01月30日 22:50:24 +00:00Commented Jan 30, 2014 at 22:50
-
\$\begingroup\$ What format do we take the input? And can we assume the block of text will not have capital letters apart from the ones beginning each sentence? \$\endgroup\$Paul Prestidge– Paul Prestidge2014年01月30日 22:59:46 +00:00Commented Jan 30, 2014 at 22:59
-
\$\begingroup\$ @Chron Yes to your assumption. \$\endgroup\$AncientSwordRage– AncientSwordRage2014年01月30日 23:02:34 +00:00Commented Jan 30, 2014 at 23:02
-
\$\begingroup\$ Can we assume that the first letter of each sentence of input is already capitalized? \$\endgroup\$Kendall Frey– Kendall Frey2014年01月30日 23:07:14 +00:00Commented Jan 30, 2014 at 23:07
2 Answers 2
Ruby, (69+35)/2-10 = 42
a=gets
$><<gets.gsub(/./){a[0]!=$&?$&:a.slice!(0).upcase}
1/0if a>?\n
Takes input on STDIN, first line is the message to hide, second line is the text block. Assumes the secret message is lower-case. Example input:
codegolf
You'll get -10 points for writing a second program that recovers the hidden message from a block of text. In this eventuality your score is the average of the two, minus the 10 bonus points.
Example output:
You'll get -10 points for writing a seCOnD program that rEcovers the hidden messaGe frOm a bLock oF text. In this eventuality your score is the average of the two, minus the 10 bonus points.
Here's the program to obtain the secret back from the output (again, provided on STDIN):
$><<gets.scan(/(?<!^|\. )[A-Z]/)*''
One caveat here is that Ruby's lookbehind expressions have to be fixed width, so this code only works for text where the periods are followed by exactly one space. Suggestions welcome!
Python 3, (136 + 74) / 2 - 10 = 95
Encoder (message must be lowercase):
t,m=input(),list(input().replace(' ', ''))
print([''.join(map(lambda c:m.pop(0).upper()if c.islower()and c in m[:1]else c,t))][bool(m)])
Decoder:
import re
print(filter(str.isupper, re.sub(r'(^|\. )[A-Z]', '', input())))
-
\$\begingroup\$ -6 bytes in Encoder:
if c in m[:c.islower()]else c
\$\endgroup\$movatica– movatica2024年03月05日 07:27:53 +00:00Commented Mar 5, 2024 at 7:27 -
\$\begingroup\$ Strip the three extra whitespaces in the Decoder for -3 bytes. \$\endgroup\$movatica– movatica2024年03月05日 07:28:38 +00:00Commented Mar 5, 2024 at 7:28