สร้างรหัสลับ


15

สร้างการเข้ารหัสที่กำหนดตัวเลขและสตริง

งานของคุณง่าย รับสตริงsและตัวเลข0 <= n <= 9เป็นอินพุตแทรกอักขระ ASCII แบบสุ่มที่พิมพ์ได้แบบหลอกระหว่างอักขระแต่ละตัวของnเวลาสตริง เช่นว่าสำหรับตัวละครแต่ละตัวของsมีnตัวละครแบบสุ่มระหว่างพวกเขา ควรตัดช่องว่าง

การป้อนข้อมูล:

  • sวลีสตริงที่จะเข้ารหัสในตัวเลข
  • จำนวนเต็มnในช่วงของ0 <= n <= 9

ตัวอย่าง:

การป้อนข้อมูล:

The treasure is here
2

เอาท์พุท:

T ! 0 h 32 e F4 t 0i r lk e hm a 7y s # 0 u * & r * h e ! 2 i H ^ s B, h ! @ e 0) r $ h e


นี่คือเพื่อให้โค้ดที่สั้นที่สุดชนะ! ขอให้โชคดีและสนุก!


3
อักขระ ASCII ที่พิมพ์ได้แบบสุ่มคุณต้องกำหนดความหมายแบบสุ่มที่นี่ แสดงว่าตัวอักษร ASCII ที่พิมพ์ได้ทั้งหมดมีความน่าจะเป็นเหมือนกันหรือไม่ พวกเขาควรมีความเป็นอิสระทางสถิติหรือไม่? เรามีความยืดหยุ่นอะไรเกี่ยวกับเรื่องนี้?
Luis Mendo

3
@jacksonecac ฉันไม่เห็นด้วย เพียงแค่พูดแบบสุ่มไม่เพียงพอ ตัวอย่างเช่นหากฉันเลือกเฉพาะอักขระสุ่มที่มีรหัส ASCII เท่านั่นก็ยังคงสุ่ม แต่อาจจะไม่ได้รับการยอมรับ (หรือ ist มันได้หรือไม่) ถ้าชุดnอักขระแต่ละชุดประกอบด้วยnสำเนาของอักขระสุ่มแบบเดียวกันพวกเขาก็ยังสุ่มอยู่ ไม่เป็นอิสระทางสถิติ และอื่น ๆ
Luis Mendo

5
@jacksonecac "random" เป็นคำที่กว้างมาก ฉันสามารถเลือกตัวละครมีการกระจายปกติดังนั้นตัวอักษรที่อยู่รอบ ๆOมีแนวโน้มมากขึ้นกว่าช่องว่างหรือ~? ถ้ามันต้องเหมือนกันคุณควรพูดอย่างชัดเจน และถ้ามันไม่จำเป็นต้องเหมือนกันอย่างน้อยคุณก็ควรบอกอะไรบางอย่างเช่นตัวละครแต่ละตัวต้องมีความน่าจะเป็นที่ไม่เป็นศูนย์ คุณยังได้ระบุไว้ในความคิดเห็นก่อนหน้าว่าแต่ละตัวละครจะต้องมีการกระจายอย่างอิสระดังนั้นหากเป็นสิ่งสำคัญคุณควรพูดถึงความท้าทาย มีคลื่นความถี่ที่กว้างมากของการสุ่ม
Martin Ender

3
นี่ไม่ใช่ตัวเลขจริงๆ บางทีมันอาจจะเป็นซูรินาเม
Greg Martin

2
นั่นไม่ใช่การตอบสนองที่เหมาะสมต่อจุดที่ถูกต้องของ @MartinEnder ทางออกคือการระบุอย่างชัดเจนว่าตัวละครจะต้องเหมือนกันและเป็นอิสระจากสถิติซึ่งกันและกันและความคิดเห็นจะหยุดลง อีกทางเลือกหนึ่ง (แต่เปิดให้มีการละเมิดมากขึ้น) เป็นไปได้ว่าการแจกแจงแบบเบ้หรือตัวอักษรที่ต้องพึ่งพาซึ่งกันและกันนั้นก็โอเคตราบใดที่อักขระทั้งหมดมีความเป็นไปได้ที่จะเกิดขึ้น ในการกำหนดรหัสกอล์ฟเป็นสิ่งสำคัญสำหรับความยุติธรรม ในขณะที่คุณดูเหมือนไม่เต็มใจที่จะพูดถึงความคิดเห็นที่ถูกต้องเหล่านี้ในความท้าทายที่ดีฉันจะลงคะแนนให้ปิด
เลเวลริเวอร์

คำตอบ:


7

C #, 141 131 ไบต์

ค่อนข้าง คล้ายกับคำตอบ Java ของ @ Geobitยกเว้นปัจจุบันอีกต่อไป :(

(I,n)=>{var R=new System.Random();var o="";int i,r;foreach(var c in I)if(c>32)for(i=r=0,o+=c;i++<n;){r=R.Next(33,127);o+=(char)r;}return o;};

สิ่งแลมบ์ดาเต็ม:

Func<string, int, string> a = (I,n) =>
{
    var R=new System.Random();
    var o="";
    int i;
    foreach(var c in I)
        if(c>32)
            for(i=0,o+=c;i++<n;o+=(char)R.Next(33,127));
    return o;
};

ทำไมR=...คุณสามารถใช้new System.Random().Next(...)ฉันคิดได้โดยตรง
Roman Gräf

2
@ RomanGräf msdn.microsoft.com/en-us/library/h343ddh9(v=vs.110).aspx คลาสสุ่มของ C # โดยไม่ต้องมีเมล็ดจะใช้นาฬิกาของระบบดังนั้นหากคุณโทรติดต่ออย่างรวดเร็ว (เช่นภายใน วนซ้ำ) ค่าส่วนใหญ่จบลงด้วยการเหมือนกันซึ่งจะไม่ทำงานในกรณีส่วนใหญ่ :( เชื่อฉันฉันพยายามแล้วจำไว้เสมอ
Yodle

7

05AB1E , 11 ไบต์

ð-vy²FžQ.RJ

ลองออนไลน์!

คำอธิบาย

ð-           # remove spaces from input string
  v          # for each char in the string
   y         # push the char
    ²F       # input-2 number of times do:
      žQ.R   # push a random ascii character
          J  # join to string

ปิด! ตัดช่องว่าง! :)
jacksonecac

@jacksonecac: พลาดส่วนนั้นไป แก้ไขแล้วตอนนี้ :)
Emigna

งานที่ดี! ใช้งานได้!
jacksonecac

1
@carusocomputing: นั่นเป็นการเพิ่มตัวอักษรแบบสุ่มหลังจากอักษรตัวสุดท้ายเช่นกัน ไม่เพียง แต่อยู่ระหว่างตัวอักษร
Emigna

1
@Emigna หลังจากความคิดเห็นเมื่อเร็ว ๆ นี้ภายใต้คำถามนี้ดูเหมือนว่าจะดี :)
geisterfurz007

6

Java 7, 132 124 ไบต์

String f(int n,char[]a){String o="";int i;for(char b:a)if(b>32)for(i=0,o+=b;i++<n;o+=(char)(33+Math.random()*94));return o;}

ไม่มีอะไรแฟนซีเพียงแค่วงสองเท่าที่คุณคาดหวัง ด้านนอกเพื่อวนรอบสตริงภายในเพื่อเติมเต็ม randoms:

String f(int n,char[]a){
    String o="";
    int i;
    for(char b:a)
        if(b>32)
            for(i=0,
                o+=b;
                    i++<n;
                        o+=(char)(33+Math.random()*94));
    return o;
}

ไม่ต้องการk: String f(int n,char[]a){String o="";for(char b:a)if(b>32){o+=b;for(int i=0;i++<n;o+=(char)(33+Math.random()*94));}return o;}(125 bytes)
Olivier Grégoire

ใช่แล้ว ฉันใช้มันกับวิธีอื่น ไม่ได้คิดเกี่ยวกับการนำออกไปเมื่อฉันไปกับcharนักแสดง ขอบคุณ!
Geobits

ความผิดฉันเอง. ฉัน miscounted ข้อเสนอแนะของฉันคือยัง 124 ไบต์: ฉันจะตรวจสอบคอลัมน์แทนความยาว;)
โอลิเวียGrégoire

ใช่ฉันสังเกตเห็นว่าเมื่อเปรียบเทียบทั้งสอง :)
Geobits


5

อ็อกเทฟ 43 ไบต์

@(s,n)[s(s>32);33+94*rand(n,nnz(s>32))](:)'

สิ่งนี้จะใช้สตริงsและจำนวนเต็มnเป็นอินพุต สตริงใน Octave เป็นเพียงอาร์เรย์ของอักขระ s>32เป็นแผนที่แบบลอจิคัลพร้อมกับตัวอักษร1ใด ๆ ที่ไม่ใช่พื้นที่ รหัสผนวกเมทริกซ์ที่มีnแถวและหมายเลขเดียวกันของคอลัมน์เป็นs(s>32)มีที่มีตัวเลขลอยจุดระหว่าง 33 และ 126 มันจะถูกปัดเศษโดยปริยายจำนวนเต็มและแปลงเป็นตัวอักษร ASCII sเมื่อมันตัดแบ่งกับสตริง (:)'ตรงนี้กับอาร์เรย์ของตัวละครในแนวนอน

ทดสอบที่นี่!


1
การปัดเศษโดยนัย! ดี
Luis Mendo

4

Python 2, 123 122 118 114 98 ไบต์

ผู้ชายฉันหวังว่าจะrandomไม่แพงมาก (และเราไม่ต้องกรองช่องว่าง) ตอนนี้เรามีเงินออมจำนวนมากจากการได้รับอนุญาตให้มีอักขระตัวเลขในตอนท้าย :) อย่างไรก็ตามยังไงต่อไป

from random import*
f=lambda s,n:s and(' '<s[0])*eval('s[0]'+'+chr(randint(32,126))'*n)+f(s[1:],n)

4

JavaScript (Firefox 30+), 96 ไบต์

(s,n)=>s.replace(/. */g,x=>x[0]+String.fromCharCode(...[for(_ of Array(n))Math.random()*95+32]))

Pure ES6 ยาวกว่าสองไบต์:

(s,n)=>s.replace(/. */g,x=>x[0]+String.fromCharCode(...[...Array(n)].map(_=>Math.random()*95+32)))

นี่เป็นวิธีที่ยอดเยี่ยมจริงๆซึ่งมีความยาวมากกว่า 26 ไบต์:

(s,n)=>String.raw({raw:s.split` `.join``},...[for(_ of s)String.fromCharCode(...[for(_ of Array(n))Math.random()*95+32])])

การพูดอย่างเคร่งครัด/. *(?=.)/ไม่สามารถใช้กับสตริงที่เริ่มต้นหรือลงท้ายด้วยช่องว่างไม่ใช่ทุกคนที่ใส่ใจ (ตอนนี้คุณยังได้รับอนุญาตให้ใช้อักขระสุ่มต่อท้าย)
Neil

@Neil ตัวอักษรแบบต่อท้ายได้รับอนุญาตหรือไม่ ฉันเดาว่าฉันสามารถลบ(?=.)ที่ดูแลช่องว่างท้ายสตริงได้
ETHproductions

ข้อมูลจำเพาะไม่ชัดเจน แต่ฉันคิดว่าคุณควรหลีกเลี่ยงการแทรกช่องว่างดังนั้น94+33แทนที่จะเป็น95+32
edc65


3

CJam , 21 18 ไบต์

lS-(ol~f{{95mrSc+\}*}

ลองออนไลน์!

พิมพ์nตัวอักษรต่อท้ายแบบสุ่ม

คำอธิบาย

lS-        e# Read line and remove spaces.
l~         e# Read and evaluate another line.
f{         e# For each character (passing in N)...
  {        e#   Do this N times...
    95mr   e#     Push random integer in [0, 95).
    Sc+    e#     Add to space character, giving a random printable ASCII character.
  }*
}
           e# All characters remaining on the stack are printed implicitly
           e# at the end of the program.

3

Bash, 124 ไบต์

bash + coreutilsบริสุทธิ์ไม่มีโครงสร้างการไหลของการควบคุมไม่มีภาษาย่อยไม่มี "Eval"

แข็งแรงเล่นกอล์ฟ

E() { N=${1// /};paste <(fold -1<<<$N) <(tr -cd "\\40-\\176"<\/dev\/urandom|head -c$(($2*${#N}-$2))|fold -$2)|tr -d '\t\n';}

ทดสอบ

>E "The treasure is here" 2
TkZhf(e&Rt@FrS,edha+-sJTuh.rX@eVKi+3s<7hftey8r*/e

3

Q / KDB +, 39 36 34 ไบต์

raze{""sv(raze x;`char$40+n?87)}prior s
(,/)({""sv((,/)x;`char$40+n?87)}':)s

(,/)({""sv((,/)x;10h$40+n?87)}':)s

ตัวแปรที่ใช้:

s:"The treasure is here"
n:2

สิ่งนี้ใช้คำวิเศษณ์ก่อนหน้าซึ่งใช้ฟังก์ชันกับสิ่งที่เหลืออยู่ระหว่างแต่ละรายการทางด้านขวาและบรรพบุรุษ (โดยพื้นฐานแล้วใช้ฟังก์ชั่นทางซ้ายระหว่างตัวละครแต่ละตัวทางด้านขวา)

สร้างตัวเลขสุ่มจำนวน n ระหว่าง 40 ถึง 126 จากนั้นแปลงเป็นอักขระเทียบเท่า: (q ดูเหมือนจะมีเพียงอักขระสำหรับสิ่งเหล่านี้)

`char$40+n?87

//Possible characters.
()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~

ตัวอย่างผลลัพธ์:

TVghrveVp Rpti+r0sea3a9nsIjuRXrAReJ; +di=ys`{ ikhKTe4trTZesz

แก้ไข:
บันทึก 3 ไบต์โดยแปลง raze ของ q เป็น (, /) โดยใช้สัญลักษณ์ k และเปลี่ยนไปในทำนองเดียวกันก่อนหน้า `: ขอบคุณ @slackwear สำหรับการอัปเดตโกน 2 ไบต์ :)


1
สามารถบันทึกสองสามไบต์โดยการหล่อด้วย10h$
skeevey

2

Java 8, 114 ไบต์

แข็งแรงเล่นกอล์ฟ

(n,s)->s.chars().forEach((c)->{if(c>32)for(int i=0;i<=n;)System.out.print((char)(++i==1?c:33+Math.random()*94));})

แลมบ์ดาที่ยอมรับจำนวนเต็มและสตริง แรงบันดาลใจจากคำตอบของ Java 7, double loop โดยใช้ Java 8 Stream syntax ( String.chars) เพื่อบันทึกสองสามไบต์

อินพุต

3, "Hello world!"

เอาท์พุต

HfKIedb3l<-Ul%}vod"Bw\"|oa`%rH-}l/-{dMS;!B#X

2

สกาลา, 95 94 ไบต์

def c(s:String,i:Int)=s.filter(_>32).mkString(scala.util.Random.alphanumeric.take(i).mkString)

ไม่มีอะไรแฟนซีมากไปกว่าการใช้ mkString บน String มันถือว่าสตริงเป็นรายการของตัวละครและช่วยให้ฉันแทรกคั่นระหว่างพวกเขา ตัวคั่นของฉันคือจำนวนตัวอักษรและตัวเลขที่สร้างขึ้นแบบสุ่ม


ไม่ค่อยตอบคำถาม ลักษณะของความRandom.alphanumericประสงค์จะทำให้แต่ละอันเป็นเหมือนกันดังนั้นมันจึงเป็นตัวเลขที่อ่อนแอ ... ดูตัวอย่างนี้:scala> c("Hello", 1) res0: String = Hbeblblbo
Jacob

BTW, filterคุณสามารถเอา การเรียกmkStringใช้สตริงจะถือว่าเป็นชุดอักขระ
จาค็อบ

@Jacob ตัวกรองเป็นวิธีที่มีประสิทธิภาพที่สุดที่ฉันสามารถนึกถึงในการลบช่องว่างออก ฉันปล่อยให้สุ่มตามที่มันดูเหมือนจะเพียงพอ แต่ถ้าฉันมีเวลาฉันจะเพิ่มฟังก์ชันแยกต่างหากสำหรับข้อความสุ่มที่เหมาะสม
อีธาน

2

> <> (ปลา), 107 106 103 ไบต์

<v}:{r&" "
1xv+
2<v+
v}<
<~v!?=&:&:
6.>ol2-?!;a
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o-+
^3<v ~}}r]~<
.40<

ลองออนไลน์!

มันไม่ใช่การสุ่มแบบสุ่ม แต่เป็นการสุ่ม เพียงวางสตริงและจำนวนเต็มลงในสแต็ก (ตัวอย่าง: "Hello world!", 5)

Input: "Hello world!", 5
Output: H^\^]^eceeedldcdeclgfffhowhhfggojkkkkrdccedl]]\]\d

คำอธิบายแบบเต็ม

นี่เป็นรหัสรุ่นเก่ากว่าเล็กน้อยจนกว่าฉันจะอัปเดตคำอธิบาย มันเหมือนกันส่วนใหญ่อ่านได้ง่ายขึ้นนิดหน่อย:

< v}:{r&" "
+1xv
+2<v
   }
:&:<~ v!?=&
?!;a6.>ol2-
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<

เราจะแกล้งว่าพารามิเตอร์สตริงคือsและพารามิเตอร์จำนวนเต็มiพารามิเตอร์จำนวนเต็มคือ

< v}:{r&" "

ตัว<บอกให้ปลาเคลื่อนตัวไปทางซ้ายทันทีซึ่งล้อมรอบไป" "ด้วยซึ่งจะเพิ่มช่องว่างลงในสแต็ก จากนั้นปลาจะเดินทางไป&ซึ่งจะเป็นการเพิ่มพื้นที่ลงทะเบียน rย้อนกลับสแต็กและ{:}เลื่อนสแต็กไปทางซ้าย (วางiที่ส่วนท้ายของสแต็ค) คัดลอกค่าที่ส่วนท้ายของสแต็กจากนั้นเลื่อนไปทางขวา vบอกให้ปลาเริ่มเคลื่อนตัวลง

+1xv
+2<v
   }

xบอกให้ปลาเคลื่อนที่ไปในทิศทางที่สุ่มในที่สุดทำให้ปลาเดินไปทางขวาและลงไปเรื่อย ๆ หรือผ่าน1+หรือ2+ก่อนหน้า เหล่านี้เพิ่ม 1 หรือ 2 ตามลำดับไปยังหมายเลขในตอนท้ายของสแต็ค หากปลาเดินทางขึ้นไปมันจะชนvอีกครั้งและถอยหลังลง }เลื่อนสแต็กไปทางขวาจากนั้นให้iอยู่ที่ตำแหน่งที่ 1 บนสแต็กและตัวแปรใหม่นี้ที่ตำแหน่ง 0 (เราจะเรียกมันว่าm)

:&:<~ v!?=&

ในส่วนนี้จะเป็นฟังก์ชั่นขอเรียกว่าwhitespaceTrimmer มันเริ่มต้นตรงไหน<เป็น มันจะแยกช่องว่างที่อยู่ที่ท้ายสแต็ก (ดังนั้นจุดเริ่มต้นของสตริง) จนกระทั่งมันทำงานเป็นอักขระที่ไม่ใช่ช่องว่าง

ดังนั้นทันทีที่ปลาแหวกว่ายเข้า<และต้องเดินทางไปทางซ้าย จากนั้นมันก็วิ่งเข้ามา:&:&ซึ่งคัดลอกค่าที่ส่วนท้ายของสแต็กวางพื้นที่จากรีจิสเตอร์ไปยังจุดสิ้นสุดของสแต็กคัดลอกจากนั้นวางกลับไปที่รีจิสเตอร์

จากนั้นปลาก็ชน=?!v ~กันหรือเจาะจงเป็นพิเศษ=ซึ่งโผล่ออกมาสองค่าสุดท้าย (ทั้งสองที่เราเพิ่งสร้าง) ออกจากสแต็กเปรียบเทียบกับพวกมันวาง 1 ที่ส่วนท้ายของสแต็กถ้าพวกมันเท่ากันและ 0 บน จุดสิ้นสุดของสแต็กหากพวกเขาแตกต่างกัน ?ปรากฏค่าใหม่ออกจากปลายสแต็คถ้ามันเป็น 0 ก็ไม่ได้ดำเนินการตามคำแนะนำต่อไปซึ่งในกรณีนี้คือ!มันแทนรันvซึ่งคำสั่งซื้อปลาที่จะย้ายลง (ออกจากฟังก์ชั่น)

หากเป็น 1 อย่างไรก็ตามจะพบช่องว่างจึงทำการประมวลผล!ซึ่งเป็นแทรมโพลีนและทำให้ปลาข้ามคำสั่งถัดไปซึ่งก็คือ a vดังนั้นปลาจะดำเนินต่อไป ที่ด้านหน้าของปลาจะเห็น~ว่ามันบอกให้ป๊อปอัพค่าสุดท้ายออกจากสแต็ค (ยืนยันว่าจะเป็นช่องว่าง) จากนั้นปลายังคงดำเนินต่อไปและทำงานฟังก์ชั่นอีกครั้ง

?!;a6.>ol2-

ปลาจะถูกบอกให้ว่ายทันทีโดย a >จากนั้นออกอักขระสุดท้ายในสแต็กด้วยo(ซึ่งครั้งแรกที่เรียกใช้นี้คืออักขระแรกของs) จะได้รับความยาวของสแต็คจากที่l, สถานที่2ที่สิ้นสุดของสแต็คแล้ว-ทำให้เกิด 2 lจะถูกหักออกจาก มันกระทบ?!;ซึ่งการจำสิ่งที่?ทำให้ปลาข้าม!หากกองว่างเปล่าและลงจอดบน;ซึ่งจบโปรแกรม

การติดตามหากยังมีอักขระอยู่ในสแต็กเราเรียกใช้งาน!ซึ่งทำให้ปลาเด้งข้าม;และดำเนินการa6.ซึ่งจัดเก็บa(AKA 10) และ6ที่ส่วนท้ายของสแต็กซึ่งเป็นx, yพิกัดสำหรับ.ซึ่งจะปรากฏขึ้นเมื่อสิ้นสุด สแต็คจากนั้นเคลื่อนย้ายปลาไปที่10, 6และดำเนินการคำสั่งทางด้านขวาของตำแหน่งนั้น (ขณะที่ปลากำลังว่ายน้ำ)

มันซับซ้อนน้อยกว่าฟังดูเมื่อคุณรู้ว่าyตำแหน่งที่ 6 เป็นเส้นด้านล่างนี้ xตำแหน่งที่ 10 นั้นคือvและทางด้านขวาของซึ่งก็คือไม่มี -op นี่เป็นสาเหตุที่ปลาจะว่ายต่อไปอย่างถูกต้องและเริ่มดำเนินการจริงที่จุดเริ่มต้นของบรรทัด ...

:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<

นี่คือฟังก์ชั่นที่เพิ่มข้อความแบบสุ่มระหว่างตัวละคร มันเป็นคำหนึ่งเล็กน้อย แต่นั่นเป็นเพียงเพราะฉันพยายามทำให้มันสุ่มเพิ่มขึ้นเล็กน้อย เรียกสิ่งนี้ว่า genRandomCharsกัน

นี่:{{:}l1-[rvคือการตั้งค่าสำหรับฟังก์ชั่นและส่วนหนึ่งของฟังก์ชั่นจริงนั้นเอง ปลาแรกแหวกว่าย:{{ซึ่งคัดลอกค่าที่ส่วนท้ายของสแต็กจากนั้นเลื่อนไปทางซ้ายสองครั้ง หากคุณจำได้ว่าiอยู่ในตำแหน่งที่ 1 ในสแต็กคุณก็จะรู้iตอนนี้อยู่ที่ส่วนท้ายของสแต็ก

จากนั้นปลาจะแหวกว่ายไป:}ที่สำเนาiใดและเลื่อนสแต็กไปทางขวาวางiทั้งที่จุดเริ่มต้นและจุดสิ้นสุดของสแต็ก l1-[ให้ปลาวางความยาวที่ส่วนท้ายของสแต็กลบ 1 จากนั้น[สร้างสแต็คใหม่ย้ายค่าl-1(ความยาวสแต็กลบ 1) ไปที่สแต็กใหม่ (ดังนั้นเพียงปล่อยiให้สแต็คเก่า) จากนั้นปลาก็กระทบrvซึ่งจะทำให้สแต็กกลับมาอีกครั้ง (ฉันคิดว่าการสร้างสแต็กใหม่จะทำให้มันกลับด้านด้วยเหตุผลบางอย่าง) และสั่งให้ปลาลงไปว่ายน้ำอีกครั้งโดยเริ่มจากหน้าที่<ด้านล่าง

ดังนั้นในตอนท้ายของสแต็กมีmและของเราชั่วคราวitiซึ่งเราจะเรียก ทันทีที่ปลาแหวกว่าย1-}ซึ่งจะลบ 1 จากtiและย้ายไปที่จุดเริ่มต้นของสแต็ก จากนั้น:}ซึ่งเพียงคัดลอกmและย้ายไปยังจุดเริ่มต้นของสแต็กtiที่ตำแหน่งสแต็ก 1)

นี่คือเมื่อเราตีสิ่งเล็ก ๆ น้อย ๆ นี้:

v2<
<1x|!
^3<

นี่มันง่ายมากที่ตายแล้ว !สาเหตุที่ทำให้ปลาที่จะข้ามไป|xและดำเนินการ จดจำสิ่งที่xไม่เราจำไว้ว่านี้ทำให้ย้ายปลาใน 4 ทิศทาง |เป็นเพียงกระจกเงาและทำให้ปลากลับมาว่ายน้ำได้xได้ ดังนั้นโดยพื้นฐานแล้วปลาจะวาง 1, 2 หรือ 3 ลงบนปลายสแต็คแล้วเคลื่อนที่ต่อไปทางซ้ายพันรอบ

จากนั้นปลาจะทำการประมวลผล*+oซึ่งทำให้ค่าสองค่าสุดท้ายในสแต็กถูกแตกออกคูณด้วยกันและผลลัพธ์จะดันกลับมาจากนั้นสิ่งเดียวกันด้วยการเพิ่มจากนั้นค่าสุดท้ายจะถูกตอกออกจากสแต็กและส่งออกด้วยoและเอาท์พุทด้วย สแต็คของเราอยู่ในขณะนี้ค่อนข้างปกติอีกครั้งที่มีเพียง [ m, ti,s ]

:}}:ทำให้ค่าที่ส่วนท้ายของสแต็ก (โดยทั่วไปsตำแหน่ง 0) ot ถูกคัดลอกจากนั้นสแต็กจะถูกเลื่อนไปทางขวาสองครั้ง (วางtiที่ด้านหน้าอีกครั้ง) จากนั้นtiจะถูกคัดลอก ?!vน่าจะเข้าใจได้ง่ายในตอนนี้ โดยทั่วไปถ้าtiเป็น 0 เราจะออกจากฟังก์ชั่นด้วยvมิฉะนั้นเราจะดำเนินการ!และข้ามv (ทำลูปอื่น)

ถ้า tiเป็น 0 และเราทำการส่งออกอักขระสุ่มเล็กน้อยแล้วเราจะดำเนินการvและดู:

   v ~}}r]~<
.43<

ไม่มีอะไรแฟนซีเกินไปที่นี่ เราจะลบจากสแต็คผ่านทางti ~จากนั้น]เป็นของใหม่จะดึงค่าทั้งหมดของเราออกจากสแต็กและวางลงบนสแต็กเก่า! เนื่องจากปัญหาการกลับรายการที่เราย้อนกลับด้วยrแล้วเปลี่ยนสแต็คขวาสองครั้งด้วย}}~, shufting สแต็คไปทางขวาให้เรา [ m, i, s] ที่~คือการลบพิเศษซ้ำs[0]จากก่อนหน้านี้ในฟังก์ชั่นที่เราจะต้องได้ถ้า เรากำลังทำลูป (แต่เราไม่ใช่เรากำลังออก) vบอกให้ปลาแหวกว่ายแล้วเข้า>34.(กลับหัวเพื่อแสดงลำดับการประหารชีวิต) ซึ่งบอกให้ปลาว่ายง่ายๆว่ายไปทางซ้ายและเข้า3, 4(เพราะตัว.เป็นการกระโดด!) 3, 4อันที่จริงเป็นเพียงทางด้านขวาของการเริ่มต้นwhitespaceTrimmerซึ่งสมบูรณ์แบบเพราะเรากำลังเดินทางไปทางซ้าย

ตามตรรกะทั้งหมดนี้เราสามารถติดตามปลาได้จนกว่าสแต็กจะว่างเปล่าในที่สุดและโปรแกรมจะออกหลังจากwhitespaceTrimmerทำงาน


อืมฉันไม่เห็นว่าตัวละครต้องพิมพ์ได้ สิ่งนี้จะต้องมีการดัดแปลงเล็กน้อยซึ่งอาจทำให้สุ่มน้อยลง
redstarcoder

มันไม่ได้ดูสุ่มน้อยไปกว่านี้เลย ฉันเชื่อว่ามันควรจะทำงานในกรณีส่วนใหญ่ฉันยังไม่ได้ล้มเหลว มันจะทำงานร่วมกับตัวพิมพ์ใหญ่หรือตัวอักษรตัวเล็กใด ๆ แน่นอนและสัญลักษณ์บางอย่าง ฉันค่อนข้างมั่นใจว่าสิ่งนี้ตรงตามข้อกำหนดของความท้าทาย
redstarcoder

2

Perl 5, 81 ไบต์

($_,$n)=<>;chomp;y/ //d;$\=chop;print map{$_,map{chr 33+int rand 94}1..$n}split//

ฉันหวังว่าสิ่งต่อไปนี้จะช่วยให้คุณเข้าใจสิ่งที่สายการบินเดียวทำ:

($_, $n) = <STDIN>;  # Reads in the string into $_,
                     # and the number into $n, from standard input.
                     # (<STDIN> works slightly different from <>.)
chomp($_);           # Removes the newline from the string.
$_ =~ tr/ //d;       # `Tr/`ansliterates ASCII space characters
                     # into nothing, effectively `/d`eleting them.
$\ = chop($_);       # Chop()s off the last character out of $_ and
                     # appends it to the output when print()ing.
                     # (Perl always prints $\ after you call print().)
print( map {         # Each element of [List 1] will be mapped to:
    $_,              #   -- Itself, and
                     # (When mapping, each element is available as $_.)
    map {            # (`map` resembles `foreach` but returns a list.)
        chr(         #   -- A random ASCII character, in the range
          33 + int(rand(94)) ) # from 33 (!, hex 21) to 126 (~, hex 7E)
    } 1..$n          # ...$n times! (Over the range 1 to $n, actually.)
} split(//, $_) );   # [List 1] is $_, split() into characters.

1

Clojure, 126 123 118 122 117 ไบต์

(defn c[m n](apply str(remove #(=\space %)(mapcat #(apply str %(for [_(range n)](char(rand-nth(range 32 127)))))m))))

แผนที่เหนือข้อความแทรกตัวอักษรแบบสุ่มจากนั้นต่อผลลัพธ์

คำแนะนำแนะนำว่าควรเว้นช่องว่างทั้งหมดจากสตริงผลลัพธ์ หากควรเว้นช่องว่างจากข้อความต้นฉบับเท่านั้นฉันสามารถเปลี่ยนได้

Ungolfed:

(defn cipher [message n]
  (apply str
    (remove #(= \space %)
        (mapcat #(apply str %
                     (for [_ (range n)]
                       (char (rand-nth (range 32 127)))))
                message))))

1

Python 3, 127 ไบต์

import random
a,b=input(),input()
print(''.join([x+''.join([chr(random.randint(33,126))for c in range(int(b))]) for x in a]))

อาจเป็นไปได้นานกว่าที่จำเป็น แต่นี่คือเหมืองของฉันจนถึงตอนนี้


1
สิ่งนี้จะเพิ่มตัวอักษรแบบสุ่มที่ด้านหน้าของตัวละครตัวแรกและช่องว่างไม่ได้ถูกตัดแต่ง ฉันคิดว่าทั้งสองสิ่งนี้ผิดกฎ
Stewie Griffin


1

Python 3, 133 ไบต์

from random import *
c=int(input())
print(''.join([i+''.join([chr(randint(33,126))for i in range(c)])for i in input().strip(' ')])[:-c])

1

Node.js, 88 ไบต์

(s,n)=>s.replace(/./g,c=>c!=" "?c+crypto.randomBytes(n).toString`base64`.substr(0,n):"")

ตัวอย่างผลลัพธ์:

f("The treasure is here", 2)
// THphdwekAtMArbSeU1aDTsZWuqnr2yek1iyUsKshqXewvrVCeTi

f("The treasure is here", 2)
// TYshlcep6t4Iru7e29aQ1sl/uvQrlzeSJihysDhhOLe1urpte1m

ลองออนไลน์!


1

C, 102 100 ไบต์

-2 continueไบต์สำหรับการกระโดดข้าม

i;f(char*s,int n){do{while(*s==32)++s;putchar(*s);i=n;while(i--)putchar(32+rand()%95);}while(*s++);}

Ungolfed:

i;
f(char*s,int n){
 do{
  while(*s==32)++s;
  putchar(*s);
  i=n;
  while(i--)
    putchar(32+rand()%95);
 }while(*s++);
}

การใช้งาน:

main(){
  char a[]="A   A A";
  f(a,3);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.