การเข้ารหัสหน้าต่าง PI


13

นี่เป็นวิธีการเข้ารหัสอย่างง่ายที่ใช้ตัวเลข PI เพื่อเข้ารหัสข้อความวิธีการนี้ง่ายมาก:

กุญแจเป็นเพียงจำนวนเต็มบวกที่ระบุว่าหน้าต่างเริ่มต้นเมื่อใด:

ให้สตริงที่เข้ารหัสซึ่งประกอบด้วยตัวอักษรตัวพิมพ์เล็กเท่านั้นไม่มีช่องว่างคุณใช้ความยาวจากนั้นคุณจะพบตัวเลข Nth ของ PI จากนั้นดำเนินการเปลี่ยนอักษรทุกตัวไปทางด้านขวาตามจำนวนหลักที่ระบุ

ตัวอย่างเช่นหากกุญแจคือ2และฉันต้องการเข้ารหัสhouseฉันใช้หน้าต่าง 5 หลักจากที่สอง: 14159จากนั้นมันจะกลายเป็น:

h -> i
o -> s
u -> v
s -> x
e -> n

a.- โปรแกรม / ฟังก์ชัน / อัลกอริทึมของคุณจะได้รับสองพารามิเตอร์สตริงที่ประกอบด้วยตัวอักษรตัวพิมพ์เล็กเท่านั้นโดยไม่มีช่องว่างและคีย์ซึ่งจะเป็นจำนวนเต็มบวกระหว่าง 1 (1 หมายถึง 3) และ 1,000 ซึ่งอาจมากกว่า หรือน้อยกว่าเนื่องจากฉันไม่แน่ใจว่าต้องใช้เวลานานแค่ไหนในการคำนวณ PI ด้วยความแม่นยำดังกล่าวเนื่องจาก:

b.- คุณต้องคำนวณ PI ตัวเองในรหัสของคุณที่นี่เป็นหน้าเว็บเรียบร้อยเพื่อเปรียบเทียบกับวันพาย ข้อมูลที่ป้อนไม่ควรให้คุณคำนวณ PI เกิน 1,000 หลักซึ่งหมายถึงความยาว (ข้อความ) + แป้น <= 1,000

โดยการคำนวณ Pi ฉันหมายถึงไม่ได้ใส่รหัสในโค้ดของคุณ (โง่สำหรับรหัสกอล์ฟ) หรือใช้ค่าคงที่ใด ๆ ที่ฝังอยู่ในรหัสของคุณหรือรหัสประจำตัวตรีโกณมิติ (2 * acos (0)) หรือการอ้างอิงเว็บใด ๆ

c.- ผลลัพธ์จะเป็นเพียงสตริงเข้ารหัส

นี่เป็นคำถามเกี่ยวกับการเล่นกอล์ฟรหัสชนะที่สั้นกว่า!

ฉันจะยอมรับคำตอบที่ชนะในวันที่ 14 กรกฎาคม 2014


1
จะเกิดอะไรขึ้นเมื่อตัวอักษรเลื่อนไปจนจบตัวอักษร? การพันตัวไปจนถึงจุดเริ่มต้นของตัวอักษรเกิดขึ้นหรืออย่างอื่นหรือไม่?
Digital Trauma

1
ใช่คุณเพิ่งเริ่มใหม่ตั้งแต่ต้น
BrunoJ

6
อะไรคือ "คำนวณตัวเอง" ArcCos(-1)?
Martin Ender

1
ฉันอธิบายได้ดีกว่าสิ่งที่ฉันต้องการจะพูดด้วยการคำนวณด้วยตัวคุณเองและชี้ให้เห็นว่า 3 คือหลักแรก
BrunoJ

1
นี่ดูเหมือนจะเป็นอัลกอริธึมการเข้ารหัสที่ชาญฉลาดจริง ๆ ทำไมจึงไม่ใช้กันอย่างแพร่หลาย (ยกเว้นค่าคงที่ที่ซับซ้อนกว่าเช่น e ^ pi หรือสิ่งที่จำได้น้อยกว่า)
ASKASK

คำตอบ:


3

CJam - 51

l_,li(2e4,-2%{2+_2/@*\/2e2000+}*Ab><]z{~+_'z>26*-}%

อินพุตตัวอย่าง:

zebra
20

เอาท์พุท:

dkdxe

สิ่งนี้ใช้ได้กับ (ความยาวสตริง) + คีย์ <= 2000 แต่ค่อนข้างช้าสำหรับล่ามออนไลน์ (ยังเร็วกับล่าม java)

นี่คือรุ่นที่ใช้งานได้ถึง 200 และคุณสามารถลองที่http://cjam.aditsu.net/โดยไม่ต้องรอนานเกินไป:

l_,li(2e3,-2%{2+_2/@*\/2e200+}*Ab><]z{~+_'z>26*-}%

5

Python - 370

ตกลงที่ดีหนึ่งในที่สุดก็มีสิ่งที่ทำงานปี่ด้วยความขอบคุณไปlink1และlink2

from decimal import *
def f(s,n): 
 j=len(s)
 getcontext().prec=j+n+5
 d=Decimal
 e=d(0)
 for k in range(0,j+n+5): 
  e+=(d(16)**(-k)*(d(4)/(8*k+1)-d(2)/(8*k+4)-d(1)/(8*k+5)-d(1)/(8*k+6)))
 c=`e`.split("'")[1].replace('.','')
 t=''
 for i,l in enumerate(s):
  o=ord(l)
  for v in[0,32]:
   if 64+v<o<91+v:
    l=chr(((o-65-v)+int(c[i+n-1]))%26+65+v)
  t+=l   
 print t

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

>>> f('house',2)
isvxn

เเละอีกอย่าง:

Wimt fcy d dnyh uhkvkv qhvadil   

>>> f ('นี่เป็นข้อความลับมาก', 1)


1

JavaScript - 167 173 176

ขอบคุณMichaelสำหรับการแสดงถึงพลังที่ฉลาดถึง 16 คน

สิ่งนี้สามารถคำนวณ PI ได้สูงสุด 16 หลัก

function e(s,o){for(p=i=n=r='',m=1;s[+i];m<<=4,n>o?r+=String.fromCharCode(s.charCodeAt(i)-+-(1e15*p+'')[o+i++]):0)p-=(4/((d=8*n++)+1)-2/(d+=4)-1/++d-1/++d)/m;return r}

กรณีทดสอบ:

> e("house",2)
"isvxn"

แล้วเกี่ยวกับm=1และm<<=4แทนที่จะเป็นm='0x1'และm+=0? บันทึก 3 ไบต์
Michael M.

1

Python - 321 304 288 285

from decimal import*
d=Decimal
s,n=raw_input(),input()
l=len(s)
getcontext().prec=n+l
print''.join([chr((v-97)%26+97)for v in map(sum,zip(map(ord,s),map(int,str(sum([(d(4)/(8*k+1)-d(2)/(8*k+4)-d(1)/(8*k+5)-d(1)/(8*k+6))/16**k for k in range(0,l+n)])).replace('.','')[n-1:n+l])))])

เวอร์ชัน golfed ส่วนใหญ่อ่านและเข้าใจได้ง่าย บรรทัดสุดท้ายคือ ungolfed ด้านล่าง:

# Calculate PI using the BBP formula.
pi = 0
for k in range(0,l+n):
    pi += (d(1)/(16**k))*((d(4)/(8*k+1))-(d(2)/(8*k+4))-(d(1)/(8*k+5))-(d(1)/(8*k+6)))

# Remove the decimal point in PI.
pi = str(pi).replace('.','')

result = []
# For the ASCII sum of each pair of letters in `s` and its digit in PI 
for v in sum(zip(map(ord, s), map(int, pi))):
    result.append((v-97)%26+97)

# Convert all the ordinal values to characters
print ''.join(map(chr, result))

แก้ไข # 1: ทำให้การคำนวณทางคณิตศาสตร์ของฉันง่ายขึ้น

แก้ไข # 2: สร้างสูตร BBP อีกครั้ง


0

Haskell - 265 267 ไบต์ (ไม่มี IO)

p=g(1,0,1,1,3,3)where g(q,r,t,k,n,l)=if 4*q+r-t<n*t then n:g(10*q,10*(r-n*t),t,k,div(10*(3*q+r))t-10*n,l) else g(q*k,(2*q+r)*l,t*l,k+1,div(q*(7*k+2)+r*l)(t*l),l+2)
e i s=zipWith(\k c->toEnum$fromIntegral k+fromEnum c::Char)(take(length s)$drop(fromIntegral$i-1)p)s

pเป็นอัลกอริทึมรุ่น golfed ที่สามารถพบได้ที่http://rosettacode.org/wiki/Pi#Haskell

e เป็นฟังก์ชั่นการเข้ารหัส:

λ> e 2 "house"
"isvxn"

มันจะไม่วนรอบหากดัชนีอยู่นอกตัวอักษรตัวพิมพ์เล็ก ซึ่งหมายความว่าตัวละครอื่น ๆ สามารถลื่นในสตริงที่เข้ารหัส:

"Sfufv#Kork(mq}nns j{i&sv&xitmujtu&vey|h{xljej|35.)(\"%(\"\"&\" %\"\"$()$ ''\"&'!)$'(\"&($(\"& !$'&)]hrs\"ow olih7$Tdkhnsj ns&qpdlw}oplwmxbipn#o{ur!vhbp\"mitj/"

แต่น่าเสียดายที่มันใช้เวลาหลายวินาทีโดยมีออฟเซ็ตมากกว่า10 000การคำนวณเอาต์พุต โชคดีที่เมื่อใช้ออฟเซ็ตเดียวกันหลายครั้งตัวเลขจะต้องคำนวณในครั้งแรกเท่านั้น

โบนัส - การถอดรหัส

d i s=zipWith(\k c->toEnum$fromEnum c-fromIntegral k::Char)(take(length s)$drop(i-1)p)s

อีกครั้งถ้าเราทดสอบด้วยisvxn:

λ> d 2 "isvxn"
"house"

ทำผิดในส่วนโบนัสของคุณ d 2 "isvsn"ควรเป็นd 2 "isvxn"
Spedwards

แก้ไขแล้ว. ขอบคุณที่สังเกต
gxtaillon

0

CoffeeScript - 148 Chars / Bytes

รหัสกอล์ฟครั้งแรกของฉัน

น่าเสียดายที่มันไม่รองรับการห่อ (ดังนั้น az จะเป็นเครื่องหมายวรรคตอน)

e = (m, k) -> (m.split (''). map (v, i) -> String.fromCharCode v.charCodeAt () + parseInt Math.PI.toString () แทนที่ ('.', '') .slice (k-1 m.length + K-1) [ผม]). เข้าร่วม ( '')

สาธิตเกี่ยวกับCSSD

เรียกว่า:

แจ้งเตือน 'บ้าน', 2

isvxn


คุณอ่านคำถามทั้งหมดเนื่องจากระบุอย่างชัดเจนว่าคุณไม่ได้รับอนุญาตให้ "ใช้ค่าคงที่ใด ๆ ที่ฝังอยู่ในรหัสของคุณ"
core1024
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.