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


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!




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.


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: /



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.


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]


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

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))))))).


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 :)




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.


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



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 ...


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.