กู้คืนรหัสที่กลายพันธุ์


27

ในอุบัติเหตุที่ผิดปกติอย่างมากที่เกี่ยวข้องกับตัวอย่างเรเดียมตัวอย่างวาฬแบบใช้ไฟฟ้าและหมีเหนียวสามตัวรหัสที่มาบางส่วนของ The Management ™ได้กลายพันธุ์แล้ว เจ้านายของ The Management ™รู้น้อยจริง ๆ แล้วมันเป็นตำรวจจริง ๆ ที่รับผิดชอบในความพยายามที่จะขัดขวางแผนการชั่วร้ายของ The Management ™ ดังนั้นRobbers®ได้รับการว่าจ้างในความพยายามที่จะเรียกคืนรหัสดั้งเดิมเพราะบางครั้งใครที่ไม่ชอบความชั่วร้าย

ทราบ: ความท้าทายนี้ได้แรงบันดาลใจอย่างมากจากการถอดรหัสรหัสที่มา

ลักษณะ

นี่เป็นความท้าทายของ

  • ตำรวจจะเขียนโปรแกรม (รหัสกลายพันธุ์) ที่ดำเนินงาน # 1 (และเขียนโปรแกรมที่ดำเนินงาน # 2 แต่จะถูกเก็บไว้เป็นความลับ)
  • โจรจะพยายามที่จะกลับ "กลายพันธุ์" และเปลี่ยนรหัสเดิมนี้เป็นรหัสที่ดำเนินงาน # 2

ในการท้าทายนี้งาน # 1 จะส่งออกnหมายเลขหลักที่สองและงาน # 2 จะส่งออกnหมายเลขฟีโบนักชี (ซึ่งเป็นสิ่งที่ชั่วร้ายตามที่ตำรวจระบุ) ลำดับ Fibonacci ถูกกำหนดเป็น ( n=11; n=21; n=32; ... ) และจำนวนเฉพาะถูกกำหนดเป็น ( n=12; n=23; n=35; ... ))

เป้าหมายของตำรวจคือการลดความแตกต่างระหว่างโปรแกรมที่ทำงานให้เสร็จ # 1 และภารกิจ # 2 ในขณะที่ป้องกันไม่ให้โจรสร้างรหัสที่ทำให้ภารกิจ # 2 สมบูรณ์

กฎของตำรวจ

ตำรวจจะเขียนโปรแกรมสองโปรแกรม (อันที่หนึ่งในภารกิจ # 1 เสร็จสมบูรณ์และอีกอันหนึ่งที่ทำงานในภารกิจ # 2 เสร็จสิ้น) และทำให้ข้อมูลต่อไปนี้เป็นแบบสาธารณะ:

  • โปรแกรมแรก (เอาท์พุทว่าnTH จำนวนเฉพาะ)
  • แก้ไข Levenshtein ระยะทางระหว่างโปรแกรมแรกและโปรแกรมที่สอง
  • ภาษาการเขียนโปรแกรมที่ทั้งสองโปรแกรมจะถูกเขียนใน (ต้องเป็นภาษาเดียวกันสำหรับโปรแกรมทั้งสอง)

ข้อ จำกัด ต่อไปนี้ใช้กับโปรแกรมทั้งสอง:

  • ต้องมีความยาวไม่เกิน 128 อักขระ
  • พวกเขาจะต้องใช้ ASCII ที่พิมพ์ได้เท่านั้น (รวมถึงบรรทัดใหม่ซึ่งได้รับอนุญาตด้วย)
  • พวกเขาจะต้องใช้เวลาน้อยกว่า 10 วินาทีในการวิ่งหนีและพวกเขาจะไม่จำเป็นต้องใช้ในการผลิตการส่งออกที่ถูกต้องสำหรับการใด ๆn=45n>45
  • พวกเขาจะต้องไม่ใช้ฟังก์ชันการแปลงแป้นพิมพ์หรือการเข้ารหัสลับใด ๆ

กฎของโจร

โจรจะพยายามเปลี่ยนโปรแกรมของตำรวจ (ซึ่งทำภารกิจ # 1 ให้เสร็จสมบูรณ์) เป็นโปรแกรมที่ทำภารกิจ # 2 ให้เสร็จสมบูรณ์ (ไม่จำเป็นต้องเป็นโปรแกรมดั้งเดิมที่เขียนโดยตำรวจ) ในระยะแก้ไขที่ตำรวจกำหนด

การส่งที่แคร็กแล้วไม่สามารถถอดรหัสได้อีก (เฉพาะโจรคนแรกที่ได้รับการอนุมัติเท่านั้น)

หลังจากแคร็กการส่งกรุณาทำต่อไปนี้:

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

เกณฑ์การให้คะแนน

หากโปรแกรมของตำรวจยังคงไม่ได้ทำการถอดแยกเป็นเวลา 1 สัปดาห์ตำรวจสามารถโพสต์รหัสต้นฉบับที่เสร็จสิ้นภารกิจ # 2 (ในระยะแก้ไขที่ระบุ) และการส่งนั้นถือว่าปลอดภัย " การส่งที่ปลอดภัยที่มีระยะทางแก้ไขน้อยที่สุดจะเป็นผู้ชนะ ในกรณีที่เสมอกันโปรแกรมที่สั้นที่สุด (ต้นฉบับที่ทำภารกิจ # 1 สำเร็จ) จะชนะ หากการส่งสองครั้งยังคงถูกผูกไว้

หากโจรประสบความสำเร็จในการส่งข้อมูลของตำรวจคะแนนของโจรจะเพิ่มขึ้นตามระยะการแก้ไขของการส่งนั้น ตัวอย่างเช่นโจรที่แตกการส่งด้วยระยะแก้ไขที่ 3 และอีกอันที่ระยะทาง 5 ได้รับ 8 คะแนน โจรที่มีคะแนนสูงสุดจะเป็นผู้ชนะ ในกรณีที่มีการเสมอกันโจรที่ได้คะแนนก่อนจะชนะ

ลีดเดอร์บอร์ด

  1. ทับทิม, 6 (มิชชั่น)

เครื่องมือขนาดเล็กเพื่อคำนวณระยะทาง Levenshtein


1
หมายเลขฟีโบนักชีอันดับที่ 1 คืออะไร? 0 หรือ 1 หรือไม่เป็นไร
kukac67

@ kukac67 มันคือ 1; ฉันแก้ไขโพสต์แล้ว
ลูกบิดประตู

ผลลัพธ์ของโปรแกรมควรเป็นอย่างไรในกรณีล้น
es1024

ต้องเป็นโปรแกรมเต็มรูปแบบหรือเป็นฟังก์ชั่นหรือไม่ ฟังก์ชั่นที่ไม่ระบุชื่อคืออะไร?
Tyilo

2
สิ่งใดที่นับว่าเป็น "ฟังก์ชันการแปลงแป้นพิมพ์หรือเข้ารหัสลับ"? ฉันสามารถแปลงสิ่งของพื้นฐานได้ไหม ฉันสามารถใช้เลขชี้กำลังจำนวนมากโมดูโลขนาดใหญ่ได้หรือไม่
Martin Ender

คำตอบ:


6

Python 2, ระยะทาง = 8 [ แตก ]

from fractions import*
n=input()
k,=P=[2]
while n>len(P):k+=1;z=reduce(lambda x,y:x*y,P,1);P+=[k]*(gcd(z,k)<2)
print P[-1]

ในที่สุดได้รับอันนี้ภายใต้ขีด จำกัด ถ่าน ไม่ควรยากเกินไป แต่ฉันคิดว่าความคิดนั้นน่าสนใจ


โซลูชันที่ตั้งใจไว้:

from fractions import* n=input() k,=P=[1] while n>len(P):k+=1;z=reduce(lambda x,y:x+y,P[:-1],1);P+=[z]*(gcd(z,k)<2) print P[-1]

แนวคิดก็คือการใช้สิ่งF(n+2) = 1 + (sum over F(k) from k = 1 to n)นั้นและความจริงที่ว่าตัวเลขฟีโบนักชีต่อเนื่องกันเป็น coprime ในอาร์กิวเมนต์ลดก็ควรที่จะให้1+1

ดูเหมือนว่า feersum พบแนวการโจมตีที่แตกต่างกัน!




4

ทับทิมระยะทาง 6 [ปลอดภัย]

require'prime';p Prime.take(n=gets.to_i)[-1]
#p (((807462154311276410)**n/(5**0.5)).round)

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

วิธีการแก้:

require'prime';p=Prime.take(n=gets.to_i)[-1] p (((0742154311276/4e10)**n/(5**0.5)).round)

คำอธิบาย:

รหัสจะสร้างอัตราส่วนทองคำให้เป็นทศนิยม 11 ตำแหน่งและใช้เพื่อคำนวณลำดับ Fibbonaci โดยตรง มีความแม่นยำเพียงพอที่จะรับจำนวนคำศัพท์ที่ต้องการ ส่วนนั้นไม่งงเลยถ้าคุณรู้สูตร ในการทำให้การเดรัจฉานบังคับให้ย้อนกลับการกลายพันธุ์ของฉันยากขึ้นและกู้คืนค่าคงที่ฉันใช้สัญกรณ์แปดฐาน (0 นำหน้า) และการคำนวณทางวิทยาศาสตร์ (4e10) การหารด้วย 4e10 มากกว่า 1e11 ทำให้มันดูเหมือนว่าฉันหารด้วยบางสิ่งบางอย่าง.0เพื่อบังคับให้การหารแบบลอยตัวเมื่อสิ่งใดก็ตามในสัญกรณ์ทางวิทยาศาสตร์มีเหตุผลบางอย่างที่ทำให้ Float ใน Ruby เสมอแม้ว่า Bignum อาจดูสมเหตุสมผลกว่า ฉันคิดว่าฉันฉลาดกับp=สิ่งต่าง ๆ แต่วิธีที่ฉันเขียนคุณสามารถลบpได้ ฉันสามารถ 'p=วิธีแก้ปัญหาโดยใช้p&&แทน#บรรทัดที่สอง แต่ฉันไม่คิด


ไม่ได้คิดว่าจะลองแทรกeลงไปที่นั่นเมื่อทำแบบเดรัจฉาน วิธีการลับๆล่อๆจริงๆ :)
Vectorized

3

Python 2 - LD = 13 แคร็ก

n=1;j=input();
while j>0:
    n+=1;j-=1;
    while~-all(n%i for i in range(2,n)):n+=1;
print n

เป็นคนดีง่าย (หวังว่าจะไม่ง่ายเกินไป ) เพื่อเริ่มต้นสิ่งใหม่ :)

ดูเหมือนว่ามันง่ายเกินไป;) ฉันรู้สึกค่อนข้างโง่ที่ฉันลืมคุณสามารถใช้ความคิดเห็น: /



3

Haskell, ระยะทาง = 13

import Data.List
x=id=<<snd(mapAccumL(\m n->(,)=<<(++m)$[n|and[n`mod`m1/=0|m1<-m]])[1+1][3..])
main=print.(!!)(0:2:x)=<<readLn

นี่อาจอ่านได้มากกว่า แต่importกินเยอะเกินไปฉันต้องตีกอล์ฟนิดหน่อย


2

Ruby ระยะทาง 14 ( แคร็ก )

p [x=2,y=1,*(1..200).map{|i|y==(y*x**(i-1)+x%2).divmod(i)[x-1]?i:1}].-([x-1])[gets.to_i-1]


หืมลำดับ Fibbonaci ของคุณเริ่มต้นด้วย 0 ซึ่งกฎบอกว่าจะเริ่มต้นด้วย 1 มิฉะนั้นเช็คเอาท์ (แม้ว่าจะแตกต่างจากโซลูชันที่ฉันตั้งใจ)
ฮิสโทแกต

ตกลงแก้ไขแล้ว ใช้ btw ของแฟร์มาต์อย่างดี
Vectorized


2

J, ระยะทาง = 4 [ปลอดภัย]

f =: 3 :  '{. (p:) (+) / 0 , y - 1x'

วิธีการแก้:

f =: 3: '{. 2 (x :) (+%) / 0, y $ 1x '

วิธี:

หาร{. 2(x:)ของเศษส่วนต่อเนื่อง(+%)1 + 1 / ( ... (1 + 1 / (1 + 1 / (1 + 1 / (1)))))


1

Python 3, ระยะทาง = 14 [ แตก ]

n = int(input())
P = [2]
k = 2
while n > len(P):
 k += 1
 for x in P:
  if k%x == 0: break
 else: P += [k]
print(k)

ฉันมีตัวอักษรว่างไว้ดังนั้นฉันจึงใส่ช่องว่างเพื่อความชัดเจน :)




1

TI-BASICระยะทาง 38

Input N:{2>L1:For(A,3,E99:If min(1=gcd(A,seq(A,A,2,$(A:A>L1(1+dim(L1:End:L1(N

>แสดงถึงSTO→คีย์และ$แทนสัญลักษณ์สแควร์รูท


4
อักขระบางตัวเหล่านี้ดูเหมือนจะไม่สามารถพิมพ์ได้ ASCII
feersum

@feersum ขอบคุณแก้ไขแล้ว ระยะทางยังคงอยู่ที่ 38
Timtech

1

Python 2 - distance = 12 [ แคร็ก ]

ฉันมีความสุขมากกับสิ่งที่เกิดขึ้น

f=lambda p,i:p if p[45:]else f(p+[i]if all(i%q for q in p[1:])else p,-~i)
print f([1,2,3],2)[input()]

เรามาดูกันว่ามันใช้เวลานานแค่ไหน ... ฉันคิดว่ามันจะยังแตกอยู่

แก้ไข:ย่อโค้ดให้สั้นลงเล็กน้อยไม่มีผลกับการทำงาน / ระยะทาง

แนวทางแก้ไขปัญหา

ฉันพยายามไปโดยไม่มีความคิดเห็นหรือการเปลี่ยนแปลงบรรทัดใหม่

f=lambda p,i:p if p[45:]else f(p+[p[i]+p[-2]]if all(i|q for q in p[1:])else p,-~i) print f([1,1,1],2)[input()]



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