Inversi Tersembunyi (Utas Polisi)

35

Ini adalah teka-teki benang yang dapat ditemukan perampok di sini .

Tugas Anda akan dua menulis dua program (atau fungsi) sehingga mereka adalah anagram satu sama lain dan satu melakukan kebalikan dari yang lain. Program-program ini dapat menerima dan menghasilkan bilangan bulat atau bilangan kompleks sebanyak yang Anda inginkan. Jika Anda memilih mengambil angka sebagai poin karakter atau cara lain yang masuk akal, Anda harus menunjukkan bahwa Anda melakukannya dalam jawaban Anda. Jika Anda memilih untuk membatasi domain fungsi Anda, Anda juga harus menunjukkan domain terbatas dalam jawaban Anda.

Anda kemudian akan mempresentasikan program pertama dalam bentuk jawaban dengan inversi kiri tersembunyi untuk ditemukan oleh perampok.

Program yang ditampilkan harus menerapkan fungsi injeksi (jika tidak, jawaban tersembunyi tidak mungkin ada).

Jika jawaban Anda belum retak dalam satu minggu, Anda dapat mengungkapkan jawaban yang tersembunyi dan menandainya sebagai aman . Jawaban aman tidak dapat dipecahkan oleh perampok dan akan tetap tidak terpecahkan tanpa batas.

Tujuannya adalah untuk membuat jawaban terputus-putus dalam bytes.

Contoh

Anda bisa menampilkan program python berikut yang menambahkan satu ke input

lambda x:~-x

Sebuah solusi bisa berupa:

lambda x:-~x

Ini mengurangi satu dari input

Wisaya Gandum
sumber
Bisakah kita memiliki bilangan bulat imajiner / kompleks?
Stewie Griffin
@stewie jika Anda menyatakannya demikian
Wheat Wizard
1
Apakah anagramming didefinisikan sebagai permutasi karakter, atau permutasi byte (dalam bahasa yang tidak menggunakan set karakter byte tunggal)?
1. " Anda kemudian akan menyajikan salah satu dari program " tampaknya menyarankan bahwa kita dapat memilih yang akan disajikan, tetapi kalimat terus " dengan invers kiri disembunyikan ", menyiratkan bahwa kita harus menyajikan yang spesifik. Yang mana itu? 2. Pertanyaan secara khusus menyatakan " program " dan tampaknya tidak mengizinkan fungsi, tetapi contohnya adalah fungsi dan bukan program. Yang mana itu?
Peter Taylor
Apakah kapitalisasi itu penting?
Kritixi Lithos

Jawaban:

12

Python 3, 80 byte ( Retak )

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

Domain: bilangan bulat positif. Fungsinya hanya mengkuadratkan angka. Input ke stdin, output ke stdout, serta dalam fungsi terbalik. Perhatikan bahwa Python mengabaikan baris ketiga di sini, karena secara sintaksis valid dan 1 sudah menjadi nilai yang benar, sehingga Python bahkan tidak melihat apakah bagian kanan 'atau' didefinisikan dengan baik.

Perampok harus menulis fungsi sqrt yang akan bekerja dengan benar pada semua kotak non-nol, mencetak nilai integer apa adanya, tanpa floating point (jadi pada input '4' output harus '2' atau '2 \ n', bukan '2.0' atau '2.0 \ n').

Wolfram
sumber
1
Saya suka yang ini. Sangat sulit untuk memecahkannya
Wheat Wizard
3
Selamat datang di ppcg! Posting pertama yang bagus!
Rɪᴋᴇʀ
1
Tidak masalah dengan celah itu, aku mengacau. Pertanyaannya masih tetap ada.
orlp
1
Saya akan mengatakan 'tidak', jika saya benar-benar diizinkan untuk menempatkan batasan ini dengan aturan tantangan.
Wolfram
1
Retak?
Zgarb
11

Python 3, 46 byte, retak

lambda x:x*(1999888577766665//844333333222200)

Menggandakan input.

Lynn
sumber
3
Bagaimana cara 'Python' bekerja di polisi dan perampok? Bolehkah kami memilih versi sewenang-wenang untuk menyerang jawaban Anda?
orlp
Oh, ini Python 3 khusus, maaf. Begitu /juga divisi float.
Lynn
3
Nah, Anda baru membuktikan tantangan ini tidak sepadan dengan waktu saya. Bergerak.
mbomb007
11

7 , 9 byte, Retak

Program ini penuh dengan karakter yang tidak dapat dicetak, jadi inilah hexdump:

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

Catatan: ini menggunakan rutin input numerik yang tidak mampu memasukkan angka negatif, jadi pengiriman ini dibatasi hanya untuk bilangan bulat non-negatif.

Satu masalah dengan tantangan adalah Anda tidak menulis penjelasan kode (untuk membuatnya lebih sulit untuk di-crack). Di sisi lain, ini berarti bahwa saya tidak harus pergi ke masalah di sini.

Saya memilih 7 sebagai bahasa karena, terutama dalam notasi yang dikompresi, cukup sulit untuk dibaca, dan saya tidak mengerti mengapa hanya saya yang harus repot mencari sekitar 8-bit program yang ditulis dalam penyandian 3-bit. Semoga berhasil!

Penjelasan

Sekarang programnya sudah retak (dengan kekerasan, sayangnya; itu selalu berbahaya dalam solusi singkat ini), saya mungkin juga menjelaskan apa yang saya maksudkan. Ini sebenarnya cukup dipecahkan dengan membaca program; Saya bisa membuatnya jauh lebih sulit, tetapi itu terasa seperti ide yang buruk ketika ada brute force crack.

Kami akan mulai dengan mewakili program dalam penyandian yang lebih alami. Seperti biasa, nomor tebal menunjukkan perintah yang dijalankan segera (tidak semua yang representable dalam sebuah program, 6dan 7hanyalah 2untuk 5tidak), nomor unbolded mewakili lolos setara mereka ( 0untuk 5, yang semuanya representable dalam program asli; catatan yang 0lolos 6dan 1yang lolos 7):

112 7 1 7 34002 77 023 67 13303

Himpunan perintah yang tersedia dalam sumber program 7 berarti bahwa itu pada dasarnya hanya sebuah literal yang mewakili tumpukan asli (tidak ada lagi yang dapat Anda lakukan dengan hanya perintah yang lolos, 6dan 7). Jadi, hal pertama yang akan dilakukan program adalah mendorong banyak barang ke tumpukan. Begini cara tumpukan terlihat setelah program dijalankan ( |memisahkan elemen tumpukan, seperti biasa dalam 7):

772 | 7 | 34662 | 023 | 73363

Elemen tumpukan terakhir kemudian disalin untuk menjadi kode yang akan dijalankan (sambil tetap berada di tumpukan). Seperti yang terjadi, ini adalah satu-satunya bagian dari program yang memiliki kode; yang lainnya hanyalah data. Inilah yang diterjemahkan menjadi:

73363 
7       Dorong elemen kosong ke tumpukan 3 Keluarkan elemen tumpukan
       atas, buang elemen di bawahnya
 73      Efek gabungan dari ini: buang elemen tumpukan atas
   3     Keluarkan elemen tumpukan atas, buang elemen di bawah ini
    6    Lepaskan elemen tumpukan atas, kemudian menambahkannya ke elemen di bawah
     3   Output elemen stack atas, buang elemen di bawah ini

Dengan kata lain, ini sebagian besar hanya sekelompok instruksi I / O. Mari kita analisis ini secara terperinci:

  • 73buang 73363yang masih ada di atas tumpukan.
  • 3keluaran 023, dan buang 34662. Dengan demikian dapat dilihat bahwa 34662ini adalah komentar, yang digunakan untuk menyimpan byte yang diperlukan dalam versi lain dari program. Adapun apa yang 023dilakukan ketika output, ia memilih I / O format 0 (integer), kemudian 23adalah arahan yang meminta implementasi untuk memasukkan integer (dalam 7, Anda melakukan input melalui mengeluarkan kode spesifik yang meminta input). Input dilakukan dengan membuat salinan elemen stack di bawah ini, misalnya jika integer input adalah 10, elemen stack berikutnya (saat ini 7) akan menjadi 7777777777. Jadi, kami menerima input dari pengguna dalam desimal, tetapi disimpan sebagai unary.
  • 6keluar dari elemen stack atas (mengubah setiap instance 7menjadi 1; ini adalah bagaimana string yang seluruhnya terdiri dari 7s diloloskan), kemudian menambahkannya ke elemen stack sebelum ( 772). Jadi data kami sekarang seperti ini 7721111111111.
  • Akhirnya, 3menampilkan elemen tumpukan yang dipertanyakan (dan muncul elemen tumpukan kosong yang merupakan bagian dari tumpukan awal default). Nilainya dihitung dengan mengambil jumlah 1s dan 7s, dan mengurangi jumlah 0s dan 6s. (Di 2bagian tengah diabaikan dalam kebanyakan kasus; jika di akhir string, itu akan menjadi baris baru alih-alih diabaikan, tetapi aturan PPCG tidak peduli tentang itu.) Dengan demikian, output adalah asli input tambah 2.

Pada titik ini, tidak ada yang berguna pada stack dan tidak ada dalam program, sehingga program keluar.

Bagaimana kita membalikkan ini? Ini masalah sederhana mengubah 11ke 00, sehingga kita mengawali karakter untuk input yang membuatnya 2 lebih rendah, daripada 2 lebih tinggi. Ada 00delapan digit oktal yang tersembunyi lebih jauh di dalam program (sehingga digit dan byte oktal berbaris satu sama lain), jadi kita bisa menukarnya dengan 11di awal.

Komunitas
sumber
Catatan: Anda tidak perlu menjelaskan kode Anda, tetapi mengetahui program apa yang Anda lakukan akan menyenangkan.
GB
@ GB: Saya memberikan penjelasan lengkap tentang program ini (termasuk penjelasan tentang bagaimana crack bekerja).
7

JavaScript (ES6), 21 byte, Retak

Ini mudah.

b=>Math.pow(b,torc=3)

Mengembalikan kubus input.

Arnauld
sumber
1
Cracked
Emigna
6

Python 2, 83 byte, retak

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

Ini mirip dengan jawaban saya yang lain. Namun, ini menggunakan RSA 64-bit, dan secara kriptografis cukup lemah. Jika Anda dapat merampok jawaban ini, Anda secara teoritis dapat merampok jawaban saya yang lain, diberikan waktu yang cukup.

orlp
sumber
4
Retak.
Ilmari Karonen
5

Python 2, 47 byte, Retak

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

Domain untuk fungsi ini adalah {x ∈ ℤ | x> 0}. Ini kuadrat inputnya.


nmjcman101 menemukan solusi yang dimaksud:

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

Wisaya Gandum
sumber
1
Haha, cintai panggilan fungsi yang dibuat
FlipTack
1
Cracked Itu menyenangkan, saya terjebak di anagram yang sudah saya pilih!
nmjcman101
5

JavaScript (ES6), 46 byte, Retak

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

Fungsi ini mengembalikan di ln(x+1)mana xangka non-negatif.

Pemakaian

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

Catatan: Karena sifat angka floating point f(g(x))mungkin tidak persis sama x. Contoh:f(g(4))=3.9999999999999996

Sluck49
sumber
Retak. Itu benar-benar menyenangkan :-)
ETHproduk
4

J, 8 byte, retak

Satu lagi yang sederhana untuk memulai.

[:]+:[-:

Menggandakan input.

mil
sumber
Bagaimana kami menguji kode ini?
Kritixi Lithos
1
Retak.
Conor O'Brien
4

Memproses.js, 59 byte, Retak!

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

Fungsi ini mengalikan input dengan 204( 17*-4*-3=204). Dibutuhkan int sebagai input dan output float. Seperti yang diharapkan, invers membagi input dengan 204.

Juru bahasa online untuk pemrosesan-js dapat ditemukan di sini .

Kritixi Lithos
sumber
1
Retak.
Ilmari Karonen
4

JavaScript (ES6), 15 byte, dipecahkan oleh Emigna

t=>(!!0+~~t+~0)

Fungsi ini kembali n-1.


Anda dapat mengujinya seperti:

(t=>(!!0+~~t+~0))(6)

Retak

Solusi yang saya maksudkan sedikit berbeda dari celah Emigna:

t=>t+(+!!~~~00)

masukkan nama pengguna di sini
sumber
2
Cracked
Emigna
4

J , 29 byte ( Cracked by miles)

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

Ini adalah kata kerja yang mengambil bilangan bulat positif sebagai input, dan melakukan hal berikut:

  1. Konversikan ke basis 2 dan 4.
  2. Pad representasi basis-4 dengan 0s memiliki panjang yang sama dengan representasi basis-2.
  3. Menggabungkan dua representasi (base-2 pertama).
  4. Menafsirkan rangkaian sebagai representasi basis-5 dan mengkonversi ke integer.

Cobalah online!

Solusi saya

Logikanya hampir sama dengan di celah. Konjungsi peringkat "dapat macet di banyak tempat yang berbeda (dan saya menggunakannya untuk menyingkirkan yang tidak perlu 0dan 3), karena itu tidak benar-benar melakukan apa pun dalam solusi.

(7-5)#.[:(]-:&#$,)5#.inv"0 3]
Zgarb
sumber
Saya tidak mengerti J, tetapi percobaan saya menunjukkan ini benar-benar membutuhkan bilangan bulat dalam basis 2 dan 4, menambahkan nol pada akhir basis 4 untuk membuat panjangnya sama, dan baru kemudian digabungkan. Apakah angka nol ini dimaksudkan?
Wolfram
@ Wolfolf Nol yang dimaksudkan, itulah yang saya coba katakan dengan "secara bersamaan". Kalau tidak, saya tidak berpikir itu akan dapat dibalik.
Zgarb
@ Wolfolf Saya menambahkan deskripsi yang lebih eksplisit.
Zgarb
Retak .
mil
4

Memproses (java), 59 byte, AMAN

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

Fungsi ini mengalikan input dengan 204( 17*-4*-3=204). Dibutuhkan int sebagai input dan output float. Seperti yang diharapkan, invers membagi input dengan 204. Catatan: kedua program mengambil int sebagai input dan output float.

Jawaban ini persis sama dengan jawaban saya yang lain, kecuali bahwa jawaban saya yang lain ditulis dalam Processing.js. Bertemu Processing-java, sepupu Java yang kurang banyak bicara. Anda dapat mengunduh Pemrosesan di sini di processing.org.

Retaknya

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

Program ini membagi argumen dengan 204. Tapi bagaimana caranya? Mari kita masuk ke dalam fungsi.

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

Cukup sederhana, tetapi bagaimana blue( get(0, 0) )jadinya 204? Ini adalah inti dari pengajuan ini. Pertama-tama, get(0,0)dapatkan warna dari piksel yang terletak di (0,0)(sudut kiri atas jendela, yang selalu terbuka dalam sketsa Pemrosesan). Selanjutnya, blue()dapatkan nilai biru dari piksel itu, yaitu 204!

Untuk mendapatkan kiriman ini, saya bereksperimen dengan mencetak atribut berbeda dari warna yang diperoleh get(0,0). Saya telah menemukan bahwa merah, hijau, biru, nilai-nilai alpha adalah 204, 204, 204dan 255masing-masing. Dari sini, saya memutuskan untuk melakukan operasi sederhana dengan nomor ini dan berakhir dengan posting ini.

Kritixi Lithos
sumber
Saya pikir Kotlin adalah sepupu Jawa yang kurang bertele-tele! Saya mengakui bahwa bahasa C keluarga cukup besar ... tapi seperti apa sebenarnya silsilah keluarga ...
CAD97
Saya yakin Anda berhasil, belum ada yang memecahkan posting Anda dan ini sudah seminggu.
mil
3

JavaScript (ES6), 63 byte Retak oleh Ilmari Karonen

x=>eval(atob`eCp4KzEvLyAgfXBModLS4TvEn4wp1iys9YRRKC85KLIhNMC=`)

Waktunya untuk atobomong kosong. Fungsi ini mengembalikan di x*x+1mana xangka non-negatif.

Pemakaian

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

Dimaksudkan

x=>eval(atob`Lyp5fMRwICAgKi9NYXRoLnBvdyh4LTEsMC41KS8veCp4KzE=`)

Ada sejumlah besar solusi potensial, tetapi saya berharap bahwa karakter utama akan membuang urutan byte yang cukup untuk membuat ini lebih sulit. C'est laatob

Sluck49
sumber
Retak.
Ilmari Karonen
Apakah Anda baru saja secara tidak sengaja mem-posting ulang kode tantangan Anda sebagai solusi yang dimaksud? :)
Ilmari Karonen
@IlmariKaronen Terima kasih, itu akan mengajari saya untuk menyalin / menempel ... lol ya benar: P
SLuck49
2

Python 2, 225 byte, dipecahkan oleh Sp3000

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

Domain dari fungsi ini adalah [0, n), di mana n adalah angka besar di atas. Ya, fungsi ini tidak dapat dibalik di domain ini. Dan kecuali saya kacau, melanggar jawaban ini sama sulitnya dengan melanggar 512 bit RSA.

orlp
sumber
1
Brute-forcing ini jauh lebih mudah daripada RSA brute-forcing karena Anda sudah memiliki perkiraan anagram dari konstanta yang Anda butuhkan. Di sisi lain, kemungkinan masih terlalu sulit untuk dikelola dalam praktik.
4
Perlu diingat bahwa ada meta pos mengenai pengacakan dalam tantangan CnR
Kritixi Lithos
5
@KritixiLithos Jawaban saya tidak mengandung kode pengacakan, hashes atau kode kripto bawaan. Ini benar-benar satu eksponensial modular.
orlp
2
Jawaban Anda bertujuan pada masalah yang diketahui sulit dipecahkan dan karenanya cocok dengan meta post (terutama karena ia menyebutkan RSA secara langsung). Saya pikir bahkan jika Anda menggunakan celah script Anda masih layak downvote saya.
Christoph
4
Cracked
Sp3000
0

J, 15 byte

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

Mengambil bilangan bulat non-negatif n , mengubahnya menjadi daftar angka biner, dan menggabungkan angka-angka itu sebagai angka dasar 10.

Cobalah online!

mil
sumber