Setengah membalikkan string biner

12

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 0dan 1, atau \x00dan \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.

Lynn
sumber
Bisakah output memiliki panjang yang berbeda dari input?
Luis Mendo
Tentu! (Sebenarnya, kalau tidak, tantangannya tidak mungkin terbukti.)
Lynn
Apakah harus bekerja untuk string dengan panjang satu atau nol?
CalculatorFeline
Iya; fungsi harus total. Saya sudah mengklarifikasi hal ini dalam pertanyaan!
Lynn
1
Terkait
Martin Ender

Jawaban:

7

Python 2, 64 69 byte

def f(s):p=(s+s).find(s,1);return[s[~p::-1],s+s[:p]][len(s)/p%2]

Tidak Disatukan:

def f(s):
    p = (s+s).find(s,1)
    n = len(s)/p
    return s[:p][::1|n%-2] * -~(n-1^1)

Ini menemukan periode string, yaitu minimal psedemikian sehingga sstring panjang pberulang nkali (saya menemukan metode golf pada SO). Maka jika nganjil, itu menambah satu lagi pengulangan periode. Jika ngenap, ia menghapus satu pengulangan periode dan membaliknya.

Terima kasih kepada @ Sp3000 untuk membantu mengimplementasikan pemetaan fungsi antara 1 <-> 2, 3 <-> 4, dll.

feersum
sumber
... Kapan kode ungolfed akan diperbarui?
CalculatorFeline
@CatsAreFluffy Saya tidak punya rencana untuk memodifikasi kode yang tidak dikenali karena menggunakan ide yang sama dengan hanya perbedaan sepele. Bahasa Inggris di sisi lain adalah yang terbaru.
feersum
2

Perl, 49 47 byte

Termasuk +2 untuk -lp

Berdasarkan algoritma yang sangat bagus dari @ feersum

Jalankan dengan input pada STDIN, mis

perl -lp halfreverse.pl <<< "101001"

halfreverse.pl:

/^(.+?)((\1\1?)*)$/;$_=$3eq$1?reverse$2:$_.$1

Penjelasan

/^               $/         Match the complete input string
  (.+?)                     Non-greedy match. Try only one digit at the start,
                            if that doesn't work try 2, then 3 etc. The string
                            being tried is remembered in backreference \1
       ((\1\1?)*)           Try to repeat \1 as many times as possible but
                            prefer in groups of 2. Fall back to only 1 at the
                            end of the string if the trailing part has an odd
                            number of \1 (so the total count is even)

   $3eq$1                   So the last match $3 equals the first match $1
         ?                  if and only if the total count is even
          reverse$2         If total count is even drop the first instance of
                   :        \1 and reverse
                    $_.$1   If total count is odd extend $_ by one instance
$_=                         Assign result
Ton Hospel
sumber
Bagaimana cara kerjanya??
CalculatorFeline