Gizli Ters Çevirmeler (Polislerin İpliği)


35

Bu bir , soyguncuların ipliğini burada bulabilir .

Göreviniz , birbirlerinin anagramları olacak ve biri diğerinin sol tersini yapan iki program (veya işlev) yazacak . Bu programlar, istediğiniz kadar tam sayı veya karmaşık sayıyı kabul edebilir ve verebilir . Rakamları karakter noktası olarak almayı veya herhangi bir başka makul yöntemi seçerseniz, cevabınızı aldığınızı belirtmeniz gerekir. Eğer fonksiyon alanınızı sınırlandırmayı seçtiyseniz, cevabınızdaki sınırlı alanı da belirtmelisiniz.

Daha sonra ilk programı soyguncular bulmak için gizlenmiş sol tersi olan bir cevap şeklinde sunacaksınız.

Gösterilen programın bir enjektif işlevi yerine getirmesi gerekir (aksi takdirde gizli bir cevabın bulunması imkansız olur).

Cevabınız bir hafta içinde kırılmadıysa, gizli cevabı açığa çıkarabilir ve güvenli olarak işaretleyebilirsiniz . Güvenli cevaplar hırsızlar tarafından kırılamaz ve süresiz olarak kırılmaz kalacaktır.

Amaç, bayt cinsinden en kısa ve kırılmamış cevabı oluşturmak olacaktır.

Örnek

Girdiye bir tane ekleyen aşağıdaki python programını gösterebilirsiniz.

lambda x:~-x

Bir çözüm olabilir:

lambda x:-~x

Bu, girişten birini çıkarır.


Hayali / karmaşık tam sayılara sahip olabilir miyiz?
Stewie Griffin

@stewie eğer öyle yaparsan
Buğday Sihirbazı

1
Anagramlama, karakterlere izin verme veya baytlara izin verme olarak tanımlanıyor mu (tek baytlık karakter kümesi kullanmayan dillerde)?

1. “ O zaman programlardan birini sunacaksınız ”, hangisini sunacağımızı seçebileceğimizi gösteriyor gibi görünüyor, ancak cümle " sol ters ters " ile devam ediyor , bu da belirli bir programı sunmamız gerektiğini ima ediyor. Hangisi? 2. Soru özellikle " programı " belirtir ve işlevlere izin vermiyor gibi görünmektedir, ancak örnek programdan ziyade bir işlevdir. Hangisi?
Peter Taylor

Büyük harf kullanımı önemli mi?
Kritixi Lithos,

Yanıtlar:


12

Python 3, 80 bayt ( Kırık )

bhmq = int(input())
print(bhmq ** 2)
(1 or [(sqrt),(specification+of*integerr)])

Etki alanı: pozitif tamsayılar. İşlev sadece bir sayının karesidir. Stdin girişi, stdout çıkışı ve ters fonksiyon. Python'un buradaki üçüncü satırı görmezden geldiğini unutmayın, çünkü sözdizimsel olarak geçerlidir ve 1 zaten bir truthy değeridir, bu nedenle Python 'veya' öğesinin doğru kısmının iyi tanımlanmış olup olmadığına bile bakmaz.

Soyguncular, sıfır olmayan tüm karelerde düzgün çalışacak, kayan nokta olmadan tam sayı değerini yazdıracak bir sqrt işlevi yazmalıdır (yani '4' girişinde '2' veya '2 \ n' olmalı, '2.0' olmalıdır veya '2.0 \ n').


1
Bunu beğendim. Çatlamak aldatıcı bir şekilde zor
Buğday Sihirbazı

3
Ppcg'ye Hoşgeldiniz! Güzel ilk mesaj!
17:03

1
Boşver o çatlağı mahvettim. Soru yine de duruyor.
orlp

1
'Hayır' derdim, eğer gerçekten bu kısıtlamayı zorlama kurallarına göre koyma iznim varsa.
Wolfram


11

Python 3, 46 bayt, kırık

lambda x:x*(1999888577766665//844333333222200)

Girişi ikiye katlar.


3
'Python' polisler n 'soyguncularında nasıl çalışır? Cevabınıza saldırmak için isteğe bağlı bir sürüm seçebilir miyiz?
orlp

Oh, bu özellikle Python 3 , özür dilerim. Yani /şamandıra bölümüdür.
Lynn

3
Eh, az önce bu zorluğun benim zamanıma değmeyeceğini kanıtladın. Hareketli.
mbomb007


11

7 , 9 bayt, Kırık

Bu program yazdırılamayan karakterlerle dolu, bu yüzden burada bir hexdump:

00000000: 2573 dc01 7e13 dcb6 1f                   %s..~....

Not: Bu, negatif sayıları giremeyen sayısal bir giriş yordamı kullanır, bu nedenle bu gönderim yalnızca negatif olmayan tamsayılarla sınırlıdır.

karşılaştığı zorluklarla ilgili bir sorun , kodun açıklamalarını yazmamanızdır (kırılmasını zorlaştırmak için). Öte yandan, bu, benim başımın belaya girmesine gerek olmadığı anlamına geliyor.

Dil olarak 7'yi seçtim çünkü özellikle sıkıştırılmış gösterimde, okuması oldukça zor ve neden yazılan 8 bitlik programlarda gezinmekle başa çıkmak zorunda olanların sadece benim olması gerektiğini anlamıyorum . 3 bit kodlama. İyi şanslar!

açıklama

Şimdi programın kırıldığına göre (kaba kuvvetle, ne yazık ki; bu kısa çözümlerde her zaman bir tehlikedir), ne aldığımı da açıklayabilirim. Bu aslında programı okuyarak çözülebilirdi; Bunu çok daha zorlaştırabilirdim, ama kaba kuvvet çatlakları olduğunda kötü bir fikir gibi geldi.

Programı daha doğal bir kodlamayla temsil ederek başlayacağız. ; Her zamanki gibi, kalın sayılar (bir programda Temsil değildir hepsi hemen çalışır komutları gösterir 6ve 7ancak 2etmek 5, unbolded sayılar onların kaçtı eşdeğerleri (temsil değildir) 0için 5orijinal programda Temsil bunların tümü; notu bu 0bir kaçtı 6ve 1kaçtı 7):

112 7 1 7 34002 77 023 67 13303

7 program kaynağında mevcut olan komutlar dizisi, temelde sadece orijinal yığını temsil eden bir hazır bilgi olduğu anlamına gelir (sadece kaçan komutlarla yapabileceğiniz başka hiçbir şey yoktur 6ve 7). Yani bir programın yapacağı ilk şey, yığına bir sürü şey itmek. Programın çalışmasından sonra yığının nasıl göründüğü aşağıda açıklanmaktadır ( |7'de her zamanki gibi yığın öğelerini ayırır):

772 | 7 | 34662 | 023 | 73363

Son yığın elemanı daha sonra çalıştırılacak kod (yığın üzerinde kalırken) olmak üzere kopyalanır. Olduğu gibi, bu kodun programın tek kısmı; her şey sadece veridir. İşte onun için çevirdiği şey:

73363 
7 Yığına       boş bir eleman itin
  3      Üst yığın elemanını çıkarın , elemanı aşağıdan atın
 73      Bunların birleşik etkisi: üst yığın elemanını atın
   3     Üst yığın elemanını çıkarın, elemanı aşağıdan atın
    6    Üst yığın elemanından kaçın, sonra Aşağıdaki elemana ekle
     3   Üst elek elemanını çıkar, aşağıdaki elemana at

Başka bir deyişle, bu çoğunlukla sadece bir grup I / O talimatıdır. Bunu detaylı olarak inceleyelim:

  • 7373363hala yığının en üstünde olanı atar .
  • 3çıktılar 023ve atar 34662. Böylece 34662, programın diğer sürümünde ihtiyaç duyulan baytları depolamak için kullanılan bir yorum olduğu görülebilir . 023Çıktı ne zaman gelince, G / Ç formatı 0'ı (tamsayılar) seçer, daha sonra 23uygulamanın bir tamsayı girmesini isteyen bir yönergedir (7'de, giriş isteyen özel kodlar yazarak giriş yaparsınız). Girdi, aşağıdaki yığın elemanının kopyaları yapılarak yapılır, örneğin giriş tamsayısı 10 ise, bir sonraki yığın elemanı (şu anda 7) olacaktır 7777777777. Bu nedenle, kullanıcıdan girdiyi ondalık olarak kabul ediyoruz, ancak birleşik olarak depolanıyor.
  • 6üst yığın elemanının kaçar (her bir örneğini değiştirmek 7için 1, tamamen oluşan şeritler bu olduğunu 7s öncelenir), daha önce yığın elemanı için ekler ( 772). Yani verilerimiz artık bir şeylere benziyor 7721111111111.
  • Son olarak, söz 3konusu yığın öğesini çıkarır (ve varsayılan başlangıç ​​yığınının parçası olan boş bir yığın öğesi çıkar). Onun değeri sayısını alınarak hesaplanır 1s ve 7s ve sayısını çıkararak 0s ve 6s. ( 2Ortada çoğu durumda yoksayılır; dizenin sonunda ise yok sayılmak yerine izleyen bir yeni satır olur, ancak PPCG kuralları bunu önemsemez.) Bu nedenle çıktı orijinaldir giriş artı 2.

Bu noktada, yığında yararlı bir şey yoktur ve programdaki hiçbir şey yoktur, bu yüzden program sona erer.

Bunu nasıl tersine çeviririz? Bu değişen basit bir mesele 11için 00biz doğrusu yüksek 2'den, bu 2 alt hale girişine karakterleri prepending ediyoruz böylece. Bir var 00elverişli gizli sekiz sekizlik rakam biz takas basitçe yapabilirsiniz programında (şimdiye sekizlik rakam ve bayt birbirleri ile bir hizaya), bu yüzden ilgili daha 11başlangıcında.



Yan not: kodunuzu açıklamanıza gerek yoktur, ancak programınızın ne yaptığını bilmek iyi olacaktır.
GB

@TR: Programın tam bir açıklamasını verdim (çatlağın nasıl çalıştığının bir açıklaması dahil).


6

Python 2, 83 bayt, kırık

#((()))****+,,---/2289;==oppppppqqqqqw~~
lambda n:pow(n,65537,10998167423251438693)

Bu benim diğer cevabımla aynı. Ancak, bu 64-bit RSA kullanır ve kriptografik olarak oldukça zayıftır. Bu cevabı soyabiliyorsanız, diğer zamanımı da yeterince zaman vererek teorik olarak sorabilirsiniz.



5

Python 2, 47 bayt, Kırık

lambda x:x**2or (iron() and saxifrage.extend())

Bu işlevin etki alanı {x ∈ ℤ | x> 0}. Girişini kareler.


nmjcman101 amaçlanan çözümü buldu:

lambda x:sorted(a**2for a in range(x)).index(x)


1
Haha, yapılan fonksiyon çağrıları seviyorum
FlipTack

1
Cracked Bu eğlenceliydi, bıraktığım anagrama sıkışıp kaldım!
nmjcman101

5

JavaScript (ES6), 46 bayt, Kırık

x=>Math.log(x+(+String(t=985921996597669)[5]))

Bu fonksiyon, döner , negatif olmayan bir sayıdır.ln(x+1)x

kullanım

(x=>Math.log(x+(+String(t=985921996597669)[5])))(5)

Not: Kayan nokta sayılarının doğası gereği f(g(x))tam olarak eşit olmayabilir x. Örnek:f(g(4))=3.9999999999999996


Çatlak. Bu gerçekten eğlenceliydi :-)
ETHproductions


4

Processing.js, 59 bayt, Cracked!

float igetuwebaoli(int p){return p*(((17*-4*-3)))+0+0;}//,,

Bu işlev girişi 204( 17*-4*-3=204) ile çarpar . Giriş olarak bir int alır ve bir şamandıra verir. Beklendiği gibi, ters girişi girdiyi böler 204.

İşleme-j'ler için çevrimiçi bir tercüman burada bulunabilir .





4

J , 29 bayt ( Kilometre ile çatlak )

5#.[:,(3 5&#:(-$]-)7)#.inv"0]

Bu, giriş olarak pozitif bir tamsayı alan ve aşağıdakileri yapan bir fiildir :

  1. Baz 2 ve 4'e dönüştürün.
  2. Base-4 gösterimini, base-2 gösterimi ile aynı uzunluğa sahip olmak için 0'larla doldurun.
  3. İki gösterimi birleştirin (önce temel-2).
  4. Birleştirmeyi 5 temel temsili olarak yorumlayın ve tam sayıya dönüştürün.

Çevrimiçi deneyin!

Çözümüm

Mantık çatlaktakiyle hemen hemen aynı. Rütbe birlikte "birçok farklı yerde sıkışmış (ve gereksiz kurtulmak için kullanmak olabilir 0ve 3) gerçekten çözümde bir şey yapmaz, çünkü.

(7-5)#.[:(]-:&#$,)5#.inv"0 3]

J'yi anlamıyorum, ancak deneylerim bunun aslında 2 ve 4 numaralı üslerde tamsayı aldığını, uzunluklarını eşitlemek için 4 tabanının sonuna sıfırlar eklediğini ve ancak o zaman birleştiğini gösteriyor. Bu sıfırlar amaçlanıyor mu?
Wolfram

@Wolfram Sıfırlar kasıtlı, "aynı anda" ile söylemeye çalıştığım budur. Aksi takdirde geri dönüşümlü olacağını düşünmüyorum.
Zgarb

@Wolfram Daha açık bir tanım ekledim.
Zgarb


4

İşleme (java), 59 bayt, SAFE

float igetuwebaoli(int p){return p*(((17*-4*-3)))+0+0;}//,,

Bu işlev girişi 204( 17*-4*-3=204) ile çarpar . Giriş olarak bir int alır ve bir şamandıra verir. Beklendiği gibi, ters girişi girdiyi böler 204. Not: Her iki program da giriş olarak bir int alır ve bir şamandıra çıkışı verir.

Bu cevabım diğer cevabım ile tamamen aynı, ancak diğer cevabım Processing.js'de yazıldı. Java'nın daha az ayrıntılı olan kuzeni Processing-java ile tanışın. Şurada şurada indirebilirsiniz : şti.'de.

Çatlak

float ap(int i){return i*pow(blue(get(0,0)),-1);}//++7*4*-3

Bu program argümanı ikiye böler 204. Ama nasıl? Fonksiyonun içine girelim.

i *                              //multiply i by
         blue( get(0, 0) )       //this (evaluates to 204)
    pow(                  , -1)  //raises to the -1 power (ie its reciprocal)

Yeterince basit, ama nasıl blue( get(0, 0) )olur 204? Bu, bu sunumun merkezindedir. Her şeyden önce, get(0,0)bulunan pikselin rengini alır (0,0)(her zaman bir İşleme çiziminde açılan pencerenin sol üst köşesi). Sonra, blue()o pikselin mavi değerini alır, ki bu da 204!

Bu teslimi yapmak için, elde ettiğim rengin farklı niteliklerini bastırarak denedim get(0,0). Ben kırmızı, yeşil, mavi, alfa değerler olduğuna dikkat bulduk 204, 204, 204ve 255sırasıyla. Bundan sonra, bu numara ile basit bir işlem yapmaya karar verdim ve bu yazı ile sona erdi.


Kotlin'in Java'nın daha az ayrıntılı kuzeni olduğunu sanıyordum ! C dilleri ailesinin oldukça büyük olduğunu kabul ediyorum ... ama soy ağacı gerçekte nasıl görüneceklerini ...
CAD

Yaptığına inanıyorum, kimse görevinizi kırmadı ve bir hafta geçti.
miller

3

JavaScript (ES6), 63 bayt Ilmari Karonen tarafından Cracked

x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`)

Biraz atobsaçma zamanı . Bu fonksiyon, döner , negatif olmayan bir sayıdır.x*x+1x

kullanım

(x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`))(5)

istenilen

x=>eval(atob`Lyp5fMRwICAgKi9NYXRoLnBvdyh4LTEsMC41KS8veCp4KzE=`)

Çok sayıda potansiyel çözüm var, ancak baş karakterlerin bayt sırasını zorlaştıracak kadar boşa harcayacağını umuyordum. C'est laatob



Yanlışlıkla sorun kodunuzu amaçlanan çözüm olarak tekrar ettiniz mi? :)
Ilmari Karonen

@IlmariKaronen Teşekkürler, bu bana kopyalamayı / yapıştırmayı öğretir ... lol evet doğru: P
SLuck49


2

Python 2, 225 bayt, Sp3000 tarafından kırık

#((()))****+,,---/000555666888;==oppppppqqqqqw~~
lambda n:pow(n,65537,9273089718324971160906816222280219512637222672577602579509954532420895497077475973192045191331307498433055746131266769952623190481881511473086869829441397)

Bu işlevin alanı [0, n) 'dir, burada n yukarıdaki büyük sayıdır. Evet, bu işlev bu etki alanında ters çevrilebilir. Dağılmadığım sürece, bu cevabı kırmak 512 bit RSA kırmak kadar zor.


1
Brute-zorlama bu, RSA-zorlama RSA'dan çok daha kolaydır çünkü zaten ihtiyacınız olan sabitin yaklaşık bir anagramına sahipsiniz. Öte yandan, uygulamada yönetmek hala çok zor.

4
CnR zorluklarında randomizasyon ile ilgili bir meta yayın olduğunu unutmayın: meta.codegolf.stackexchange.com/questions/10793/…
Kritixi Lithos

5
@KritixiLithos Cevabım randomizasyon, karma veya dahili şifreleme kodu içermiyor. Kelimenin tam anlamıyla modüler bir üstel.
orlp

2
Cevabınız, çözülmesi zor olduğu bilinen bir sorunu hedefliyor ve bu nedenle meta postayı eşleştiriyor (özellikle de doğrudan RSA'dan bahsettiğinden). Bence sen beni takip etsen bile, senaryonun hala benim aşağı oyumu hak ediyor.
Christoph


0

J, 15 bayt

(".&,'10.')#.#:

Negatif olmayan bir tamsayı n'yi alır , onu ikili basamakların listesine dönüştürür ve bu basamakları 10 tabanlı bir sayı olarak birleştirir.

Çevrimiçi deneyin!

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.