Pulihkan kode sumber yang dimutasi

27

Dalam sebuah kecelakaan yang sangat tidak biasa yang melibatkan sampel kecil radium, paus tersengat listrik, dan tiga beruang bergetah, beberapa kode sumber The Management ™ telah dimutasi. Atasan The Management ™ tidak tahu, sebenarnya para Polisilah yang bertanggung jawab, dalam upaya untuk menggagalkan rencana "jahat" Manajemen. Jadi Robbers® telah dipekerjakan dalam upaya untuk mengambil kode asli, karena siapa yang terkadang tidak suka menjadi jahat?

catatan: Tantangan ini sangat terinspirasi oleh Unscramble the Source Code .

Deskripsi

Ini adalah tantangan .

  • The polisi akan menulis sebuah program (kode bermutasi) yang melakukan tugas # 1 (dan juga menulis sebuah program yang melakukan tugas # 2, tapi dirahasiakan).
  • The perampok akan mencoba untuk membalikkan "mutasi" dan mengubah kode asli ini ke kode yang melakukan tugas # 2.

Dalam tantangan ini, Tugas # 1 akan menampilkan nbilangan prima th , dan Tugas # 2 akan menampilkan nbilangan Fibonacci th (yang entah bagaimana jahat, menurut Cops © pula). Urutan Fibonacci didefinisikan sebagai ( n=11; n=21; n=32;;)), dan bilangan prima didefinisikan sebagai ( n=12; n=23; n=35; → ) ...

Tujuan polisi adalah untuk meminimalkan perbedaan antara program yang menyelesaikan Tugas # 1 dan Tugas # 2, sekaligus mencegah para perampok menciptakan kembali kode yang menyelesaikan Tugas # 2.

Aturan Cop

Polisi akan menulis dua program (satu yang menyelesaikan Tugas # 1, dan satu yang menyelesaikan Tugas # 2), dan menjadikan informasi berikut ini publik:

  • Program pertama (yang menampilkan nbilangan prima th)
  • The Levenshtein mengedit jarak antara program pertama dan program kedua
  • Bahasa pemrograman tempat kedua program ditulis (harus bahasa yang sama untuk kedua program)

Batasan berikut berlaku untuk kedua program:

  • Panjangnya harus 128 karakter atau kurang.
  • Mereka hanya harus menggunakan ASCII yang dapat dicetak (ditambah baris baru, yang juga diperbolehkan).
  • Mereka harus berjalan kurang dari 10 detik n=45, dan mereka tidak diharuskan untuk menghasilkan output yang benar untuk apa pun n>45.
  • Mereka tidak boleh menggunakan fungsi hashing atau kriptografi.

Aturan Perampok

Perampok akan berusaha mengubah program polisi (yang menyelesaikan Tugas # 1) menjadi program yang menyelesaikan Tugas # 2 (tidak harus program asli yang ditulis oleh polisi) dalam jarak sunting yang ditentukan oleh polisi.

Pengajuan yang sudah-retak tidak bisa dipecahkan lagi (hanya perampok pertama yang memecahkan kiriman yang mendapat kredit).

Setelah memecahkan kiriman, silakan lakukan hal berikut:

  • Posting jawaban untuk pertanyaan yang menyertai tantangan ini (tautan) , berikan bahasa, solusi Anda, dan tautan ke jawaban asli.
  • Tinggalkan komentar dengan teks "Retak" yang menautkan ke jawaban Anda yang diposting.
  • Edit jawaban polisi jika Anda memiliki hak istimewa edit (jika tidak, tunggu sampai orang lain dengan hak istimewa yang diperlukan melakukannya untuk Anda atau menyarankan edit).

Mencetak gol

Jika program polisi tetap tidak terpecahkan selama 1 minggu, polisi dapat memposting kode asli yang menyelesaikan Tugas # 2 (dalam jarak edit yang ditentukan), dan pengiriman sejak saat itu dianggap "aman." Pengiriman aman yang memiliki jarak pengeditan terkecil akan menang. Dalam hal seri, program terpendek (asli yang menyelesaikan Tugas # 1) menang. Jika dua pengiriman masih terikat, satu yang diposting sebelumnya menang.

Jika seorang perampok berhasil memecahkan kiriman polisi, skor perampok naik oleh jarak pengeditan kiriman itu. Misalnya, seorang perampok yang memecahkan kiriman dengan jarak sunting 3 dan satu dengan jarak 5 menghasilkan 8 poin. Perampok dengan skor tertinggi menang. Dalam hal seri, perampok yang mendapatkan skor pertama menang.

Papan peringkat

  1. Ruby, 6 (histokrat)

Alat kecil untuk menghitung jarak Levenshtein

Gagang pintu
sumber
1
Berapa nomor Fibonacci 1? 0 atau 1? Atau apakah itu tidak masalah
kukac67
@ kukac67 Ini 1; Saya telah mengedit posting.
Gagang Pintu
Apa yang seharusnya menjadi hasil dari program, dalam kasus melimpah?
es1024
Haruskah itu program penuh atau dapatkah itu berfungsi? Bagaimana dengan fungsi anonim?
Tyilo
2
Apa yang dianggap sebagai "fungsi hashing atau kriptografi"? Bisakah saya mendasarkan konversi? Bisakah saya mengambil modulo eksponensial besar bilangan prima besar?
Martin Ender

Jawaban:

6

Python 2, jarak = 8 [ retak ]

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]

Akhirnya punya yang satu ini di bawah batas char. Seharusnya tidak terlalu sulit, tetapi saya pikir idenya menarik.


Solusi yang dimaksudkan:

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]

Idenya adalah untuk menggunakan itu F(n+2) = 1 + (sum over F(k) from k = 1 to n), dan fakta bahwa angka Fibonacci berturut-turut adalah coprime. The 1dalam mengurangi argumen seharusnya memberikan +1.

Sepertinya feersum menemukan garis serangan yang berbeda!

Sp3000
sumber
Cracked
feersum
5

J, distance = 5 [ Cracked ]

f=:3 :'{.p:|.i.y'

Pemakaian:

> f 45
197
grc
sumber
1
Cracked
randomra
4

Ruby, jarak 6 [aman]

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

Membuat pasangan rumus dengan jarak edit pendek itu menyenangkan, tetapi sepertinya pendekatan ini mungkin lebih efektif / menyebalkan. Anda mungkin mengerti persis apa yang saya lakukan, tetapi itu tidak berarti Anda bisa membalikkannya.

Larutan:

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

Penjelasan:

Kode menghasilkan Rasio Emas ke 11 tempat desimal dan menggunakannya untuk secara langsung menghitung urutan Fibbonaci. Ini cukup presisi untuk mendapatkan jumlah persyaratan yang diperlukan dengan benar. Bagian itu sama sekali tidak dikaburkan, jika Anda tahu rumusnya. Untuk membuatnya lebih sulit untuk secara brutal membalikkan mutasi saya dan memulihkan konstanta, saya menggunakan notasi oktal (terkemuka 0) dan notasi ilmiah (4e10). Membagi dengan 4e10 daripada 1e11 membuatnya tampak seperti saya membaginya dengan sesuatu .0untuk memaksa divisi float, ketika sebenarnya apa pun dalam notasi ilmiah adalah karena alasan tertentu selalu merupakan Float di Ruby, bahkan ketika Bignum mungkin tampak lebih masuk akal. Saya pikir saya pandai dengan p=barang - barang itu, tetapi cara saya menulisnya Anda bisa menghapus saja p. Saya bisa'p=solusi dengan menggunakan p&&bukannya #pada baris kedua, tapi saya tidak memikirkannya.

histokrat
sumber
Tidak terpikir untuk mencoba memasukkan di ebawah sana ketika melakukan kekerasan. Solusi yang sangat licik. :)
Vektor
3

Python 2 - LD = 13 Retak

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

Yang bagus, mudah (mudah-mudahan tidak terlalu mudah) untuk memulai segalanya :)

Sepertinya itu terlalu mudah;) Saya merasa agak konyol karena saya lupa Anda dapat menggunakan komentar: /

FryAmTheEggman
sumber
Retak.
Sp3000
3

Haskell, jarak = 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

Ini bisa lebih mudah dibaca, tetapi importmemakan terlalu banyak byte, jadi saya harus sedikit golf.

Zgarb
sumber
2

Ruby, jarak 14 ( Retak )

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]
histokrat
sumber
Retak?
Vectorized
Hm, urutan Fibbonaci Anda dimulai dengan 0, di mana aturan mengatakan mulai dengan 1. Jika tidak periksa (meskipun sangat berbeda dari solusi yang saya maksudkan).
histokrat
OK, diperbaiki. Penggunaan btw Fermat yang bagus.
Vectorized
2

CJam, jarak 10 (Cracked)

1l~{{)_mp!}g}*

Cukup pakai nSTDIN. Uji di sini.

Untuk referensi, solusi asli menggunakan yang langka j.

Asli:

T1]l~\{(_j\(j+}j

Martin Ender
sumber
1
Cracked
Optimizer
2

J, jarak = 4 [aman]

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

Larutan:

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

Metode:

Penyebut {. 2(x:)dari fraksi lanjutan (+%)1 + 1 / (... (1 + 1 / (1 + 1 / (1 + 1 / (1))))))).

randomra
sumber
1

Python 3, jarak = 14 [ retak ]

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)

Saya punya beberapa karakter cadangan jadi saya menaruh beberapa spasi kosong untuk kejelasan :)

Sp3000
sumber
Cracked
feersum
1

JAGL Alpha 1.2 - Distance = 16 [ Cracked ]

T~2S]{]S1{D[dmn}wDS}wSP

Seharusnya tidak terlalu sulit, Kita akan melihat apa yang terjadi ...

globby
sumber
Retak ?
matsjoyce
1

TI-BASIC , jarak 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

>mewakili STO→kunci dan $mewakili simbol akar kuadrat.

Timtech
sumber
4
Beberapa karakter ini tampaknya tidak dapat dicetak ASCII.
feersum
@feersum Terima kasih, diperbaiki.
Jaraknya
1

Python 2 - distance = 12 [ Cracked ]

Saya agak senang dengan bagaimana ini terjadi.

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()]

Mari kita lihat berapa lama ... Saya menganggap itu masih akan retak.

Sunting: kode singkat sedikit, tidak berpengaruh pada operasi / jarak.

Solusi yang dimaksudkan

Saya mencoba untuk pergi tanpa perubahan komentar atau baris baru.

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()]

PurkkaKoodari
sumber
Cracked
feersum
0

Python 3 - Distance = 14 [ Cracked ]


a,c,n=1,2,int(input())
while n-1:
 c+=1
 while 1!=list(map(c.__mod__,range(2,46))).count(0):
  c,a=a+c,a
 n-=1
print(c)

Kami akan melihat berapa lama ini berlangsung ...

matsjoyce
sumber
Cracked
feersum