Mutasyona uğramış kaynak kodunu kurtar


27

Küçük bir radyum örneği, bir elektrik kesilmiş balina ve üç sakızlı ayı içeren çok sıradışı bir kazada, The Management ™ 'in kaynak kodunun bir kısmı değiştirildi. Çok az Management ™ 'ın patronu biliyor mu, aslında Management ™' ın "kötü" planlarını engellemek amacıyla sorumlu olan Cops © idi. Öyleyse, Robbers® orijinal kodu almak için işe alındı, çünkü kim bazen kötülükten hoşlanmaz?

not: Bu zorluk, Kaynak Kodunu Çözmeden büyük ölçüde esinlenmiştir .

Açıklama

Bu bir mücadelesi.

  • Polisler gerçekleştirdiği Görev 1. (ve ayrıca gerçekleştirdiği Görev 2. ancak gizli tutulur bir programı yazmak) bir programı (mutasyona uğramış kodu) yazacak.
  • Soyguncular "mutasyon" ters girişiminde ve kod olduğunu gerçekleştirdiği Görev 2. içine bu orijinal kodu değişecektir.

Bu zorlukta, Görev # 1, asal sayının çıktısının alacak , Görev # 2 de , nFibonacci sayısının çıktısını alacak . Fibonacci dizisi ( n=11; n=21; n=32; ...) ve asal sayılar ( n=12; n=23; n=35; ...) olarak tanımlanır.

Polislerin amacı, Görev # 1 ve Görev # 2'yi tamamlayan programlar arasındaki farkı asgariye indirirken, soyguncuların Görev # 2'yi tamamlayan kodu yeniden oluşturmasını engellemektir.

Polis Kuralları

Polisler iki program yazacaktır (Görev # 1'i tamamlayan ve Görev # 2'yi tamamlayan bir program) ve aşağıdaki bilgileri herkese açık hale getirecektir:

  • İlk program (bu çıktıları nasal sayı)
  • Levenshtein düzenlemek mesafesi ilk program ve ikinci programı arasında
  • Her iki programın da yazıldığı programlama dili (her iki program için aynı dilde olmalıdır)

Her iki program için aşağıdaki kısıtlamalar geçerlidir:

  • 128 karakter uzunluğunda veya daha kısa olmalıdır.
  • Yalnızca yazdırılabilir ASCII (ayrıca izin verilen yeni satırlar) kullanmaları gerekir.
  • Çalıştırmak için 10 saniyeden daha az zaman almaları gerekir n=45ve herhangi biri için doğru çıktıyı üretmeleri gerekmez n>45.
  • Herhangi bir karma veya şifreleme işlevi kullanmamalıdırlar.

Soyguncu Kuralları

Soyguncusu, polis tarafından belirtilen düzenleme mesafesindeki polisin programını (Görev # 1'i tamamlayan) Görev # 2'yi (mutlaka polis tarafından yazılmış orijinal program değil) tamamlayan bir program olarak değiştirmeye çalışacaktır.

Önceden kırılmış bir gönderim tekrar kırılamaz (yalnızca gönderimi kesen ilk hırsız kredi kazanır).

Bir gönderimi kırdıktan sonra, lütfen aşağıdakileri yapın:

  • Dili, çözümünüzü ve orijinal cevabın bağlantısını sağlayan bu zorluğun beraberindeki soruya (link) bir cevap gönderin .
  • Gönderdiğiniz cevabınıza bağlanan "Çatlak" metinli bir yorum bırakın .
  • Düzenleme ayrıcalıklarına sahipseniz polisin yanıtını düzenleyin (yapmazsanız, gerekli ayrıcalıklara sahip başka birinin sizin için yapmasını bekleyin veya bir düzenleme önerin).

puanlama

Bir polisin programı 1 hafta boyunca izsiz kalırsa, polis, Görev # 2'yi (belirtilen düzenleme mesafesindeki) tamamlayan orijinal kodu gönderebilir ve gönderim daha sonra "güvenli" olarak kabul edilir. En küçük düzenleme mesafesine sahip olan güvenli gönderim kazanacaktır. Beraberlik durumunda en kısa program (Görev # 1'i tamamlayan orijinal) kazanır. İki gönderi hala bağlıysa, daha önce kaydedilmiş olan kazanır.

Bir soyguncu, bir polisin gönderimini başarılı bir şekilde kırarsa, soyguncunun puanı, bu gönderinin düzenleme mesafesi kadar artar. Örneğin, 3 düzenleme mesafesine ve 5 mesafeye sahip bir gönderimi kıran bir soyguncu 8 puan kazanır. En yüksek puana sahip hırsız kazanır. Beraberlik durumunda, ilk önce puanı alan hırsız kazanır.

Liderler Sıralaması

  1. Yakut, 6 (histokrat)

Levenshtein mesafesini hesaplamak için küçük bir araç


1
1. Fibonacci numarası nedir? 0 mı 1 mi? Veya farketmez
kukac67

@ kukac67 1; Gönderiyi düzenledim.
Doorknob

Taşma durumunda programların çıktısı ne olmalıdır?
es1024

Tam bir program mı olmalı yoksa bir fonksiyon olabilir mi? İsimsiz bir fonksiyon ne olacak?
Tyilo

2
Bir "karma veya şifreleme işlevi" olarak ne sayılır? Eşyaları temeline çevirebilir miyim? Büyük üstel modulo büyük astarları alabilir miyim?
Martin Ender

Yanıtlar:


6

Python 2, mesafe = 8 [ kırık ]

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]

Nihayet bunu char limitinin altına aldım. Çok zor olmamalı ama fikrin ilginç olduğunu düşündüm.


Amaçlanan çözüm:

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]

Buradaki fikir onu kullanmaktı F(n+2) = 1 + (sum over F(k) from k = 1 to n)ve ardışık Fibonacci sayıları artardı. 1Azaltmak argüman sağlamak gerekiyordu +1.

Feersum farklı bir saldırı çizgisi bulmuşa benziyor!




4

Yakut, mesafe 6 [güvenli]

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

Kısa düzenleme mesafeleri olan formül çiftleriyle gelmek eğlencelidir, ancak bu yaklaşım daha etkili / can sıkıcı olabilir gibi görünüyor. Ne yaptığımı tam olarak anlayabilirsin, ama bu onu tersine çevirebileceğin anlamına gelmez.

Çözüm:

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

Açıklama:

Kod, Altın Oranı 11 ondalık basamağa kadar üretir ve Fibbonaci dizisini doğrudan hesaplamak için kullanır. Gerekli sayıda terimi doğru bir şekilde elde etmek için yeterli hassasiyet. Formülü biliyor olsaydın, o kısım hiç şaşırtmazdı. Kaba kuvvetin mutasyonlarımı tersine çevirmesini ve sabiti geri kazanmasını zorlaştırmak için, sekizlik gösterimi (baştaki 0) ve bilimsel gösterimi (4e10) kullandım. 1e11 yerine 4e10'a bölünmek, daha fazla .0bir nedenle, bir Bignum daha mantıklı gelse de, aslında her ne kadar herhangi bir nedenle Ruby'de bir Float'ta olduğu zaman, float bölünmesini zorlayacak bir şeye böldüm gibi görünüyor. Zekice davrandığımı sanıyordum p=, ancak yazdığım şekilde silebilirsiniz p. Yapabilirdim'p=İkinci satır p&&yerine kullanarak çözüm #, ama bunu düşünmedim.


eKaba kuvvet yaparken oraya bir aşağı sokmayı denemeyi düşünmedim . Gerçekten sinsi bir çözüm. :)
Vectörize

3

Python 2 - LD = 13 Kırık

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

İşleri başlatmak için hoş, kolay (umarım çok kolay değildir ) :)

Çok kolay oldu gibi görünüyor;) Yorumları kullanabileceğinizi unuttuğumu aptal hissediyorum: /



3

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

Bu daha okunaklı olabilir, ama importçok fazla bayt yedik, bu yüzden biraz golf oynamak zorunda kaldım.


2

Yakut, mesafe 14 ( Kırık )

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, Fibbonaci diziniz 0 ile başlıyor, kurallar 1 ile başlıyor. Aksi halde kontrol ediyor (benim hedeflediğim çözümden çok farklı olsa da).
histocrat

Tamam, düzeltildi. Fermat'ın btw'sini güzel kullanmak.
Vectorized


2

J, mesafe = 4 [güvenli]

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

Çözüm:

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

Yöntem:

Devam {. 2(x:)eden fraksiyonun paydası (+%)1 + 1 / (... (1 + 1 / (1 + 1 / (1 + 1 / (1))))).


1

Python 3, mesafe = 14 [ kırık ]

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)

Biraz yedek karakterim vardı, bu yüzden netlik için biraz boşluk bıraktım :)




1

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

>temsil STO→anahtarı ve $karekök sembolü temsil eder.


4
Bu karakterlerden bazıları yazdırılabilir ASCII gibi görünmüyor.
feersum

@ feersum Teşekkürler, düzeltildi. Mesafe hala 38.
Timtech

1

Python 2 - mesafe = 12 [ Kırık ]

Bunun nasıl sonuçlandığına sevindim.

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

Ne kadar sürdüğünü görelim ... Hala kırılacağını varsayıyorum.

Düzenleme: kısaltılmış kod küçük bir bit, işlem / mesafe üzerinde hiçbir etkisi yoktur.

Amaçlanan çözüm

Hiçbir yorum veya yeni satır değişikliği için gitmeye çalıştım.

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 - Mesafe = 14 [ Kırık ]


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)

Bunun ne kadar sürdüğünü göreceğiz ...


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.