Transformer dalam Penyamaran (Utas Polisi)


10

Utas perampok ada di sini

Tugas polisi adalah menulis fungsi atau program yang, ketika diberi input sendiri, menghasilkan string deterministik terbatas. Jika program diberikan input yang berbeda, itu harus mengembalikan output yang berbeda.

Aturan:

  • Pengajuan terdiri dari
    • Nama bahasa
      • Jika ada bendera yang digunakan, mereka harus dibuka.
    • Hitungan hitungan program
    • Hitungan jumlah byte
    • Keluaran
      • Jika sangat panjang, harap berikan pastebin atau yang serupa
      • Jika mengandung unsintables, berikan hexdump.
      • Mengejar baris baru dan spasi putih harus dimasukkan dalam output
    • Dari mana input berasal (STDIN, baris perintah, dll. )
  • Jika berlaku, Anda dapat mengasumsikan bahwa byte yang mewakili EOF tidak ada dalam input, kecuali jika Anda menggunakan byte itu dalam program Anda.
  • Jika program Anda retak, tambahkan tautan ke jawaban yang sesuai di utas perampok di judul Anda.
  • Program Anda tidak aman sampai satu minggu berlalu dan Anda menandainya.
  • Saya tidak menyetujui teknik seperti penyemaian secara acak dengan fungsi hash input atau kriptografis. Saya tidak bisa menghentikan mereka, tetapi saya tidak akan menerima solusi yang memanfaatkan salah satu dari ini . Perhatikan juga bahwa beberapa teknik ini mungkin memiliki tabrakan, di mana string yang berbeda menghasilkan output yang sama.
  • Tujuan Anda adalah mendapatkan hasil terpendek. Solusi aman terpendek yang diposting dalam waktu tiga minggu setelah memposting pertanyaan ini akan menang!

Tugas perampok adalah menemukan program berukuran sama atau kurang dari aslinya, yang juga mematuhi aturan di atas.

Jika seorang perampok memecahkan program Anda dengan solusi yang berbeda dari yang dimaksudkan, maka Anda memiliki kesempatan untuk 'membuka kembali' dengan membuktikan bahwa solusi perampok itu salah. Anda dapat melakukan ini dengan menemukan input ke program perampok yang akan menghasilkan output yang sama.

Pengiriman Contoh:

brainfuck, 10 byte, Nilai: 10

]<.[<],>[,

Solusi ini adalah , [>,] <[. <] Yang hanya membalikkan input

Semoga berhasil!


"Jika program diberikan input yang berbeda, itu harus mengembalikan output yang berbeda." Apakah ini berarti program tidak boleh menampilkan hal yang sama untuk input lain? Atau apakah ini berarti program tidak harus terus-menerus mengeluarkan sesuatu terlepas dari inputnya? (ADA input yang tidak sama dengan dirinya sendiri, vs, input FORALL tidak sama dengan dirinya sendiri, kembalikan output yang berbeda.)
tsh

@tsh Hanya input itu sendiri yang harus memiliki output yang unik. Misalnya, pengajuan yang valid dapat berupa program identifikasi diri , yang menghasilkan 1untuk dirinya sendiri dan 0sebaliknya
Jo King

@JoKing Jadi, contoh pengajuan Python 3 Anda tidak valid? Karena tidak jelas juga output 1021111143210532105110321051101121171164041581121141051101164011111410040105414410111010061393941untuk beberapa string lainnya.
Lynn

@lynn Anda benar. Saya telah menghapus contoh itu
Jo King

Jawaban:


4

7 , 31 karakter, skor 30, aman tapi mungkin rusak?

Program 7 biasanya hanya angka, tetapi bisa berisi spasi, membaginya menjadi beberapa angka. Oleh karena itu pengajuan ini terdiri dari dua angka (yang secara implisit digabungkan oleh 7 penerjemah), dan program juga mengambil dua angka sebagai input, melalui input standar. (The "31 karakter" di header adalah total panjang dari dua angka, ditambah satu karakter spasi putih yang terpisah; digit yang membentuk angka ditafsirkan sebagai oktal ketika digunakan sebagai program, tetapi desimal saat digunakan sebagai input, dan itu digit yang sama dalam dua kasus, bukan angka yang sebenarnya. Perhatikan bahwa itu tidak relevan baik ketika diperlakukan sebagai program, atau ketika diperlakukan sebagai input, apakah Anda memisahkannya dengan spasi atau baris baru, saya harap itu tidak dapat membatalkan pengajuan.)

Output yang diharapkan adalah angka berikut (dinyatakan di sini dalam desimal, karena itulah format output yang digunakan oleh 7 juru bahasa):

238363505302130098723162537059

Perhatikan bahwa 7 penerjemah yang ditautkan dari wiki Esolang secara internal menyimpan angka di unary, artinya Anda tidak mungkin memiliki cukup memori untuk benar-benar menjalankan program itu sendiri untuk melihat apa yang dilakukannya. Saya memverifikasi program melalui mengetahui perilakunya secara manual, dan mengujinya pada input kecil untuk memverifikasi bahwa ia melakukan apa yang saya harapkan. Pendekatan alternatif adalah menulis juru bahasa yang menggunakan metode yang lebih efisien untuk menyimpan angka.

Menghindari keretakan di sini adalah sesuatu yang menyusahkan, tapi saya akhirnya sekarang puas bahwa tidak ada dua angka selain yang ada dalam program itu sendiri yang mampu menghasilkan 238363505302130098723162537059 sebagai output. ( EDIT 1 minggu kemudian: Saya mungkin salah, tergantung bagaimana Anda menginterpretasikan pertanyaan; lihat di bawah. )

Larutan

Program aslinya adalah:

711170237403706
111723603700633
Program ini mengambil dua angka x dan y , dan menghitung hasil dari ekspresi 3xy-y-2 (yaitu y(3x-1)-2 ). Jika kami melakukan perhitungan ini di x=711170237403706 dan y=111723603700633 , kami mendapatkan hasil 238363505302130098723162537059 sesuai kebutuhan .

Dimaksudkan bahwa tidak ada input lain yang akan memberikan hasil yang diinginkan karena:

Input harus dipilih sedemikian rupa sehingga y(3x-1)-2=238363505302130098723162537059 , yaituy(3x-1)=238363505302130098723162537061 (menambahkan 2 ke kedua sisi). Angka ini adalah semiprime, dengan hanya dua faktor:111723603700633 dan2133510712211117 . Hanya satu dari angka-angka ini,2133510712211117 , dapat diekspresikan dalam bentuk3x-1 (memberi(3×711170237403706)-1=2133510712211117 ). Jadi kita dapat secara unik mengidentifikasi angka mana yangx dan mana yangy , artinya hanya satu input yang berfungsi.

Namun, tergantung pada bagaimana Anda menginterpretasikan pertanyaan, mungkin ada input kedua yang menghasilkan output yang diinginkan (sehingga membatalkan solusi ini):

113x-1x79454501767376699574387512354189) yang tidak ada dalam set karakter untuk 7 program. Jadi, jika input dibatasi pada karakter yang sama dengan program, solusi ini valid; tetapi jika input yang mengandung karakter dari luar rangkaian karakter program diizinkan, solusi ini tidak valid.

Penjelasan

Begini cara fungsi solusi yang dimaksud:

711170237403706 111723603700633
7 7 7 Pemisah elemen tumpukan
 111 023 403706 111723603700633 Elemen tumpukan awal
 111 Nomor 3, secara unary
     023 I / O DSL untuk "memasukkan nomor"
         403706 111723603700633 Program utama
(Tersirat: jalankan salinan elemen program utama, pertahankan yang asli)
         40 Swap {023} di atas {program}, hindari
           3 Do I / O menggunakan {023}; pop {program}
     0 I / O: numerik
      23 Masukkan nomor, salin {111} berkali-kali
            706 Tambahkan "6" ke nomor (menurunkannya)
                11 Dorong dua elemen tumpukan kosong
                  17236 Dorong elemen tumpukan "23" (tidak terhapuskan)
                       0 Escape {23}, mengonsumsi elemen kosong
                        3 Do I / O menggunakan {23}; pop {elemen di bawah ini}
                    23 Salin bagian atas input tumpukan beberapa kali
                         7006 Tambahkan "66" (yaitu kurangi 2)
                             3 Output {sebagai angka}
                              3 Keluar dari program (karena tumpukan rendah)
170666123453123451234512345


3

Node.js v10.9.0 , 40 byte, Nilai: 40, Retak

Memasukkan

Ini adalah fungsi yang mengambil tepat satu parameter.

Keluaran

&`nij.9=j.,)r31n=+(=ooj`[o.o.)1.s](>=6>t

Saya hanya bisa mengatur ulang o=>[...j=o,].sort(n=>(j+=113)&69).join`` , tetapi jtidak bisa pergi ke integer
l4m2

Retak. Itu cukup menyenangkan :-)
ETHproduksi

3

A Pear Tree , 46 byte ASCII, skor 0, Retak

Input diambil dari input standar. Output yang diharapkan (pada output standar) adalah string kosong (yaitu ketika program diberikan sendiri sebagai argumen, tidak ada output yang harus dicetak).

Dengan kata lain, tantangannya di sini adalah untuk menulis program A Pear Tree yang tidak menghasilkan apa pun pada output standar ketika diberikan sendiri pada input standar, dan yang melakukan output sesuatu pada output standar ketika diberi sesuatu selain dirinya pada input standar, tanpa menggunakan lebih dari 46 byte. (Saya sudah berhasil melakukan ini sambil memegang program untuk dicetak ASCII, juga, meskipun A Pear Tree sering menggunakan karakter non-ASCII dan tidak patut dicetak.) Ini secara efektif tugas menulis sebuah program identifikasi diri , dengan format output spesifik (yaitu string nol ketika identifikasi diri berhasil); namun, A Pear Tree memiliki setidaknya dua putaran yang membuat tugasnya agak lebih sulit daripada yang terlihat ketika dilakukan dalam bahasa khusus ini (itulah sebabnya saya memilihnya untuk pengiriman polisi saya).

Solusi saya

Solusi saya agak berbeda dari crack:

eval(k=q(print$\=$_="eval(k=q($k))"ne$_;MZpa))

Cobalah online!

Alih-alih menggunakan exit, saya malah mengatur $_(output implisit) dan $\(baris baru setelah output, termasuk output implisit) ke string nol jika ada kecocokan (dan 1jika tidak ada kecocokan). A printmasih diperlukan karena output implisit hanya diaktifkan jika ada setidaknya satu byte input (dengan demikian, kita perlu secara eksplisit mencetak sesuatu jika kita diberi string kosong sebagai input, yang berbeda dari program).

Setiap program Pear Tree perlu mengandung sebuah checksum di suatu tempat (itulah MZpasolusi ini). Solusi saya dan crack memilih nama variabel (dan memvariasikan detail minor lainnya dari kode) untuk membuat checksum seluruhnya terdiri dari huruf ASCII.



3

Perl 5 -p0777, 10 byte, skor 10, aman

W)9r46<(k

Karakter terakhir di sini adalah "shift out", kode karakter 14 (desimal) / 0E (hex). Semua yang lain dapat dicetak ASCII.

Karena kita menggunakan argumen I / O tersirat dari Perl -p0777, input berasal dari input standar, dan output menuju ke output standar.

Larutan

Program melakukan hal berikut:

NUL-pad input ke setidaknya 10 karakter, kemudian XOR dengan string svgOUT_TOP

yang berarti bahwa program itu sendiri, satu-satunya input yang menghasilkan output yang diinginkan, adalah:

$ _ ^ = abc | $ ^

Cobalah online!

Penjelasan

Perl memiliki sejumlah variabel tujuan khusus. Misalnya, saat menggunakan-p0777 I / O implisit, $_adalah input pada awal program dan output pada akhir program.

Sebagian besar variabel ini memiliki nilai standar yang sangat sederhana. Namun, nilai default $^, format top-of-page yang saat ini dipilih, adalah string yang lebih panjangSTDOUT_TOP . Dengan demikian, kita dapat menggunakan ini sebagai metode kebingungan yang sangat singkat melalui XORing $^dengan nilai yang ingin kita hapus (dalam hal ini, program).

Untuk menyembunyikan tanda _TOPdi akhir, saya mengisi program itu sendiri hingga 10 karakter melalui menambahkan abc|, yang berarti bahwa semua karakter STDOUT_TOPakan XOR dengan sesuatu; pilihan abc|pada awalnya adalah cara mudah untuk menjaga output sebagian besar dapat dicetak (dan untuk membuatnya lebih sulit untuk mengetahui bahwa saya XORing dengan string yang sebagian besar terbuat dari huruf kapital, karena di ASCII, huruf kecil XOR huruf besar adalah huruf kecil).


3

Python 3, 50 byte retak

Input dan output dari / ke stdin / -out. Output berbeda untuk setiap input yang berbeda. Output unik ketika diberi kode sumber:

218216195196222130136136132192197195196130241204136209197216206130201131244155157154215136138204197216138201138195196138195196218223222130131247131131

(Itu 150 digit)

Semoga berhasil!


Aduh! Saya melihat sekarang bahwa tantangan ini sudah lama berakhir ... Aneh yang muncul di timeline / feed saya. Penasaran ingin melihat apakah ada yang menanggapi ini ...
agtoever



2

Cubix , 18 byte, Skor 18, aman

Sayang sekali tantangan ini tidak mendapat perhatian lebih, tapi begitulah yang terjadi kadang-kadang. Saya akan meninggalkan ini tidak aman, tetapi memutuskan untuk mengirim solusi sebelum saya melupakannya.

Ini seharusnya cukup mudah retak.

Masukan daristdin

Keluaran

$`*2aJPJ#74(o);89

Sunting: Saya harus menyebutkan bahwa ini mengharapkan sumber dalam bentuk yang lebih pendek ... dan sekarang saya perhatikan ada byte yang hilang (tidak dapat dicetak) dari hasil yang saya hancurkan ketika saya memposting. Harus menyalin sekarang. Nilai hex adalah24 60 2a 13 32 61 4a 50 4a 23 37 34 28 6f 29 3b 38 39

Konsepnya adalah untuk menghapus cetak karakter pertama dan kemudian hapus indeks terbalik dari karakter, misalnya [karakter] - [0, len ([karakter]) .. 2]

Kodenya adalah

$r;#AoW\U-@</u.?;;

yang memetakan ke kubus berikut

    $ r
    ; #
A o W \ U - @ <
/ u . ? ; ; . .
    . .
    . .

Coba di sini


2

Jelly , 14 byte, Nilai: 21, Aman

Baik ukuran program dan output dihitung menggunakan codepage Jelly.

Memasukkan

Argumen baris perintah pertama.

Keluaran

-§ḋẇ"*YdĖDƘ>Ẉed€Ç+æạɦ

Larutan

ØJiⱮÄÆNPḃØ⁵ịØJ

Cobalah online!


Karena mengkonversi dari / ke Jelly codepage sulit, akan berguna untuk memiliki verifier (yang mengambil program, mengubahnya dari UTF8 ke Jelly, mengumpankannya sendiri, mengonversi dari Jelly ke UTF8, dan memeriksa apakah itu sama dengan yang diharapkan output)
user202729

@ user202729 program Jelly ini,,v⁼ akan menghasilkan 1jika input dievaluasi sebagai kode Jelly dengan input input sama dengan input dan akan menghasilkan 0atau kesalahan (jika inputnya adalah kode Jelly tidak valid) jika tidak.
Jonathan Allan

1

JavaScript Firefox, <10 byte, Nilai: 52, dari input argumen fungsi, Cracked

ZnVuY3Rpb24gYnRvYSgpIHsKICAgIFtuYXRpdmUgY29kZV0KfQ==


btoa

btoa(btoa) menyandikan string berikut:

function btoa() {
    [native code]
}

pemberian yang mana:

"ZnVuY3Rpb24gYnRvYSgpIHsKICAgIFtuYXRpdmUgY29kZV0KfQ=="

baru saja disalin


Pertama-tama, setelah melakukan yang jelas, ini bukan kode yang sebenarnya? Kedua, Anda tidak menentukan dari mana input berasal. Saya akan memposting celah tetapi jujur ​​saya tidak yakin apakah pengiriman ini valid.
Quintec


Saya rasa tidak perlu memasukkan crack post di posting ini - orang bisa mengklik tautan untuk melihat crack.
user202729

1

GCC 61-> 61 byte

70 4F 92 73 08 D4 03 E7 65 DC D6 89 B5 AD BA 90 
97 26 31 10 F6 FA 0A 30 8F 24 69 0A A7 8B 59 9E 
A2 42 D5 67 B8 12 3A 1E 9D 25 80 F9 6B 25 32 C2 
EE 46 3F 8D 7E 0C 73 0F F0 93 C6 68 50

Program penuh, ambil input dari stdin dan output ke stdout


Jadi, apakah ada ruang setelah terakhir 50?
tsh

@ tsh Ini dump hex
l4m2

1

Perl 6, 43 byte, Nilai: 15, dari stdin

49671296789805

2
Hanya memeriksa, karena jawaban Anda sebelumnya tidak mengikuti aturan tentang keluaran unik untuk program Anda sebagai masukan, dapatkah Anda mengonfirmasi bahwa pengiriman ini dilakukan?
Jo King

Ya saya pikir begitu.
donaldh


1

J , 26 byte, Nilai: 52, Aman

Program ini bukan REPL, tetapi skrip lengkap yang menerima stdindan secara eksplisit dicetakstdout .

Memasukkan

Input standar.

Keluaran

6fc42353c98217ef5a2908a3c63d090aa9a55b2558b61294e06a

Tidak, ini bukan metode enkripsi.


Larutan

echo]hfd]257x#.3&u:stdin''
                   stdin'' Take the whole input
               3&u:        Convert to codepoints
         257x#.     Convert base 257 to integer
     hfd]           "Hex from Decimal"
echo]               Print to stdout

Cobalah online!


1

Keg , 6 byte, Nilai: 6

Memasukkan

Dari stdin, menggunakan?

Keluaran

5\x1c"\x1c"9

Pikiran Anda bahwa mereka adalah urutan melarikan diri untuk byte yang tidak diinginkan. Ganti lolos dengan karakter literal. Teks mentah tersedia di sini

Semoga berhasil dengan yang satu ini! Sampai jumpa minggu depan!


0

 Perl 6, 31 byte, Nilai: 39, dari stdin - Cracked

Retak di sini

().1111111111112222235abcegijkmnorstvy

Solusi kasar. Mungkin bertahan hidup


Saya cukup yakin bahwa saya telah memecahkan solusi Anda dan saya menduga bahwa program Anda tidak mengikuti aturan bahwa input yang berbeda harus menghasilkan output yang berbeda.
nwellnhof
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.