バイナリ文字列の半逆


12

これは私のPuzzling.SEの質問のフォローアップの質問です。ブール文字列をブール文字列にマッピングする関数fがあり、すべての入力文字列b に対してf(f(b))= reverse(b)があるかどうかを尋ねました。(reverseとは、ビットの順序を逆にする機能を意味します。)

上記のリンクには、優れたf ''による証明付きの肯定的な答えが含まれていますが、見る前に自分で質問を熟考することをお勧めします。

そのような関数fをできるだけ少ないバイトで実装します。

  • STDINから入力を読み取るか、関数の引数を取ることができます。そして、結果文字列をSTDOUTに書き込むか、それを返します。

  • どちらの方法でも、選択した2つの異なるバイトまたは文字の実際の文字列(0and 1、or \x00、andなど\x01)、またはtrueおよびfalse値の配列/リストを操作できます。ただし、2つの値を選択し、それらに固執します。

  • fを 1回適用した結果は、バイナリ文字列そのものでなければなりませんb -> if b starts with 'x' then reverse(b[1:]) else 'x' + b

  • あなたの機能は合計する必要があります。特に、入力は空の文字列、または1ビット長などです。文字列の長さの上限はありません。

  • また、純粋でなければなりません。関数呼び出し間でグローバルな状態を保持しないでください。入力文字列は出力文字列を完全に決定する必要があります。


出力の長さと入力の長さは異なる場合がありますか?
ルイスメンドー

承知しました!(実際、そうでなければ、チャレンジは証明不可能です。)
リン

長さ1または0の文字列に対して機能する必要がありますか?
電卓

はい; 関数は合計である必要があります。私は質問でこれを明らかにしました!
リン

回答:



7

Python 2、64 69バイト

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

ゴルフをしていない:

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

これは、弦の周期、つまり、繰り返しの長さの弦であるpような最小値を見つけます(SOでゴルフ法を見つけました)。次に、奇数の場合、期間の繰り返しがもう1つ追加されます。偶数の場合、期間の繰り返しを1つ削除し、逆にします。spnnn

1 <-> 2、3 <-> 4などの間の関数マッピングの実装を支援してくれた@ Sp3000に感謝します。


...非ゴルフコードはいつ更新されますか?
電卓

@CatsAreFluffyわずかな違いがあるだけで同じアイデアを使用するため、私は未使用のコードを変更する予定はありません。一方、英語は最新です。
-feersum

2

Perl、49 47バイト

+2を含む -lp

@feersumの非常に素晴らしいアルゴリズムに基づく

STDINで入力して実行します。たとえば

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

halfreverse.pl

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

説明

/^               $/         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

どのように機能しますか?
電卓
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.