Doubled-letter steganography
up vote
18
down vote
favorite
Steganography hides a given message inside a given carrier, producing a package that does not look suspicious. For this challenge, you will write a program that takes an ASCII message and an ASCII carrier as input, and return or print a package that is identical to the carrier except characters corresponding to the message are doubled, in the same order that they appear in the message.
Rules:
- If the carrier already contains sequences of the same character more than once, and they are not used to encode a character of the message, the program will reduce them to a single character.
- If the carrier does not contain the message characters in the right order, the program may return nothing, the carrier itself, or an error.
- You may assume that the message and carrier are non-empty ASCII strings.
- Capitalization matters: A is not equivalent to a.
- When more than one package is valid, your program may output any or all of them.
- Space is a character like any other character.
Test cases:
Message Carrier Package
"hi" "has it arrived?" "hhas iit arived?" OR "hhas it ariived?"
"sir" "has it arrived?" "hass iit arrived?"
"foo" "has it arrived?" "" OR "has it arrived?" OR an error.
"Car" "Cats are cool." "CCaats arre col."
"car" "Cats are cool." "" OR "Cats are cool." OR an error.
"Couch" "Couch" "CCoouucchh"
"oo" "oooooooooo" "oooo"
"o o" "oooo oooa" "oo ooa"
This is code golf, so fewest bytes wins.
code-golf string steganography
New contributor
|
show 4 more comments
up vote
18
down vote
favorite
Steganography hides a given message inside a given carrier, producing a package that does not look suspicious. For this challenge, you will write a program that takes an ASCII message and an ASCII carrier as input, and return or print a package that is identical to the carrier except characters corresponding to the message are doubled, in the same order that they appear in the message.
Rules:
- If the carrier already contains sequences of the same character more than once, and they are not used to encode a character of the message, the program will reduce them to a single character.
- If the carrier does not contain the message characters in the right order, the program may return nothing, the carrier itself, or an error.
- You may assume that the message and carrier are non-empty ASCII strings.
- Capitalization matters: A is not equivalent to a.
- When more than one package is valid, your program may output any or all of them.
- Space is a character like any other character.
Test cases:
Message Carrier Package
"hi" "has it arrived?" "hhas iit arived?" OR "hhas it ariived?"
"sir" "has it arrived?" "hass iit arrived?"
"foo" "has it arrived?" "" OR "has it arrived?" OR an error.
"Car" "Cats are cool." "CCaats arre col."
"car" "Cats are cool." "" OR "Cats are cool." OR an error.
"Couch" "Couch" "CCoouucchh"
"oo" "oooooooooo" "oooo"
"o o" "oooo oooa" "oo ooa"
This is code golf, so fewest bytes wins.
code-golf string steganography
New contributor
5
Not suspicious at all... :P
– Quintec
2 days ago
Is"oooo oa"
(with 2 spaces) a valid output for the last test case?
– Arnauld
2 days ago
3
It is not a valid output because the order of doubled characters in the package must match the order of the characters in the message. In the message, we have an 'o', then an ' ', then an 'o', but your package has the space after the o's
– jkpate
2 days ago
Ah yes, that makes sense.
– Arnauld
2 days ago
1
No. My reasoning behind this rule is that the program's output in the case of no solution should be unambiguous that no solution is possible. The three allowed outputs are unambiguous, but more extensive checking would be required for the deduplicated case.
– jkpate
2 days ago
|
show 4 more comments
up vote
18
down vote
favorite
up vote
18
down vote
favorite
Steganography hides a given message inside a given carrier, producing a package that does not look suspicious. For this challenge, you will write a program that takes an ASCII message and an ASCII carrier as input, and return or print a package that is identical to the carrier except characters corresponding to the message are doubled, in the same order that they appear in the message.
Rules:
- If the carrier already contains sequences of the same character more than once, and they are not used to encode a character of the message, the program will reduce them to a single character.
- If the carrier does not contain the message characters in the right order, the program may return nothing, the carrier itself, or an error.
- You may assume that the message and carrier are non-empty ASCII strings.
- Capitalization matters: A is not equivalent to a.
- When more than one package is valid, your program may output any or all of them.
- Space is a character like any other character.
Test cases:
Message Carrier Package
"hi" "has it arrived?" "hhas iit arived?" OR "hhas it ariived?"
"sir" "has it arrived?" "hass iit arrived?"
"foo" "has it arrived?" "" OR "has it arrived?" OR an error.
"Car" "Cats are cool." "CCaats arre col."
"car" "Cats are cool." "" OR "Cats are cool." OR an error.
"Couch" "Couch" "CCoouucchh"
"oo" "oooooooooo" "oooo"
"o o" "oooo oooa" "oo ooa"
This is code golf, so fewest bytes wins.
code-golf string steganography
New contributor
Steganography hides a given message inside a given carrier, producing a package that does not look suspicious. For this challenge, you will write a program that takes an ASCII message and an ASCII carrier as input, and return or print a package that is identical to the carrier except characters corresponding to the message are doubled, in the same order that they appear in the message.
Rules:
- If the carrier already contains sequences of the same character more than once, and they are not used to encode a character of the message, the program will reduce them to a single character.
- If the carrier does not contain the message characters in the right order, the program may return nothing, the carrier itself, or an error.
- You may assume that the message and carrier are non-empty ASCII strings.
- Capitalization matters: A is not equivalent to a.
- When more than one package is valid, your program may output any or all of them.
- Space is a character like any other character.
Test cases:
Message Carrier Package
"hi" "has it arrived?" "hhas iit arived?" OR "hhas it ariived?"
"sir" "has it arrived?" "hass iit arrived?"
"foo" "has it arrived?" "" OR "has it arrived?" OR an error.
"Car" "Cats are cool." "CCaats arre col."
"car" "Cats are cool." "" OR "Cats are cool." OR an error.
"Couch" "Couch" "CCoouucchh"
"oo" "oooooooooo" "oooo"
"o o" "oooo oooa" "oo ooa"
This is code golf, so fewest bytes wins.
code-golf string steganography
code-golf string steganography
New contributor
New contributor
edited 2 days ago
Jonathan Allan
50.5k534165
50.5k534165
New contributor
asked 2 days ago
jkpate
1914
1914
New contributor
New contributor
5
Not suspicious at all... :P
– Quintec
2 days ago
Is"oooo oa"
(with 2 spaces) a valid output for the last test case?
– Arnauld
2 days ago
3
It is not a valid output because the order of doubled characters in the package must match the order of the characters in the message. In the message, we have an 'o', then an ' ', then an 'o', but your package has the space after the o's
– jkpate
2 days ago
Ah yes, that makes sense.
– Arnauld
2 days ago
1
No. My reasoning behind this rule is that the program's output in the case of no solution should be unambiguous that no solution is possible. The three allowed outputs are unambiguous, but more extensive checking would be required for the deduplicated case.
– jkpate
2 days ago
|
show 4 more comments
5
Not suspicious at all... :P
– Quintec
2 days ago
Is"oooo oa"
(with 2 spaces) a valid output for the last test case?
– Arnauld
2 days ago
3
It is not a valid output because the order of doubled characters in the package must match the order of the characters in the message. In the message, we have an 'o', then an ' ', then an 'o', but your package has the space after the o's
– jkpate
2 days ago
Ah yes, that makes sense.
– Arnauld
2 days ago
1
No. My reasoning behind this rule is that the program's output in the case of no solution should be unambiguous that no solution is possible. The three allowed outputs are unambiguous, but more extensive checking would be required for the deduplicated case.
– jkpate
2 days ago
5
5
Not suspicious at all... :P
– Quintec
2 days ago
Not suspicious at all... :P
– Quintec
2 days ago
Is
"oooo oa"
(with 2 spaces) a valid output for the last test case?– Arnauld
2 days ago
Is
"oooo oa"
(with 2 spaces) a valid output for the last test case?– Arnauld
2 days ago
3
3
It is not a valid output because the order of doubled characters in the package must match the order of the characters in the message. In the message, we have an 'o', then an ' ', then an 'o', but your package has the space after the o's
– jkpate
2 days ago
It is not a valid output because the order of doubled characters in the package must match the order of the characters in the message. In the message, we have an 'o', then an ' ', then an 'o', but your package has the space after the o's
– jkpate
2 days ago
Ah yes, that makes sense.
– Arnauld
2 days ago
Ah yes, that makes sense.
– Arnauld
2 days ago
1
1
No. My reasoning behind this rule is that the program's output in the case of no solution should be unambiguous that no solution is possible. The three allowed outputs are unambiguous, but more extensive checking would be required for the deduplicated case.
– jkpate
2 days ago
No. My reasoning behind this rule is that the program's output in the case of no solution should be unambiguous that no solution is possible. The three allowed outputs are unambiguous, but more extensive checking would be required for the deduplicated case.
– jkpate
2 days ago
|
show 4 more comments
7 Answers
7
active
oldest
votes
up vote
4
down vote
Jelly, 28 bytes
ẹⱮŒp<ƝẠ$ƇṪ
nƝ+çṬ¥a⁸ḟ0Ḥç¦ð¹ç?
A full program taking carrier
and message
as command line arguments which prints the result
(For a non-packable message
prints the unchanged carrier
).
Try it online! Or see the test-suite.
How?
ẹⱮŒp<ƝẠ$ƇṪ - Link 1, helper function to find the indices to double: carrier, message
- e.g. "programming", "rom"
Ɱ - map across message with:
ẹ - indices of [[2,5], [3], [7,8]]
Œp - Cartesian product [[2,3,7],[2,3,8],[5,3,7],[5,3,8]]
Ƈ - filter keep if:
$ - last two links as a monad:
Ɲ - for neighbours:
< - less than? [1,1] [1,1] [0,1] [0,1]
Ạ - all truthy? 1 1 0 0
- [[2,3,7],[2,3,8]]
Ṫ - tail (if empty yields 0) [2,3,8]
nƝ+çṬ¥a⁸ḟ0Ḥç¦ð¹ç? - Main Link: carrier, message
? - if...
ç - ...condition: last Link (the helper function) as a dyad
ð - ...then: perform the dyadic chain to the left (described below)
¹ - ...else: do nothing (yields carrier)
- (the then clause:)
Ɲ - for neighbours in the carrier
n - not equal?
¥ - last two links as a dyad:
ç - call last Link (the helper function) as a dyad
Ṭ - untruth (e.g. [2,5] -> [0,1,0,0,1])
+ - add (vectorises)
a⁸ - logical AND with carrier
ḟ0 - filter out zeros
¦ - sparse application...
ç - ...to indices: call last Link (the helper function) as a dyad
Ḥ - ...do: double (e.g. 'x' -> 'xx')
add a comment |
up vote
3
down vote
JavaScript (ES6), 75 bytes
Takes input as (message)(carrier)
.
s=>g=([c,...C],p)=>c?(c==s[0]?(s=s.slice(1),p=c)+c:p==c?'':p=c)+g(C,c):s&&X
Try it online!
Alternate version, 72 bytes
If we can take the message as an array of characters:
s=>g=([c,...C],p)=>c?(c==s[0]?(p=s.shift())+c:p==c?'':p=c)+g(C,c):s+s&&X
Try it online!
You could removep=
since p is passed by a parameter.
– tsh
1 hour ago
add a comment |
up vote
2
down vote
Haskell, 124 121 107 101 97 95 90 bytes
(#).(++"ü")
"ü"#=
p@(m:n)#e@(c:d)|m/=c=c:p#snd(span(==c)d)|m==n!!0=m:m:n#d|1<2=m:n#e
Raises the "Non-exhaustive patterns" exception if the carrier does not contain the message.
Try it online!
Edit: -5 bytes thanks to @Laikoni.
I think switching the cases allows you to dropm==c
: Try it online!
– Laikoni
yesterday
add a comment |
up vote
1
down vote
Retina 0.8.2, 67 bytes
+`(.)(1*)1*(.*¶)(?(1)(1(2)))(.*)$(?!¶)
$1$4$5¶$3$6
M!s`.*¶$
¶
Try it online! Takes the carrier on the first line and the message on the second line. Explanation:
+`(.)(1*)1*(.*¶)(?(1)(1(2)))(.*)$(?!¶)
$1$4$5¶$3$6
Process runs of 1 or more identical characters of the carrier. If there is also a run of 1 or more of the same characters in the message, then append the shorter of the two runs to the output in duplicate, otherwise append a single character of the carrier to the output. Each run of output characters is terminated with a newline to distinguish it from the input. The (?!¶)
at the end prevents the regex from thinking the carrier is the message once the message is exhausted, as normally $
is allowed to match where ¶$
would match.
M!s`.*¶$
Delete everything if the message wasn't completely encoded.
¶
Remove the newlines from the output.
I think it does not pass the second to last test case (which, to be fair, I did not have in the initial post).
– jkpate
2 days ago
@jkpate Thanks for pointing that out; I've had to rewrite my approach slightly.
– Neil
2 days ago
add a comment |
up vote
0
down vote
Clean, 118 bytes
import StdEnv,StdLib
$=
$[u:v]b#(_,w)=span((==)u)v
|b%(0,0)==[u]=[u,u: $if(v%(0,0)<>b%(1,1))w v(tl b)]=[u: $w b]
Try it online!
Takes the carrier first, then the message.
Errors with Run time error, rule '$;2' in module 'main' does not match
if message won't fit.
add a comment |
up vote
0
down vote
Ruby, 73 bytes
f=->m,c,b=p{x,*c=c;x ?(x==m[0]?x+m.shift: x==b ?'':x)+f[m,c,x]:m[0]?x:''}
Try it online!
Recursive function, takes inputs as array of characters.
For once I was hoping to make use of Ruby's built-in squeeze
method that contracts consecutive runs of the same character to a single instance. But unfortunately, nope - the last two test cases screwed everything so badly, that I had to resort to a completely different approach, and this turned out to be basically a port of Arnauld's answer.
add a comment |
up vote
0
down vote
Powershell, 134 bytes
param($m,$c)$c-csplit"([$m])"|%{$i+=$o=$_-ceq$m[+$i]
if($o-or$_-cne"`0$h"[-1]){$h+=($_-replace'(.)(?=1)')*($o+1)}}
$h*!($i-$m.Length)
The script returns the empty string
if the carrier does not contain the message characters in the right order.
Less golfed test script:
$f = {
param($message,$carrier)
$carrier-csplit"([$message])"|%{ # split by chars of the message, chars itself included ()
$offset=$_-ceq$message[+$i] # 0 or 1 if current substring is a current message char (case-sensitive equality)
$i+=$offset # move to next message char if need it
if($offset-or$_-cne"`0$h"[-1]){ # condition to remove redundant doubles after message char: arrrived -> arrived, ooo -> oo, etc
# `0 to avoid exception error if $h is empty
$h+=($_-replace'(.)(?=1)')*($offset+1) # accumulate a double message char or a single substring without inner doubles: arried -> arived, anna -> ana, etc
}
}
$h*!($i-$message.Length) # repeat 0 or 1 times to return '' if the carrier does not contain the message characters in the right order
}
@(
,('hi' ,'has it arrived?' ,'hhas iit arived?', 'hhas it ariived?')
,('hi?' ,'has it arrived?' ,'hhas iit arived??', 'hhas it ariived??')
,('sir' ,'has it arrived?' ,'hass iit arrived?')
,('foo' ,'has it arrived?' ,'')
,('Car' ,'Cats are cool.' ,'CCaats arre col.')
,('car' ,'Cats are cool.' ,'')
,('Couch' ,'Couch' ,'CCoouucchh')
,('oo' ,'oooooooooo' ,'oooo')
,('o o' ,'oooo oooa' ,'oo ooa')
,('er' ,'error' ,'eerorr', 'eerror')
,('a+b' ,'anna+bob' ,'aana++bbob')
) | % {
$message,$carrier,$expected = $_
$result = &$f $message $carrier
"$($result-in$expected): $result"
}
Output:
True: hhas iit arived?
True: hhas iit arived??
True: hass iit arrived?
True:
True: CCaats arre col.
True:
True: CCoouucchh
True: oooo
True: oo ooa
True: eerror
True: aana++bbob
add a comment |
7 Answers
7
active
oldest
votes
7 Answers
7
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
4
down vote
Jelly, 28 bytes
ẹⱮŒp<ƝẠ$ƇṪ
nƝ+çṬ¥a⁸ḟ0Ḥç¦ð¹ç?
A full program taking carrier
and message
as command line arguments which prints the result
(For a non-packable message
prints the unchanged carrier
).
Try it online! Or see the test-suite.
How?
ẹⱮŒp<ƝẠ$ƇṪ - Link 1, helper function to find the indices to double: carrier, message
- e.g. "programming", "rom"
Ɱ - map across message with:
ẹ - indices of [[2,5], [3], [7,8]]
Œp - Cartesian product [[2,3,7],[2,3,8],[5,3,7],[5,3,8]]
Ƈ - filter keep if:
$ - last two links as a monad:
Ɲ - for neighbours:
< - less than? [1,1] [1,1] [0,1] [0,1]
Ạ - all truthy? 1 1 0 0
- [[2,3,7],[2,3,8]]
Ṫ - tail (if empty yields 0) [2,3,8]
nƝ+çṬ¥a⁸ḟ0Ḥç¦ð¹ç? - Main Link: carrier, message
? - if...
ç - ...condition: last Link (the helper function) as a dyad
ð - ...then: perform the dyadic chain to the left (described below)
¹ - ...else: do nothing (yields carrier)
- (the then clause:)
Ɲ - for neighbours in the carrier
n - not equal?
¥ - last two links as a dyad:
ç - call last Link (the helper function) as a dyad
Ṭ - untruth (e.g. [2,5] -> [0,1,0,0,1])
+ - add (vectorises)
a⁸ - logical AND with carrier
ḟ0 - filter out zeros
¦ - sparse application...
ç - ...to indices: call last Link (the helper function) as a dyad
Ḥ - ...do: double (e.g. 'x' -> 'xx')
add a comment |
up vote
4
down vote
Jelly, 28 bytes
ẹⱮŒp<ƝẠ$ƇṪ
nƝ+çṬ¥a⁸ḟ0Ḥç¦ð¹ç?
A full program taking carrier
and message
as command line arguments which prints the result
(For a non-packable message
prints the unchanged carrier
).
Try it online! Or see the test-suite.
How?
ẹⱮŒp<ƝẠ$ƇṪ - Link 1, helper function to find the indices to double: carrier, message
- e.g. "programming", "rom"
Ɱ - map across message with:
ẹ - indices of [[2,5], [3], [7,8]]
Œp - Cartesian product [[2,3,7],[2,3,8],[5,3,7],[5,3,8]]
Ƈ - filter keep if:
$ - last two links as a monad:
Ɲ - for neighbours:
< - less than? [1,1] [1,1] [0,1] [0,1]
Ạ - all truthy? 1 1 0 0
- [[2,3,7],[2,3,8]]
Ṫ - tail (if empty yields 0) [2,3,8]
nƝ+çṬ¥a⁸ḟ0Ḥç¦ð¹ç? - Main Link: carrier, message
? - if...
ç - ...condition: last Link (the helper function) as a dyad
ð - ...then: perform the dyadic chain to the left (described below)
¹ - ...else: do nothing (yields carrier)
- (the then clause:)
Ɲ - for neighbours in the carrier
n - not equal?
¥ - last two links as a dyad:
ç - call last Link (the helper function) as a dyad
Ṭ - untruth (e.g. [2,5] -> [0,1,0,0,1])
+ - add (vectorises)
a⁸ - logical AND with carrier
ḟ0 - filter out zeros
¦ - sparse application...
ç - ...to indices: call last Link (the helper function) as a dyad
Ḥ - ...do: double (e.g. 'x' -> 'xx')
add a comment |
up vote
4
down vote
up vote
4
down vote
Jelly, 28 bytes
ẹⱮŒp<ƝẠ$ƇṪ
nƝ+çṬ¥a⁸ḟ0Ḥç¦ð¹ç?
A full program taking carrier
and message
as command line arguments which prints the result
(For a non-packable message
prints the unchanged carrier
).
Try it online! Or see the test-suite.
How?
ẹⱮŒp<ƝẠ$ƇṪ - Link 1, helper function to find the indices to double: carrier, message
- e.g. "programming", "rom"
Ɱ - map across message with:
ẹ - indices of [[2,5], [3], [7,8]]
Œp - Cartesian product [[2,3,7],[2,3,8],[5,3,7],[5,3,8]]
Ƈ - filter keep if:
$ - last two links as a monad:
Ɲ - for neighbours:
< - less than? [1,1] [1,1] [0,1] [0,1]
Ạ - all truthy? 1 1 0 0
- [[2,3,7],[2,3,8]]
Ṫ - tail (if empty yields 0) [2,3,8]
nƝ+çṬ¥a⁸ḟ0Ḥç¦ð¹ç? - Main Link: carrier, message
? - if...
ç - ...condition: last Link (the helper function) as a dyad
ð - ...then: perform the dyadic chain to the left (described below)
¹ - ...else: do nothing (yields carrier)
- (the then clause:)
Ɲ - for neighbours in the carrier
n - not equal?
¥ - last two links as a dyad:
ç - call last Link (the helper function) as a dyad
Ṭ - untruth (e.g. [2,5] -> [0,1,0,0,1])
+ - add (vectorises)
a⁸ - logical AND with carrier
ḟ0 - filter out zeros
¦ - sparse application...
ç - ...to indices: call last Link (the helper function) as a dyad
Ḥ - ...do: double (e.g. 'x' -> 'xx')
Jelly, 28 bytes
ẹⱮŒp<ƝẠ$ƇṪ
nƝ+çṬ¥a⁸ḟ0Ḥç¦ð¹ç?
A full program taking carrier
and message
as command line arguments which prints the result
(For a non-packable message
prints the unchanged carrier
).
Try it online! Or see the test-suite.
How?
ẹⱮŒp<ƝẠ$ƇṪ - Link 1, helper function to find the indices to double: carrier, message
- e.g. "programming", "rom"
Ɱ - map across message with:
ẹ - indices of [[2,5], [3], [7,8]]
Œp - Cartesian product [[2,3,7],[2,3,8],[5,3,7],[5,3,8]]
Ƈ - filter keep if:
$ - last two links as a monad:
Ɲ - for neighbours:
< - less than? [1,1] [1,1] [0,1] [0,1]
Ạ - all truthy? 1 1 0 0
- [[2,3,7],[2,3,8]]
Ṫ - tail (if empty yields 0) [2,3,8]
nƝ+çṬ¥a⁸ḟ0Ḥç¦ð¹ç? - Main Link: carrier, message
? - if...
ç - ...condition: last Link (the helper function) as a dyad
ð - ...then: perform the dyadic chain to the left (described below)
¹ - ...else: do nothing (yields carrier)
- (the then clause:)
Ɲ - for neighbours in the carrier
n - not equal?
¥ - last two links as a dyad:
ç - call last Link (the helper function) as a dyad
Ṭ - untruth (e.g. [2,5] -> [0,1,0,0,1])
+ - add (vectorises)
a⁸ - logical AND with carrier
ḟ0 - filter out zeros
¦ - sparse application...
ç - ...to indices: call last Link (the helper function) as a dyad
Ḥ - ...do: double (e.g. 'x' -> 'xx')
edited 2 days ago
answered 2 days ago
Jonathan Allan
50.5k534165
50.5k534165
add a comment |
add a comment |
up vote
3
down vote
JavaScript (ES6), 75 bytes
Takes input as (message)(carrier)
.
s=>g=([c,...C],p)=>c?(c==s[0]?(s=s.slice(1),p=c)+c:p==c?'':p=c)+g(C,c):s&&X
Try it online!
Alternate version, 72 bytes
If we can take the message as an array of characters:
s=>g=([c,...C],p)=>c?(c==s[0]?(p=s.shift())+c:p==c?'':p=c)+g(C,c):s+s&&X
Try it online!
You could removep=
since p is passed by a parameter.
– tsh
1 hour ago
add a comment |
up vote
3
down vote
JavaScript (ES6), 75 bytes
Takes input as (message)(carrier)
.
s=>g=([c,...C],p)=>c?(c==s[0]?(s=s.slice(1),p=c)+c:p==c?'':p=c)+g(C,c):s&&X
Try it online!
Alternate version, 72 bytes
If we can take the message as an array of characters:
s=>g=([c,...C],p)=>c?(c==s[0]?(p=s.shift())+c:p==c?'':p=c)+g(C,c):s+s&&X
Try it online!
You could removep=
since p is passed by a parameter.
– tsh
1 hour ago
add a comment |
up vote
3
down vote
up vote
3
down vote
JavaScript (ES6), 75 bytes
Takes input as (message)(carrier)
.
s=>g=([c,...C],p)=>c?(c==s[0]?(s=s.slice(1),p=c)+c:p==c?'':p=c)+g(C,c):s&&X
Try it online!
Alternate version, 72 bytes
If we can take the message as an array of characters:
s=>g=([c,...C],p)=>c?(c==s[0]?(p=s.shift())+c:p==c?'':p=c)+g(C,c):s+s&&X
Try it online!
JavaScript (ES6), 75 bytes
Takes input as (message)(carrier)
.
s=>g=([c,...C],p)=>c?(c==s[0]?(s=s.slice(1),p=c)+c:p==c?'':p=c)+g(C,c):s&&X
Try it online!
Alternate version, 72 bytes
If we can take the message as an array of characters:
s=>g=([c,...C],p)=>c?(c==s[0]?(p=s.shift())+c:p==c?'':p=c)+g(C,c):s+s&&X
Try it online!
edited 2 days ago
answered 2 days ago
Arnauld
70.9k688298
70.9k688298
You could removep=
since p is passed by a parameter.
– tsh
1 hour ago
add a comment |
You could removep=
since p is passed by a parameter.
– tsh
1 hour ago
You could remove
p=
since p is passed by a parameter.– tsh
1 hour ago
You could remove
p=
since p is passed by a parameter.– tsh
1 hour ago
add a comment |
up vote
2
down vote
Haskell, 124 121 107 101 97 95 90 bytes
(#).(++"ü")
"ü"#=
p@(m:n)#e@(c:d)|m/=c=c:p#snd(span(==c)d)|m==n!!0=m:m:n#d|1<2=m:n#e
Raises the "Non-exhaustive patterns" exception if the carrier does not contain the message.
Try it online!
Edit: -5 bytes thanks to @Laikoni.
I think switching the cases allows you to dropm==c
: Try it online!
– Laikoni
yesterday
add a comment |
up vote
2
down vote
Haskell, 124 121 107 101 97 95 90 bytes
(#).(++"ü")
"ü"#=
p@(m:n)#e@(c:d)|m/=c=c:p#snd(span(==c)d)|m==n!!0=m:m:n#d|1<2=m:n#e
Raises the "Non-exhaustive patterns" exception if the carrier does not contain the message.
Try it online!
Edit: -5 bytes thanks to @Laikoni.
I think switching the cases allows you to dropm==c
: Try it online!
– Laikoni
yesterday
add a comment |
up vote
2
down vote
up vote
2
down vote
Haskell, 124 121 107 101 97 95 90 bytes
(#).(++"ü")
"ü"#=
p@(m:n)#e@(c:d)|m/=c=c:p#snd(span(==c)d)|m==n!!0=m:m:n#d|1<2=m:n#e
Raises the "Non-exhaustive patterns" exception if the carrier does not contain the message.
Try it online!
Edit: -5 bytes thanks to @Laikoni.
Haskell, 124 121 107 101 97 95 90 bytes
(#).(++"ü")
"ü"#=
p@(m:n)#e@(c:d)|m/=c=c:p#snd(span(==c)d)|m==n!!0=m:m:n#d|1<2=m:n#e
Raises the "Non-exhaustive patterns" exception if the carrier does not contain the message.
Try it online!
Edit: -5 bytes thanks to @Laikoni.
edited yesterday
answered 2 days ago
nimi
31k31985
31k31985
I think switching the cases allows you to dropm==c
: Try it online!
– Laikoni
yesterday
add a comment |
I think switching the cases allows you to dropm==c
: Try it online!
– Laikoni
yesterday
I think switching the cases allows you to drop
m==c
: Try it online!– Laikoni
yesterday
I think switching the cases allows you to drop
m==c
: Try it online!– Laikoni
yesterday
add a comment |
up vote
1
down vote
Retina 0.8.2, 67 bytes
+`(.)(1*)1*(.*¶)(?(1)(1(2)))(.*)$(?!¶)
$1$4$5¶$3$6
M!s`.*¶$
¶
Try it online! Takes the carrier on the first line and the message on the second line. Explanation:
+`(.)(1*)1*(.*¶)(?(1)(1(2)))(.*)$(?!¶)
$1$4$5¶$3$6
Process runs of 1 or more identical characters of the carrier. If there is also a run of 1 or more of the same characters in the message, then append the shorter of the two runs to the output in duplicate, otherwise append a single character of the carrier to the output. Each run of output characters is terminated with a newline to distinguish it from the input. The (?!¶)
at the end prevents the regex from thinking the carrier is the message once the message is exhausted, as normally $
is allowed to match where ¶$
would match.
M!s`.*¶$
Delete everything if the message wasn't completely encoded.
¶
Remove the newlines from the output.
I think it does not pass the second to last test case (which, to be fair, I did not have in the initial post).
– jkpate
2 days ago
@jkpate Thanks for pointing that out; I've had to rewrite my approach slightly.
– Neil
2 days ago
add a comment |
up vote
1
down vote
Retina 0.8.2, 67 bytes
+`(.)(1*)1*(.*¶)(?(1)(1(2)))(.*)$(?!¶)
$1$4$5¶$3$6
M!s`.*¶$
¶
Try it online! Takes the carrier on the first line and the message on the second line. Explanation:
+`(.)(1*)1*(.*¶)(?(1)(1(2)))(.*)$(?!¶)
$1$4$5¶$3$6
Process runs of 1 or more identical characters of the carrier. If there is also a run of 1 or more of the same characters in the message, then append the shorter of the two runs to the output in duplicate, otherwise append a single character of the carrier to the output. Each run of output characters is terminated with a newline to distinguish it from the input. The (?!¶)
at the end prevents the regex from thinking the carrier is the message once the message is exhausted, as normally $
is allowed to match where ¶$
would match.
M!s`.*¶$
Delete everything if the message wasn't completely encoded.
¶
Remove the newlines from the output.
I think it does not pass the second to last test case (which, to be fair, I did not have in the initial post).
– jkpate
2 days ago
@jkpate Thanks for pointing that out; I've had to rewrite my approach slightly.
– Neil
2 days ago
add a comment |
up vote
1
down vote
up vote
1
down vote
Retina 0.8.2, 67 bytes
+`(.)(1*)1*(.*¶)(?(1)(1(2)))(.*)$(?!¶)
$1$4$5¶$3$6
M!s`.*¶$
¶
Try it online! Takes the carrier on the first line and the message on the second line. Explanation:
+`(.)(1*)1*(.*¶)(?(1)(1(2)))(.*)$(?!¶)
$1$4$5¶$3$6
Process runs of 1 or more identical characters of the carrier. If there is also a run of 1 or more of the same characters in the message, then append the shorter of the two runs to the output in duplicate, otherwise append a single character of the carrier to the output. Each run of output characters is terminated with a newline to distinguish it from the input. The (?!¶)
at the end prevents the regex from thinking the carrier is the message once the message is exhausted, as normally $
is allowed to match where ¶$
would match.
M!s`.*¶$
Delete everything if the message wasn't completely encoded.
¶
Remove the newlines from the output.
Retina 0.8.2, 67 bytes
+`(.)(1*)1*(.*¶)(?(1)(1(2)))(.*)$(?!¶)
$1$4$5¶$3$6
M!s`.*¶$
¶
Try it online! Takes the carrier on the first line and the message on the second line. Explanation:
+`(.)(1*)1*(.*¶)(?(1)(1(2)))(.*)$(?!¶)
$1$4$5¶$3$6
Process runs of 1 or more identical characters of the carrier. If there is also a run of 1 or more of the same characters in the message, then append the shorter of the two runs to the output in duplicate, otherwise append a single character of the carrier to the output. Each run of output characters is terminated with a newline to distinguish it from the input. The (?!¶)
at the end prevents the regex from thinking the carrier is the message once the message is exhausted, as normally $
is allowed to match where ¶$
would match.
M!s`.*¶$
Delete everything if the message wasn't completely encoded.
¶
Remove the newlines from the output.
edited 2 days ago
answered 2 days ago
Neil
78.6k744175
78.6k744175
I think it does not pass the second to last test case (which, to be fair, I did not have in the initial post).
– jkpate
2 days ago
@jkpate Thanks for pointing that out; I've had to rewrite my approach slightly.
– Neil
2 days ago
add a comment |
I think it does not pass the second to last test case (which, to be fair, I did not have in the initial post).
– jkpate
2 days ago
@jkpate Thanks for pointing that out; I've had to rewrite my approach slightly.
– Neil
2 days ago
I think it does not pass the second to last test case (which, to be fair, I did not have in the initial post).
– jkpate
2 days ago
I think it does not pass the second to last test case (which, to be fair, I did not have in the initial post).
– jkpate
2 days ago
@jkpate Thanks for pointing that out; I've had to rewrite my approach slightly.
– Neil
2 days ago
@jkpate Thanks for pointing that out; I've had to rewrite my approach slightly.
– Neil
2 days ago
add a comment |
up vote
0
down vote
Clean, 118 bytes
import StdEnv,StdLib
$=
$[u:v]b#(_,w)=span((==)u)v
|b%(0,0)==[u]=[u,u: $if(v%(0,0)<>b%(1,1))w v(tl b)]=[u: $w b]
Try it online!
Takes the carrier first, then the message.
Errors with Run time error, rule '$;2' in module 'main' does not match
if message won't fit.
add a comment |
up vote
0
down vote
Clean, 118 bytes
import StdEnv,StdLib
$=
$[u:v]b#(_,w)=span((==)u)v
|b%(0,0)==[u]=[u,u: $if(v%(0,0)<>b%(1,1))w v(tl b)]=[u: $w b]
Try it online!
Takes the carrier first, then the message.
Errors with Run time error, rule '$;2' in module 'main' does not match
if message won't fit.
add a comment |
up vote
0
down vote
up vote
0
down vote
Clean, 118 bytes
import StdEnv,StdLib
$=
$[u:v]b#(_,w)=span((==)u)v
|b%(0,0)==[u]=[u,u: $if(v%(0,0)<>b%(1,1))w v(tl b)]=[u: $w b]
Try it online!
Takes the carrier first, then the message.
Errors with Run time error, rule '$;2' in module 'main' does not match
if message won't fit.
Clean, 118 bytes
import StdEnv,StdLib
$=
$[u:v]b#(_,w)=span((==)u)v
|b%(0,0)==[u]=[u,u: $if(v%(0,0)<>b%(1,1))w v(tl b)]=[u: $w b]
Try it online!
Takes the carrier first, then the message.
Errors with Run time error, rule '$;2' in module 'main' does not match
if message won't fit.
answered 23 hours ago
Οurous
6,11311032
6,11311032
add a comment |
add a comment |
up vote
0
down vote
Ruby, 73 bytes
f=->m,c,b=p{x,*c=c;x ?(x==m[0]?x+m.shift: x==b ?'':x)+f[m,c,x]:m[0]?x:''}
Try it online!
Recursive function, takes inputs as array of characters.
For once I was hoping to make use of Ruby's built-in squeeze
method that contracts consecutive runs of the same character to a single instance. But unfortunately, nope - the last two test cases screwed everything so badly, that I had to resort to a completely different approach, and this turned out to be basically a port of Arnauld's answer.
add a comment |
up vote
0
down vote
Ruby, 73 bytes
f=->m,c,b=p{x,*c=c;x ?(x==m[0]?x+m.shift: x==b ?'':x)+f[m,c,x]:m[0]?x:''}
Try it online!
Recursive function, takes inputs as array of characters.
For once I was hoping to make use of Ruby's built-in squeeze
method that contracts consecutive runs of the same character to a single instance. But unfortunately, nope - the last two test cases screwed everything so badly, that I had to resort to a completely different approach, and this turned out to be basically a port of Arnauld's answer.
add a comment |
up vote
0
down vote
up vote
0
down vote
Ruby, 73 bytes
f=->m,c,b=p{x,*c=c;x ?(x==m[0]?x+m.shift: x==b ?'':x)+f[m,c,x]:m[0]?x:''}
Try it online!
Recursive function, takes inputs as array of characters.
For once I was hoping to make use of Ruby's built-in squeeze
method that contracts consecutive runs of the same character to a single instance. But unfortunately, nope - the last two test cases screwed everything so badly, that I had to resort to a completely different approach, and this turned out to be basically a port of Arnauld's answer.
Ruby, 73 bytes
f=->m,c,b=p{x,*c=c;x ?(x==m[0]?x+m.shift: x==b ?'':x)+f[m,c,x]:m[0]?x:''}
Try it online!
Recursive function, takes inputs as array of characters.
For once I was hoping to make use of Ruby's built-in squeeze
method that contracts consecutive runs of the same character to a single instance. But unfortunately, nope - the last two test cases screwed everything so badly, that I had to resort to a completely different approach, and this turned out to be basically a port of Arnauld's answer.
answered 15 hours ago
Kirill L.
3,4051118
3,4051118
add a comment |
add a comment |
up vote
0
down vote
Powershell, 134 bytes
param($m,$c)$c-csplit"([$m])"|%{$i+=$o=$_-ceq$m[+$i]
if($o-or$_-cne"`0$h"[-1]){$h+=($_-replace'(.)(?=1)')*($o+1)}}
$h*!($i-$m.Length)
The script returns the empty string
if the carrier does not contain the message characters in the right order.
Less golfed test script:
$f = {
param($message,$carrier)
$carrier-csplit"([$message])"|%{ # split by chars of the message, chars itself included ()
$offset=$_-ceq$message[+$i] # 0 or 1 if current substring is a current message char (case-sensitive equality)
$i+=$offset # move to next message char if need it
if($offset-or$_-cne"`0$h"[-1]){ # condition to remove redundant doubles after message char: arrrived -> arrived, ooo -> oo, etc
# `0 to avoid exception error if $h is empty
$h+=($_-replace'(.)(?=1)')*($offset+1) # accumulate a double message char or a single substring without inner doubles: arried -> arived, anna -> ana, etc
}
}
$h*!($i-$message.Length) # repeat 0 or 1 times to return '' if the carrier does not contain the message characters in the right order
}
@(
,('hi' ,'has it arrived?' ,'hhas iit arived?', 'hhas it ariived?')
,('hi?' ,'has it arrived?' ,'hhas iit arived??', 'hhas it ariived??')
,('sir' ,'has it arrived?' ,'hass iit arrived?')
,('foo' ,'has it arrived?' ,'')
,('Car' ,'Cats are cool.' ,'CCaats arre col.')
,('car' ,'Cats are cool.' ,'')
,('Couch' ,'Couch' ,'CCoouucchh')
,('oo' ,'oooooooooo' ,'oooo')
,('o o' ,'oooo oooa' ,'oo ooa')
,('er' ,'error' ,'eerorr', 'eerror')
,('a+b' ,'anna+bob' ,'aana++bbob')
) | % {
$message,$carrier,$expected = $_
$result = &$f $message $carrier
"$($result-in$expected): $result"
}
Output:
True: hhas iit arived?
True: hhas iit arived??
True: hass iit arrived?
True:
True: CCaats arre col.
True:
True: CCoouucchh
True: oooo
True: oo ooa
True: eerror
True: aana++bbob
add a comment |
up vote
0
down vote
Powershell, 134 bytes
param($m,$c)$c-csplit"([$m])"|%{$i+=$o=$_-ceq$m[+$i]
if($o-or$_-cne"`0$h"[-1]){$h+=($_-replace'(.)(?=1)')*($o+1)}}
$h*!($i-$m.Length)
The script returns the empty string
if the carrier does not contain the message characters in the right order.
Less golfed test script:
$f = {
param($message,$carrier)
$carrier-csplit"([$message])"|%{ # split by chars of the message, chars itself included ()
$offset=$_-ceq$message[+$i] # 0 or 1 if current substring is a current message char (case-sensitive equality)
$i+=$offset # move to next message char if need it
if($offset-or$_-cne"`0$h"[-1]){ # condition to remove redundant doubles after message char: arrrived -> arrived, ooo -> oo, etc
# `0 to avoid exception error if $h is empty
$h+=($_-replace'(.)(?=1)')*($offset+1) # accumulate a double message char or a single substring without inner doubles: arried -> arived, anna -> ana, etc
}
}
$h*!($i-$message.Length) # repeat 0 or 1 times to return '' if the carrier does not contain the message characters in the right order
}
@(
,('hi' ,'has it arrived?' ,'hhas iit arived?', 'hhas it ariived?')
,('hi?' ,'has it arrived?' ,'hhas iit arived??', 'hhas it ariived??')
,('sir' ,'has it arrived?' ,'hass iit arrived?')
,('foo' ,'has it arrived?' ,'')
,('Car' ,'Cats are cool.' ,'CCaats arre col.')
,('car' ,'Cats are cool.' ,'')
,('Couch' ,'Couch' ,'CCoouucchh')
,('oo' ,'oooooooooo' ,'oooo')
,('o o' ,'oooo oooa' ,'oo ooa')
,('er' ,'error' ,'eerorr', 'eerror')
,('a+b' ,'anna+bob' ,'aana++bbob')
) | % {
$message,$carrier,$expected = $_
$result = &$f $message $carrier
"$($result-in$expected): $result"
}
Output:
True: hhas iit arived?
True: hhas iit arived??
True: hass iit arrived?
True:
True: CCaats arre col.
True:
True: CCoouucchh
True: oooo
True: oo ooa
True: eerror
True: aana++bbob
add a comment |
up vote
0
down vote
up vote
0
down vote
Powershell, 134 bytes
param($m,$c)$c-csplit"([$m])"|%{$i+=$o=$_-ceq$m[+$i]
if($o-or$_-cne"`0$h"[-1]){$h+=($_-replace'(.)(?=1)')*($o+1)}}
$h*!($i-$m.Length)
The script returns the empty string
if the carrier does not contain the message characters in the right order.
Less golfed test script:
$f = {
param($message,$carrier)
$carrier-csplit"([$message])"|%{ # split by chars of the message, chars itself included ()
$offset=$_-ceq$message[+$i] # 0 or 1 if current substring is a current message char (case-sensitive equality)
$i+=$offset # move to next message char if need it
if($offset-or$_-cne"`0$h"[-1]){ # condition to remove redundant doubles after message char: arrrived -> arrived, ooo -> oo, etc
# `0 to avoid exception error if $h is empty
$h+=($_-replace'(.)(?=1)')*($offset+1) # accumulate a double message char or a single substring without inner doubles: arried -> arived, anna -> ana, etc
}
}
$h*!($i-$message.Length) # repeat 0 or 1 times to return '' if the carrier does not contain the message characters in the right order
}
@(
,('hi' ,'has it arrived?' ,'hhas iit arived?', 'hhas it ariived?')
,('hi?' ,'has it arrived?' ,'hhas iit arived??', 'hhas it ariived??')
,('sir' ,'has it arrived?' ,'hass iit arrived?')
,('foo' ,'has it arrived?' ,'')
,('Car' ,'Cats are cool.' ,'CCaats arre col.')
,('car' ,'Cats are cool.' ,'')
,('Couch' ,'Couch' ,'CCoouucchh')
,('oo' ,'oooooooooo' ,'oooo')
,('o o' ,'oooo oooa' ,'oo ooa')
,('er' ,'error' ,'eerorr', 'eerror')
,('a+b' ,'anna+bob' ,'aana++bbob')
) | % {
$message,$carrier,$expected = $_
$result = &$f $message $carrier
"$($result-in$expected): $result"
}
Output:
True: hhas iit arived?
True: hhas iit arived??
True: hass iit arrived?
True:
True: CCaats arre col.
True:
True: CCoouucchh
True: oooo
True: oo ooa
True: eerror
True: aana++bbob
Powershell, 134 bytes
param($m,$c)$c-csplit"([$m])"|%{$i+=$o=$_-ceq$m[+$i]
if($o-or$_-cne"`0$h"[-1]){$h+=($_-replace'(.)(?=1)')*($o+1)}}
$h*!($i-$m.Length)
The script returns the empty string
if the carrier does not contain the message characters in the right order.
Less golfed test script:
$f = {
param($message,$carrier)
$carrier-csplit"([$message])"|%{ # split by chars of the message, chars itself included ()
$offset=$_-ceq$message[+$i] # 0 or 1 if current substring is a current message char (case-sensitive equality)
$i+=$offset # move to next message char if need it
if($offset-or$_-cne"`0$h"[-1]){ # condition to remove redundant doubles after message char: arrrived -> arrived, ooo -> oo, etc
# `0 to avoid exception error if $h is empty
$h+=($_-replace'(.)(?=1)')*($offset+1) # accumulate a double message char or a single substring without inner doubles: arried -> arived, anna -> ana, etc
}
}
$h*!($i-$message.Length) # repeat 0 or 1 times to return '' if the carrier does not contain the message characters in the right order
}
@(
,('hi' ,'has it arrived?' ,'hhas iit arived?', 'hhas it ariived?')
,('hi?' ,'has it arrived?' ,'hhas iit arived??', 'hhas it ariived??')
,('sir' ,'has it arrived?' ,'hass iit arrived?')
,('foo' ,'has it arrived?' ,'')
,('Car' ,'Cats are cool.' ,'CCaats arre col.')
,('car' ,'Cats are cool.' ,'')
,('Couch' ,'Couch' ,'CCoouucchh')
,('oo' ,'oooooooooo' ,'oooo')
,('o o' ,'oooo oooa' ,'oo ooa')
,('er' ,'error' ,'eerorr', 'eerror')
,('a+b' ,'anna+bob' ,'aana++bbob')
) | % {
$message,$carrier,$expected = $_
$result = &$f $message $carrier
"$($result-in$expected): $result"
}
Output:
True: hhas iit arived?
True: hhas iit arived??
True: hass iit arrived?
True:
True: CCaats arre col.
True:
True: CCoouucchh
True: oooo
True: oo ooa
True: eerror
True: aana++bbob
edited 6 hours ago
answered 6 hours ago
mazzy
1,947313
1,947313
add a comment |
add a comment |
jkpate is a new contributor. Be nice, and check out our Code of Conduct.
jkpate is a new contributor. Be nice, and check out our Code of Conduct.
jkpate is a new contributor. Be nice, and check out our Code of Conduct.
jkpate is a new contributor. Be nice, and check out our Code of Conduct.
If this is an answer to a challenge…
…Be sure to follow the challenge specification. However, please refrain from exploiting obvious loopholes. Answers abusing any of the standard loopholes are considered invalid. If you think a specification is unclear or underspecified, comment on the question instead.
…Try to optimize your score. For instance, answers to code-golf challenges should attempt to be as short as possible. You can always include a readable version of the code in addition to the competitive one.
Explanations of your answer make it more interesting to read and are very much encouraged.…Include a short header which indicates the language(s) of your code and its score, as defined by the challenge.
More generally…
…Please make sure to answer the question and provide sufficient detail.
…Avoid asking for help, clarification or responding to other answers (use comments instead).
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodegolf.stackexchange.com%2fquestions%2f177212%2fdoubled-letter-steganography%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
5
Not suspicious at all... :P
– Quintec
2 days ago
Is
"oooo oa"
(with 2 spaces) a valid output for the last test case?– Arnauld
2 days ago
3
It is not a valid output because the order of doubled characters in the package must match the order of the characters in the message. In the message, we have an 'o', then an ' ', then an 'o', but your package has the space after the o's
– jkpate
2 days ago
Ah yes, that makes sense.
– Arnauld
2 days ago
1
No. My reasoning behind this rule is that the program's output in the case of no solution should be unambiguous that no solution is possible. The three allowed outputs are unambiguous, but more extensive checking would be required for the deduplicated case.
– jkpate
2 days ago