Ini adalah pertanyaan tindak lanjut untuk saya pertanyaan Puzzling.SE : Saya bertanya apakah ada fungsi f memetakan string Boolean string Boolean, sehingga f (f (b)) = membalikkan (b) untuk semua masukan string b . (Secara terbalik , maksud saya fungsi yang membalik urutan bit.)
Tautan di atas berisi jawaban positif, dengan bukti, oleh f '' hebat , tetapi Anda mungkin ingin merenungkan pertanyaannya sendiri sebelum melihat.
Mengimplementasikan fungsi seperti f sebagai beberapa byte mungkin.
Anda dapat membaca input dari STDIN, atau mengambil argumen fungsi; dan baik menulis string hasil ke STDOUT, atau mengembalikannya.
Apa pun itu, Anda dapat bekerja dengan string aktual dari dua byte atau karakter berbeda pilihan Anda (katakan
0
dan1
, atau\x00
dan\x01
), atau dengan array / daftar nilai-nilai yang benar dan salah . Namun, pilih dua nilai dan patuhi itu.Hasil aplikasi tunggal f harus berupa string biner itu sendiri: tidak ada jawaban konyol seperti
b -> if b starts with 'x' then reverse(b[1:]) else 'x' + b
...Fungsi Anda harus total ; khususnya, input mungkin berupa string kosong, atau satu bit panjang, dll. Tidak ada batas atas untuk panjang string.
Itu juga harus murni : jangan simpan negara global apa pun di antara panggilan fungsi; string input harus sepenuhnya menentukan string output.
Jawaban:
CJam, 32 byte
Cobalah online.
Terlalu panjang...
sumber
Python 2, 64
69byteTidak Disatukan:
Ini menemukan periode string, yaitu minimal
p
sedemikian sehinggas
string panjangp
berulangn
kali (saya menemukan metode golf pada SO). Maka jikan
ganjil, itu menambah satu lagi pengulangan periode. Jikan
genap, ia menghapus satu pengulangan periode dan membaliknya.Terima kasih kepada @ Sp3000 untuk membantu mengimplementasikan pemetaan fungsi antara 1 <-> 2, 3 <-> 4, dll.sumber
Perl,
4947 byteTermasuk +2 untuk
-lp
Berdasarkan algoritma yang sangat bagus dari @ feersum
Jalankan dengan input pada STDIN, mis
halfreverse.pl
:Penjelasan
sumber