ซูรินาเมอักษรสองเท่า


19

Steganography ซ่อนข้อความที่กำหนดไว้ภายในสายการบินที่กำหนดโดยสร้างแพ็คเกจที่ไม่น่าสงสัย สำหรับความท้าทายนี้คุณจะเขียนโปรแกรมที่ใช้ข้อความ ASCII และผู้ให้บริการ ASCII เป็นอินพุตและส่งคืนหรือพิมพ์แพคเกจที่เหมือนกับผู้ให้บริการยกเว้นตัวอักษรที่สอดคล้องกับข้อความนั้นเป็นสองเท่าตามลำดับที่ปรากฏใน ข้อความ.

กฎ:

  1. หากผู้ให้บริการมีลำดับของอักขระเดียวกันมากกว่าหนึ่งครั้งและไม่ได้ใช้เพื่อเข้ารหัสอักขระของข้อความโปรแกรมจะลดจำนวนอักขระดังกล่าวเป็นอักขระเดียว
  2. หากผู้ให้บริการไม่มีอักขระข้อความตามลำดับที่ถูกต้องโปรแกรมอาจไม่ส่งคืนอะไรผู้ให้บริการเองหรือมีข้อผิดพลาด
  3. คุณอาจคิดว่าข้อความและผู้ให้บริการเป็นสตริง ASCII ที่ไม่ว่างเปล่า
  4. การใช้ตัวพิมพ์ใหญ่: A ไม่เทียบเท่ากับ a
  5. เมื่อมีมากกว่าหนึ่งแพ็คเกจที่ถูกต้องโปรแกรมของคุณอาจส่งออกใด ๆ หรือทั้งหมดของพวกเขา
  6. Space เป็นตัวละครที่เหมือนตัวละครอื่น ๆ

กรณีทดสอบ:

แพ็คเกจผู้ให้บริการข้อความ
"สวัสดี" "มาถึงแล้วหรือ" "มันก็เกิดขึ้นแล้วเหรอ?" หรือ "ได้รับมันแล้วเหรอ?"
"ท่าน" "มาถึงแล้วหรือ" "รบกวนฉันมาแล้วเหรอ?"
"foo" "มาถึงแล้วหรือ" "" หรือ "มาถึงแล้วหรือ" หรือมีข้อผิดพลาด
"รถยนต์" "แมวเท่ห์" "CCaats arre col."
"รถยนต์" "แมวเท่" "" หรือ "แมวเท่ห์" หรือมีข้อผิดพลาด
"Couch" "Couch" "CCoouucchh"
"oo" "oooooooooo" "oooo"
"o o" "oooo oooa" "oo ooa"

นี่คือรหัสกอล์ฟดังนั้นจำนวนไบต์ที่น้อยที่สุดจึงชนะ


5
ไม่น่าสงสัยเลย ... : P
Quintec

คือ"oooo oa"(มี 2 ช่องว่าง) การส่งออกที่ถูกต้องสำหรับกรณีทดสอบสุดท้าย?
Arnauld

3
มันไม่ได้เป็นผลลัพธ์ที่ถูกต้องเพราะคำสั่งของตัวละครสองเท่าในแพคเกจจะต้องตรงกับคำสั่งของตัวละครในข้อความ ในข้อความเรามี 'o' และ '' แล้ว 'o' แต่แพ็คเกจของคุณมีช่องว่างหลังจาก o
jkpate

อ่าใช่มันสมเหตุสมผลแล้ว
Arnauld

1
ไม่เหตุผลของฉันที่อยู่เบื้องหลังกฎนี้คือผลลัพธ์ของโปรแกรมในกรณีที่ไม่มีวิธีแก้ปัญหาควรไม่ชัดเจนว่าไม่มีวิธีแก้ปัญหาใด ๆ เอาต์พุตที่ได้รับอนุญาตทั้งสามนั้นไม่มีความกำกวม แต่จะต้องมีการตรวจสอบอย่างละเอียดมากขึ้นสำหรับกรณีที่ซ้ำซ้อน
jkpate

คำตอบ:


5

เยลลี่ขนาด 28 ไบต์

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

โปรแกรมเต็มการcarrierและmessageเป็นอาร์กิวเมนต์บรรทัดคำสั่งซึ่งพิมพ์ผลลัพธ์
(สำหรับการ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: ลองออนไลน์!
Laikoni

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 ตัวหรือมากกว่าของผู้ให้บริการ หากมีการเรียกใช้อักขระเดียวกันในข้อความตั้งแต่ 1 ตัวขึ้นไปให้ผนวกสองตัวที่สั้นลงไปยังเอาต์พุตในส่วนที่ซ้ำกันมิฉะนั้นจะผนวกอักขระตัวเดียวของพาหะเข้ากับเอาต์พุต การรันอักขระเอาต์พุตแต่ละรายการจะถูกยกเลิกด้วยการขึ้นบรรทัดใหม่เพื่อแยกความแตกต่างจากอินพุต (?!¶)ที่ป้องกันปลาย regex จากความคิดของผู้ให้บริการที่เป็นข้อความเมื่อข้อความถูกหมดเป็นปกติ$ที่ได้รับอนุญาตเพื่อให้ตรงกับที่¶$จะตรงกับ

M!s`.*¶$

ลบทุกอย่างหากข้อความไม่ได้เข้ารหัสอย่างสมบูรณ์

ลบบรรทัดใหม่ออกจากผลลัพธ์


ฉันคิดว่ามันไม่ผ่านการทดสอบครั้งที่สองถึงกรณีทดสอบครั้งสุดท้าย (ซึ่งเพื่อความเป็นธรรมฉันไม่ได้มีในโพสต์เริ่มต้น)
jkpate

@ jkpate ขอบคุณที่ชี้ให้เห็น; ฉันต้องเขียนแนวทางของฉันอีกครั้ง
Neil

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 matchหากข้อความไม่พอดี


0

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

ลองออนไลน์!

ฟังก์ชั่นแบบเรียกซ้ำใช้อินพุตเป็นอาร์เรย์ของอักขระ

ครั้งหนึ่งฉันก็หวังที่จะใช้ประโยชน์จากsqueezeวิธีการในตัวของรูบี้ที่สัญญาการทำงานต่อเนื่องของตัวละครเดียวกันกับอินสแตนซ์เดียว แต่น่าเสียดายที่ Nope - สองคนสุดท้ายกรณีทดสอบเมาทุกอย่างเพื่อไม่ดีที่ฉันมีรีสอร์ทให้วิธีการที่แตกต่างกันอย่างสมบูรณ์และนี้จะกลายเป็นพื้นพอร์ตของคำตอบ 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ถ้าผู้ให้บริการไม่มีอักขระข้อความตามลำดับที่ถูกต้อง

สคริปต์ทดสอบ golfed น้อย:

$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
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.