Mesin Enigma Cheapo (Perampok)

8

Untuk pos polisi, mesin Enigma Cheapo (Polisi)

Pengajuan perampok terdiri dari program / fungsi yang menerima output dari kode polisi dan mengembalikan input untuk semua output yang disediakan oleh kode polisi itu. (Dengan kata lain, Anda harus menulis fungsi terbalik)

Anda tidak dapat menggunakan bawaan yang memiliki tujuan hashing atau enkripsi.

Input / Output format

8 bit (0 atau 1), atau integer basis-10 dalam rentang 1-256, 0-255 atau -128 hingga 127. Dapat menggunakan I / O standar atau file I / O. Fungsi juga dapat mengembalikan nilai sebagai output. Input dan output harus berasal dari rentang yang sama (seperti dalam, biner, 1-256, 0-255 atau -128 hingga 127), yang juga harus kisaran yang sama dengan yang digunakan oleh polisi.

Mencetak gol

Rasio jumlah byte polisi ke jumlah byte Anda. Kemenangan skor tertinggi.

Anda dapat mengirimkan upaya perampok terhadap kode polisi Anda sendiri untuk referensi. (Tentu saja kode ini tidak memenuhi syarat untuk menang)

Pemberitahuan

Harap edit jawaban polisi yang sesuai untuk memasukkan jumlah byte baru Anda dan rasio yang sesuai.

ghosts_in_the_code
sumber
2
Awalnya saya bertanya-tanya bagaimana Anda akan menjadikan Emigna menjadi mesin. Lalu saya menyadari Anda tidak berbicara tentang pengguna.
Magic Gurita Guci
Oke, maaf sudah mengganggu Anda lagi, tapi saya ingin memastikan saya sudah benar kali ini. Jika jawaban brainfuck membaca dan mencetak byte (titik kode 0 hingga 255) dan jawaban Jelly saya mengambil bilangan bulat antara 0 dan 255 dan mengembalikan bilangan bulat dalam kisaran yang sama, apakah itu dapat diterima?
Dennis
@ Dennis Tidak, tidak. Mungkin Anda (atau orang lain) dapat menyarankan kata alternatif yang membuat ini lebih jelas.
ghosts_in_the_code
@carusocomputing Emigna adalah mesin, bukan? Dia memiliki setiap program 05AB1E dimuat di sistem memorinya, ya?
Caird coinheringaahing

Jawaban:

3

JavaScript oleh Christoph , 8/25

f=(y,x=0)=>y?f(y/2,x^y):x

(kisaran 0-255)

Sayangnya, f=(y,x)=>y?f(y/2,x^y):xberfungsi untuk semua nilai kecuali 0.

Catatan teknis

Kami menggunakan y/2daripada y>>1menyimpan byte. Ini menyalahgunakan fakta bahwa nilai apa pun pada yakhirnya akan dibulatkan 0karena aritmatika underflow .

Arnauld
sumber
2

C, oleh Dave , 64/95 92 85

b,i,e,t[256];r(x){for(;!b;++i,b=e==x)for(srand(i&&e);t[e=rand()%256]++;);return i-1;}

Coba di sini !

C, versi lebih pendek, 64/89 71

i,e,t[256];r(x){for(srand(1);t[e=rand()%256]++||++i,e!=x;);return i-1;}

Yang ini lebih spesifik implementasi, tetapi bekerja pada TIO. Panjangnya sama dengan solusi PHP, saya tidak bisa mendapatkannya lebih pendek dari ini.

Coba di sini !

Appleshell
sumber
Ok saya akan mengambilnya dengan pengiriman polisi itu. Terima kasih telah memberi tahu saya.
Ad Hoc Garf Hunter
1

Jelly , 22/3 = 7 1/3

⁹ḶDÞḊi

Cobalah online!

The penyerahan polisi oleh fənɛtɪk adalah untuk mengembalikan n th ( 0 -indexed) leksikografi diurutkan angka desimal menggunakan domain [0255] .

Saya pertama kali harfiah dibalik operasi dijelaskan, ⁹ḶDÞi⁸‘- mengambil berbagai menurunkan dari 256 , ⁹Ḷdan Þmenginstruksikan untuk mengatasinya dengan fungsi utama dari konversi ke daftar desimal, D; kemudian temukan indeks,, iinput , dan kurangi 1 , (Daftar Jelly berindeks 1 ).

Lalu aku bermain golf dengan mengeluarkan daftar yang diurutkan . Ketika suatu item tidak ditemukan imengembalikan 0 seperti yang diperlukan untuk elemen pertama yang dihapus ( 0 ), sementara yang lain ditemukan satu indeks sebelumnya, memungkinkan penghapusan penurunan ,, yang pada gilirannya memberikan iinput implisit di sebelah kanan dari kiri (hanya ) masukan ke tautan monadik.

Jonathan Allan
sumber
1

Javascript oleh Magenta, 32/23

x=>x%16*16+(x/16+13)%16

Kode pada dasarnya mengganti bit 4 yang lebih rendah dan atas dan melakukan penambahan modulo pada satu bagian.

Christoph
sumber
1

Javascript oleh histocrat, 27/29

x=>x-65?x-126?x*127%258:131:6

Sayangnya dua codings keras diperlukan untuk memecahnya. Perhatikan bahwa fungsi asli tidak memetakan nilai apa pun ke 130 tetapi memetakan nilai ke 256 .

Christoph
sumber
1
Memiliki 256 dalam rentang legal menurut aturan ("8 bit (0 atau 1), atau integer basis-10 dalam kisaran 1-256"). Meskipun demikian, ini masih merupakan Perampok yang valid!
histokrat
1

PHP, Skor 64/71

for(srand(0);$a<256;)$b[$c=rand()%256]++||$d[$c]=$a++;echo$d[$argn]|0;

Untungnya PHP randhanya meneruskan ke stdlib seperti C. Jadi ini berfungsi selama kita menggunakan stdlib yang sama. Ini berarti ini berfungsi pada TIO tetapi tidak pada misalnya sandbox.onlinephpfunctions.com . Versi kode Dave saat ini hanya mengulangi urutan pseudorandom dan mengembalikan nilai unik ke - n jadi saya kira mungkin ada jawaban yang jauh lebih pendek jika bahasa golf juga menggunakan stdlib.

Berikut ini adalah implementasi dari kode Dave yang tidak bergantung pada stdlib. Itu mungkin juga membantu.

Christoph
sumber
+1 untuk menemukan cara mengganti bahasa yang satu ini! Tahu mengapa ini tidak perlu srand(1)? Juga, ini adalah Cobalah secara online!
Dave
@Have srand(x&&f(x-1))ini berhenti hanya jika x==0karena itu akan diunggulkan 0di babak pertama. Tidak yakin mengapa panggilan berikutnya tidak mengubahnya.
Christoph
@Dave sepertinya srand(0)rusak rand(lihat di sini ). Saya kira srand(0)secara otomatis dipromosikan menjadi srand(1). Saya kira jika Anda bisa menggunakan benih yang berbeda setiap kali akan jauh lebih sulit untuk mematahkannya.
Christoph
Menarik bahwa ini berhasil. Tampaknya khusus untuk versi stdlib yang digunakan pada TIO, perilaku di C di sana tampaknya sama, sedangkan pada mesin lokal saya dengan dentang perlu untuk memanggil kembali srand dengan 0 resp. 1 pada setiap iterasi, alih-alih hanya memohon satu kali dengan 0.
Appleshell
1
@Appleshell tampaknya kecurigaan Christoph benar: glibc memiliki pemeriksaan khusus. Lihat di sini: stackoverflow.com/a/8049852/1180785 (karena Anda menyebutkan dentang, saya kira lokal Anda adalah OSX, jadi tidak ada glibc)
Dave
0

Jelly , 11/8

*205%257

Cobalah online untuk melihat seluruh tabel.

Dalam hal pengiriman perampok dalam bahasa yang berbeda tidak diizinkan di masa mendatang, saya akan menghubungi solusi berikut.

g=(x,y=0)=>x-++y**5%257?g(x,y):y
Dennis
sumber
0

C (gcc) oleh Bijan, 32/30

g(x){x=x?g(--x)*205+51&255:0;}

Bersenang-senang bermain golf, terima kasih! x=memungkinkan untuk melewatkan kembali dengan gcc dan tcc (Anda mungkin ingin mengubah jawaban Anda untuk memasukkannya). g(--x)*205+51&255adalah kebalikannya.

Christoph
sumber
0

Jelly , 37/11

O_77×191%⁹Ọ

Menggunakan format I / O yang sama dengan polisi. Tidak yakin apakah itu diperlukan.

Cobalah online untuk melihat seluruh tabel.

Bagaimana itu bekerja

Untuk input n , jawaban polisi menghitung f (n): = ((((n + 5)% 256 × 2)% 256 + 2)% 256 × 9)% 256 . Karena %merupakan operator linier, ini setara dengan f (n) = (((n + 5) × 7 + 2) × 9)% 256 . Memperluas istilah yang tepat, kita mendapatkan f (n) = (63n + 333)% 256 = (63n + 77)% 256 .

Membalikkan ini agak mudah. Untuk membatalkan penambahan, kita cukup mengurangi 77 . Juga, karena 191 × 63% 256 = 12033% 256 = 1 , maka 191 adalah 63 modul terbalik 256 , jadi mengalikan dengan 191 membatalkan mengalikan dengan 63 . Dengan cara ini, g (n) = (n - 77) × 191% 256 mendefinisikan kebalikan dari f .

Dennis
sumber