双字母隐写术


19

隐秘术将给定的消息隐藏在给定的载体内,从而产生看上去并不可疑的包装。对于此挑战,您将编写一个程序,该程序将ASCII消息和ASCII载体作为输入,并返回或打印与该载体相同的程序包,但与该消息相对应的字符以与它们相同的顺序被加倍。消息。

规则:

  1. 如果载体已经多次包含相同字符的序列,并且不使用它们对消息的字符进行编码,则程序会将它们简化为单个字符。
  2. 如果载体未按正确的顺序包含消息字符,则程序可能不返回任何内容,载体本身或错误。
  3. 您可以假定消息和运营商是非空的ASCII字符串。
  4. 大写很重要:A不等于a。
  5. 当一个以上的软件包有效时,您的程序可能会输出其中的任何一个或全部。
  6. 空格是与其他任何字符一样的字符。

测试用例:

邮件载体包装
“嗨”“到了吗?” “它来了吗?” 或“它到达了吗?”
“先生”“到了吗?” “有来吗?”
“ foo”“到达了吗?” “”或“到达了吗?” 或错误。
“汽车”“猫很酷。” “ CCaats arre col。”
“汽车”“猫很酷。” “”或“猫很酷。” 或错误。
“沙发”“沙发”“ CCoouucchh”
“ oo”“ oooooooooo”“ oooo”
“ o o”“ oooo oooa”“ oo ooa”

这是代码高尔夫,所以最少的字节获胜。


5
一点都不怀疑...:P
Quintec '18

"oooo oa"(2位),最后的测试情况下,有效的输出?
Arnauld

3
这不是有效的输出,因为包中双字符的顺序必须与消息中字符的顺序匹配。在消息中,我们有一个'o',然后是'',然后是'o',但是您的包裹在o后面有空格
jkpate

是的,这很有意义。
Arnauld

1
否。我基于此规则的原因是,在无解决方案的情况下,程序的输出应明确无解。允许的三个输出是明确的,但是对于重复数据删除的情况,将需要进行更广泛的检查。
jkpate

Answers:


5

果冻,28 个字节

ẹⱮŒp<ƝẠ$ƇṪ
nƝ+çṬ¥a⁸ḟ0Ḥç¦ð¹ç?

完整的程序以carriermessage作为命令行参数来打印结果
(对于不可打包的程序,则message打印未更改的carrier)。

在线尝试!或查看测试套件

怎么样?

ẹⱮŒ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')

3

JavaScript(ES6),71个字节

将输入作为(message)(carrier)

s=>g=([c,...C],p)=>c?(c==s[0]?(s=s.slice(1),c)+c:p==c?'':c)+g(C,c):s&&X

在线尝试!


替代版本,66字节

如果我们可以将消息视为字符数组:

s=>g=([c,...C],p)=>c?(c==s[0]?s.shift()+c:p==c?'':c)+g(C,c):s+s&&X

在线尝试!


编辑:感谢@tsh注意到从非递归版本切换到递归版本时,我忘记删除一些代码。


您可以删除,p=因为p是通过参数传递的。
tsh

@tsh糟糕。这是以前的非递归版本中的一些残留代码,我忘记删除了。谢谢!
Arnauld

2

Haskell,124 121 107 101 97 95 90字节

(#).(++"ü")
"ü"#[]=[]
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

如果运营商不包含该消息,则会引发“非穷举模式”异常。

在线尝试!

编辑:-5字节感谢@Laikoni。


我认为切换大小写可以让您放弃m==c在线尝试!
莱科尼

1

视网膜0.8.2,67字节

+`(.)(\1*)\1*(.*¶)(?(\1)(\1(\2)))(.*)$(?!¶)
$1$4$5¶$3$6
M!s`.*¶$
¶

在线尝试!在第一行接收运营商,在第二行获取消息。说明:

+`(.)(\1*)\1*(.*¶)(?(\1)(\1(\2)))(.*)$(?!¶)
$1$4$5¶$3$6

载体具有1个或更多相同字符的过程运行。如果消息中也有一个或多个相同字符的游程,则将两个游程中的较短者一式两份地附加到输出中,否则将承运人的单个字符附加到输出中。输出字符的每次运行都以换行符结尾,以区别于输入。所述(?!¶)在端部防止思维载体中的正则表达式是一旦该消息被耗尽,因为通常的消息$被允许以匹配¶$将匹配。

M!s`.*¶$

如果邮件未完全编码,请删除所有内容。

从输出中删除换行符。


我认为它没有通过倒数第二个测试用例(公平地说,我在最初的帖子中没有)。
jkpate

@jkpate感谢您指出这一点;我不得不稍微重写我的方法。
尼尔

0

干净,118字节

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]

在线尝试!

首先取承运人,然后取消息。

Run time error, rule '$;2' in module 'main' does not matchif消息不适合的错误。


0

红宝石,73个字节

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:''}

在线尝试!

递归函数,将输入作为字符数组。

我曾经一次希望使用Ruby的内置squeeze方法,该方法将相同字符的连续运行收缩到一个实例中。但不幸的是,没有-最后两个测试用例严重破坏了所有内容,以至于我不得不求助于一种完全不同的方法,而这实际上是Arnauld的回答的一部分


0

Powershell,134个字节

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)

empty string如果载体未按正确的顺序包含消息字符,则脚本返回。

少打高尔夫的测试脚本:

$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"
}

输出:

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

0

C(gcc),69 + 12 = 81字节

g(char*m,char*_){for(;*_;++_)*m-*_?_[-1]-*_&&p*_):p p*m++));*m&&0/0;}

编译(12字节)

-Dp=putchar(

在线尝试!

g(char*m,char*_){
    for(;*_;++_)        //step through _
        *m-*_?          //check if character should be encoded
            _[-1]-*_&&  //no? skip duplicates
                p*_)    //    print non-duplicates
        :p p*m++));     //print encoded character twice
    *m&&0/0;            //if m is not fully encoded, exit via Floating point exception
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.